1 //////////////////////////////////////////////
\r
5 #include "FastGDIApp.h"
\r
7 #include "ColourDialog.h"
\r
8 #include "resource.h"
\r
11 CColourDialog::CColourDialog(UINT nResID) : CDialog(nResID)
\r
18 CColourDialog::~CColourDialog()
\r
22 BOOL CColourDialog::OnCommand(WPARAM wParam, LPARAM /*lParam*/)
\r
24 switch (LOWORD(wParam))
\r
28 return TRUE; // return TRUE for handled commands
\r
31 // return FALSE for unhandled commands
\r
35 void CColourDialog::OnGrayScale()
\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
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
51 TintBitmap(&m_bmPreview, m_cRed, m_cGreen, m_cBlue);
\r
57 BOOL CColourDialog::OnInitDialog()
\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
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
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
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
78 // Create the two image previews
\r
79 m_Preview.AttachDlgItem(IDC_PREVIEW, this);
\r
80 CreateImagePreviews(GetFrameApp().GetMainFrame().GetMyView().GetImage());
\r
85 INT_PTR CColourDialog::DialogProc(UINT uMsg, WPARAM wParam, LPARAM lParam)
\r
90 OnHScroll(wParam, lParam);
\r
98 return DialogProcDefault(uMsg, wParam, lParam);
\r
101 void CColourDialog::OnHScroll(WPARAM wParam, LPARAM lParam)
\r
103 UNREFERENCED_PARAMETER(wParam);
\r
105 // Update the text for the colour's edit control
\r
106 int nPos = SendMessage((HWND)lParam, TBM_GETPOS, 0, 0);
\r
108 wsprintf(Text, _T("%d\0"), nPos);
\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
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
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
131 // Update the colour of the preview image
\r
132 TintBitmap(&m_bmPreview, m_cRed, m_cGreen, m_cBlue);
\r
134 if (SendDlgItemMessage(IDC_CHECK1, BM_GETCHECK, 0, 0))
\r
135 GrayScaleBitmap(&m_bmPreview);
\r
140 void CColourDialog::OnOK()
\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
150 void CColourDialog::OnPaintPreview()
\r
151 // Displays the bitmap in the display area of our dialog
\r
154 ::GetObject(m_bmPreview, sizeof(BITMAP), &bm);
\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
162 if (bm.bmWidth < bm.bmHeight*rcView.Width()/rcView.Height())
\r
164 nLeftDest = rcView.left + (rcView.Width() - bm.bmWidth)/2;
\r
165 nTopDest = rcView.top;
\r
169 nLeftDest = rcView.left;
\r
170 nTopDest = rcView.top + (rcView.Height() - bm.bmHeight)/2;
\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
180 void CColourDialog::CreateImagePreviews(HBITMAP hbmImage)
\r
181 // Creates the two Preview bitmaps: m_Preview and m_PreviewOrig
\r
183 // Get the size of the bitmap
\r
185 ::GetObject(hbmImage, sizeof(BITMAP), &bm);
\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
191 // Calculate the stretch values, preserving the aspect ratio
\r
194 double AspectRatio;
\r
196 if (bm.bmWidth < bm.bmHeight*rcView.Width()/rcView.Height())
\r
198 AspectRatio = (double)bm.bmWidth / (double)bm.bmHeight;
\r
199 nWidthDest = (int)(rcView.Height()*AspectRatio);
\r
200 nHeightDest = rcView.Height();
\r
204 AspectRatio = (double)bm.bmHeight / (double)bm.bmWidth;
\r
205 nWidthDest = rcView.Width();
\r
206 nHeightDest = (int)(rcView.Width()*AspectRatio);
\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
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
224 // Make a second copy of the bitmap
\r
225 Dest2DC.BitBlt(0, 0, nWidthDest, nHeightDest, &Dest1DC, 0, 0, SRCCOPY);
\r