CaptionBtnDlg.cpp
上传用户:zslianheng
上传日期:2013-04-03
资源大小:946k
文件大小:4k
源码类别:

Linux/Unix编程

开发平台:

Visual C++

  1. /***************************************************************************
  2.  *                                                                         *
  3.  *   This program is free software; you can redistribute it and/or modify  *
  4.  *   it under the terms of the GNU General Public License as published by  *
  5.  *   the Free Software Foundation; either version 2 of the License, or     *
  6.  *   (at your option) any later version.                                   *
  7.  *                                                                         *
  8.  *   copyright            : (C) 2002 by Zhang Yong                         *
  9.  *   email                : z-yong163@163.com                              *
  10.  ***************************************************************************/
  11. // CaptionBtnDlg.cpp : implementation file
  12. //
  13. #include "stdafx.h"
  14. #include "CaptionBtnDlg.h"
  15. #ifdef _DEBUG
  16. #define new DEBUG_NEW
  17. #undef THIS_FILE
  18. static char THIS_FILE[] = __FILE__;
  19. #endif
  20. /////////////////////////////////////////////////////////////////////////////
  21. // CCaptionBtnDlg dialog
  22. CCaptionBtnDlg::CCaptionBtnDlg(int buttons, UINT nIDTemplate, CWnd* pParent /*=NULL*/)
  23. : CDialog(nIDTemplate, pParent)
  24. {
  25. //{{AFX_DATA_INIT(CCaptionBtnDlg)
  26. // NOTE: the ClassWizard will add member initialization here
  27. //}}AFX_DATA_INIT
  28. nrButtons = buttons;
  29. pressedButton = -1;
  30. inButton = FALSE;
  31. }
  32. int CCaptionBtnDlg::hitTest(CPoint &pt)
  33. {
  34. int w = nrButtons * 14;
  35. CRect rc;
  36. GetWindowRect(rc);
  37. rc.right -= 20;
  38. rc.left = rc.right - w;
  39. rc.top += 6;
  40. rc.bottom = rc.top + 12;
  41. if (rc.PtInRect(pt))
  42. return (rc.right - pt.x - 1) / 14;
  43. return -1;
  44. }
  45. void CCaptionBtnDlg::drawButton(int button, BOOL pressed)
  46. {
  47. CWindowDC dc(this);
  48. CRect rc;
  49. GetWindowRect(rc);
  50. rc.OffsetRect(-rc.left, -rc.top);
  51. rc.right -= 20 + button * 14;
  52. rc.left = rc.right - 12;
  53. rc.top += 6;
  54. rc.bottom = rc.top + 12;
  55. CRgn rgn;
  56. rgn.CreateRectRgn(rc.left, rc.top, rc.right, rc.bottom);
  57. dc.SelectClipRgn(&rgn);
  58. drawCaptionBtn(&dc, rc, button, pressed);
  59. }
  60. void CCaptionBtnDlg::drawButtons()
  61. {
  62. for (int i = 0; i < nrButtons; i++)
  63. drawButton(i, FALSE);
  64. }
  65. void CCaptionBtnDlg::DoDataExchange(CDataExchange* pDX)
  66. {
  67. CDialog::DoDataExchange(pDX);
  68. //{{AFX_DATA_MAP(CCaptionBtnDlg)
  69. // NOTE: the ClassWizard will add DDX and DDV calls here
  70. //}}AFX_DATA_MAP
  71. }
  72. BEGIN_MESSAGE_MAP(CCaptionBtnDlg, CDialog)
  73. //{{AFX_MSG_MAP(CCaptionBtnDlg)
  74. ON_WM_NCPAINT()
  75. ON_WM_ACTIVATE()
  76. ON_WM_NCLBUTTONDOWN()
  77. ON_WM_LBUTTONUP()
  78. ON_WM_MOUSEMOVE()
  79. ON_WM_NCACTIVATE()
  80. //}}AFX_MSG_MAP
  81. ON_MESSAGE(WM_SETTEXT, OnSetText)
  82. END_MESSAGE_MAP()
  83. /////////////////////////////////////////////////////////////////////////////
  84. // CCaptionBtnDlg message handlers
  85. void CCaptionBtnDlg::OnNcPaint() 
  86. {
  87. CDialog::OnNcPaint();
  88. drawButtons();
  89. }
  90. void CCaptionBtnDlg::OnActivate(UINT nState, CWnd* pWndOther, BOOL bMinimized) 
  91. {
  92. CDialog::OnActivate(nState, pWndOther, bMinimized);
  93. drawButtons();
  94. }
  95. void CCaptionBtnDlg::OnNcLButtonDown(UINT nHitTest, CPoint point) 
  96. {
  97. int button = hitTest(point);
  98. if (button >= 0) {
  99. SetCapture();
  100. pressedButton = button;
  101. inButton = TRUE;
  102. drawButton(button, TRUE);
  103. }
  104. CDialog::OnNcLButtonDown(nHitTest, point);
  105. }
  106. void CCaptionBtnDlg::OnLButtonUp(UINT nFlags, CPoint point) 
  107. {
  108. if (GetCapture() == this) {
  109. ReleaseCapture();
  110. ClientToScreen(&point);
  111. int button = hitTest(point);
  112. if (button >= 0 && pressedButton == button) {
  113. drawButton(button, FALSE);
  114. onCaptionBtnClicked(button);
  115. }
  116. pressedButton = -1;
  117. }
  118. CDialog::OnLButtonUp(nFlags, point);
  119. }
  120. void CCaptionBtnDlg::OnMouseMove(UINT nFlags, CPoint point) 
  121. {
  122. if (GetCapture() == this) {
  123. ClientToScreen(&point);
  124. int button = hitTest(point);
  125. if (inButton && button != pressedButton) {
  126. inButton = FALSE;
  127. drawButton(pressedButton, FALSE);
  128. } else if (!inButton && button == pressedButton) {
  129. inButton = TRUE;
  130. drawButton(pressedButton, TRUE);
  131. }
  132. }
  133. CDialog::OnMouseMove(nFlags, point);
  134. }
  135. LRESULT CCaptionBtnDlg::OnSetText(WPARAM wParam, LPARAM lParam)
  136. {
  137. LRESULT res = Default();
  138. drawButtons();
  139. return res;
  140. }
  141. BOOL CCaptionBtnDlg::OnNcActivate(BOOL bActive) 
  142. {
  143. BOOL ret = CDialog::OnNcActivate(bActive);
  144. drawButtons();
  145. return ret;
  146. }