GfxGroupEdit.cpp
上传用户:guangzhiyw
上传日期:2007-01-09
资源大小:495k
文件大小:3k
源码类别:

ICQ/即时通讯

开发平台:

Visual C++

  1. // Copyright (c) Iuri Apollonio 1998
  2. // Use & modify as you want & need, and leave those 4 lines.
  3. // Strongly based on article "Inplace edit control" of Mario Contestabile and "Editable subitems" of Zafir
  4. // http://www.codeguru.com
  5. // GfxGroupEdit.cpp : implementation file
  6. //
  7. #include "stdafx.h"
  8. //#include "micq.h"
  9. #include "GfxGroupEdit.h"
  10. #include "GfxOutBarCtrl.h"
  11. #ifdef _DEBUG
  12. #define new DEBUG_NEW
  13. #undef THIS_FILE
  14. static char THIS_FILE[] = __FILE__;
  15. #endif
  16. /////////////////////////////////////////////////////////////////////////////
  17. // CGfxGroupEdit
  18. CGfxGroupEdit::CGfxGroupEdit()
  19. {
  20. bEscapeKey = FALSE;
  21. iIndex = -1;
  22. msgSend = NM_OB_ONGROUPENDEDIT;
  23. bNoDown = false;
  24. }
  25. CGfxGroupEdit::~CGfxGroupEdit()
  26. {
  27. }
  28. BEGIN_MESSAGE_MAP(CGfxGroupEdit, CEdit)
  29. //{{AFX_MSG_MAP(CGfxGroupEdit)
  30. ON_WM_KILLFOCUS()
  31. ON_WM_CREATE()
  32. ON_WM_CHAR()
  33. //}}AFX_MSG_MAP
  34. END_MESSAGE_MAP()
  35. /////////////////////////////////////////////////////////////////////////////
  36. // CGfxGroupEdit message handlers
  37. void CGfxGroupEdit::OnKillFocus(CWnd* pNewWnd) 
  38. {
  39. PostMessage(WM_CLOSE, 0, 0);
  40. if (!bEscapeKey)
  41. {
  42. GetWindowText(text);
  43. if (text != "") GetOwner()->SendMessage(WM_OUTBAR_NOTIFY, msgSend, (LPARAM) this);
  44. }
  45. }
  46. BOOL CGfxGroupEdit::PreTranslateMessage(MSG* pMsg) 
  47. {
  48. if (pMsg->wParam == VK_RETURN)
  49. {
  50. PostMessage(WM_CLOSE, 0, 0);
  51. return TRUE;
  52. }
  53. else if (pMsg->wParam == VK_ESCAPE)
  54. {
  55. PostMessage(WM_CLOSE, 0, 0);
  56. return bEscapeKey = TRUE;
  57. }
  58. return CEdit::PreTranslateMessage(pMsg);
  59. }
  60. void CGfxGroupEdit::PostNcDestroy() 
  61. {
  62. CEdit::PostNcDestroy();
  63. delete this;
  64. }
  65. int CGfxGroupEdit::OnCreate(LPCREATESTRUCT lpCreateStruct) 
  66. {
  67. if (CEdit::OnCreate(lpCreateStruct) == -1)
  68. return -1;
  69. SendMessage(WM_SETFONT,(WPARAM) GetStockObject(DEFAULT_GUI_FONT),MAKELPARAM(TRUE,0));
  70. return 0;
  71. }
  72. void CGfxGroupEdit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) 
  73. {
  74. if (msgSend == NM_OB_ONGROUPENDEDIT)
  75. {
  76. CEdit::OnChar(nChar, nRepCnt, nFlags);
  77. return;
  78. }
  79. if (nChar == VK_ESCAPE || nChar == VK_RETURN)
  80. {
  81. if (nChar == VK_ESCAPE) bEscapeKey = TRUE;
  82. GetParent()->SetFocus();
  83. return;
  84. }
  85. CEdit::OnChar(nChar, nRepCnt, nFlags);
  86. CString str;
  87. CRect rect, parentrect;
  88. GetClientRect(&rect);
  89. GetParent()->GetClientRect(&parentrect);
  90. ClientToScreen(&rect);
  91. GetParent()->ScreenToClient(&rect);
  92. GetWindowText(str);
  93. CWindowDC dc(this);
  94. CFont *pFont = GetParent()->GetFont();
  95. CFont *pFontDC = dc.SelectObject(pFont);
  96. CRect szrc(rect);
  97. szrc.bottom = szrc.top;
  98. if (bNoDown == true)
  99. {
  100. dc.DrawText(str, szrc, DT_CALCRECT);
  101. if (szrc.right >= parentrect.right - 1) rect.right = parentrect.right - 1;
  102. else rect.right = szrc.right;
  103. MoveWindow(&rect);
  104. return;
  105. }
  106. dc.DrawText(str, szrc, DT_WORDBREAK|DT_CENTER|DT_CALCRECT);
  107. dc.SelectObject(pFontDC);
  108. CSize size = szrc.Size();
  109. if (size.cx > rect.Width())
  110. {
  111. if (size.cx + rect.left < parentrect.right) rect.right = rect.left + size.cx;
  112. else rect.right = parentrect.right;
  113. MoveWindow(&rect);
  114. }
  115. else if (size.cy > rect.Height())
  116. {
  117. if (size.cy + rect.bottom < parentrect.bottom) rect.bottom = rect.top + size.cy;
  118. else rect.bottom = parentrect.bottom;
  119. MoveWindow(&rect);
  120. }
  121. }