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

组合框控件

开发平台:

Visual C++

  1. // SkinButton.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "SkinButton.h"
  5. #ifdef _DEBUG
  6. #define new DEBUG_NEW
  7. #undef THIS_FILE
  8. static char THIS_FILE[] = __FILE__;
  9. #endif
  10. /////////////////////////////////////////////////////////////////////////////
  11. // CSkinButton
  12. IMPLEMENT_DYNAMIC(CSkinButton, CButton)
  13. CSkinButton::CSkinButton()
  14. {
  15. m_res = NULL;
  16. m_bMouseIn = m_bDown = FALSE;
  17. m_backcolor = ::GetSysColor(COLOR_BTNFACE);
  18. m_textcolor = ::GetSysColor(COLOR_BTNTEXT);
  19. }
  20. CSkinButton::~CSkinButton()
  21. {
  22. }
  23. BEGIN_MESSAGE_MAP(CSkinButton, CButton)
  24. //{{AFX_MSG_MAP(CSkinButton)
  25. ON_WM_PAINT()
  26. ON_WM_MOUSEMOVE()
  27. ON_WM_LBUTTONDOWN()
  28. ON_WM_LBUTTONUP()
  29. ON_WM_LBUTTONDBLCLK()
  30. ON_WM_SETFOCUS()
  31. ON_WM_KILLFOCUS()
  32. ON_WM_ERASEBKGND()
  33. ON_WM_KEYDOWN()
  34. ON_WM_KEYUP()
  35. ON_WM_ENABLE()
  36. //}}AFX_MSG_MAP
  37. END_MESSAGE_MAP()
  38. /////////////////////////////////////////////////////////////////////////////
  39. // CSkinButton message handlers
  40. CString GetPathName( const char * filename );
  41. CString GetFileName( const char * filename, int ext = 0);
  42. char *next_token( char *buf, char *token, char *stopchars );
  43. BOOL CSkinButtonResource::LoadSkin(const char *skinfile)
  44. {
  45. static const char * ps = "Buttons";
  46. char buf[1000];
  47. CString path = GetPathName( skinfile );
  48. GetPrivateProfileString( ps, "Bitmap", "", buf, 1000, skinfile );
  49. if ( *buf == 0 || !m_bmpButton.LoadBitmap( path + "/" + GetFileName( buf,1 )) )
  50. return FALSE;
  51. m_TopHeight = GetPrivateProfileInt( ps, "TopHeight", 0, skinfile );
  52. m_BottomHeight = GetPrivateProfileInt( ps, "BottomHeight", 0, skinfile );
  53. m_LeftWidth = GetPrivateProfileInt( ps, "LeftWidth", 0, skinfile );
  54. m_RightWidth = GetPrivateProfileInt( ps, "RightWidth", 0, skinfile );
  55. m_bTrans = GetPrivateProfileInt( ps, "Trans", 0, skinfile );
  56. m_bInited = TRUE;
  57. return TRUE;
  58. }
  59. BOOL CSkinButtonResource::DrawAImage(CDC *pDC, CRect r, CRect sr)
  60. {
  61. int w = sr.Width();
  62. int h = sr.Height();
  63. int tw = r.Width();
  64. int th = r.Height();
  65. int x = sr.left;
  66. int y = sr.top;
  67. m_bmpButton.Draw( pDC, 0, 0, CRect(x, y, x + m_LeftWidth, y + m_TopHeight) );
  68. m_bmpButton.Draw( pDC, tw - m_RightWidth, 0, CRect(x + w-m_RightWidth, y, x + w +m_RightWidth,y+m_TopHeight) );
  69. m_bmpButton.Draw( pDC, 0, th-m_BottomHeight, CRect(x, y+h-m_BottomHeight, x+m_LeftWidth, y+h) );
  70. m_bmpButton.Draw( pDC, tw - m_RightWidth, th-m_BottomHeight, CRect(x+w -m_RightWidth, y+h-m_BottomHeight, x+w, y+h) );
  71. m_bmpButton.StretchDraw( pDC, CRect( m_LeftWidth, 0, tw - m_RightWidth, m_TopHeight ),
  72. CRect( x + m_LeftWidth, y, x + w-m_RightWidth, y+m_TopHeight ) );
  73. m_bmpButton.StretchDraw( pDC, CRect( m_LeftWidth, th-m_BottomHeight, tw - m_RightWidth, th ),
  74. CRect( x + m_LeftWidth, y+h-m_BottomHeight, x + w-m_RightWidth, y+h ) );
  75. m_bmpButton.StretchDraw( pDC, CRect( 0, m_TopHeight, m_LeftWidth, th - m_BottomHeight ),
  76. CRect( x, y+m_TopHeight, x + m_LeftWidth , y+h-m_BottomHeight  ) );
  77. m_bmpButton.StretchDraw( pDC, CRect( tw - m_RightWidth, m_TopHeight, tw, th - m_BottomHeight  ),
  78. CRect( x + w-m_RightWidth, y+m_TopHeight, x+w, y+h-m_BottomHeight ) );
  79. m_bmpButton.StretchDraw( pDC, CRect( m_LeftWidth, m_TopHeight, tw - m_RightWidth, th - m_BottomHeight ),
  80. CRect( x + m_LeftWidth, y + m_TopHeight, x + w-m_RightWidth, y+h-m_BottomHeight ) );
  81. return TRUE;
  82. }
  83. BOOL CSkinButtonResource::DrawImage(CDC *pDC, CRect r, int state)
  84. {
  85. int w = m_bmpButton.Width();
  86. int h = m_bmpButton.Height();
  87. if ( state == 0 )
  88. {
  89. //nomral
  90. pDC->Draw3dRect( r, RGB(0,0,255), RGB(0, 0, 255 ) );
  91. //pDC->TextOut( 0, 0, "normal");
  92. DrawAImage( pDC, r, CRect( 0, 0, w/5, h ) );
  93. }
  94. else if ( state == 1 )
  95. {
  96. //hover
  97. pDC->Draw3dRect( r, RGB(0,255,0), RGB(0, 255, 0 ) );
  98. //pDC->TextOut( 0, 0, "hover");
  99. DrawAImage( pDC, r, CRect( 3 * w/5, 0, 4 * w/5, h ) );
  100. }
  101. else if ( state == 2 )
  102. {
  103. //down
  104. pDC->Draw3dRect( r, RGB(255,0,0), RGB(255, 0, 0 ) );
  105. //pDC->TextOut( 0, 0, "down");
  106. DrawAImage(pDC, r,  CRect( w/5, 0, 2 * w/5, h ) );
  107. }
  108. else if ( state == 3 )
  109. {
  110. //normal with focus
  111. pDC->Draw3dRect( r, RGB(255,255,0), RGB(255, 255, 0 ) );
  112. //pDC->TextOut( 0, 0, "focus");
  113. DrawAImage( pDC, r, CRect( 3 * w/5, 0, 4 * w/5, h ) );
  114. }
  115. else if ( state == 4 )
  116. {
  117. pDC->Draw3dRect( r, RGB(255,255,0), RGB(255, 255, 0 ) );
  118. DrawAImage( pDC, r, CRect( 2 * w/5, 0, 3 * w/5, h ) );
  119. }
  120. return TRUE;
  121. }
  122. BOOL CSkinButton::DrawImage(CMyBitmap &bmp)
  123. {
  124. m_bFocus = GetFocus()->GetSafeHwnd() == m_hWnd;
  125. m_bEnable = !(GetWindowLong(m_hWnd,GWL_STYLE) & WS_DISABLED);
  126. CBitmap *obmp;
  127. CDC memDC;
  128. CClientDC dc(0);
  129. CRect r;
  130. GetClientRect(r);
  131. memDC.CreateCompatibleDC(&dc);
  132. bmp.CreateCompatibleBitmap(&dc, r.Width(), r.Height() );
  133. obmp = memDC.SelectObject( &bmp );
  134. if ( !m_bEnable )
  135. {
  136. m_res->DrawImage( &memDC, r, 4 );
  137. }
  138. else
  139. if ( m_bMouseIn &&m_bDown )
  140. {
  141. m_res->DrawImage( &memDC, r, 2);
  142. }
  143. else if ( m_bMouseIn )
  144. {
  145. m_res->DrawImage( &memDC, r, 1 );
  146. }
  147. else if ( m_bFocus )
  148. {
  149. m_res->DrawImage( &memDC, r, 3 );
  150. }
  151. else
  152. {
  153. m_res->DrawImage( &memDC, r,0  );
  154. }
  155. memDC.SelectObject( obmp );
  156. return TRUE;
  157. }
  158. void CSkinButton::OnPaint() 
  159. {
  160. if ( !m_res || !m_res->m_bInited )
  161. {
  162. Default();
  163. return;
  164. }
  165. //Note:!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  166. // to draw button, cliprgn is needed
  167. //
  168. CPaintDC dc(this); // device context for painting
  169. CRect r;
  170. CMyBitmap bmp;
  171. GetClientRect(r);
  172. DrawImage(bmp);
  173. SetWindowRgn(bmp.CreateRgnFromFile(RGB(255,0,255)), TRUE );
  174. HRGN hRgn = CreateRectRgn(0, 0, 0, 0);
  175. GetWindowRgn(hRgn);
  176. ::SelectClipRgn(dc.GetSafeHdc(), hRgn);
  177. bmp.Draw( &dc, r );
  178. dc.SelectClipRgn(NULL);
  179. DeleteObject(hRgn);
  180. //dc.BitBlt( 0, 0, r.Width(), r.Height(), &memDC, 0, 0, SRCCOPY);
  181. DrawText( &dc );
  182. // TODO: Add your message handler code here
  183. // Do not call CButton::OnPaint() for painting messages
  184. }
  185. void CSkinButton::OnMouseMove(UINT nFlags, CPoint point) 
  186. {
  187. // TODO: Add your message handler code here and/or call default
  188. HRGN hRgn = CreateRectRgn(0, 0, 0, 0);
  189. GetWindowRgn(hRgn);
  190. if ( PtInRegion( hRgn, point.x, point.y ))
  191. {
  192. if ( !m_bMouseIn)
  193. {
  194. m_bMouseIn = TRUE;
  195. //GetRegion();
  196. Invalidate();
  197. UpdateWindow();
  198. SetCapture();
  199. }
  200. }
  201. else
  202. {
  203. if ( m_bMouseIn)
  204. {
  205. m_bMouseIn = FALSE;
  206. //GetRegion();
  207. Invalidate();
  208. UpdateWindow();
  209. if ( !m_bDown )
  210. ReleaseCapture();
  211. }
  212. }
  213. DeleteObject(hRgn);
  214. }
  215. void CSkinButton::OnLButtonDown(UINT nFlags, CPoint point) 
  216. {
  217. // TODO: Add your message handler code here and/or call default
  218. //CButton::OnLButtonDown(nFlags, point);
  219. m_bDown = TRUE;
  220. m_bMouseIn = TRUE;
  221. //GetRegion();
  222. Invalidate();
  223. UpdateWindow();
  224. SetFocus();
  225. }
  226. void CSkinButton::OnLButtonUp(UINT nFlags, CPoint point) 
  227. {
  228. // TODO: Add your message handler code here and/or call default
  229. ReleaseCapture();
  230. m_bDown = FALSE;
  231. if ( m_bMouseIn )
  232. {
  233. m_bMouseIn = FALSE;
  234. //GetRegion();
  235. Invalidate();
  236. UpdateWindow();
  237. GetParent()->SendMessage( WM_COMMAND, GetDlgCtrlID(), (LPARAM)m_hWnd );
  238. }
  239. else
  240. {
  241. //GetRegion();
  242. Invalidate();
  243. UpdateWindow();
  244. }
  245. }
  246. void CSkinButton::OnLButtonDblClk(UINT nFlags, CPoint point) 
  247. {
  248. // TODO: Add your message handler code here and/or call default
  249. //CButton::OnLButtonDblClk(nFlags, point);
  250. }
  251. void CSkinButton::OnSetFocus(CWnd* pOldWnd) 
  252. {
  253. //CButton::OnSetFocus(pOldWnd);
  254. // TODO: Add your message handler code here
  255. }
  256. void CSkinButton::OnKillFocus(CWnd* pNewWnd) 
  257. {
  258. //CButton::OnKillFocus(pNewWnd);
  259. // TODO: Add your message handler code here
  260. }
  261. BOOL CSkinButton::DrawText(CDC *pDC )
  262. {
  263. CRect r;
  264. CString str;
  265. GetClientRect( r );
  266. GetWindowText( str );
  267. CFont *ofont;
  268. ofont = pDC->SelectObject( GetParent()->GetFont() );
  269. if ( m_bEnable )
  270. pDC->SetTextColor(m_textcolor);
  271. else
  272. pDC->SetTextColor(RGB(100,100,100));
  273. pDC->SetBkMode(TRANSPARENT);
  274. pDC->DrawText( str, r, DT_CENTER | DT_SINGLELINE | DT_VCENTER );
  275. pDC->SelectObject(ofont);
  276. return TRUE;
  277. }
  278. BOOL CSkinButton::OnEraseBkgnd(CDC* pDC) 
  279. {
  280. // TODO: Add your message handler code here and/or call default
  281. return TRUE;
  282. }
  283. void CSkinButton::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 
  284. {
  285. // TODO: Add your message handler code here and/or call default
  286. if ( nChar == VK_SPACE )
  287. OnLButtonDown( 0, 0 );
  288. //CButton::OnKeyDown(nChar, nRepCnt, nFlags);
  289. }
  290. void CSkinButton::OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags) 
  291. {
  292. // TODO: Add your message handler code here and/or call default
  293. if ( nChar == VK_SPACE )
  294. OnLButtonUp( 0, 0 );
  295. //CButton::OnKeyUp(nChar, nRepCnt, nFlags);
  296. }
  297. BOOL CSkinButton::GetRegion()
  298. {
  299. CMyBitmap bmp;
  300. /*
  301. if ( hRgn ) 
  302. {
  303. dc.SelectClipRgn(NULL);
  304. DeleteObject(hRgn);
  305. }
  306. HRGN  hRgn = NULL;
  307. if ( m_res->m_bTrans )
  308. {
  309. HRGN rgn;
  310. rgn = bmp.CreateRgnFromFile(RGB(255,0,255));
  311. //strange, must after ClipRgn
  312. //SetWindowPos( NULL, 0, 0, bmp.Width(), bmp.Height(), SWP_NOZORDER | SWP_NOMOVE );
  313. HRGN hRgn = CreateRectRgn(0, 0, 0, 0);
  314. SetWindowRgn( rgn, TRUE );
  315. GetWindowRgn(hRgn);
  316. ::SelectClipRgn(dc.GetSafeHdc(), hRgn);
  317. }
  318. */
  319. //DrawImage( bmp );
  320. CRgn rgn;
  321. rgn.CreateEllipticRgn( 00, 00, 50, 50 );
  322. SetWindowRgn((HRGN)rgn.Detach(), TRUE );
  323. //SetWindowRgn(bmp.CreateRgnFromFile(RGB(255,0,255)), TRUE );
  324. return TRUE;
  325. }
  326. BOOL CSkinButton::EnableWindow( BOOL bEnable)
  327. {
  328. CWnd::EnableWindow( bEnable );
  329. OnPaint();
  330. return TRUE;
  331. }
  332. void CSkinButton::OnEnable(BOOL bEnable) 
  333. {
  334. // CButton::OnEnable(bEnable);
  335. if ( bEnable )
  336. ModifyStyle( WS_DISABLED, 0, 0);
  337. else
  338. ModifyStyle( 0, WS_DISABLED, 0);
  339. // TODO: Add your message handler code here
  340. Invalidate();
  341. UpdateWindow();
  342. }