MsnEdit.cpp
上传用户:seeker_wen
上传日期:2016-05-23
资源大小:2084k
文件大小:4k
源码类别:

ICQ/即时通讯

开发平台:

Visual C++

  1. // EditWithButton.cpp : implementation file
  2. #include "stdafx.h"
  3. #include "MsnEdit.h"
  4. // CMsnEdit
  5. IMPLEMENT_DYNAMIC(CMsnEdit, CEdit)
  6. CMsnEdit::CMsnEdit()
  7. {
  8. m_iButtonClickedMessageId = WM_USER_EDITBUTTON_CLICKED;
  9. m_bButtonExistsAlways = FALSE;
  10. m_rcEditArea.SetRect(0,0,0,0);
  11. }
  12. CMsnEdit::~CMsnEdit()
  13. {
  14. }
  15. BEGIN_MESSAGE_MAP(CMsnEdit, CEdit)
  16. ON_MESSAGE(WM_SETFONT, OnSetFont)
  17. ON_WM_SIZE()
  18. ON_WM_ERASEBKGND()
  19. ON_WM_CHAR()
  20. ON_WM_KEYDOWN()
  21. ON_WM_LBUTTONUP()
  22. ON_WM_SETCURSOR()
  23. ON_WM_CREATE()
  24. END_MESSAGE_MAP()
  25. // CMsnEdit message handlers
  26. void CMsnEdit::PreSubclassWindow( )
  27. {
  28. // We must have a multiline edit
  29. // to be able to set the edit rect
  30. ASSERT( GetStyle() & ES_MULTILINE );
  31. ResizeWindow();
  32. CEdit::PreSubclassWindow();
  33. }
  34. BOOL CMsnEdit::PreTranslateMessage( MSG* pMsg )
  35. {
  36. return CEdit::PreTranslateMessage(pMsg);
  37. }
  38. BOOL CMsnEdit::SetBitmaps(CString EmptyEdit, CString FilledEdit)
  39. {
  40. //delete if already loaded.. just in case
  41. m_bmpEmptyEdit = EmptyEdit;
  42. m_bmpFilledEdit = FilledEdit;
  43. return TRUE;
  44. }
  45. //client area
  46. void CMsnEdit::SetButtonArea(CRect rcButtonArea)
  47. {
  48. m_rcButtonArea = rcButtonArea;
  49. }
  50. void CMsnEdit::ResizeWindow()
  51. {
  52. if (!::IsWindow(m_hWnd)) return;
  53. //proceed only if edit area is set
  54. if (m_rcEditArea == CRect(0,0,0,0)) return;
  55. // if (GetWindowTextLength() == 0)
  56. // {
  57. // SetWindowPos(&wndTop,0,0,m_sizeEmptyBitmap.cx,m_sizeEmptyBitmap.cy,SWP_NOMOVE|SWP_NOZORDER);
  58. // }else
  59. // {
  60. // SetWindowPos(&wndTop,0,0,m_sizeFilledBitmap.cx,m_sizeFilledBitmap.cy,SWP_NOMOVE|SWP_NOZORDER);
  61. // }
  62. SetRect(&m_rcEditArea);
  63. }
  64. //set edit area may be called before creating the edit control
  65. //especially when using the CEdit::Create method
  66. //or after creating the edit control in CEdit::DoDataExchange
  67. //we call ResizeWindow once in SetEditArea and once in PreSubclassWindow
  68. BOOL CMsnEdit::SetEditArea(CRect rcEditArea)
  69. {
  70. m_rcEditArea = rcEditArea;
  71. ResizeWindow();
  72. return TRUE;
  73. }
  74. void CMsnEdit::SetButtonClickedMessageId(UINT iButtonClickedMessageId)
  75. {
  76. m_iButtonClickedMessageId = iButtonClickedMessageId;
  77. }
  78. void CMsnEdit::SetButtonExistsAlways(BOOL bButtonExistsAlways)
  79. {
  80. m_bButtonExistsAlways = bButtonExistsAlways;
  81. }
  82. BOOL CMsnEdit::OnEraseBkgnd(CDC* pDC)
  83. {
  84. CRect rc;
  85. GetClientRect(rc);
  86. int iTextLength = GetWindowTextLength();
  87.    
  88. if (iTextLength == 0)
  89. {
  90. DrawSkinImageRes(pDC->m_hDC, rc, m_bmpEmptyEdit, 15, 35, 15, 15, FALSE);
  91. }
  92. else
  93. {
  94. DrawSkinImageRes(pDC->m_hDC, rc, m_bmpFilledEdit, 15, 35, 15, 15, FALSE);
  95. }
  96. return TRUE;
  97. }
  98. void CMsnEdit::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
  99. {
  100. //this will draw the background again
  101. //so that the button will be drawn if the text exists
  102. InvalidateRect(NULL);
  103. CEdit::OnKeyDown(nChar, nRepCnt, nFlags);
  104. }
  105. void CMsnEdit::OnLButtonUp(UINT nFlags, CPoint point)
  106. {
  107. if (m_rcButtonArea.PtInRect(point))
  108. {
  109. if ( (GetWindowTextLength() > 0) || m_bButtonExistsAlways)
  110. {
  111. CWnd *pOwner = GetOwner();
  112. if (pOwner)
  113. {
  114. pOwner->SendMessage(m_iButtonClickedMessageId,0,0);
  115. }
  116. }
  117. }
  118. CEdit::OnLButtonUp(nFlags, point);
  119. }
  120. BOOL CMsnEdit::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
  121. {
  122. CPoint pntCursor;
  123. GetCursorPos(&pntCursor);
  124. ScreenToClient(&pntCursor);
  125. //show arrow cursor
  126. if (!m_rcEditArea.PtInRect(pntCursor))
  127. {
  128. SetCursor(AfxGetApp()->LoadStandardCursor(MAKEINTRESOURCE(32649)));
  129. return TRUE;
  130. }
  131. return CEdit::OnSetCursor(pWnd, nHitTest, message);
  132. }
  133. int CMsnEdit::OnCreate(LPCREATESTRUCT lpCreateStruct)
  134. {
  135. if (CEdit::OnCreate(lpCreateStruct) == -1)
  136. return -1;
  137. ResizeWindow();
  138. return 0;
  139. }
  140. LRESULT CMsnEdit::OnSetFont( WPARAM wParam, LPARAM lParam )
  141. {
  142. DefWindowProc( WM_SETFONT, wParam, lParam );
  143. ResizeWindow();
  144. return 0;
  145. }
  146. void CMsnEdit::OnSize( UINT nType, int cx, int cy ) 
  147. {
  148. CEdit::OnSize( nType, cx, cy );
  149. m_rcEditArea = CRect(20,9,cx-35,22);
  150. m_rcButtonArea = CRect(cx-30,0,30,32);
  151. SetRect(CRect(20,9,cx-35,22));
  152. }