FormatBar.cpp
上传用户:shilei2004
上传日期:2020-07-18
资源大小:83k
文件大小:7k
源码类别:

RichEdit

开发平台:

Visual C++

  1. /////////////////////////////////////////////////////////////////////////////
  2. // FormatBar.cpp : implementation file
  3. // Download by http://www.codefans.net
  4. #include "stdafx.h"
  5. #include "RichEdit.h"
  6. #include "FormatBar.h"
  7. #ifdef _DEBUG
  8. #define new DEBUG_NEW
  9. #undef THIS_FILE
  10. static char THIS_FILE[] = __FILE__;
  11. #endif
  12. /////////////////////////////////////////////////////////////////////////////
  13. // CFormatBar
  14. // Declare const array of font sizes
  15. const static int nFontSizes[] = 
  16. {8, 9, 10, 11, 12, 14, 16, 18, 20, 22, 24, 26, 28, 36, 48, 72};
  17. CFormatBar::CFormatBar(UINT nID )
  18. {
  19. nToolbarID = nID;
  20. }
  21. CFormatBar::~CFormatBar()
  22. {
  23. }
  24. BEGIN_MESSAGE_MAP(CFormatBar, CSA3DToolBar)
  25. //{{AFX_MSG_MAP(CFormatBar)
  26. ON_WM_CREATE()
  27. //}}AFX_MSG_MAP
  28. ON_CBN_SELENDOK(IDC_FONTNAME, OnSelectFontName)
  29. ON_CBN_SELENDOK(IDC_FONTSIZE, OnSelectFontSize)
  30. END_MESSAGE_MAP()
  31. /////////////////////////////////////////////////////////////////////////////
  32. // CFormatBar message handlers
  33. int CFormatBar::OnCreate(LPCREATESTRUCT lpCreateStruct) 
  34. {
  35. if (CToolBar::OnCreate(lpCreateStruct) == -1)
  36. return -1;
  37. // Load the toolbar
  38. if( !LoadToolBar( nToolbarID ) )
  39. return -1;
  40. // Get the average char width
  41. CClientDC dc(this);
  42. // Determine the size required by the font comboboxes
  43. // We will use the DEFAULT_GUI_FONT
  44. HGDIOBJ hFont = GetStockObject( DEFAULT_GUI_FONT );
  45. CFont font;
  46. font.Attach( hFont );
  47. dc.SelectObject( font );
  48. TEXTMETRIC tm;
  49. dc.GetTextMetrics( &tm );
  50. int cxChar = tm.tmAveCharWidth;
  51. int cyChar = tm.tmHeight + tm.tmExternalLeading;
  52. // Create the Font Name combo
  53. CRect rect; 
  54. GetItemRect( CommandToIndex(IDC_FONTNAME), &rect );
  55. rect.right = rect.left + (LF_FACESIZE+2)*cxChar;
  56. rect.bottom = rect.top + 16*cyChar;
  57. SetButtonInfo( CommandToIndex(IDC_FONTNAME), IDC_FONTNAME, 
  58. TBBS_SEPARATOR, rect.Width() );
  59. UINT nCreateStyle = WS_TABSTOP|WS_VISIBLE|WS_VSCROLL;
  60. if (!m_cmbFontName.Create(nCreateStyle|CBS_DROPDOWNLIST|CBS_SORT, 
  61. rect, this, IDC_FONTNAME))
  62. {
  63. TRACE0("Failed to create Font Name combo-boxn");
  64. return -1;
  65. }
  66. // Create Font Size combo
  67. GetItemRect( CommandToIndex(IDC_FONTSIZE), &rect );
  68. rect.right = rect.left + 8*cxChar;
  69. rect.bottom = rect.top + 16*cyChar;
  70. SetButtonInfo( CommandToIndex(IDC_FONTSIZE), IDC_FONTSIZE, 
  71. TBBS_SEPARATOR, rect.Width() );
  72. if (!m_cmbFontSize.Create(nCreateStyle|CBS_DROPDOWN|WS_HSCROLL, 
  73. rect, this, IDC_FONTSIZE))
  74. {
  75. TRACE0("Failed to create Font Size combo-boxn");
  76. return -1;
  77. }
  78. m_cmbFontSize.LimitText(4);
  79. // Set the font for the combo boxes to DEFAULT_GUI_FONT
  80. m_cmbFontName.SetFont(&font);
  81. m_cmbFontSize.SetFont(&font);
  82. // Fill the Font names in the Font Name combo
  83. ::EnumFontFamilies( dc.m_hDC, NULL, (FONTENUMPROC)EnumFontFamProc, 
  84. (LPARAM) this );
  85. // Fill the Font Size combo
  86. CString sSize;
  87. int nSizeCount = sizeof(nFontSizes) / sizeof(nFontSizes[0]);
  88. for( int i=0; i < nSizeCount; i++ )
  89. {
  90. sSize.Format("%d", nFontSizes[i] );
  91. m_cmbFontSize.AddString( sSize );
  92. }
  93. return 0;
  94. }
  95. int CALLBACK CFormatBar::EnumFontFamProc(ENUMLOGFONT *lpelf, NEWTEXTMETRIC *lpntm,
  96. int nFontType, LPARAM lParam)
  97. {
  98. CFormatBar* pWnd = (CFormatBar*)lParam;
  99. // Add the font name to the combo
  100. pWnd->m_cmbFontName.AddString(lpelf->elfLogFont.lfFaceName);
  101. return 1; // 1 to continue enumeration
  102. }
  103. void CFormatBar::OnSelectFontName()
  104. {
  105. TCHAR szFontName[LF_FACESIZE];
  106. int nIndex = m_cmbFontName.GetCurSel();
  107. m_cmbFontName.GetLBText( nIndex, szFontName );
  108. // If font name is empty - return
  109. if( szFontName[0] == 0 )
  110. return;
  111. CHARNMHDR fh;
  112. CHARFORMAT& cf = fh.cf;
  113. fh.hwndFrom = m_hWnd;
  114. fh.idFrom = GetDlgCtrlID();
  115. fh.code = FN_SETFORMAT;
  116. cf.dwMask = CFM_FACE;
  117. _tcsncpy(cf.szFaceName, szFontName, LF_FACESIZE); //strncpy
  118. GetOwner()->SendMessage(WM_NOTIFY, fh.idFrom, (LPARAM)&fh);
  119. }
  120. void CFormatBar::OnSelectFontSize()
  121. {
  122. TCHAR szSize[5];
  123. int index = m_cmbFontSize.GetCurSel();
  124. if( index != CB_ERR )
  125. m_cmbFontSize.GetLBText(index, szSize );
  126. else
  127. m_cmbFontSize.GetWindowText( szSize, 5 );
  128. // Get size in Twips
  129. int nSize = _ttoi( szSize ) * 20; // atoi for tchar
  130. if( !nSize )
  131. return;
  132. CHARNMHDR fh;
  133. CHARFORMAT& cf = fh.cf;
  134. fh.hwndFrom = m_hWnd;
  135. fh.idFrom = GetDlgCtrlID();
  136. fh.code = FN_SETFORMAT;
  137. cf.dwMask = CFM_SIZE;
  138. cf.yHeight = nSize;
  139. GetOwner()->SendMessage(WM_NOTIFY, fh.idFrom, (LPARAM)&fh);
  140. }
  141. void CFormatBar::OnUpdateCmdUI(CFrameWnd* pTarget, BOOL bDisableIfNoHndler)
  142. {
  143. // Take care of the regular toolbar buttons
  144. CToolBar::OnUpdateCmdUI( pTarget, bDisableIfNoHndler);
  145. // Don't update the combo boxes if user changing font attribute
  146. CWnd *pWnd = GetFocus();
  147. if( pWnd == &m_cmbFontName || m_cmbFontSize.IsChild(pWnd) )
  148. return;
  149. // get the current font from the view and update
  150. CHARNMHDR fh;
  151. CHARFORMAT& cf = fh.cf;
  152. fh.hwndFrom = m_hWnd;
  153. fh.idFrom = GetDlgCtrlID();
  154. fh.code = FN_GETFORMAT;
  155. CWnd *pOwnerWnd = GetOwner();
  156. if( !GetOwner()->SendMessage(WM_NOTIFY, fh.idFrom, (LPARAM)&fh) )
  157. {
  158. TRACE0("The Rich Edit View/Control has to handle the FN_GETFORMATn"
  159. "notification for the Format Bar to work properlyn");
  160. return;
  161. }
  162. // Update the font only if the selection font is different
  163. TCHAR szName[LF_FACESIZE];
  164. m_cmbFontName.GetWindowText( szName, LF_FACESIZE );
  165. // the selection must be same font and charset to display correctly
  166. if ((cf.dwMask & (CFM_FACE|CFM_CHARSET)) != (CFM_FACE|CFM_CHARSET))
  167. m_cmbFontName.SetCurSel( -1 );
  168. else if( ::_tcscmp( szName, cf.szFaceName ) != 0 )
  169. {
  170. if( m_cmbFontName.SelectString( -1, cf.szFaceName ) == CB_ERR )
  171. m_cmbFontName.SetCurSel( -1 );
  172. }
  173. // Update the font size
  174. TCHAR szSize[5];
  175. m_cmbFontSize.GetWindowText( szSize, 5 );
  176. int nSize = _ttoi( szSize ); // atoi for tchar
  177. // Update the font size only if selection is different 
  178. int nSelSize = (cf.dwMask & CFM_SIZE) ? cf.yHeight/20 : 0;
  179. if( nSize != nSelSize )
  180. {
  181. if(cf.dwMask & CFM_SIZE)
  182. {
  183. CString strSize;
  184. strSize.Format("%d", nSelSize );
  185. m_cmbFontSize.SetWindowText( strSize );
  186. }
  187. else
  188. m_cmbFontSize.SetCurSel(-1);
  189. }
  190. }
  191. BOOL CFormatBar::PreTranslateMessage(MSG* pMsg) 
  192. {
  193. if (pMsg->message == WM_KEYDOWN)
  194. {
  195. NMHDR nm;
  196. nm.hwndFrom = m_hWnd;
  197. nm.idFrom = GetDlgCtrlID();
  198. nm.code = NM_RETURN;
  199. switch (pMsg->wParam)
  200. {
  201. case VK_RETURN:
  202. // Send change notification
  203. if( m_cmbFontName.IsChild(GetFocus()) )
  204. OnSelectFontName();
  205. else if( m_cmbFontSize.IsChild(GetFocus()) )
  206. OnSelectFontSize();
  207. //Fall through
  208. case VK_ESCAPE:
  209. GetOwner()->SendMessage(WM_NOTIFY, nm.idFrom, (LPARAM)&nm);
  210. return TRUE;
  211. }
  212. }
  213. return CToolBar::PreTranslateMessage(pMsg);
  214. }