GFXGROUPEDIT.CPP
上传用户:maryhy001
上传日期:2007-05-02
资源大小:2317k
文件大小:3k
源码类别:

网格计算

开发平台:

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