Update the changelog
[opencv] / apps / Common / DWnd.cpp
1 // DWnd.cpp : implementation file\r
2 //\r
3 \r
4 #include "stdafx.h"\r
5 \r
6 #ifdef _DEBUG\r
7 #define new DEBUG_NEW\r
8 #undef THIS_FILE\r
9 static char THIS_FILE[] = __FILE__;\r
10 #endif\r
11 \r
12 #include "DWnd.h"\r
13 /////////////////////////////////////////////////////////////////////////////\r
14 // CDWnd\r
15 \r
16 CDWnd::CDWnd()\r
17 {\r
18     m_FatherWnd = NULL;\r
19     m_IWK[0] = m_IWK[1] = 0;\r
20     m_WIK[0] = m_WIK[1] = 0;\r
21 }\r
22 \r
23 CDWnd::~CDWnd()\r
24 {\r
25 }\r
26 \r
27 \r
28 BEGIN_MESSAGE_MAP(CDWnd, CWnd)\r
29         //{{AFX_MSG_MAP(CDWnd)\r
30         ON_WM_PAINT()\r
31         ON_WM_SIZING()\r
32         ON_WM_SIZE()\r
33         ON_WM_LBUTTONDOWN()\r
34         ON_WM_LBUTTONUP()\r
35         ON_WM_MOUSEMOVE()\r
36         ON_WM_CHAR()\r
37         //}}AFX_MSG_MAP\r
38 END_MESSAGE_MAP()\r
39 \r
40 \r
41 /////////////////////////////////////////////////////////////////////////////\r
42 // CDWnd message handlers\r
43 \r
44 BOOL CDWnd::CreateWnd(CWnd* pParent, \r
45                       char* pName,\r
46                       long  lWidth,\r
47                       long  lHeight,\r
48                       long  lBPP )\r
49 {\r
50     BOOL res = TRUE;\r
51     RECT rect;\r
52 \r
53     rect.left = 0;\r
54     rect.top = 0;\r
55     rect.right = rect.left + lWidth;\r
56     rect.bottom = rect.top + lHeight;\r
57 \r
58     res = CreateEx( WS_EX_CLIENTEDGE,\r
59                   AfxRegisterWndClass( NULL ),\r
60                   pName,\r
61                   WS_VISIBLE | WS_TILEDWINDOW ,\r
62                   rect, pParent, 0, NULL );\r
63     if( !res ) return FALSE;\r
64 \r
65     m_Image.Create( rect.right, rect.bottom, lBPP );\r
66 \r
67     m_FatherWnd = pParent;\r
68     return TRUE;\r
69 }\r
70 \r
71 void CDWnd::DrawIplImage( IplImage* pImage, BOOL bSetChannelNumber )\r
72 {\r
73     long CN = 3;\r
74     IplImage* pDstImg = m_Image.GetImage();\r
75     if( pImage == NULL ) return;\r
76     if( pImage->depth != IPL_DEPTH_8U ) return;\r
77 \r
78     if( pDstImg != 0 ) CN = pDstImg->nChannels;\r
79     if( bSetChannelNumber ) CN = pImage->nChannels;\r
80     \r
81     if( pDstImg == NULL ||\r
82         pImage->width != pDstImg->width ||\r
83         pImage->height != pDstImg->height ||\r
84         (CN != pDstImg->nChannels) )\r
85     {\r
86         m_Image.Create( \r
87             pImage->width,\r
88             pImage->height,\r
89             CN * 8 );\r
90         pDstImg = m_Image.GetImage();\r
91     }\r
92 \r
93     if( pDstImg == NULL )  return;\r
94     if( pImage->nChannels == pDstImg->nChannels )\r
95     {\r
96         m_Image.CopyOf( pImage );\r
97     }\r
98     else if( pImage->nChannels == 1 && pDstImg->nChannels == 3 )\r
99     { /* gray to color */\r
100         iplGrayToColor(pImage, pDstImg, 1, 1, 1);\r
101     }\r
102     else if( pImage->nChannels == 3 && pDstImg->nChannels == 1 )\r
103     { /* color to gray */\r
104         iplColorToGray( pImage, pDstImg );\r
105     }\r
106 }\r
107 \r
108 void CDWnd::OnPaint() \r
109 {\r
110         CPaintDC dc(this); // device context for painting\r
111     ReDraw();\r
112         // Do not call CWnd::OnPaint() for painting messages\r
113 }\r
114 \r
115 BOOL CDWnd::ReDraw( CDC *pDC ) \r
116 {\r
117   \r
118     HDC hDCSrc;\r
119     HDC hDCDst;\r
120 \r
121     BOOL bReleaseDC = FALSE;\r
122     RECT rect;\r
123 \r
124     if( m_hWnd == NULL ) return FALSE;\r
125 \r
126     GetClientRect( &rect );\r
127 \r
128     if( pDC == NULL ) {pDC = GetDC();bReleaseDC = TRUE; }\r
129     if( pDC == NULL ) return FALSE;\r
130 \r
131     hDCSrc = m_Image.GetDC();\r
132     hDCDst = pDC->m_hDC;\r
133     if( m_Image.Width() > rect.right - rect.left )\r
134     {\r
135             SetStretchBltMode(\r
136                hDCDst,           // handle to device context\r
137                HALFTONE );\r
138     }\r
139     else\r
140     {\r
141             SetStretchBltMode(\r
142                hDCDst,           // handle to device context\r
143                COLORONCOLOR );\r
144     }\r
145 \r
146     ::StretchBlt( \r
147         hDCDst,\r
148         rect.left, rect.top,\r
149         rect.right - rect.left, rect.bottom - rect.top,\r
150         hDCSrc,\r
151         0,0,\r
152         m_Image.Width(),\r
153         m_Image.Height(),\r
154         SRCCOPY );\r
155 \r
156     m_IWK[0] = (double)(rect.right - rect.left) / m_Image.Width();\r
157     m_IWK[1] = (double)(rect.bottom - rect.top) / m_Image.Height();\r
158     m_WIK[0] = (double)m_Image.Width() / (rect.right - rect.left);\r
159     m_WIK[1] = (double)m_Image.Height() / (rect.bottom - rect.top);\r
160 \r
161     if( bReleaseDC ) ReleaseDC( pDC );\r
162 \r
163     return TRUE;\r
164 }\r
165 \r
166 BOOL CDWnd::DrawToHDC( HDC hDC, RECT* pDstRect ) \r
167 {\r
168   \r
169     HDC hDCSrc;\r
170     HDC hDCDst;\r
171 \r
172     RECT rect;\r
173 \r
174     if( m_hWnd == NULL ) return FALSE;\r
175 \r
176     if( pDstRect ) rect = *pDstRect;\r
177     else GetClientRect( &rect );\r
178 \r
179     hDCSrc = m_Image.GetDC();\r
180     hDCDst = hDC;\r
181     if( m_Image.Width() > rect.right - rect.left )\r
182     {\r
183             SetStretchBltMode(\r
184                hDCDst,           // handle to device context\r
185                HALFTONE );\r
186     }\r
187     else\r
188     {\r
189             SetStretchBltMode(\r
190                hDCDst,           // handle to device context\r
191                COLORONCOLOR );\r
192     }\r
193 \r
194     ::StretchBlt( \r
195         hDCDst,\r
196         rect.left, rect.top,\r
197         rect.right - rect.left, rect.bottom - rect.top,\r
198         hDCSrc,\r
199         0,0,\r
200         m_Image.Width(),\r
201         m_Image.Height(),\r
202         SRCCOPY );\r
203 \r
204     return TRUE;\r
205 }\r
206 \r
207 void CDWnd::OnSizing(UINT fwSide, LPRECT pRect) \r
208 {\r
209         CWnd::OnSizing(fwSide, pRect);\r
210         \r
211   // TODO: Add your message handler code here\r
212         \r
213 }\r
214 \r
215 void CDWnd::OnSize(UINT nType, int cx, int cy) \r
216 {\r
217         CWnd::OnSize(nType, cx, cy);\r
218         \r
219     ReDraw();\r
220 }\r
221 \r
222 void CDWnd::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) \r
223 {\r
224         // TODO: Add your message handler code here and/or call default\r
225     if( nChar == 115 && nFlags == 31 )\r
226     {\r
227         CString str;\r
228         GetWindowText(str);\r
229         str += ".bmp";\r
230         m_Image.Save((LPCTSTR)str);\r
231     }\r
232         \r
233         CWnd::OnChar(nChar, nRepCnt, nFlags);\r
234 }\r