ARGH
[matches/honours.git] / research / transmission_spectroscopy / TOF / Win32++ / samples / FastGDI / src / ColourDialog.cpp
1 //////////////////////////////////////////////\r
2 // ColourDialog.cpp\r
3 \r
4 #include "stdafx.h"\r
5 #include "FastGDIApp.h"\r
6 #include "Mainfrm.h"\r
7 #include "ColourDialog.h"\r
8 #include "resource.h"\r
9 \r
10 \r
11 CColourDialog::CColourDialog(UINT nResID) : CDialog(nResID)\r
12 {\r
13         m_cRed = 0;\r
14         m_cGreen = 0;\r
15         m_cBlue = 0;\r
16 }\r
17 \r
18 CColourDialog::~CColourDialog()\r
19 {\r
20 }\r
21 \r
22 BOOL CColourDialog::OnCommand(WPARAM wParam, LPARAM /*lParam*/)\r
23 {\r
24         switch (LOWORD(wParam))\r
25         {\r
26         case IDC_CHECK1:\r
27                 OnGrayScale();\r
28                 return TRUE;    // return TRUE for handled commands\r
29         }\r
30 \r
31         // return FALSE for unhandled commands\r
32         return FALSE;\r
33 }\r
34 \r
35 void CColourDialog::OnGrayScale()\r
36 {\r
37         // Update the colour of the preview image\r
38         if (SendDlgItemMessage(IDC_CHECK1, BM_GETCHECK, 0, 0))\r
39                 GrayScaleBitmap(&m_bmPreview);\r
40         else\r
41         {\r
42                 // Copy m_hbmPreviewOrig to m_hbmPreview\r
43                 CMemDC Mem1DC(NULL);\r
44                 CBitmap* pOldBitmap1 = Mem1DC.SelectObject(&m_bmPreviewOrig);\r
45                 CMemDC Mem2DC(NULL);\r
46                 CBitmap* pOldBitmap2 = Mem2DC.SelectObject(&m_bmPreview);\r
47                 Mem2DC.BitBlt(0, 0, 239-16, 201-16, &Mem1DC, 0, 0, SRCCOPY);\r
48                 Mem1DC.SelectObject(pOldBitmap1);\r
49                 Mem2DC.SelectObject(pOldBitmap2);\r
50 \r
51                 TintBitmap(&m_bmPreview, m_cRed, m_cGreen, m_cBlue);\r
52         }\r
53 \r
54         OnPaintPreview();\r
55 }\r
56 \r
57 BOOL CColourDialog::OnInitDialog()\r
58 {\r
59         // Attach the Trackbar controls to CWnd objects\r
60         m_RedSlider.AttachDlgItem(IDC_SLIDER_RED, this);\r
61         m_GreenSlider.AttachDlgItem(IDC_SLIDER_GREEN, this);\r
62         m_BlueSlider.AttachDlgItem(IDC_SLIDER_BLUE, this);\r
63 \r
64         // Set Trackbar ranges\r
65         m_RedSlider.SendMessage(TBM_SETRANGE,  (WPARAM)TRUE, (LPARAM)MAKELONG(-255, 255));\r
66         m_GreenSlider.SendMessage(TBM_SETRANGE,  (WPARAM)TRUE, (LPARAM)MAKELONG(-255, 255));\r
67         m_BlueSlider.SendMessage(TBM_SETRANGE,  (WPARAM)TRUE, (LPARAM)MAKELONG(-255, 255));\r
68 \r
69         // Attach the Edit controls to CWnd objects\r
70         m_RedEdit.AttachDlgItem(IDC_EDIT_RED, this);\r
71         m_GreenEdit.AttachDlgItem(IDC_EDIT_GREEN, this);\r
72         m_BlueEdit.AttachDlgItem(IDC_EDIT_BLUE, this);\r
73 \r
74         m_RedEdit.SendMessage(WM_SETTEXT, 0, (LPARAM)_T("0"));\r
75         m_GreenEdit.SendMessage(WM_SETTEXT, 0, (LPARAM)_T("0"));\r
76         m_BlueEdit.SendMessage(WM_SETTEXT, 0, (LPARAM)_T("0"));\r
77 \r
78         // Create the two image previews\r
79         m_Preview.AttachDlgItem(IDC_PREVIEW, this);\r
80         CreateImagePreviews(GetFrameApp().GetMainFrame().GetMyView().GetImage());\r
81 \r
82         return TRUE;\r
83 }\r
84 \r
85 INT_PTR CColourDialog::DialogProc(UINT uMsg, WPARAM wParam, LPARAM lParam)\r
86 {\r
87         switch(uMsg)\r
88         {\r
89         case WM_HSCROLL:\r
90                 OnHScroll(wParam, lParam);\r
91                 break;\r
92 \r
93         case WM_PAINT:\r
94                 OnPaintPreview();\r
95                 return 0;\r
96         }\r
97 \r
98         return DialogProcDefault(uMsg, wParam, lParam);\r
99 }\r
100 \r
101 void CColourDialog::OnHScroll(WPARAM wParam, LPARAM lParam)\r
102 {\r
103         UNREFERENCED_PARAMETER(wParam);\r
104 \r
105         // Update the text for the colour's edit control\r
106         int nPos = SendMessage((HWND)lParam, TBM_GETPOS, 0, 0);\r
107         TCHAR Text[5];\r
108         wsprintf(Text, _T("%d\0"), nPos);\r
109 \r
110         if ((HWND)lParam == m_RedSlider.GetHwnd())\r
111                 m_RedEdit.SendMessage(WM_SETTEXT, 0, (LPARAM)&Text);\r
112         else if ((HWND)lParam == m_GreenSlider.GetHwnd())\r
113                 m_GreenEdit.SendMessage(WM_SETTEXT, 0, (LPARAM)&Text);\r
114         else if ((HWND)lParam == m_BlueSlider.GetHwnd())\r
115                 m_BlueEdit.SendMessage(WM_SETTEXT, 0, (LPARAM)&Text);\r
116 \r
117         // Store the colour values\r
118         m_cRed   = m_RedSlider.SendMessage(TBM_GETPOS);\r
119         m_cGreen = m_GreenSlider.SendMessage(TBM_GETPOS);\r
120         m_cBlue  = m_BlueSlider.SendMessage(TBM_GETPOS);\r
121 \r
122         // Copy m_hbmPreviewOrig to m_hbmPreview\r
123         CMemDC Mem1DC(NULL);\r
124         CBitmap* pBitmapOld1 = Mem1DC.SelectObject(&m_bmPreviewOrig);\r
125         CMemDC Mem2DC(NULL);\r
126         CBitmap* pBitmapOld2 = Mem2DC.SelectObject(&m_bmPreview);\r
127         Mem2DC.BitBlt(0, 0, 239-16, 201-16, &Mem1DC, 0, 0, SRCCOPY);\r
128         Mem1DC.SelectObject(pBitmapOld1);\r
129         Mem2DC.SelectObject(pBitmapOld2);\r
130 \r
131         // Update the colour of the preview image\r
132         TintBitmap(&m_bmPreview, m_cRed, m_cGreen, m_cBlue);\r
133 \r
134         if (SendDlgItemMessage(IDC_CHECK1, BM_GETCHECK, 0, 0))\r
135                 GrayScaleBitmap(&m_bmPreview);\r
136 \r
137         OnPaintPreview();\r
138 }\r
139 \r
140 void CColourDialog::OnOK()\r
141 {\r
142         // Get a reference to our CMainFrame object\r
143         CMainFrame& MainFrame = GetFrameApp().GetMainFrame();\r
144         BOOL bGray = SendDlgItemMessage(IDC_CHECK1, BM_GETCHECK, 0, 0);\r
145         MainFrame.ModifyBitmap(m_cRed, m_cGreen, m_cBlue, bGray);\r
146 \r
147         CDialog::OnOK();\r
148 }\r
149 \r
150 void CColourDialog::OnPaintPreview()\r
151 // Displays the bitmap in the display area of our dialog\r
152 {\r
153         BITMAP bm;\r
154         ::GetObject(m_bmPreview, sizeof(BITMAP), &bm);\r
155 \r
156         // Get the size of the destination display area\r
157         CRect rcView = m_Preview.GetClientRect();\r
158         m_Preview.MapWindowPoints(this, rcView);\r
159 \r
160         int nLeftDest;\r
161         int nTopDest;\r
162         if (bm.bmWidth < bm.bmHeight*rcView.Width()/rcView.Height())\r
163         {\r
164                 nLeftDest = rcView.left + (rcView.Width() - bm.bmWidth)/2;\r
165                 nTopDest = rcView.top;\r
166         }\r
167         else\r
168         {\r
169                 nLeftDest = rcView.left;\r
170                 nTopDest = rcView.top + (rcView.Height() - bm.bmHeight)/2;\r
171         }\r
172 \r
173         CClientDC dcPreview(this);\r
174         CMemDC MemDC(&dcPreview);\r
175         CBitmap* pBitmapOld = MemDC.SelectObject(&m_bmPreview);\r
176         dcPreview.BitBlt(nLeftDest, nTopDest, bm.bmWidth, bm.bmHeight, &MemDC, 0, 0, SRCCOPY);\r
177         MemDC.SelectObject(pBitmapOld);\r
178 }\r
179 \r
180 void CColourDialog::CreateImagePreviews(HBITMAP hbmImage)\r
181 // Creates the two Preview bitmaps: m_Preview and m_PreviewOrig\r
182 {\r
183         // Get the size of the bitmap\r
184         BITMAP bm;\r
185         ::GetObject(hbmImage, sizeof(BITMAP), &bm);\r
186 \r
187         // Get the size of the destination display area\r
188         CRect rcView = m_Preview.GetClientRect();\r
189         m_Preview.MapWindowPoints(this, (LPPOINT)&rcView, 2);\r
190 \r
191         // Calculate the stretch values, preserving the aspect ratio\r
192         int nWidthDest;\r
193         int nHeightDest;\r
194         double AspectRatio;\r
195 \r
196         if (bm.bmWidth < bm.bmHeight*rcView.Width()/rcView.Height())\r
197         {\r
198                 AspectRatio = (double)bm.bmWidth / (double)bm.bmHeight;\r
199                 nWidthDest = (int)(rcView.Height()*AspectRatio);\r
200                 nHeightDest = rcView.Height();\r
201         }\r
202         else\r
203         {\r
204                 AspectRatio = (double)bm.bmHeight / (double)bm.bmWidth;\r
205                 nWidthDest = rcView.Width();\r
206                 nHeightDest = (int)(rcView.Width()*AspectRatio);\r
207         }\r
208 \r
209         // Create the Device Contexts and compatible bitmaps\r
210         CMemDC Dest1DC(NULL);\r
211         CMemDC Dest2DC(NULL);\r
212         CMemDC MemDC(NULL);\r
213         CClientDC dcDesktop(NULL);\r
214         m_bmPreview.CreateCompatibleBitmap(&dcDesktop, nWidthDest, nHeightDest);\r
215         m_bmPreviewOrig.CreateCompatibleBitmap(&dcDesktop, nWidthDest, nHeightDest);\r
216         MemDC.SelectObject(FromHandle(hbmImage));\r
217         Dest1DC.SelectObject(&m_bmPreview);\r
218         Dest2DC.SelectObject(&m_bmPreviewOrig);\r
219 \r
220         // Stretch the bitmap to fit in the destination display area\r
221         Dest1DC.SetStretchBltMode(COLORONCOLOR);\r
222         Dest1DC.StretchBlt(0, 0, nWidthDest, nHeightDest, &MemDC, 0, 0, bm.bmWidth, bm.bmHeight, SRCCOPY);\r
223 \r
224         // Make a second copy of the bitmap\r
225         Dest2DC.BitBlt(0, 0, nWidthDest, nHeightDest, &Dest1DC, 0, 0, SRCCOPY);\r
226 }\r
227 \r

UCC git Repository :: git.ucc.asn.au