GuiComboFont.cpp
上传用户:wlkj888
上传日期:2022-08-01
资源大小:806k
文件大小:11k
源码类别:

对话框与窗口

开发平台:

Visual C++

  1. /****************************************************************************
  2.  * *  
  3.  * GuiToolKit   *
  4.  * (MFC extension) *  
  5.  * Created by Francisco Campos G. www.beyondata.com fcampos@beyondata.com *
  6.  *--------------------------------------------------------------------------*    
  7.  * *
  8.  * This program is free software; so you are free to use it any of your *
  9.  * applications(Freeware, Shareware, Commercial), but leave this header *
  10.  * intact. *
  11.  * *
  12.  * These files are provided "as is" without warranty of any kind. *
  13.  * *
  14.  *        GuiToolKit is forever FREE CODE !!!!! *
  15.  * *
  16.  *--------------------------------------------------------------------------*
  17.  * Created by: Francisco Campos G. *
  18.  * Bug Fixes and improvements :(Add your name) *
  19.  * -Francisco Campos *
  20.  * *
  21.  ****************************************************************************/
  22. #include "stdafx.h"
  23. #include "GuiComboFont.h"
  24. #ifdef _DEBUG
  25. #define new DEBUG_NEW
  26. #undef THIS_FILE
  27. static char THIS_FILE[] = __FILE__;
  28. #endif
  29. // CGuiComboFont
  30. IMPLEMENT_DYNAMIC(CGuiComboFont, CComboBox)
  31. CGuiComboFont::CGuiComboFont()
  32. {
  33. m_clrBtnFace     = GuiDrawLayer::GetRGBColorFace(GuiDrawLayer::m_Style);
  34. m_clrBtnLight    = ::GetSysColor(COLOR_3DHILIGHT);
  35. m_clrBtnDark     = ::GetSysColor(COLOR_3DSHADOW);
  36. m_iWidthDrowDown = GetSystemMetrics(SM_CXHTHUMB);
  37. m_bOverCombo     = FALSE;
  38. m_Font.CreateStockObject(DEFAULT_GUI_FONT);
  39. m_bPress         = FALSE;
  40. m_imgArrow.Create(IDB_GUI_DOCKBAR, 9, 11, RGB(255, 0, 255));
  41. CBitmap cbmp;
  42. BITMAP bmp;
  43. cbmp.LoadBitmap(IDB_GUI_DOCKBAR);
  44. cbmp.GetBitmap(&bmp);
  45. mHeight          = CPoint(bmp.bmWidth, bmp.bmHeight);
  46. m_bFondoXp       = FALSE;
  47. m_IsCallMiniTool = FALSE;
  48. bColor           = TRUE;
  49. bhistory         = FALSE;
  50. }
  51. CGuiComboFont::~CGuiComboFont()
  52. {
  53. }
  54. void CGuiComboFont::FillerCombo()
  55. {
  56. CClientDC dc(this);
  57. ResetContent();
  58. ::EnumFonts(
  59. dc,                  // handle to device context
  60. NULL,       // pointer to font typeface name string
  61. (FONTENUMPROC) EnumFontsProc,  // pointer to callback function
  62. (LPARAM) this);             // pointer to application-supplied data
  63. SetCurSel(0);
  64. }
  65. void CGuiComboFont::OnSysColorChange()
  66. {
  67. CComboBox::OnSysColorChange();
  68. m_clrBtnLight    = ::GetSysColor(COLOR_3DHILIGHT);
  69. m_clrBtnDark     = ::GetSysColor(COLOR_3DSHADOW);
  70. if (bColor)
  71. m_clrBtnFace = GuiDrawLayer::GetRGBColorFace(GuiDrawLayer::m_Style);
  72. }
  73. void CGuiComboFont::AutoColor(BOOL bAColor)
  74. {
  75. bColor = bAColor;
  76. }
  77. BEGIN_MESSAGE_MAP(CGuiComboFont, CComboBox)
  78. //{{AFX_MSG_MAP(CGuiComboFont)
  79. ON_WM_LBUTTONDOWN()
  80. ON_WM_LBUTTONUP()
  81. ON_WM_PAINT()
  82. ON_WM_SETCURSOR()
  83. ON_WM_TIMER()
  84. ON_CONTROL_REFLECT(CBN_KILLFOCUS, OnCbnKillfocus)
  85.     // ON_CONTROL_REFLECT(CBN_KILLFOCUS, OnKillFocus)
  86. ON_WM_SETFOCUS()
  87. ON_WM_CREATE()
  88. ON_WM_SYSCOLORCHANGE()
  89. ON_CONTROL_REFLECT(CBN_CLOSEUP, OnCloseup)
  90. //}}AFX_MSG_MAP
  91. ON_CONTROL_REFLECT(CBN_EDITUPDATE, OnCbnEditupdate)
  92. END_MESSAGE_MAP()
  93. /////////////////////////////////////////////////////////////////////////////
  94. // CGuiComboFont message handlers
  95. void CGuiComboFont::PreSubclassWindow() 
  96. {
  97. CComboBox::PreSubclassWindow();
  98. // FillerCombo();
  99. }
  100. void CGuiComboFont::OnLButtonDown(UINT nFlags, CPoint point) 
  101. {
  102. // TODO: Add your message handler code here and/or call default
  103. m_bOverCombo = TRUE;
  104. m_bPress = TRUE;
  105. CClientDC dc(this);
  106. DrawCombo(CM_SELECCIONADO, &dc);
  107. CComboBox::OnLButtonDown(nFlags, point);
  108. }
  109. void CGuiComboFont::OnLButtonUp(UINT nFlags, CPoint point) 
  110. {
  111. // TODO: Add your message handler code here and/or call default
  112. if (m_IsCallMiniTool == TRUE)
  113. m_bPress = FALSE;
  114. CComboBox::OnLButtonUp(nFlags, point);
  115. }
  116. void CGuiComboFont::OnPaint() 
  117. {
  118. CPaintDC dc(this); // device context for painting
  119.    /*
  120.     * Se hace un llamamdo a la funci髇 definida por defecto
  121.     * para el procesamiento de mensajes que la aplicaci髇 definitivamente
  122.     * no esta interesado en manejar
  123. **/ 
  124. m_clrBtnFace=GuiDrawLayer::GetRGBColorFace(GuiDrawLayer::m_Style);
  125. CComboBox::DefWindowProc(WM_PAINT, (WPARAM)dc.m_hDC, 0);
  126. if (m_bPress != TRUE)
  127. DrawCombo(CM_NORMAL, &dc);
  128. else
  129. DrawCombo(CM_SELECCIONADO, &dc);
  130. // Do not call CComboBox::OnPaint() for painting messages
  131. }
  132. void CGuiComboFont::OnSetFocus(CWnd* pOldWnd) 
  133. {
  134. CComboBox::OnSetFocus(pOldWnd);
  135. CClientDC dc(this);
  136. DrawCombo(CM_SELECCIONADO, &dc);
  137. }
  138. BOOL CGuiComboFont::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) 
  139. {
  140. // TODO: Add your message handler code here and/or call default
  141. CPoint ptCurPos;
  142. CRect m_rcCli;
  143. GetCursorPos(&ptCurPos);
  144. ScreenToClient(&ptCurPos);
  145. GetClientRect(&m_rcCli);
  146. if (m_rcCli.PtInRect(ptCurPos) && m_bOverCombo == FALSE && m_bPress == FALSE)
  147. {
  148. m_bOverCombo = TRUE;
  149. CClientDC dc(this);
  150. DrawCombo(CM_ONFOCUS, &dc);
  151. SetTimer(1, 10, NULL);
  152. OnTimer(1);
  153. return TRUE;
  154. }
  155. return CComboBox::OnSetCursor(pWnd, nHitTest, message);
  156. }
  157. void CGuiComboFont::SetColor(COLORREF clrFace)
  158. {
  159. m_clrBtnFace = clrFace;
  160. Invalidate();
  161. UpdateWindow();
  162. }
  163. void CGuiComboFont::DrawCombo(enTypeShow enShow, CDC* pDC)
  164. {
  165.     CRect m_rcClient;
  166. CRect m_rcDropDown;
  167. GetClientRect(&m_rcClient);
  168. m_rcClient.bottom -= 1;
  169. // primero eliminamos los bordes 3D del combobox
  170. pDC->Draw3dRect(&m_rcClient, m_clrBtnFace, m_clrBtnFace);
  171. m_rcClient.DeflateRect(1, 1);
  172. if (IsWindowEnabled())
  173. {
  174. if (enShow == CM_NORMAL)
  175. pDC->Draw3dRect(&m_rcClient, 
  176. GuiDrawLayer::GetRGBPressBXP(), GuiDrawLayer::GetRGBPressBXP());
  177. }
  178.     else
  179. {
  180. pDC->Draw3dRect(&m_rcClient, m_clrBtnLight, m_clrBtnLight);
  181. }
  182. if (enShow == CM_NORMAL)
  183. {
  184. m_rcClient.bottom -= 1;
  185. pDC->Draw3dRect(&m_rcClient, m_clrBtnFace, m_clrBtnFace);
  186. m_rcClient.bottom += 1;
  187. }
  188. else // && !XP
  189. {
  190. m_rcClient.bottom -= 1;
  191. pDC->Draw3dRect(&m_rcClient, 
  192. GuiDrawLayer::GetRGBCaptionXP(), GuiDrawLayer::GetRGBCaptionXP());
  193. m_rcClient.bottom += 1;
  194. }
  195. // debemos pintar el borde del boton drawDwon
  196. CRect m_rc = m_rcClient;
  197. m_rcClient.DeflateRect(1, 1);
  198. m_rcClient.left = m_rcClient.right - m_iWidthDrowDown;
  199. pDC->Draw3dRect(&m_rcClient, m_clrBtnFace, m_clrBtnFace);
  200. m_rcClient.DeflateRect(1, 1);
  201. m_rcClient.InflateRect(0, 1);
  202. if (enShow == CM_NORMAL)
  203. {
  204. // el boton no esta seleccionado
  205. m_rc.DeflateRect(1, 1);
  206. CBrush cblu;
  207. m_rcClient.bottom += 1;
  208. cblu.CreateSolidBrush(m_clrBtnFace);
  209. pDC->FillRect(&m_rcClient, &cblu);
  210. m_rcClient.right += 1;
  211. m_rcClient.left -= 1;
  212. m_rcClient.bottom -= 1;
  213. pDC->Draw3dRect(&m_rcClient, 
  214. GuiDrawLayer::GetRGBColorBTNHigh(), GuiDrawLayer::GetRGBColorBTNHigh());
  215. pDC->Draw3dRect(&m_rc, 
  216. GuiDrawLayer::GetRGBColorBTNHigh(), GuiDrawLayer::GetRGBColorBTNHigh());
  217. m_rcClient.right += 1;
  218. m_rcClient.left += 1;
  219. m_rcClient.bottom += 1;
  220. DrawArrow(pDC, m_rcClient);
  221. cblu.DeleteObject();
  222. }
  223. else
  224. {
  225. m_rcClient.InflateRect(1, 1);
  226. CBrush cblu;
  227. cblu.CreateSolidBrush(enShow == CM_ONFOCUS? GuiDrawLayer::GetRGBFondoXP():GuiDrawLayer::GetRGBPressBXP());
  228. pDC->FillRect(&m_rcClient, &cblu);
  229. m_rcClient.right += 1;
  230. m_rcClient.bottom -= 1;
  231. pDC->Draw3dRect(&m_rcClient, GuiDrawLayer::GetRGBCaptionXP(), GuiDrawLayer::GetRGBCaptionXP());
  232. DrawArrow(pDC, m_rcClient);
  233. cblu.DeleteObject();
  234. }
  235. }
  236. void CGuiComboFont::DrawArrow(CDC* pDC, CRect m_rc)
  237. {
  238. int difh =m_rc.Height() - mHeight.y;
  239. difh /= 2;
  240. m_rc.left = m_rc.right - m_iWidthDrowDown;
  241. m_imgArrow.Draw(pDC, 0, CPoint(m_rc.left + 2, m_rc.top + difh), ILD_TRANSPARENT);
  242. }
  243. void CGuiComboFont::OnTimer(UINT nIDEvent) 
  244. {
  245. // TODO: Add your message handler code here and/or call default
  246. if (nIDEvent== 1)
  247. {
  248. CPoint pt(GetMessagePos());
  249. CRect m_rc;
  250. ScreenToClient(&pt);
  251. GetClientRect(m_rc);
  252. if (!m_rc.PtInRect(pt) && m_bPress != TRUE)
  253. {
  254. KillTimer(1);
  255. m_bOverCombo = FALSE;
  256. CClientDC dc(this);
  257. if (m_bPress == FALSE)
  258. DrawCombo(CM_NORMAL, &dc);
  259. else
  260. DrawCombo(CM_ONFOCUS, &dc);
  261. m_bPress = FALSE;
  262. }
  263. }
  264. CComboBox::OnTimer(nIDEvent);
  265. }
  266. void  CGuiComboFont::OnCloseup() 
  267. {
  268. // TODO: Add your control notification handler code here
  269. CClientDC dc(this);
  270. m_bPress = FALSE;
  271. OnTimer(1);
  272. }
  273. // void CGuiComboFont::OnKillFocus(CWnd* pNewWnd) //version 6
  274. void CGuiComboFont::OnCbnKillfocus() // version 7.0
  275. {
  276.     CClientDC dc(this);
  277. DrawCombo(CM_NORMAL, &dc);
  278. if (!(GetStyle() & CBS_DROPDOWNLIST))
  279. {
  280. CString sCad;
  281. GetWindowText(sCad);
  282. AddString(sCad);
  283. }
  284. m_bPress = FALSE;
  285. m_bOverCombo = FALSE;
  286. }
  287. int CGuiComboFont::OnCreate(LPCREATESTRUCT lpCreateStruct) 
  288. {
  289. if (CComboBox::OnCreate(lpCreateStruct) == -1)
  290. return -1;
  291. SetFont(&m_Font);
  292. FillerCombo();
  293. return 0;
  294. }
  295. BOOL CALLBACK CGuiComboFont::EnumFontsProc(LPLOGFONT lplf, LPTEXTMETRIC lptm, DWORD dwFontType, LPARAM lpData)
  296. {
  297. CGuiComboFont *pThis = (CGuiComboFont*)(lpData);
  298. int index = pThis->AddString(lplf->lfFaceName);
  299. ASSERT(index != -1);
  300. int ret = pThis->SetItemData(index, dwFontType); 
  301. ASSERT(ret != -1);
  302. return TRUE;
  303. }
  304. void CGuiComboFont::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
  305. {
  306. CDC *pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
  307. CRect rc = lpDrawItemStruct->rcItem;
  308. int nNumItem = lpDrawItemStruct->itemID;
  309. CBrush bf;
  310. if (nNumItem == -1)
  311. return;
  312. rc.bottom -= 2;
  313. CString szFontName;
  314. GetLBText(nNumItem, szFontName);
  315. DWORD dwData = GetItemData(nNumItem);
  316. if (lpDrawItemStruct->itemState & ODS_SELECTED)
  317. {
  318. bf.CreateSolidBrush(::GetSysColor(COLOR_HIGHLIGHT));
  319. pDC->SetTextColor(::GetSysColor(COLOR_HIGHLIGHTTEXT));
  320. }
  321. else
  322. {
  323. pDC->SetTextColor(::GetSysColor(COLOR_WINDOWTEXT));
  324. bf.CreateSolidBrush(pDC->GetBkColor());
  325. }
  326. pDC->SetBkMode(TRANSPARENT);
  327. pDC->FillRect(&rc, &bf);
  328. CFont font;
  329. if (!font.CreateFont(
  330. 16,                        // nHeight
  331. 0,                         // nWidth
  332. 0,                         // nEscapement
  333. 0,                         // nOrientation
  334. FW_NORMAL,                 // nWeight
  335. FALSE,                     // bItalic
  336. FALSE,                     // bUnderline
  337. 0,                         // cStrikeOut
  338. ANSI_CHARSET,              // nCharSet
  339. OUT_DEFAULT_PRECIS,        // nOutPrecision
  340. CLIP_DEFAULT_PRECIS,       // nClipPrecision
  341. DEFAULT_QUALITY,           // nQuality
  342. DEFAULT_PITCH | FF_SWISS,  // nPitchAndFamily
  343. szFontName))    // lpszFacename                  
  344. return;
  345. CSize sz;
  346. HFONT hFont = NULL;
  347. hFont = (HFONT)pDC->SelectObject(font);
  348. sz    = pDC->GetTextExtent(szFontName);
  349. if (GetItemData(lpDrawItemStruct->itemID) & TRUETYPE_FONTTYPE)
  350. {
  351. m_imgArrow.Draw(pDC, 11, CPoint(rc.left + 2, rc.top + 1), ILD_TRANSPARENT);
  352. }
  353. pDC->TextOut(rc.left + 13, rc.top, szFontName);
  354. pDC->SelectObject(hFont);
  355. }
  356. void CGuiComboFont::OnCbnEditupdate()
  357. {
  358. CString m_szCad;
  359. GetWindowText(m_szCad);
  360. DWORD m_dwCurRange = GetEditSel();
  361. DWORD m_dwStart    = LOWORD(m_dwCurRange);
  362. DWORD m_dwEnd      = HIWORD(m_dwCurRange);
  363. // se busca la cadena aprox, si no existe se debe insertar
  364. if (SelectString(-1, m_szCad) == CB_ERR)
  365. {
  366. SetCurSel(0);
  367. }
  368. else
  369. {
  370. if (m_dwCurRange != CB_ERR)
  371. {
  372. if (m_dwEnd <(DWORD) m_szCad.GetLength())
  373. SetEditSel(m_dwStart, m_dwEnd);
  374. else
  375. SetEditSel(m_szCad.GetLength(), - 1);
  376. }
  377. }
  378. }
  379. void CGuiComboFont::MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct)
  380. {
  381. }