XTFontCombo.cpp
上传用户:szled88
上传日期:2015-04-09
资源大小:43957k
文件大小:16k
源码类别:

对话框与窗口

开发平台:

Visual C++

  1. // XTFontCombo.cpp : implementation of the CXTFontCombo class.
  2. //
  3. // This file is a part of the XTREME CONTROLS MFC class library.
  4. // (c)1998-2008 Codejock Software, All Rights Reserved.
  5. //
  6. // THIS SOURCE FILE IS THE PROPERTY OF CODEJOCK SOFTWARE AND IS NOT TO BE
  7. // RE-DISTRIBUTED BY ANY MEANS WHATSOEVER WITHOUT THE EXPRESSED WRITTEN
  8. // CONSENT OF CODEJOCK SOFTWARE.
  9. //
  10. // THIS SOURCE CODE CAN ONLY BE USED UNDER THE TERMS AND CONDITIONS OUTLINED
  11. // IN THE XTREME TOOLKIT PRO LICENSE AGREEMENT. CODEJOCK SOFTWARE GRANTS TO
  12. // YOU (ONE SOFTWARE DEVELOPER) THE LIMITED RIGHT TO USE THIS SOFTWARE ON A
  13. // SINGLE COMPUTER.
  14. //
  15. // CONTACT INFORMATION:
  16. // support@codejock.com
  17. // http://www.codejock.com
  18. //
  19. /////////////////////////////////////////////////////////////////////////////
  20. #include "stdafx.h"
  21. #include "Resource.h"
  22. #include "Common/XTPVC80Helpers.h"  // Visual Studio 2005 helper functions
  23. #include "Common/XTPColorManager.h"
  24. #include "Common/XTPDrawHelpers.h"
  25. #include "XTDefines.h"
  26. #include "XTGlobal.h"
  27. #include "XTVC50Helpers.h"
  28. #include "XTFlatComboBox.h"
  29. #include "XTListBox.h"
  30. #include "XTFontCombo.h"
  31. #ifdef _DEBUG
  32. #define new DEBUG_NEW
  33. #undef THIS_FILE
  34. static char THIS_FILE[] = __FILE__;
  35. #endif
  36. //////////////////////////////////////////////////////////////////////
  37. // CXTFontEnum
  38. //////////////////////////////////////////////////////////////////////
  39. const int BMW = 16;
  40. CXTFontEnum::CXTFontEnum()
  41. {
  42. Init();
  43. }
  44. CXTFontEnum::~CXTFontEnum()
  45. {
  46. }
  47. CXTFontEnum& CXTFontEnum::Get()
  48. {
  49. static CXTFontEnum fontEnum;
  50. return fontEnum;
  51. }
  52. bool CXTFontEnum::DoesFontExist(CString& strFaceName)
  53. {
  54. POSITION pos;
  55. for (pos = m_listFonts.GetHeadPosition(); pos; m_listFonts.GetNext(pos))
  56. {
  57. CXTLogFont& lf = m_listFonts.GetAt(pos);
  58. if (strFaceName.CompareNoCase(lf.lfFaceName) == 0)
  59. {
  60. strFaceName = lf.lfFaceName; // adjust case if necessary
  61. return true;
  62. }
  63. }
  64. return false;
  65. }
  66. CXTLogFont* CXTFontEnum::GetLogFont(const CString& strFaceName)
  67. {
  68. POSITION pos;
  69. for (pos = m_listFonts.GetHeadPosition(); pos; m_listFonts.GetNext(pos))
  70. {
  71. CXTLogFont& lf = m_listFonts.GetAt(pos);
  72. if (strFaceName == lf.lfFaceName)
  73. {
  74. return &lf;
  75. }
  76. }
  77. return NULL;
  78. }
  79. bool CXTFontEnum::AddFont(const LOGFONT* pLF, DWORD dwType)
  80. {
  81. // See if the font name has already been added.
  82. CXTStringHelper strFaceName = pLF->lfFaceName;
  83. strFaceName.Remove('@');
  84. if (DoesFontExist(strFaceName) != 0)
  85. {
  86. return false;
  87. }
  88. LOGFONT lfGlobal;
  89. XTAuxData().font.GetLogFont(&lfGlobal);
  90. // Save the CXTLogFont struct.
  91. CXTLogFont lf;
  92. MEMCPY_S((void*)&lf, (const void*)pLF, sizeof(CXTLogFont));
  93. lf.dwType = dwType;
  94. lf.lfHeight = -(::GetSystemMetrics(SM_CYVTHUMB)-(::GetSystemMetrics(SM_CYEDGE)*2));
  95. lf.lfWidth = 0;
  96. m_listFonts.AddTail(lf);
  97. return true;
  98. }
  99. BOOL CALLBACK CXTFontEnum::EnumFontFamExProc(ENUMLOGFONTEX* pelf,
  100. NEWTEXTMETRICEX* /*lpntm*/, DWORD dwFontType, LPARAM lParam)
  101. {
  102. CXTFontEnum* pFontEnum = (CXTFontEnum*)lParam;
  103. if (pFontEnum != NULL)
  104. {
  105. if (pFontEnum->AddFont(&pelf->elfLogFont, dwFontType))
  106. {
  107. // TODO:
  108. }
  109. }
  110. return TRUE;
  111. }
  112. int CXTFontEnum::GetMaxWidth()
  113. {
  114. CWindowDC dc(NULL);
  115. CFont* p = dc.SelectObject(&XTAuxData().font);
  116. int iMaxWidth = 0;
  117. POSITION pos;
  118. for (pos = m_listFonts.GetHeadPosition(); pos; m_listFonts.GetNext(pos))
  119. {
  120. CXTLogFont& lf = m_listFonts.GetAt(pos);
  121. int nWidth = dc.GetTextExtent(lf.lfFaceName).cx;
  122. iMaxWidth = __max(iMaxWidth, nWidth);
  123. }
  124. dc.SelectObject(p);
  125. return iMaxWidth;
  126. }
  127. void CXTFontEnum::Init(CDC* pDC/*= NULL*/, BYTE nCharSet/*= DEFAULT_CHARSET*/)
  128. {
  129. m_listFonts.RemoveAll();
  130. // Enumerate all styles of all fonts for the ANSI character set
  131. CXTLogFont lf;
  132. lf.lfFaceName[ 0 ] = '';
  133. lf.lfCharSet = nCharSet;
  134. if (pDC == NULL || pDC->m_hDC == NULL)
  135. {
  136. CWindowDC dc(NULL);
  137. ::EnumFontFamiliesEx(dc.m_hDC, &lf,
  138. (FONTENUMPROC)EnumFontFamExProc, (LPARAM)this, 0);
  139. }
  140. else
  141. {
  142. ::EnumFontFamiliesEx(pDC->m_hDC, &lf,
  143. (FONTENUMPROC)EnumFontFamExProc, (LPARAM)this, 0);
  144. }
  145. }
  146. /////////////////////////////////////////////////////////////////////////////
  147. // CXTFontListBox
  148. /////////////////////////////////////////////////////////////////////////////
  149. CXTFontListBox::CXTFontListBox()
  150. {
  151. m_csSymbol = _T("AaBbCc");
  152. m_dwStyle  = xtFontBoth;
  153. VERIFY(m_ilFontType.Create(
  154. XT_IDB_FONTTYPE, BMW, 1, RGB(255, 0, 255)));
  155. }
  156. CXTFontListBox::~CXTFontListBox()
  157. {
  158. }
  159. BEGIN_MESSAGE_MAP(CXTFontListBox, CXTListBox)
  160. //{{AFX_MSG_MAP(CXTFontListBox)
  161. //}}AFX_MSG_MAP
  162. END_MESSAGE_MAP()
  163. /////////////////////////////////////////////////////////////////////////////
  164. // CXTFontListBox message handlers
  165. void CXTFontListBox::DrawItem(LPDRAWITEMSTRUCT lpDIS)
  166. {
  167. CDC*  pDC       = CDC::FromHandle(lpDIS->hDC);
  168. UINT  itemState = lpDIS->itemState;
  169. UINT  itemID    = lpDIS->itemID;
  170. CRect rcItem    = lpDIS->rcItem;
  171. if (itemID == (UINT)-1)
  172. {
  173. return;
  174. }
  175. CXTLogFont* pLF = (CXTLogFont*)lpDIS->itemData;
  176. if (pLF == NULL)
  177. {
  178. return;
  179. }
  180. BOOL bDisabled = ((itemState & ODS_DISABLED) == ODS_DISABLED);
  181. BOOL bSelected = ((itemState & ODS_SELECTED) == ODS_SELECTED);
  182. BOOL bFocus    = ((itemState & ODS_FOCUS)    == ODS_FOCUS);
  183. // draw background.
  184. if (bDisabled)
  185. {
  186. pDC->SetTextColor(GetXtremeColor(COLOR_GRAYTEXT));
  187. pDC->SetBkColor(GetXtremeColor(COLOR_3DFACE));
  188. pDC->FillSolidRect(&rcItem, GetXtremeColor(COLOR_3DFACE));
  189. }
  190. else
  191. {
  192. if (bSelected)
  193. {
  194. pDC->SetTextColor(GetXtremeColor(COLOR_HIGHLIGHTTEXT));
  195. pDC->SetBkColor(GetXtremeColor(COLOR_WINDOW));
  196. pDC->FillSolidRect(&rcItem, GetXtremeColor(COLOR_HIGHLIGHT));
  197. }
  198. else
  199. {
  200. pDC->SetTextColor(GetXtremeColor(COLOR_WINDOWTEXT));
  201. pDC->SetBkColor(GetXtremeColor(COLOR_WINDOW));
  202. pDC->FillSolidRect(&rcItem, GetXtremeColor(COLOR_WINDOW));
  203. }
  204. // draw focus rectangle.
  205. if (bFocus)
  206. {
  207. pDC->DrawFocusRect(&rcItem);
  208. }
  209. }
  210. CString csFaceName = pLF->lfFaceName;
  211. // true type or device flag set by SetItemData
  212. if (pLF->dwType & TRUETYPE_FONTTYPE)
  213. {
  214. m_ilFontType.Draw(pDC, 1, rcItem.TopLeft(), ILD_NORMAL);
  215. }
  216. // Define the size of the text area to draw
  217. CRect rcText(rcItem);
  218. rcText.left += BMW + 6;
  219. pDC->SetBkMode(TRANSPARENT);
  220. if (m_dwStyle & xtFontGUI)
  221. {
  222. CXTPFontDC fontDC(pDC, &XTAuxData().font);
  223. pDC->DrawText(csFaceName, rcText, DT_VCENTER | DT_SINGLELINE);
  224. }
  225. if (m_dwStyle & xtFontSample)
  226. {
  227. if (m_dwStyle & xtFontGUI)
  228. rcText.left = rcText.left + CXTFontEnum::Get().GetMaxWidth() + 5;
  229. if ((m_dwStyle & xtFontGUI) || (pLF->lfCharSet == SYMBOL_CHARSET))
  230. csFaceName = m_csSymbol;
  231. // Create the font to be displayed and initialize the device context.
  232. CFont font;
  233. font.CreateFontIndirect(pLF);
  234. // Draw the text item.
  235. CXTPFontDC fontDC(pDC, &font);
  236. pDC->DrawText(csFaceName, rcText, DT_VCENTER | DT_SINGLELINE);
  237. }
  238. }
  239. void CXTFontListBox::MeasureItem(LPMEASUREITEMSTRUCT lpMIS)
  240. {
  241. ASSERT(lpMIS->CtlType == ODT_LISTBOX);
  242. lpMIS->itemHeight = (::GetSystemMetrics(SM_CYVTHUMB)-::GetSystemMetrics(SM_CYEDGE));
  243. lpMIS->itemWidth = 0;
  244. }
  245. int CXTFontListBox::CompareItem(LPCOMPAREITEMSTRUCT lpCIS)
  246. {
  247. ASSERT(lpCIS->CtlType == ODT_LISTBOX);
  248. int iItem1 = (int)(WORD)lpCIS->itemID1;
  249. if (iItem1 == -1)
  250. {
  251. return -1;
  252. }
  253. CString strItem1;
  254. GetText(iItem1, strItem1);
  255. int iItem2 = (int)(WORD)lpCIS->itemID2;
  256. if (iItem2 == -1)
  257. {
  258. return -1;
  259. }
  260. CString strItem2;
  261. GetText(iItem2, strItem2);
  262. return strItem1.Collate(strItem2);
  263. }
  264. void CXTFontListBox::Initialize(bool /*bAutoFont = true*/)
  265. {
  266. CXTListBox::Initialize(false);
  267. CXTFontList& fontList = CXTFontEnum::Get().GetFontList();
  268. POSITION pos;
  269. for (pos = fontList.GetHeadPosition(); pos; fontList.GetNext(pos))
  270. {
  271. CXTLogFont& lf = fontList.GetAt(pos);
  272. int iIndex = AddString(lf.lfFaceName);
  273. SetItemDataPtr(iIndex, &lf);
  274. }
  275. }
  276. bool CXTFontListBox::GetSelFont(CXTLogFont& lf)
  277. {
  278. int iCurSel = GetCurSel();
  279. if (iCurSel == LB_ERR)
  280. {
  281. return false;
  282. }
  283. CXTLogFont* pLF = (CXTLogFont*)GetItemDataPtr(iCurSel);
  284. if (pLF == NULL)
  285. {
  286. return false;
  287. }
  288. MEMCPY_S((void*)&lf, (const void*)pLF, sizeof(CXTLogFont));
  289. return true;
  290. }
  291. bool CXTFontListBox::GetSelFont(CString& strFaceName)
  292. {
  293. CXTLogFont lf;
  294. if (GetSelFont(lf))
  295. {
  296. strFaceName = lf.lfFaceName;
  297. return true;
  298. }
  299. return false;
  300. }
  301. bool CXTFontListBox::SetSelFont(CXTLogFont& lf)
  302. {
  303. return SetSelFont(lf.lfFaceName);
  304. }
  305. bool CXTFontListBox::SetSelFont(const CString& strFaceName)
  306. {
  307. int iCount = GetCount();
  308. int i;
  309. for (i = 0; i < iCount; ++i)
  310. {
  311. CXTLogFont* pLF = (CXTLogFont*)GetItemDataPtr(i);
  312. if (pLF != NULL)
  313. {
  314. if (strFaceName.CompareNoCase(pLF->lfFaceName) == 0)
  315. {
  316. SetCurSel(i);
  317. return true;
  318. }
  319. }
  320. }
  321. return false;
  322. }
  323. ///////////////////////////////////////////////////////////////////////////
  324. // CXTFontCombo
  325. ///////////////////////////////////////////////////////////////////////////
  326. CXTFontCombo::CXTFontCombo()
  327. {
  328. m_bFlatLook = TRUE;
  329. m_csSymbol  = _T("AaBbCc");
  330. m_dwStyle   = xtFontBoth;
  331. }
  332. CXTFontCombo::~CXTFontCombo()
  333. {
  334. }
  335. IMPLEMENT_DYNAMIC(CXTFontCombo, CXTFlatComboBox)
  336. BEGIN_MESSAGE_MAP(CXTFontCombo, CXTFlatComboBox)
  337. //{{AFX_MSG_MAP(CXTFontCombo)
  338. ON_CONTROL_REFLECT_EX(CBN_DROPDOWN, OnDropDown)
  339. //}}AFX_MSG_MAP
  340. END_MESSAGE_MAP()
  341. void CXTFontCombo::DrawItem(LPDRAWITEMSTRUCT lpDIS)
  342. {
  343. CDC*  pDC       = CDC::FromHandle(lpDIS->hDC);
  344. UINT  itemState = lpDIS->itemState;
  345. UINT  itemID    = lpDIS->itemID;
  346. CRect rcItem    = lpDIS->rcItem;
  347. if (itemID == (UINT)-1)
  348. {
  349. return;
  350. }
  351. CXTLogFont* pLF = (CXTLogFont*)lpDIS->itemData;
  352. if (pLF == NULL)
  353. {
  354. return;
  355. }
  356. BOOL bDisabled = ((itemState & ODS_DISABLED) == ODS_DISABLED);
  357. BOOL bSelected = ((itemState & ODS_SELECTED) == ODS_SELECTED);
  358. BOOL bFocus    = ((itemState & ODS_FOCUS)    == ODS_FOCUS);
  359. // draw background.
  360. if (bDisabled)
  361. {
  362. pDC->SetTextColor(GetXtremeColor(COLOR_GRAYTEXT));
  363. pDC->SetBkColor(GetXtremeColor(COLOR_3DFACE));
  364. pDC->FillSolidRect(&rcItem, GetXtremeColor(COLOR_3DFACE));
  365. }
  366. else
  367. {
  368. if (bSelected)
  369. {
  370. pDC->SetTextColor(GetXtremeColor(COLOR_HIGHLIGHTTEXT));
  371. pDC->SetBkColor(GetXtremeColor(COLOR_WINDOW));
  372. pDC->FillSolidRect(&rcItem, GetXtremeColor(COLOR_HIGHLIGHT));
  373. }
  374. else
  375. {
  376. pDC->SetTextColor(GetXtremeColor(COLOR_WINDOWTEXT));
  377. pDC->SetBkColor(GetXtremeColor(COLOR_WINDOW));
  378. pDC->FillSolidRect(&rcItem, GetXtremeColor(COLOR_WINDOW));
  379. }
  380. // draw focus rectangle.
  381. if (bFocus)
  382. {
  383. pDC->DrawFocusRect(&rcItem);
  384. }
  385. }
  386. CString csFaceName = pLF->lfFaceName;
  387. // true type or device flag set by SetItemData
  388. if (pLF->dwType & TRUETYPE_FONTTYPE)
  389. {
  390. m_ilFontType.Draw(pDC, 1, rcItem.TopLeft(), ILD_NORMAL);
  391. }
  392. // Define the size of the text area to draw
  393. CRect rcText(rcItem);
  394. rcText.left += BMW + 6;
  395. pDC->SetBkMode(TRANSPARENT);
  396. if (m_dwStyle & xtFontGUI)
  397. {
  398. CXTPFontDC fontDC(pDC, &XTAuxData().font);
  399. pDC->DrawText(csFaceName, rcText, DT_VCENTER | DT_SINGLELINE);
  400. }
  401. if (m_dwStyle & xtFontSample)
  402. {
  403. if (m_dwStyle & xtFontGUI)
  404. rcText.left = rcText.left + CXTFontEnum::Get().GetMaxWidth() + 5;
  405. if ((m_dwStyle & xtFontGUI) || (pLF->lfCharSet == SYMBOL_CHARSET))
  406. csFaceName = m_csSymbol;
  407. // Create the font to be displayed and initialize the device context.
  408. CFont font;
  409. font.CreateFontIndirect(pLF);
  410. // Draw the text item.
  411. CXTPFontDC fontDC(pDC, &font);
  412. pDC->DrawText(csFaceName, rcText, DT_VCENTER | DT_SINGLELINE);
  413. }
  414. }
  415. /////////////////////////////////////////////////////////////////////////////
  416. // CXTFontCombo diagnostics
  417. #ifdef _DEBUG
  418. void CXTFontCombo::AssertValid() const
  419. {
  420. CXTFlatComboBox::AssertValid();
  421. DWORD dwStyle = ::GetWindowLong(m_hWnd, GWL_STYLE);
  422. // combo box is owner drawn, and must be created with the
  423. // following styles:
  424. ASSERT(dwStyle & CBS_OWNERDRAWFIXED);
  425. ASSERT(dwStyle & CBS_DROPDOWN);
  426. ASSERT(dwStyle & CBS_SORT);
  427. ASSERT(dwStyle & CBS_HASSTRINGS);
  428. }
  429. #endif
  430. void CXTFontCombo::MeasureItem(LPMEASUREITEMSTRUCT lpMIS)
  431. {
  432. ASSERT(lpMIS->CtlType == ODT_COMBOBOX);
  433. lpMIS->itemHeight = (::GetSystemMetrics(SM_CYVTHUMB)-::GetSystemMetrics(SM_CYEDGE));
  434. lpMIS->itemWidth = 0;
  435. }
  436. int CXTFontCombo::CompareItem(LPCOMPAREITEMSTRUCT lpCIS)
  437. {
  438. ASSERT_VALID(this);
  439. ASSERT(lpCIS->CtlType == ODT_LISTBOX);
  440. int iItem1 = (int)(WORD)lpCIS->itemID1;
  441. if (iItem1 == -1)
  442. {
  443. return -1;
  444. }
  445. CString strItem1;
  446. GetLBText(iItem1, strItem1);
  447. int iItem2 = (int)(WORD)lpCIS->itemID2;
  448. if (iItem2 == -1)
  449. {
  450. return -1;
  451. }
  452. CString strItem2;
  453. GetLBText(iItem2, strItem2);
  454. return strItem1.Collate(strItem2);
  455. }
  456. void CXTFontCombo::InitControl(LPCTSTR lpszFaceName, UINT nWidth/*= 0*/, BOOL bEnable/*= TRUE*/)
  457. {
  458. ASSERT_VALID(this);
  459. ResetContent();
  460. // MFCBUG: adjust height so display is the same as non-owner drawn
  461. // CComboBoxes. MFC adjusts the height of an owner-drawn CComboBox
  462. // 2-3 pixels larger than a non owner-drawn combo.
  463. SetItemHeight(-1, (::GetSystemMetrics(SM_CYVTHUMB)-::GetSystemMetrics(SM_CYEDGE)));
  464. if (nWidth != 0)
  465. {
  466. SetDroppedWidth(nWidth);
  467. }
  468. // moved from constructor so resource is loaded when this gets called
  469. if (!m_ilFontType.m_hImageList)
  470. {
  471. VERIFY(m_ilFontType.Create(
  472. XT_IDB_FONTTYPE, BMW, 1, RGB(255, 0, 255)));
  473. }
  474. EnableAutoCompletion(bEnable);
  475. CXTFontList& fontList = CXTFontEnum::Get().GetFontList();
  476. POSITION pos;
  477. for (pos = fontList.GetHeadPosition(); pos; fontList.GetNext(pos))
  478. {
  479. CXTLogFont& lf = fontList.GetAt(pos);
  480. int iIndex = AddString(lf.lfFaceName);
  481. SetItemDataPtr(iIndex, &lf);
  482. }
  483. if (lpszFaceName && _tcslen(lpszFaceName))
  484. {
  485. SetSelFont(lpszFaceName);
  486. }
  487. }
  488. bool CXTFontCombo::GetSelFont(CXTLogFont& lf)
  489. {
  490. int iCurSel = GetCurSel();
  491. if (iCurSel == CB_ERR)
  492. {
  493. CString strWindowText;
  494. GetWindowText(strWindowText);
  495. iCurSel = SelectString(-1, strWindowText);
  496. if (iCurSel == CB_ERR)
  497. {
  498. return false;
  499. }
  500. }
  501. CXTLogFont* pLF = (CXTLogFont*)GetItemDataPtr(iCurSel);
  502. if (pLF == NULL)
  503. {
  504. return false;
  505. }
  506. MEMCPY_S((void*)&lf, (const void*)pLF, sizeof(CXTLogFont));
  507. return true;
  508. }
  509. bool CXTFontCombo::GetSelFont(CString& strFaceName)
  510. {
  511. CXTLogFont lf;
  512. if (GetSelFont(lf))
  513. {
  514. strFaceName = lf.lfFaceName;
  515. return true;
  516. }
  517. return false;
  518. }
  519. bool CXTFontCombo::SetSelFont(CXTLogFont& lf)
  520. {
  521. return SetSelFont(lf.lfFaceName);
  522. }
  523. bool CXTFontCombo::SetSelFont(const CString& strFaceName)
  524. {
  525. int iCount = GetCount();
  526. int i;
  527. for (i = 0; i < iCount; ++i)
  528. {
  529. CXTLogFont* pLF = (CXTLogFont*)GetItemDataPtr(i);
  530. if (pLF != NULL)
  531. {
  532. if (strFaceName.CompareNoCase(pLF->lfFaceName) == 0)
  533. {
  534. SetCurSel(i);
  535. return true;
  536. }
  537. }
  538. }
  539. return false;
  540. }
  541. BOOL CXTFontCombo::OnDropDown()
  542. {
  543. GetSelFont(m_csSelected);
  544. return FALSE; // continue routing.
  545. }
  546. void CXTFontCombo::NotifyOwner(UINT nCode)
  547. {
  548. CWnd* pWndOwner = GetOwner();
  549. if (::IsWindow(pWndOwner->GetSafeHwnd()))
  550. {
  551. pWndOwner->SendMessage(WM_COMMAND,
  552. MAKEWPARAM(GetDlgCtrlID(), nCode), (LPARAM)m_hWnd);
  553. }
  554. }
  555. BOOL CXTFontCombo::PreTranslateMessage(MSG* pMsg)
  556. {
  557. if (pMsg->message == WM_KEYUP || pMsg->message == WM_KEYDOWN)
  558. {
  559. switch (pMsg->wParam)
  560. {
  561. case VK_ESCAPE:
  562. {
  563. if (GetDroppedState() == TRUE)
  564. {
  565. ShowDropDown(FALSE);
  566. SetSelFont(m_csSelected);
  567. NotifyOwner(CBN_SELENDCANCEL);
  568. }
  569. return TRUE;
  570. }
  571. case VK_SPACE:
  572. case VK_RETURN:
  573. {
  574. if (GetDroppedState() == TRUE)
  575. {
  576. ShowDropDown(FALSE);
  577. NotifyOwner(CBN_SELENDOK);
  578. }
  579. return TRUE;
  580. }
  581. case VK_UP:
  582. case VK_DOWN:
  583. {
  584. if (GetDroppedState() == FALSE)
  585. {
  586. ShowDropDown(TRUE);
  587. return TRUE;
  588. }
  589. break;
  590. }
  591. }
  592. }
  593. return CXTFlatComboBox::PreTranslateMessage(pMsg);
  594. }