SkinWin.cpp
上传用户:vipseo
上传日期:2010-02-15
资源大小:137k
文件大小:30k
源码类别:

组合框控件

开发平台:

Visual C++

  1. // SkinWin.cpp: implementation of the CSkinWin class.
  2. //
  3. // A class to enable draw windows-blind style window
  4. //
  5. //  ToDo:
  6. // how to popup system menu by my program??
  7. //
  8. // History:
  9. // 2002.11.24
  10. // CAN WORK NOW.
  11. // 2002.11.23 intial version
  12. //
  13. //
  14. //
  15. // AUthor:
  16. // szhao00@mails.tsinghua.edu.cn
  17. //
  18. //////////////////////////////////////////////////////////////////////
  19. #include "stdafx.h"
  20. #include "SkinWin.h"
  21. #ifdef _DEBUG
  22. #undef THIS_FILE
  23. static char THIS_FILE[]=__FILE__;
  24. #define new DEBUG_NEW
  25. #endif
  26. //////////////////////////////////////////////////////////////////////
  27. // Construction/Destruction
  28. //////////////////////////////////////////////////////////////////////
  29. CSkinWin::CSkinWin()
  30. {
  31. m_bInit = FALSE;
  32. m_winstate = 0;
  33. m_barcolor = RGB(207,207,207);
  34. m_menucolor = RGB(207,207,207);
  35. }
  36. CSkinWin::~CSkinWin()
  37. {
  38. }
  39. CString GetPathName( const char * filename );
  40. CString GetFileName( const char * filename, int ext = 0);
  41. char *next_token( char *buf, char *token, char *stopchars );
  42. COLORREF ReadColor( CString section, CString key, CString file, COLORREF defcolor )
  43. {
  44. char buf[1000];
  45. GetPrivateProfileString( section, key, "", buf, 1000, file );
  46. if ( *buf )
  47. {
  48. char token[255];
  49. char *p = buf;
  50. int r, g, b;
  51. p = next_token( p, token, NULL );
  52. r = atoi(token);
  53. p = next_token( p, token, NULL );
  54. g = atoi(token);
  55. p = next_token( p, token, NULL );
  56. b = atoi(token);
  57. return RGB(r, g, b );
  58. }
  59. else
  60. return defcolor;
  61. }
  62. BOOL CSkinWin::LoadSkin( const char * skinfile )
  63. {
  64. static const char * ps = "Personality";
  65. char buf[1000];
  66. CString path = GetPathName( skinfile );
  67. if ( m_bInit )
  68. {
  69. m_bmpDlg.DeleteObject();
  70. m_bmpTitle.DeleteObject();
  71. m_bmpLeft.DeleteObject();
  72. m_bmpRight.DeleteObject();
  73. m_bmpBottom.DeleteObject();
  74. m_bmpMaxBtn.DeleteObject();
  75. m_bmpRestoreBtn.DeleteObject();
  76. m_bmpMinBtn.DeleteObject();
  77. m_bmpCloseBtn.DeleteObject();
  78. //set deafult
  79. m_barcolor = RGB(207,207,207);
  80. m_menucolor = RGB(207,207,207);
  81. m_bInit = FALSE;
  82. }
  83. GetPrivateProfileString( ps, "DialogBmp", "", buf, 1000, skinfile );
  84. if ( *buf != 0 )
  85. m_bmpDlg.LoadBitmap( path + "/" + GetFileName( buf,1 ));
  86. GetPrivateProfileString( ps, "Top", "", buf, 1000, skinfile );
  87. if ( *buf == 0 || !m_bmpTitle.LoadBitmap( path + "/" + GetFileName( buf,1 )) )
  88. return FALSE;
  89. GetPrivateProfileString( ps, "Left", "", buf, 1000, skinfile );
  90. if ( *buf == 0 || !m_bmpLeft.LoadBitmap( path + "/" + GetFileName( buf,1 ) )) 
  91. return FALSE;
  92. GetPrivateProfileString( ps, "Right", "", buf, 1000, skinfile );
  93. if ( *buf == 0 || !m_bmpRight.LoadBitmap( path + "/" + GetFileName( buf,1 ) )) 
  94. return FALSE;
  95. GetPrivateProfileString( ps, "Bottom", "", buf, 1000, skinfile );
  96. if ( *buf == 0 || !m_bmpBottom.LoadBitmap( path + "/" + GetFileName( buf,1 ) )) 
  97. return FALSE;
  98. m_TitleHeight = m_bmpTitle.Height()/2;
  99. m_BorderLeftWidth = m_bmpLeft.Width()/2;
  100. m_BorderRightWidth = m_bmpRight.Width()/2;
  101. m_BorderBottomHeight = m_bmpBottom.Height()/2;
  102. m_titleoff1 = GetPrivateProfileInt( ps, "TopTopHeight", 0, skinfile );
  103. m_titleoff2 = m_bmpTitle.Width() - GetPrivateProfileInt( ps, "TopBotHeight", 0, skinfile );
  104. if ( m_titleoff2 <= m_titleoff1 )
  105. m_titleoff2 = m_titleoff1 + 1;
  106. m_leftoff1 = GetPrivateProfileInt( ps, "LeftTopHeight", 0, skinfile );
  107. m_leftoff2 = m_bmpLeft.Height() - GetPrivateProfileInt( ps, "LeftBotHeight", 0, skinfile );
  108. if ( m_leftoff2 <= m_leftoff1 )
  109. m_leftoff2 = m_leftoff1 + 1;
  110. m_rightoff1 = GetPrivateProfileInt( ps, "RightTopHeight", 0, skinfile );
  111. m_rightoff2 = m_bmpRight.Height() - GetPrivateProfileInt( ps, "RightBotHeight", 0, skinfile );
  112. if ( m_rightoff2 <= m_rightoff1 )
  113. m_rightoff2 = m_rightoff1 + 1;
  114. m_bottomoff1 = GetPrivateProfileInt( ps, "BottomTopHeight", 0, skinfile );
  115. m_bottomoff2 = m_bmpBottom.Width() - GetPrivateProfileInt( ps, "BottomBotHeight", 0, skinfile );
  116. if ( m_bottomoff2 <= m_bottomoff1 )
  117. m_bottomoff2 = m_bottomoff1 + 1;
  118. //load buttons
  119. int count = GetPrivateProfileInt( ps, "ButtonCount", 0, skinfile );
  120. int icount = GetPrivateProfileInt( ps, "ButtonImgCount", 3, skinfile );
  121. for ( int i = 0; i < count; i++ )
  122. {
  123. CString sec;
  124. sec.Format( "Button%d", i );
  125. GetPrivateProfileString( sec, "ButtonImage", "", buf, 1000, skinfile );
  126. int action = GetPrivateProfileInt( sec, "Action", 0,  skinfile );
  127. int x = GetPrivateProfileInt( sec, "XCoord", 0, skinfile );
  128. int y = GetPrivateProfileInt( sec, "YCoord", 0, skinfile );
  129. int state = icount;
  130. if ( action == 0 )
  131. {
  132. //close
  133. if ( !m_bmpCloseBtn.LoadBitmap( path + "/" + GetFileName( buf,1 )) ) 
  134. return FALSE;
  135. //state = m_bmpCloseBtn.Width()/m_bmpCloseBtn.Height();
  136. m_rectCloseBtn = CRect( x-m_bmpCloseBtn.Width()/state, y, x , y + m_bmpCloseBtn.Height() );
  137. }
  138. if ( action == 2 )
  139. {
  140. //min
  141. if ( !m_bmpMinBtn.LoadBitmap( path + "/" + GetFileName( buf,1 )) ) 
  142. return FALSE;
  143. //state = m_bmpMinBtn.Width()/m_bmpMinBtn.Height();
  144. m_rectMinBtn = CRect( x-m_bmpMinBtn.Width()/state, y, x, y + m_bmpMinBtn.Height() );
  145. }
  146. if ( action == 1 )
  147. {
  148. if ( !m_bmpMaxBtn.GetSafeHandle() )
  149. {
  150. //max
  151. if ( !m_bmpMaxBtn.LoadBitmap( path + "/" + GetFileName( buf,1 )) ) 
  152. return FALSE;
  153. //state = m_bmpMaxBtn.Width()/m_bmpMaxBtn.Height();
  154. m_rectMaxBtn = CRect( x-m_bmpMaxBtn.Width()/state, y, x , y + m_bmpMaxBtn.Height() );
  155. }
  156. else
  157. {
  158. //restore
  159. if ( !m_bmpRestoreBtn.LoadBitmap( path + "/" + GetFileName( buf,1 )) ) 
  160. return FALSE;
  161. //state = m_bmpRestoreBtn.Width()/m_bmpRestoreBtn.Height();
  162. m_rectRestoreBtn = CRect( x-m_bmpRestoreBtn.Width()/state, y, x , y + m_bmpRestoreBtn.Height() );
  163. }
  164. }
  165. if ( action == 4 )
  166. {
  167. }
  168. }
  169. m_textShift = GetPrivateProfileInt( ps, "TextShift", 0, skinfile );
  170. m_textShiftVer = GetPrivateProfileInt( ps, "TextShiftVert", 0, skinfile );
  171. char * colours = "Colours";
  172. m_colTitle1 = ReadColor(colours, "TitleText", skinfile, GetSysColor(COLOR_CAPTIONTEXT) );
  173. m_colTitle2 = ReadColor(colours, "InactiveTitleText", skinfile, GetSysColor(COLOR_CAPTIONTEXT) );
  174. m_bTrans = GetPrivateProfileInt( ps, "UsesTran", 0, skinfile );
  175. if ( m_bTrans )
  176. m_colTrans = ReadColor(colours, "TransColor", skinfile, RGB(255,0,255) );
  177. m_barcolor = ReadColor(colours, "BarColor", skinfile, RGB(207,207,207) );
  178. m_menucolor = ReadColor(colours, "MenuColor", skinfile, RGB(207,207,207) );
  179. m_btnbgcolor = ReadColor(colours, "ButtonFace", skinfile, GetSysColor(COLOR_BTNFACE) );
  180. m_btntextcolor = ReadColor(colours, "ButtonText", skinfile, GetSysColor(COLOR_BTNTEXT));
  181. m_btnhovercolor = ReadColor(colours, "ButtonHilight", skinfile, GetSysColor(COLOR_BTNFACE) );
  182. m_btnfocuscolor = ReadColor(colours, "ButtonFocus", skinfile, GetSysColor(COLOR_BTNFACE) );
  183. m_bInit = TRUE;
  184. return TRUE;
  185. }
  186. BOOL CSkinWin::DrawTitle(CDC *pDC, int x, int y, int w, int state)
  187. {
  188. int padding; 
  189. int ox = x;
  190. padding = ( w - m_bmpTitle.Width() )/( m_titleoff2 - m_titleoff1 ) + 1 ;
  191. if ( padding < 0 ) padding = 0;
  192. RECT sr;
  193. if ( state == 0 )
  194. sr = CRect( 0, 0, m_titleoff1, m_TitleHeight );
  195. else
  196. sr = CRect( 0, m_TitleHeight, m_titleoff1, m_bmpTitle.Height()  );
  197. m_bmpTitle.Draw( pDC, x, y, &sr );
  198.  
  199. x += m_titleoff1;
  200. if ( state == 0 )
  201. sr = CRect(  m_titleoff1, 0, m_titleoff2, m_TitleHeight );
  202. else
  203. sr = CRect(  m_titleoff1, m_TitleHeight, m_titleoff2, m_bmpTitle.Height()  );
  204. for ( int i = 0; i <= padding; i++, x += m_titleoff2 - m_titleoff1 )
  205. {
  206. int d = ( x + m_titleoff2 - m_titleoff1 - ox - w);
  207. if ( d > 0 )
  208. sr.right = sr.right - d;
  209. m_bmpTitle.Draw( pDC, x, y, &sr );
  210. }
  211. x = ox + w - ( m_bmpTitle.Width() - m_titleoff2 ) + 1 ;
  212. if ( state == 0 )
  213. sr = CRect(  m_titleoff2, 0, m_bmpTitle.Width()-1, m_TitleHeight);
  214. else
  215. sr = CRect(  m_titleoff2, m_TitleHeight, m_bmpTitle.Width()-1, m_bmpTitle.Height()  );
  216. m_bmpTitle.Draw( pDC, x, y, &sr );
  217. return TRUE;
  218. }
  219. BOOL CSkinWin::DrawBottom(CDC *pDC, int x, int y, int w, int state)
  220. {
  221. int padding; 
  222. int ox = x;
  223. padding = ( w - m_bmpBottom.Width() )/( m_bottomoff2 - m_bottomoff1 ) + 1 ;
  224. if ( padding < 0 ) padding = 0;
  225. RECT sr;
  226. if ( state == 0 )
  227. sr = CRect( 0, 0, m_bottomoff1, m_BorderBottomHeight);
  228. else
  229. sr = CRect( 0, m_BorderBottomHeight, m_bottomoff1, m_bmpBottom.Height()  );
  230. m_bmpBottom.Draw( pDC, x, y, &sr );
  231. x += m_bottomoff1;
  232. if ( state == 0 )
  233. sr = CRect(  m_bottomoff1, 0, m_bottomoff2, m_BorderBottomHeight );
  234. else
  235. sr = CRect(  m_bottomoff1, m_BorderBottomHeight, m_bottomoff2, m_bmpBottom.Height() );
  236. for ( int i = 0; i <= padding; i++, x += m_bottomoff2 - m_bottomoff1 )
  237. {
  238. int d = ( x + m_bottomoff2 - m_bottomoff1 - ox - w);
  239. if ( d > 0 )
  240. sr.right = sr.right - d;
  241. m_bmpBottom.Draw( pDC, x, y, &sr );
  242. }
  243. x = ox + w - ( m_bmpBottom.Width() - m_bottomoff2 );
  244. if ( state == 0 )
  245. sr = CRect(  m_bottomoff2, 0, m_bmpBottom.Width()-1, m_BorderBottomHeight );
  246. else
  247. sr = CRect(  m_bottomoff2, m_BorderBottomHeight, m_bmpBottom.Width()-1, m_bmpBottom.Height()  );
  248. m_bmpBottom.Draw( pDC, x, y, &sr );
  249. return TRUE;
  250. }
  251. BOOL CSkinWin::DrawLeft(CDC *pDC, int x, int y, int h, int state)
  252. {
  253. int padding; 
  254. int oy = y;
  255. padding = ( h - m_bmpLeft.Height() )/( m_leftoff2 - m_leftoff1 ) + 1 ;
  256. if ( padding < 0 ) padding = 0;
  257. RECT sr;
  258. if ( state == 0 )
  259. sr = CRect( 0, 0, m_BorderLeftWidth, m_leftoff1 );
  260. else
  261. sr = CRect( m_BorderLeftWidth, 0, m_bmpLeft.Width(), m_leftoff1  );
  262. m_bmpLeft.Draw( pDC, x, y, &sr );
  263. y += m_leftoff1;
  264. if ( state == 0 )
  265. sr = CRect(  0, m_leftoff1,  m_BorderLeftWidth, m_leftoff2 );
  266. else
  267. sr = CRect(  m_BorderLeftWidth, m_leftoff1, m_bmpLeft.Width(), m_leftoff2 );
  268. for ( int i = 0; i <= padding; i++, y += m_leftoff2 - m_leftoff1 )
  269. {
  270. int d = ( y + m_leftoff2 - m_leftoff1 - oy - h);
  271. if ( d > 0 )
  272. sr.bottom = sr.bottom - d;
  273. m_bmpLeft.Draw( pDC, x, y, &sr );
  274. }
  275. y = oy + h - ( m_bmpLeft.Height() - m_leftoff2 ) ;
  276. if ( state == 0 )
  277. sr = CRect(  0, m_leftoff2, m_BorderLeftWidth, m_bmpLeft.Height());
  278. else
  279. sr = CRect(  m_BorderLeftWidth, m_leftoff2,  m_bmpLeft.Width(), m_bmpLeft.Height()  );
  280. m_bmpLeft.Draw( pDC, x, y, &sr );
  281. return TRUE;
  282. }
  283. BOOL CSkinWin::DrawRight(CDC *pDC, int x, int y, int h, int state)
  284. {
  285. int padding; 
  286. int oy = y;
  287. padding = ( h - m_bmpRight.Height() )/( m_rightoff2 - m_rightoff1 ) + 1 ;
  288. if ( padding < 0 ) padding = 0;
  289. RECT sr;
  290. if ( state == 0 )
  291. sr = CRect( 0, 0, m_BorderRightWidth, m_rightoff1 );
  292. else
  293. sr = CRect( m_BorderRightWidth, 0, m_bmpRight.Width(), m_rightoff1  );
  294. m_bmpRight.Draw( pDC, x, y, &sr );
  295. y += m_rightoff1;
  296. if ( state == 0 )
  297. sr = CRect(  0, m_rightoff1,  m_BorderRightWidth, m_rightoff2 );
  298. else
  299. sr = CRect(  m_BorderRightWidth, m_rightoff1, m_bmpRight.Width(), m_rightoff2 );
  300. for ( int i = 0; i <= padding; i++, y += m_rightoff2 - m_rightoff1 )
  301. {
  302. int d = ( y + m_rightoff2 - m_rightoff1 - oy - h);
  303. if ( d > 0 )
  304. sr.bottom = sr.bottom - d;
  305. m_bmpRight.Draw( pDC, x, y, &sr );
  306. }
  307. y = oy + h - ( m_bmpRight.Height() - m_rightoff2 ) ;
  308. if ( state == 0 )
  309. sr = CRect(  0, m_rightoff2, m_BorderRightWidth, m_bmpRight.Height());
  310. else
  311. sr = CRect(  m_BorderRightWidth, m_rightoff2,  m_bmpRight.Width(), m_bmpRight.Height()  );
  312. m_bmpRight.Draw( pDC, x, y, &sr );
  313. return TRUE;
  314. }
  315. BOOL CSkinWin::DrawFrame(CDC *pDC, int x, int y, int w, int h, int state, int title )
  316. {
  317. if ( title )
  318. DrawTitle( pDC, x + m_BorderLeftWidth , y, 
  319.     w - m_BorderRightWidth - m_BorderLeftWidth + 1, state );
  320. DrawLeft( pDC, x, y, h, state );
  321. DrawRight( pDC, x + w - m_BorderRightWidth , y, h, state );
  322. DrawBottom( pDC, x + m_BorderLeftWidth, 
  323. y + h - m_BorderBottomHeight, w - m_BorderRightWidth - m_BorderLeftWidth, state );
  324. return TRUE;
  325. }
  326. BOOL CSkinWin::InstallSkin(CWnd *wnd)
  327. {
  328. if ( !wnd  || !m_bInit ) return FALSE;
  329. HookWindow( (HWND)NULL);
  330. int r = HookWindow( wnd );
  331. DWORD style = GetWindowLong( m_hWnd, GWL_STYLE );
  332. m_sizable = style & WS_SIZEBOX;
  333. m_minable = style & WS_MINIMIZEBOX;
  334. m_maxable = style & WS_MAXIMIZEBOX;
  335. //m_sysmenu = style & WS_MAXIMIZEBOX;
  336. style &= ~(WS_MINIMIZEBOX);
  337. style &= ~WS_MAXIMIZEBOX;
  338. style &= ~WS_SYSMENU;
  339. SetWindowLong( m_hWnd, GWL_STYLE, style );
  340. return r;
  341. }
  342. LRESULT CSkinWin::WindowProc(UINT msg, WPARAM wp, LPARAM lp)
  343. {
  344. if ( !IsWindow(m_hWnd) )
  345. return 0;
  346. if ( !m_bInit  ) 
  347. return Default();
  348. switch ( msg )
  349. {
  350. case WM_SHOWWINDOW:
  351. //call setwindowpos to force OnNcCalcSize when hWnd is a dialog
  352. if ( wp )
  353. SetWindowPos( m_hWnd, 0, 0, 0, 400, 400, SWP_NOSIZE|SWP_NOMOVE|SWP_FRAMECHANGED );
  354. Default();
  355. return 0;
  356. break;
  357. //case WM_ERASEBKGND:
  358. case WM_INITMENUPOPUP:
  359. Default();
  360. return 0;
  361. // return OnEraseBkgnd(CDC::FromHandle((HDC)wp) );
  362. /*
  363. case WM_INITMENU:
  364. //a hack, when popup sysmenu, redraw title bar
  365. HMENU h;
  366. h = (HMENU)wp;
  367. int c;
  368. h = GetSubMenu(h, 0);
  369. c = GetMenuItemID( h, 0 );
  370. if ( c == SC_RESTORE )
  371. {
  372. CRect r;
  373. GetClientRect( m_hWnd, r );
  374. OnNcPaint(0);
  375. r.bottom = GetSystemMetrics(SM_CYCAPTION);
  376. InvalidateRect( m_hWnd, r, TRUE );
  377. UpdateWindow( m_hWnd );
  378. }
  379. Default();
  380. return 0;
  381. */
  382. case WM_SYSCOMMAND:
  383. OnSysCommand( wp, lp );
  384. //Default();
  385. return 0;
  386. case WM_SETTEXT:
  387. return OnSetText( wp, lp );
  388. case WM_NCPAINT:
  389. OnNcPaint( (HRGN)wp );
  390. return 0;
  391. case WM_NCCALCSIZE:
  392. OnNcCalcSize( (BOOL)wp, (NCCALCSIZE_PARAMS *)lp );
  393. return 0;
  394. case WM_SIZE:
  395. OnSize( wp, LOWORD(lp), HIWORD(lp) );
  396. return 0;
  397. case WM_NCACTIVATE:
  398. return OnNcActivate( (BOOL)wp );
  399. case WM_NCHITTEST:
  400. return OnNcHitTest(CPoint(LOWORD(lp), HIWORD(lp)));
  401. case WM_NCLBUTTONUP:
  402. OnNcLButtonUp(wp, CPoint(LOWORD(lp), HIWORD(lp)));
  403. return 0;
  404. case WM_NCLBUTTONDOWN:
  405. OnNcLButtonDown(wp, CPoint(LOWORD(lp), HIWORD(lp)));
  406. return 0;
  407. case WM_NCLBUTTONDBLCLK:
  408. OnNcLButtonDblClk(wp, CPoint(LOWORD(lp), HIWORD(lp)));
  409. return 0;
  410. case WM_NCRBUTTONUP:
  411. OnNcRButtonUp(wp, CPoint(LOWORD(lp), HIWORD(lp)));
  412. return 0;
  413. case WM_NCRBUTTONDOWN:
  414. OnNcRButtonDown(wp, CPoint(LOWORD(lp), HIWORD(lp)));
  415. return 0;
  416. case WM_NCMOUSEMOVE:
  417. OnNcMouseMove( wp,CPoint(LOWORD(lp), HIWORD(lp)));
  418. return 0;
  419. case WM_GETMINMAXINFO:
  420. OnGetMinMaxInfo( (MINMAXINFO *)lp );
  421. return 0;
  422. case WM_WINDOWPOSCHANGING:
  423. OnWindowPosChanging((WINDOWPOS *)lp);
  424. return 0;
  425. case WM_SIZING:
  426. OnSizing( wp, (LPRECT)lp );
  427. return 0;
  428. case WM_ACTIVATE:
  429. OnActivate( wp, CWnd::FromHandle((HWND)lp), 0 );
  430. return 0;
  431. case WM_COMMAND:
  432. if ( !HandleSysCommand( wp, lp ) )
  433. Default();
  434. return 0;
  435. default:
  436. return Default();
  437. }
  438. }
  439. void CSkinWin::OnNcPaint(HRGN rgn1)
  440. {
  441. CWnd *pWnd = CWnd::FromHandle(m_hWnd);
  442. CDC * pDC = pWnd->GetWindowDC();
  443. CRect wr;
  444. pWnd->GetWindowRect( wr );
  445. //f ( (DWORD)rgn) 
  446. //pDC->SelectClipRgn( CRgn::FromHandle(rgn) );
  447. //m_bActive = GetActiveWindow() == m_hWnd;
  448. int state = 0;
  449. if ( m_bActive)
  450. state = 0;
  451. else state = 1;
  452. pDC->ExcludeClipRect(0, 0, wr.Width(), m_TitleHeight );
  453. DrawFrame( pDC, 0, 0, wr.Width(), wr.Height(), state, 0 );
  454. pDC->SelectClipRgn( NULL ); 
  455. CDC memDC, *pNewDC;
  456. CMyBitmap bmp;
  457. CBitmap  *obmp;
  458. memDC.CreateCompatibleDC( pDC );
  459. bmp.CreateCompatibleBitmap( pDC, wr.Width(), m_TitleHeight );
  460. obmp = memDC.SelectObject(&bmp);
  461. pNewDC = &memDC;
  462. DrawTitle( pNewDC, m_BorderLeftWidth , 0, 
  463.     wr.Width() - m_BorderRightWidth - m_BorderLeftWidth + 1, state );
  464. DrawLeft( pNewDC, 0, 0, m_bmpLeft.Height(), state );
  465. DrawRight( pNewDC, wr.Width() - m_BorderRightWidth , 0, m_bmpRight.Height(), state );
  466. CRgn newrgn;
  467. newrgn.CreateRectRgn( 0, 0, wr.Width(), wr.Height() );
  468. if ( m_bTrans )
  469. {
  470. CRgn rgn;
  471. rgn.CreateRectRgn( 0, m_TitleHeight, wr.Width(), wr.Height() );
  472. HRGN hrgn = bmp.CreateRgnFromFile( m_colTrans );
  473. newrgn.CombineRgn( &rgn, CRgn::FromHandle(hrgn), RGN_XOR  );
  474. pDC->SelectClipRgn( &newrgn ); 
  475. }
  476. else
  477. SetWindowRgn( m_hWnd, newrgn, FALSE );
  478. if ( m_downHitTest == HTCLOSE )
  479. DrawButton( pNewDC, 0, 1 );
  480. else if ( m_moveHitTest == HTCLOSE)
  481. DrawButton( pNewDC, 0, 2 );
  482. else
  483. DrawButton( pNewDC, 0, 0 );
  484. if ( m_downHitTest == HTMINBUTTON )
  485. DrawButton( pNewDC, 2, 1 );
  486. else if ( m_moveHitTest == HTMINBUTTON)
  487. DrawButton( pNewDC, 2, 2 );
  488. else
  489. DrawButton( pNewDC, 2, 0 );
  490. if ( m_downHitTest == HTMAXBUTTON )
  491. DrawButton( pNewDC, 1, 1 );
  492. else if ( m_moveHitTest == HTMAXBUTTON)
  493. DrawButton( pNewDC, 1, 2 );
  494. else
  495. DrawButton( pNewDC, 1, 0 );
  496. int cx = GetSystemMetrics(SM_CXSMICON);
  497. int cy = GetSystemMetrics(SM_CYSMICON);
  498. HICON hi = (HICON)SendMessage( m_hWnd, WM_GETICON, ICON_SMALL, 0);
  499. if ( !hi )
  500. {
  501. #ifdef IDR_MAINFRAME
  502. hi = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
  503. #endif
  504. }
  505. //draw icon
  506. ::DrawIconEx( pNewDC->GetSafeHdc(), m_BorderLeftWidth, 5, (HICON)
  507. CopyImage( hi, IMAGE_ICON, 
  508. cx, cy, 0), cx, cy, 0, 0, DI_NORMAL);
  509. //draw text
  510. if ( m_title.IsEmpty() )
  511. pWnd->GetWindowText(m_title);
  512. if (m_bActive)
  513. pNewDC->SetTextColor( m_colTitle1 );
  514. else
  515. pNewDC->SetTextColor( m_colTitle2 );
  516. CFont font, *ofont;
  517. font.CreatePointFont( GetSystemMetrics(SM_CYSMCAPTION), "System" );
  518. ofont = pNewDC->SelectObject(&font);
  519. pNewDC->SetBkMode(TRANSPARENT);
  520. pNewDC->DrawText( m_title, CRect( m_textShift, m_textShiftVer, wr.Width() - m_bmpTitle.Width() + m_titleoff2, 
  521. m_TitleHeight ), DT_SINGLELINE | DT_LEFT | DT_VCENTER | DT_WORD_ELLIPSIS  );
  522. pNewDC->SelectObject(&font);
  523. pDC->BitBlt( 0, 0, wr.Width(),
  524. m_TitleHeight, pNewDC, 0, 0, SRCCOPY );
  525. memDC.SelectObject(obmp);
  526. pDC->SelectClipRgn(NULL);
  527. }
  528. void CSkinWin::OnNcCalcSize(BOOL bCalcValidRects, NCCALCSIZE_PARAMS *lpncsp)
  529. {
  530. if ( bCalcValidRects )
  531. {
  532. lpncsp->rgrc[0].left = lpncsp->rgrc[0].left + m_BorderLeftWidth;
  533. lpncsp->rgrc[0].right = lpncsp->rgrc[0].right - m_BorderRightWidth;
  534. lpncsp->rgrc[0].top = lpncsp->rgrc[0].top + m_TitleHeight;
  535. lpncsp->rgrc[0].bottom = lpncsp->rgrc[0].bottom - m_BorderBottomHeight;
  536. lpncsp->rgrc[1] = lpncsp->rgrc[0];
  537. }
  538. else
  539. {
  540. Default();
  541. }
  542. }
  543. void CSkinWin::OnSizing(UINT nSide, LPRECT lpRect)
  544. {
  545. //Default();
  546. CWnd *pWnd = CWnd::FromHandle(m_hWnd);
  547. CRect wr(lpRect);
  548. /*
  549. if ( m_bTrans )
  550. SetWindowRgn( m_hWnd, GetRegion(wr.Width(), wr.Height() ), TRUE );
  551. else
  552. SetWindowRgn( m_hWnd, NULL, TRUE );
  553. */
  554. }
  555. void CSkinWin::OnSize(UINT nType, int cx, int cy)
  556. {
  557. //Default();
  558. CWnd *pWnd = CWnd::FromHandle(m_hWnd);
  559. CRect wr;
  560. Default();
  561. pWnd->GetWindowRect(wr);
  562. pWnd->Invalidate();
  563. OnNcPaint(0);
  564. if ( m_bTrans )
  565. SetWindowRgn( m_hWnd, GetRegion(wr.Width(), wr.Height() ), TRUE );
  566. else
  567. SetWindowRgn( m_hWnd, NULL, TRUE );
  568. }
  569. HRGN CSkinWin::GetRegion(int w, int h)
  570. {
  571. CWnd *pWnd = CWnd::FromHandle(m_hWnd);
  572. CRect wr;
  573. pWnd->GetWindowRect(wr);
  574. CRgn rgn;
  575. if ( m_bTrans )
  576. {
  577. CDC *pDC = pWnd->GetDC();
  578. CDC memDC;
  579. CMyBitmap bmp;
  580. CBitmap *obmp;
  581. memDC.CreateCompatibleDC(pDC);
  582. bmp.CreateCompatibleBitmap( pDC, w, m_TitleHeight );
  583. obmp = memDC.SelectObject(&bmp);
  584. /*
  585. memDC.FillSolidRect( 0, 0, w, h, 0 );
  586. DrawFrame( &memDC, 0, 0, w, h, 0 );
  587. */
  588. DrawTitle( &memDC, m_BorderLeftWidth , 0, 
  589.     wr.Width() - m_BorderRightWidth - m_BorderLeftWidth + 1, 0 );
  590. DrawLeft( &memDC, 0, 0, m_bmpLeft.Height(), 0 );
  591. DrawRight( &memDC, wr.Width() - m_BorderRightWidth , 0, m_bmpRight.Height(), 0 );
  592. memDC.SelectObject(obmp);
  593. pWnd->ReleaseDC( pDC );
  594. rgn.CreateRectRgn( 0, m_TitleHeight, wr.Width(), wr.Height() );
  595. HRGN hrgn = bmp.CreateRgnFromFile( m_colTrans );
  596. CRgn newrgn;
  597. newrgn.CreateRectRgn( 0, m_TitleHeight, wr.Width(), wr.Height() );
  598. newrgn.CombineRgn( &rgn, CRgn::FromHandle(hrgn), RGN_XOR  );
  599. return (HRGN)newrgn.Detach();
  600. }
  601. else
  602. rgn.CreateRectRgn( 0, 0, wr.Width(), wr.Height() );
  603. return (HRGN)rgn.Detach();
  604. }
  605. BOOL CSkinWin::OnNcActivate(BOOL bActive)
  606. {
  607. m_bActive = bActive;
  608. OnNcPaint(0);
  609. if ( !bActive )
  610. {
  611. return 1;
  612. }
  613. else
  614. return 0;
  615. }
  616. UINT CSkinWin::OnNcHitTest(CPoint point)
  617. {
  618. CWnd *pWnd = CWnd::FromHandle(m_hWnd);
  619. CRect wr;
  620. pWnd->GetWindowRect(wr);
  621. point.x -= wr.left;
  622. point.y -= wr.top;
  623. if ( PtInRect( GetButtonRect(0), point ) )
  624. return HTCLOSE;
  625. if ( PtInRect( GetButtonRect(2), point ) && m_minable )
  626. return HTMINBUTTON;
  627. if ( PtInRect( GetButtonRect(1), point ) && m_maxable )
  628. return HTMAXBUTTON;
  629. CRect r;
  630. int cx = GetSystemMetrics(SM_CXSMICON);
  631. int cy = GetSystemMetrics(SM_CYSMICON);
  632. if ( PtInRect( CRect(m_BorderLeftWidth, 5, m_BorderLeftWidth + cx, cy + 5), point ) )
  633. return HTSYSMENU;
  634. r = CRect( 0, 0, m_BorderLeftWidth, m_TitleHeight );
  635. if ( PtInRect( r, point ) && m_sizable && m_winstate != 1 )  //!IsZoomed(m_hWnd) )
  636. return HTTOPLEFT;
  637. r = CRect( wr.Width() - m_BorderLeftWidth, 0,  wr.Width(), m_TitleHeight  );
  638. if ( PtInRect( r, point ) && m_sizable && m_winstate != 1 )  //!IsZoomed(m_hWnd) )
  639. return HTTOPRIGHT;
  640. r = CRect( 0, wr.Height() - m_BorderBottomHeight, m_BorderLeftWidth, wr.Height() );
  641. if ( PtInRect( r, point ) && m_sizable && m_winstate != 1 )  //!IsZoomed(m_hWnd) )
  642. return HTBOTTOMLEFT;
  643. r = CRect( wr.Width()-m_BorderRightWidth, wr.Height() - m_BorderBottomHeight,  wr.Width(), wr.Height() );
  644. if ( PtInRect( r, point ) && m_sizable && m_winstate != 1 )  //!IsZoomed(m_hWnd) )
  645. return HTBOTTOMRIGHT;
  646. r = CRect( 0, m_TitleHeight,  m_BorderLeftWidth, wr.Height() - m_BorderBottomHeight  );
  647. if ( PtInRect( r, point ) && m_sizable && m_winstate != 1 )  //!IsZoomed(m_hWnd) )
  648. return HTLEFT;
  649. r = CRect( wr.Width()-m_BorderRightWidth, m_TitleHeight,  wr.Width(), wr.Height() - m_BorderBottomHeight  );
  650. if ( PtInRect( r, point ) && m_sizable && m_winstate != 1 )  //!IsZoomed(m_hWnd) )
  651. return HTRIGHT;
  652. r = CRect( m_BorderLeftWidth, wr.Height() - m_BorderBottomHeight,  wr.Width()-m_BorderRightWidth, wr.Height() );
  653. if ( PtInRect( r, point ) && m_sizable && m_winstate != 1 )  //!IsZoomed(m_hWnd) )
  654. return HTBOTTOM;
  655. r = CRect( m_BorderLeftWidth, 0,  wr.Width()-m_BorderRightWidth, m_BorderBottomHeight );
  656. if ( PtInRect( r, point ) && m_sizable && m_winstate != 1 )  //!IsZoomed(m_hWnd) )
  657. return HTTOP;
  658. //set to boder 5
  659. r = CRect( m_BorderLeftWidth, 5 , wr.Width()-m_BorderRightWidth, m_TitleHeight );
  660. if ( PtInRect( r, point ) )
  661. return HTCAPTION;
  662. return HTCLIENT;
  663. }
  664. void CSkinWin::OnNcLButtonDblClk(UINT nHitTest, CPoint point)
  665. {
  666. if ( nHitTest == HTCAPTION && m_sizable )
  667. {
  668. if ( m_winstate == 1 )
  669. Restore();
  670. else
  671. Maximize(); //ShowWindow(m_hWnd, SW_MAXIMIZE);
  672. m_downHitTest = 0;
  673. m_moveHitTest = 0;
  674. OnNcPaint(0);
  675. }
  676. }
  677. void CSkinWin::OnNcLButtonDown(UINT nHitTest, CPoint point)
  678. {
  679. m_downHitTest = nHitTest;
  680. m_moveHitTest = m_downHitTest;
  681. OnNcPaint(0);
  682. if ( nHitTest >= HTLEFT && nHitTest <= HTBOTTOMRIGHT || 
  683. nHitTest == HTCAPTION && m_winstate != 1 )  //!IsZoomed(m_hWnd) )
  684. Default();
  685. else if ( nHitTest == HTSYSMENU )
  686. {
  687. PopupSysMenu(point);
  688. /*
  689. CWnd * pWnd = CWnd::FromHandle(m_hWnd);
  690. //a tricky hack
  691. pWnd->ModifyStyle( 0, WS_SYSMENU | WS_MINIMIZEBOX | WS_MAXIMIZEBOX );
  692. Default();
  693. pWnd->ModifyStyle( WS_SYSMENU | WS_MINIMIZEBOX | WS_MAXIMIZEBOX, 0 );
  694. */
  695. }
  696. }
  697. void CSkinWin::OnNcLButtonUp(UINT nHitTest, CPoint point)
  698. {
  699. if ( nHitTest == HTCLOSE )
  700. {
  701. SendMessage(m_hWnd, WM_CLOSE, 0, 0);
  702. return;
  703. }
  704. else if ( nHitTest == HTMINBUTTON )
  705. Minimize();
  706. else if ( nHitTest == HTMAXBUTTON )
  707. {
  708. if ( m_winstate == 1 ) // IsZoomed(m_hWnd) )
  709. Restore(); //ShowWindow(m_hWnd, SW_RESTORE);
  710. else
  711. Maximize(); //ShowWindow(m_hWnd, SW_MAXIMIZE);
  712. }
  713. else
  714. return;
  715. m_downHitTest = 0;
  716. m_moveHitTest = 0;
  717. OnNcPaint(0);
  718. }
  719. void CSkinWin::OnNcMouseMove(UINT nHitTest, CPoint point)
  720. {
  721. if ( nHitTest >= HTLEFT && nHitTest <= HTBOTTOMRIGHT || 
  722.  nHitTest == HTCAPTION && m_winstate != 1 )  //!IsZoomed(m_hWnd) )
  723. Default();
  724. m_moveHitTest = nHitTest;
  725. m_downHitTest = 0;
  726. if ( m_oldHitTest != nHitTest )
  727. {
  728. /*
  729. CRect r;
  730. r = GetButtonRect(0);
  731. r.UnionRect( r, GetButtonRect(1) );
  732. r.UnionRect( r, GetButtonRect(2) );
  733. CRgn rgn;
  734. rgn.CreateRectRgn( r.left, r.top, r.right, r.bottom );
  735. */
  736. OnNcPaint(0);
  737. m_oldHitTest = nHitTest;
  738. }
  739. }
  740. void CSkinWin::OnNcRButtonDown(UINT nHitTest, CPoint point)
  741. {
  742. if ( nHitTest == HTCAPTION )
  743. {
  744. /*
  745. CWnd * pWnd = CWnd::FromHandle(m_hWnd);
  746. pWnd->ModifyStyle( 0, WS_SYSMENU | WS_MINIMIZEBOX | WS_MAXIMIZEBOX );
  747. Default();
  748. pWnd->ModifyStyle( WS_SYSMENU | WS_MINIMIZEBOX | WS_MAXIMIZEBOX, 0 );
  749. */
  750. PopupSysMenu(point);
  751. }
  752. }
  753. void CSkinWin::OnNcRButtonUp(UINT nHitTest, CPoint point)
  754. {
  755. }
  756. CRect CSkinWin::GetButtonRect(int i)
  757. {
  758. CWnd *pWnd = CWnd::FromHandle(m_hWnd);
  759. CRect wr;
  760. pWnd->GetWindowRect(wr);
  761. CRect r;
  762. if ( i == 0 && m_bmpCloseBtn.GetSafeHandle() )
  763. {
  764. //close
  765. r = m_rectCloseBtn;
  766. r.left = wr.Width() - m_rectCloseBtn.right;
  767. r.right = wr.Width() - m_rectCloseBtn.left;
  768. }
  769. if ( i == 1 && m_bmpMaxBtn.GetSafeHandle())
  770. {
  771. //max
  772. if ( m_winstate != 1 || !m_bmpRestoreBtn.GetSafeHandle() )
  773. {
  774. r = m_rectMaxBtn;
  775. r.left = wr.Width() - m_rectMaxBtn.right;
  776. r.right = wr.Width() - m_rectMaxBtn.left;
  777. }
  778. else
  779. {
  780. r = m_rectRestoreBtn;
  781. r.left = wr.Width() - m_rectRestoreBtn.right;
  782. r.right = wr.Width() - m_rectRestoreBtn.left;
  783. }
  784. }
  785. if ( i == 2 && m_bmpMinBtn.GetSafeHandle())
  786. {
  787. //min
  788. r = m_rectMinBtn;
  789. r.left = wr.Width() - m_rectMinBtn.right;
  790. r.right = wr.Width() - m_rectMinBtn.left;
  791. }
  792. return r;
  793. }
  794. BOOL CSkinWin::DrawButton( CDC * pDC, int i, int state)
  795. {
  796. if ( i == 0 )
  797. {
  798. if ( m_bmpCloseBtn.GetSafeHandle() )
  799. {
  800. CRect r = GetButtonRect(0);
  801. m_bmpCloseBtn.Draw( pDC, r.left, r.top, 
  802. CRect( state * r.Width(), 0, (state + 1 ) * r.Width(), m_bmpCloseBtn.Height() ), m_colTrans, m_bTrans );
  803. }
  804. }
  805. if ( i == 1 )
  806. {
  807. CRect r = GetButtonRect(1);
  808. if ( m_maxable && m_bmpMaxBtn.GetSafeHandle() )
  809. if ( m_winstate == 1&& m_bmpRestoreBtn.GetSafeHandle() )
  810. m_bmpRestoreBtn.Draw( pDC, r.left, r.top, 
  811. CRect( state * r.Width(), 0, (state + 1 ) * r.Width(), m_bmpCloseBtn.Height() ), m_colTrans, m_bTrans );
  812. else
  813. m_bmpMaxBtn.Draw( pDC, r.left, r.top, 
  814. CRect( state * r.Width(), 0, (state + 1 ) * r.Width(), m_bmpCloseBtn.Height() ) , m_colTrans, m_bTrans);
  815. }
  816. if ( i == 2 )
  817. {
  818. if ( m_minable && m_bmpMinBtn.GetSafeHandle() )
  819. {
  820. CRect r = GetButtonRect(2);
  821. m_bmpMinBtn.Draw( pDC, r.left, r.top, 
  822. CRect( state * r.Width(), 0, (state + 1 ) * r.Width(), m_bmpCloseBtn.Height() ) , m_colTrans, m_bTrans);
  823. }
  824. }
  825. return TRUE;
  826. }
  827. void CSkinWin::OnGetMinMaxInfo(MINMAXINFO *lpMMI)
  828. {
  829. lpMMI->ptMinTrackSize = CPoint( m_bmpTitle.Width() + m_bmpLeft.Width() +
  830. m_bmpRight.Width(),  m_bmpLeft.Height() + 20 );
  831. }
  832. void CSkinWin::OnWindowPosChanging(WINDOWPOS *lpwndpos)
  833. {
  834. }
  835. BOOL CSkinWin::OnEraseBkgnd(CDC *pDC)
  836. {
  837. if ( m_bmpDlg.GetSafeHandle() )
  838. {
  839. CRect r;
  840. GetClientRect( m_hWnd, r);
  841. for ( int i = 0; i < r.Width()/m_bmpDlg.Width() + 1; i++ )
  842. for ( int j = 0; j < r.Height()/m_bmpDlg.Height() + 1; j++ )
  843. {
  844. m_bmpDlg.Draw( pDC, CRect( i *  m_bmpDlg.Width(), j * m_bmpDlg.Height(),
  845. i *  m_bmpDlg.Width() + m_bmpDlg.Width(), j * m_bmpDlg.Height() + m_bmpDlg.Height() ) );
  846. }
  847. return TRUE;
  848. }
  849. else
  850. return FALSE;
  851. }
  852. CRect CSkinWin::GetMaximizeRect()
  853. {
  854. CRect r;
  855. SystemParametersInfo(SPI_GETWORKAREA, 0, r, 0);
  856. return r;
  857. }
  858. BOOL CSkinWin::Maximize()
  859. {
  860. CRect r = GetMaximizeRect();
  861. GetWindowRect( m_hWnd, m_rectRestoreWin );
  862. m_winstate = 1;
  863. ::MoveWindow( m_hWnd, r.left, r.top, r.Width(), r.Height(), TRUE  );
  864. UpdateWindow( m_hWnd );
  865. return TRUE;
  866. }
  867. BOOL CSkinWin::Minimize()
  868. {
  869. m_oldwinstate = m_winstate;
  870. m_winstate = 2;
  871. ShowWindow(m_hWnd, SW_MINIMIZE);
  872. return TRUE;
  873. }
  874. BOOL CSkinWin::Restore()
  875. {
  876. if ( m_winstate == 1 )
  877. {
  878. ::MoveWindow( m_hWnd, m_rectRestoreWin.left, m_rectRestoreWin.top,
  879. m_rectRestoreWin.Width(), m_rectRestoreWin.Height(), TRUE  );
  880. m_winstate = 0;
  881. UpdateWindow( m_hWnd );
  882. }
  883. return TRUE;
  884. }
  885. //void OnActivate(UINT nState,CWnd* pWndOther, BOOL bMinimized );
  886. void CSkinWin::OnActivate(UINT nState, CWnd *pWndOther, BOOL bMinimized)
  887. {
  888. //Default();
  889. m_bActive = ( nState == WA_ACTIVE || nState == WA_CLICKACTIVE );
  890. OnNcActivate(m_bActive);
  891. }
  892. LRESULT CSkinWin::OnSetText(WPARAM wp, LPARAM lp)
  893. {
  894. char * str = ( char *)lp;
  895. Default();
  896. m_title = str;
  897. OnNcPaint(0);
  898. return 0;
  899. }
  900. void CSkinWin::OnSysCommand(UINT nID, LPARAM lParam)
  901. {
  902. if ( nID == SC_MAXIMIZE )
  903. Maximize();
  904. else if ( nID == SC_RESTORE && m_winstate == 1 )
  905. Restore();
  906. else if ( nID == SC_RESTORE && m_winstate == 2 )
  907. {
  908. ShowWindow( m_hWnd, SW_RESTORE );
  909. m_winstate = m_oldwinstate;
  910. OnNcPaint(0);
  911. }
  912. else 
  913. Default();
  914. }
  915. BOOL CSkinWin::PopupSysMenu(CPoint point)
  916. {
  917. CWnd * pWnd = CWnd::FromHandle(m_hWnd);
  918. CMenu SysMenu;
  919. SysMenu.Attach( GetSystemMenu(m_hWnd, FALSE) );
  920. /*
  921.   when gray menuitem, a strange line appears!!
  922.   
  923. if ( m_winstate == 0 )
  924. {
  925. SysMenu.EnableMenuItem( SC_MINIMIZE, MF_BYCOMMAND|MF_ENABLED );
  926. SysMenu.EnableMenuItem( SC_MAXIMIZE, MF_BYCOMMAND|MF_ENABLED );
  927. SysMenu.EnableMenuItem( SC_RESTORE, MF_BYCOMMAND|MF_DISABLED|MF_GRAYED );
  928. }
  929. else if ( m_winstate == 1 )
  930. {
  931. SysMenu.EnableMenuItem( SC_MAXIMIZE, MF_BYCOMMAND|MF_DISABLED|MF_GRAYED );
  932. SysMenu.EnableMenuItem( SC_RESTORE, MF_BYCOMMAND|MF_ENABLED );
  933. }
  934. else if ( m_winstate == 2 )
  935. {
  936. SysMenu.EnableMenuItem( SC_MINIMIZE, MF_BYCOMMAND|MF_DISABLED|MF_GRAYED );
  937. SysMenu.EnableMenuItem( SC_RESTORE, MF_BYCOMMAND|MF_ENABLED );
  938. }
  939. */
  940. SysMenu.TrackPopupMenu( 0, point.x, point.y, pWnd  );
  941. SysMenu.Detach();
  942. return TRUE;
  943. }
  944. BOOL CSkinWin::HandleSysCommand(WPARAM wp, LPARAM lp)
  945. {
  946. if ( lp == 0 )
  947. {
  948. CMenu SysMenu;
  949. SysMenu.Attach( GetSystemMenu(m_hWnd, FALSE) );
  950. int count = SysMenu.GetMenuItemCount();
  951. for( int i = 0; i < count ; i++ )
  952. if ( SysMenu.GetMenuItemID(i) == wp )
  953. break;
  954. SysMenu.Detach();
  955. if ( i >= count )
  956. return FALSE;
  957. if ( wp == SC_MAXIMIZE )
  958. Maximize();
  959. else if ( wp == SC_MINIMIZE )
  960. Minimize();
  961. else if ( wp == SC_RESTORE && m_winstate == 1 )
  962. Restore();
  963. else if ( wp == SC_RESTORE && m_winstate == 2 )
  964. {
  965. ShowWindow( m_hWnd, SW_RESTORE );
  966. m_winstate = m_oldwinstate;
  967. OnNcPaint(0);
  968. }
  969. else 
  970. SendMessage( m_hWnd, WM_SYSCOMMAND, wp, lp );
  971. return TRUE;
  972. }
  973. return FALSE;
  974. }