GFXGROUPEDIT.CPP
上传用户:lvjun8202
上传日期:2013-04-30
资源大小:797k
文件大小:3k
源码类别:

SNMP编程

开发平台:

C/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. #ifdef _DEBUG
  10. #define new DEBUG_NEW
  11. #undef THIS_FILE
  12. static char THIS_FILE[] = __FILE__;
  13. #endif
  14. /////////////////////////////////////////////////////////////////////////////
  15. // CGfxGroupEdit
  16. CGfxGroupEdit::CGfxGroupEdit()
  17. {
  18. bEscapeKey = FALSE;
  19. iIndex = -1;
  20. msgSend = NM_OB_ONGROUPENDEDIT;
  21. bNoDown = false;
  22. }
  23. CGfxGroupEdit::~CGfxGroupEdit()
  24. {
  25. }
  26. BEGIN_MESSAGE_MAP(CGfxGroupEdit, CEdit)
  27. //{{AFX_MSG_MAP(CGfxGroupEdit)
  28. ON_WM_KILLFOCUS()
  29. ON_WM_CREATE()
  30. ON_WM_CHAR()
  31. //}}AFX_MSG_MAP
  32. END_MESSAGE_MAP()
  33. /////////////////////////////////////////////////////////////////////////////
  34. // CGfxGroupEdit message handlers
  35. void CGfxGroupEdit::OnKillFocus(CWnd* pNewWnd) 
  36. {
  37. PostMessage(WM_CLOSE, 0, 0);
  38. if (!bEscapeKey)
  39. {
  40. GetWindowText(text);
  41. }
  42. if (text == "") 
  43. text = _T("未命名");
  44. GetOwner()->SendMessage(WM_OUTBAR_NOTIFY, msgSend, (LPARAM) this);
  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. }