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

对话框与窗口

开发平台:

Visual C++

  1. // Custom Items.cpp : implementation file
  2. //
  3. // This file is a part of the XTREME TOOLKIT PRO 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 "CustomItems.h"
  22. ////////////////////////////////////////////////////////////////////////////////////////////////
  23. CCustomItemIcon::CCustomItemIcon(CString strCaption, HICON hIcon)
  24. : CXTPPropertyGridItem(strCaption)
  25. {
  26. m_hIcon = hIcon? CopyIcon(hIcon): 0;
  27. m_nFlags = xtpGridItemHasExpandButton;
  28. }
  29. CCustomItemIcon::~CCustomItemIcon(void)
  30. {
  31. if (m_hIcon)
  32. DestroyIcon(m_hIcon);
  33. }
  34. BOOL CCustomItemIcon::OnDrawItemValue(CDC& dc, CRect rcValue)
  35. {
  36. if (m_hIcon)
  37. {
  38. COLORREF clr = dc.GetTextColor();
  39. CRect rcSample(rcValue.left - 2, rcValue.top + 1, rcValue.left + 18, rcValue.bottom - 1);
  40. DrawIconEx(dc, rcSample.left, rcSample.top, m_hIcon, rcSample.Width(), rcSample.Height(), 0, 0, DI_NORMAL);
  41. dc.Draw3dRect(rcSample, clr, clr);
  42. }
  43. CRect rcText(rcValue);
  44. rcText.left += 25;
  45. dc.DrawText( _T("(Icon)"), rcText,  DT_SINGLELINE|DT_VCENTER);
  46. return TRUE;
  47. }
  48. void CCustomItemIcon::OnInplaceButtonDown(CXTPPropertyGridInplaceButton* /*pButton*/)
  49. {
  50. const TCHAR szFilters[]=
  51. _T("Icon files (*.ico)|*.ico|All Files (*.*)|*.*||");
  52. CFileDialog dlg(TRUE, _T("ico"), _T("*.ico"), OFN_FILEMUSTEXIST| OFN_HIDEREADONLY, szFilters);
  53. if (dlg.DoModal() == IDOK)
  54. {
  55. if (m_hIcon)
  56. DestroyIcon(m_hIcon);
  57. m_hIcon = (HICON)LoadImage(NULL, dlg.GetPathName(), IMAGE_ICON, 0, 0, LR_LOADFROMFILE|LR_DEFAULTSIZE );
  58. OnValueChanged(_T(""));
  59. ((CWnd*)m_pGrid)->Invalidate(FALSE);
  60. }
  61. }
  62. ////////////////////////////////////////////////////////////////////////////////////////////////
  63. BEGIN_MESSAGE_MAP(CCustomItemSpinInplaceButton, CSpinButtonCtrl)
  64. ON_NOTIFY_REFLECT(UDN_DELTAPOS, OnDeltapos)
  65. END_MESSAGE_MAP()
  66. void CCustomItemSpinInplaceButton::OnDeltapos(NMHDR *pNMHDR, LRESULT *pResult)
  67. {
  68. LPNMUPDOWN pNMUpDown = reinterpret_cast<LPNMUPDOWN>(pNMHDR);
  69. m_pItem->OnValidateEdit();
  70. long nValue = m_pItem->GetNumber() + pNMUpDown->iDelta;
  71. int nLower, nUpper;
  72. GetRange(nLower, nUpper);
  73. nValue = max(nLower, min(nUpper, nValue));
  74. CString str;
  75. str.Format(_T("%i"), nValue);
  76. m_pItem->OnValueChanged(str);
  77. *pResult = 1;
  78. }
  79. CCustomItemSpin::CCustomItemSpin(CString strCaption)
  80. : CXTPPropertyGridItemNumber(strCaption)
  81. {
  82. m_wndSpin.m_pItem = this;
  83. }
  84. void CCustomItemSpin::OnDeselect()
  85. {
  86. CXTPPropertyGridItemNumber::OnDeselect();
  87. if (m_wndSpin.m_hWnd) m_wndSpin.ShowWindow(SW_HIDE);
  88. }
  89. void CCustomItemSpin::OnSelect()
  90. {
  91. CXTPPropertyGridItem::OnSelect();
  92. if (!m_bReadOnly)
  93. {
  94. CRect rc = GetItemRect();
  95. rc.left = rc.right - 15;
  96. if (!m_wndSpin.m_hWnd)
  97. {
  98. m_wndSpin.Create(UDS_ARROWKEYS|WS_CHILD, rc, (CWnd*)m_pGrid, 0);
  99. m_wndSpin.SetRange(0, 100);
  100. }
  101. m_wndSpin.MoveWindow(rc);
  102. m_wndSpin.ShowWindow(SW_SHOW);
  103. }
  104. }
  105. CRect CCustomItemSpin::GetValueRect()
  106. {
  107. CRect rcValue(CXTPPropertyGridItem::GetValueRect());
  108. rcValue.right -= 17;
  109. return rcValue;
  110. }
  111. ////////////////////////////////////////////////////////////////////////////////////////////////
  112. class CCustomItemChilds::CCustomItemChildsAll : public CXTPPropertyGridItemNumber
  113. {
  114. public:
  115. CCustomItemChildsAll(CString strCaption) : CXTPPropertyGridItemNumber(strCaption) {}
  116. virtual void OnValueChanged(CString strValue)
  117. {
  118. SetValue(strValue);
  119. CCustomItemChilds* pParent = ((CCustomItemChilds*)m_pParent);
  120. CRect& rc = pParent->m_rcValue;
  121. rc.left = rc.right = rc.top = rc.bottom = GetNumber();
  122. pParent->OnValueChanged(pParent->RectToString(rc));
  123. }
  124. };
  125. class CCustomItemChilds::CCustomItemChildsPad : public CXTPPropertyGridItemNumber
  126. {
  127. public:
  128. CCustomItemChildsPad(CString strCaption, LONG& nPad) : CXTPPropertyGridItemNumber(strCaption), m_nPad(nPad) {}
  129. virtual void OnValueChanged(CString strValue)
  130. {
  131. SetValue(strValue);
  132. CCustomItemChilds* pParent = ((CCustomItemChilds*)m_pParent);
  133. m_nPad = GetNumber();
  134. pParent->m_itemAll->SetNumber(0);
  135. pParent->OnValueChanged(pParent->RectToString(pParent->m_rcValue));
  136. }
  137. LONG& m_nPad;
  138. };
  139. CCustomItemChilds::CCustomItemChilds(CString strCaption, CRect rcValue)
  140. : CXTPPropertyGridItem(strCaption)
  141. {
  142. m_rcValue = rcValue;
  143. m_strValue = RectToString(rcValue);
  144. m_nFlags = 0;
  145. }
  146. void CCustomItemChilds::OnAddChildItem()
  147. {
  148. m_itemAll = (CCustomItemChildsAll*)AddChildItem(new CCustomItemChildsAll(_T("All")));
  149. m_itemLeft = (CCustomItemChildsPad*)AddChildItem(new CCustomItemChildsPad(_T("Left"), m_rcValue.left));
  150. m_itemTop = (CCustomItemChildsPad*)AddChildItem(new CCustomItemChildsPad(_T("Top"), m_rcValue.top));
  151. m_itemRight = (CCustomItemChildsPad*)AddChildItem(new CCustomItemChildsPad(_T("Right"), m_rcValue.right));
  152. m_itemBottom = (CCustomItemChildsPad*)AddChildItem(new CCustomItemChildsPad(_T("Bottom"), m_rcValue.bottom));
  153. UpdateChilds();
  154. }
  155. void CCustomItemChilds::UpdateChilds()
  156. {
  157. m_itemLeft->SetNumber(m_rcValue.left);
  158. m_itemRight->SetNumber(m_rcValue.right);
  159. m_itemTop->SetNumber(m_rcValue.top);
  160. m_itemBottom->SetNumber(m_rcValue.bottom);
  161. }
  162. void CCustomItemChilds::SetValue(CString strValue)
  163. {
  164. CXTPPropertyGridItem::SetValue(strValue);
  165. UpdateChilds();
  166. }
  167. CString CCustomItemChilds::RectToString(CRect rc)
  168. {
  169. CString str;
  170. str.Format(_T("%i; %i; %i; %i"), rc.left, rc.top, rc.right, rc.bottom);
  171. return str;
  172. }
  173. ///////////////////////////////////////////////////////////////////////////////
  174. class CCustomItemColorPopup: public CXTColorPopup
  175. {
  176. friend class CCustomItemColor;
  177. public:
  178. CCustomItemColorPopup() : CXTColorPopup(TRUE) {}
  179. private:
  180. DECLARE_MESSAGE_MAP()
  181. afx_msg LRESULT OnSelEndOK(WPARAM wParam, LPARAM lParam);
  182. CCustomItemColor* m_pItem;
  183. };
  184. BEGIN_MESSAGE_MAP(CCustomItemColorPopup, CXTColorPopup)
  185. ON_MESSAGE(CPN_XT_SELENDOK, OnSelEndOK)
  186. END_MESSAGE_MAP()
  187. LRESULT CCustomItemColorPopup::OnSelEndOK(WPARAM wParam, LPARAM /*lParam*/)
  188. {
  189. m_pItem->OnValueChanged(m_pItem->RGBToString((COLORREF)wParam));
  190. return 0;
  191. }
  192. CCustomItemColor::CCustomItemColor(CString strCaption, COLORREF clr)
  193. : CXTPPropertyGridItemColor(strCaption, clr)
  194. {
  195. m_nFlags = xtpGridItemHasComboButton|xtpGridItemHasEdit;
  196. SetColor(clr);
  197. m_strDefaultValue = m_strValue;
  198. }
  199. void CCustomItemColor::OnInplaceButtonDown(CXTPPropertyGridInplaceButton* /*pButton*/)
  200. {
  201. CCustomItemColorPopup *pColorPopup = new CCustomItemColorPopup();
  202. pColorPopup->SetTheme(xtThemeOffice2003);
  203. CRect rcItem= GetItemRect();
  204. m_pGrid->ClientToScreen(&rcItem);
  205. pColorPopup->Create(rcItem, m_pGrid, CPS_XT_RIGHTALIGN|CPS_XT_USERCOLORS|CPS_XT_EXTENDED|CPS_XT_MORECOLORS|CPS_XT_SHOW3DSELECTION|CPS_XT_SHOWHEXVALUE, GetColor(), GetColor());
  206. pColorPopup->SetOwner(m_pGrid);
  207. pColorPopup->SetFocus();
  208. pColorPopup->AddListener(pColorPopup->GetSafeHwnd());
  209. pColorPopup->m_pItem = this;
  210. }
  211. ///////////////////////////////////////////////////////////////////////////////
  212. CCustomItemFileBox::CCustomItemFileBox(CString strCaption)
  213. : CXTPPropertyGridItem(strCaption)
  214. {
  215. m_nFlags = xtpGridItemHasExpandButton|xtpGridItemHasEdit;
  216. }
  217. void CCustomItemFileBox::OnInplaceButtonDown(CXTPPropertyGridInplaceButton* /*pButton*/)
  218. {
  219. CFileDialog dlg( TRUE, NULL,  GetValue(), OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT, NULL, m_pGrid);
  220. if ( dlg.DoModal( ) == IDOK )
  221. {
  222. OnValueChanged( dlg.GetPathName());
  223. m_pGrid->Invalidate( FALSE );
  224. }
  225. };
  226. ///////////////////////////////////////////////////////////////////////////////
  227. BEGIN_MESSAGE_MAP(CInplaceCheckBox, CButton)
  228. ON_MESSAGE(BM_SETCHECK, OnCheck)
  229. ON_WM_CTLCOLOR_REFLECT()
  230. END_MESSAGE_MAP()
  231. HBRUSH CInplaceCheckBox::CtlColor(CDC* pDC, UINT /*nCtlColor*/)
  232. {
  233. class CGridView : public CXTPPropertyGridView
  234. {
  235. friend class CInplaceCheckBox;
  236. };
  237. CGridView* pGrid = (CGridView*)m_pItem->m_pGrid;
  238. COLORREF clr = pGrid->GetPaintManager()->GetItemMetrics()->m_clrBack;
  239. if (clr != m_clrBack || !m_brBack.GetSafeHandle())
  240. {
  241. m_brBack.DeleteObject();
  242. m_brBack.CreateSolidBrush(clr);
  243. m_clrBack = clr;
  244. }
  245. pDC->SetBkColor(m_clrBack);
  246. return m_brBack;
  247. }
  248. LRESULT CInplaceCheckBox::OnCheck(WPARAM wParam, LPARAM lParam)
  249. {
  250. m_pItem->m_bValue = (wParam == BST_CHECKED);
  251. m_pItem->OnValueChanged(m_pItem->GetValue());
  252. return CButton::DefWindowProc(BM_SETCHECK, wParam, lParam);
  253. }
  254. CCustomItemCheckBox::CCustomItemCheckBox(CString strCaption)
  255. : CXTPPropertyGridItem(strCaption)
  256. {
  257. m_wndCheckBox.m_pItem = this;
  258. m_nFlags = 0;
  259. m_bValue = FALSE;
  260. }
  261. void CCustomItemCheckBox::OnDeselect()
  262. {
  263. CXTPPropertyGridItem::OnDeselect();
  264. if (m_wndCheckBox.m_hWnd) m_wndCheckBox.DestroyWindow();
  265. }
  266. void CCustomItemCheckBox::OnSelect()
  267. {
  268. CXTPPropertyGridItem::OnSelect();
  269. if (!m_bReadOnly)
  270. {
  271. CRect rc = GetValueRect();
  272. rc.left -= 15;
  273. rc.right = rc.left + 15;
  274. if (!m_wndCheckBox.m_hWnd)
  275. {
  276. m_wndCheckBox.Create(NULL, WS_CHILD|BS_AUTOCHECKBOX|BS_FLAT, rc, (CWnd*)m_pGrid, 0);
  277. }
  278. if (m_wndCheckBox.GetCheck() != m_bValue) m_wndCheckBox.SetCheck(m_bValue);
  279. m_wndCheckBox.MoveWindow(rc);
  280. m_wndCheckBox.ShowWindow(SW_SHOW);
  281. }
  282. }
  283. CRect CCustomItemCheckBox::GetValueRect()
  284. {
  285. CRect rcValue(CXTPPropertyGridItem::GetValueRect());
  286. rcValue.left += 17;
  287. return rcValue;
  288. }
  289. BOOL CCustomItemCheckBox::OnDrawItemValue(CDC& dc, CRect rcValue)
  290. {
  291. CRect rcText(rcValue);
  292. if (m_wndCheckBox.GetSafeHwnd() == 0 && m_bValue)
  293. {
  294. CRect rcCheck(rcText.left , rcText.top, rcText.left + 13, rcText.bottom -1);
  295. dc.DrawFrameControl(rcCheck, DFC_MENU, DFCS_MENUCHECK);
  296. }
  297. rcText.left += 17;
  298. dc.DrawText( GetValue(), rcText,  DT_SINGLELINE|DT_VCENTER);
  299. return TRUE;
  300. }
  301. BOOL CCustomItemCheckBox::GetBool()
  302. {
  303. return m_bValue;
  304. }
  305. void CCustomItemCheckBox::SetBool(BOOL bValue)
  306. {
  307. m_bValue = bValue;
  308. if (m_wndCheckBox.GetSafeHwnd())
  309. m_wndCheckBox.SetCheck(bValue);
  310. }
  311. BOOL CCustomItemCheckBox::IsValueChanged()
  312. {
  313. return !m_bValue;
  314. }
  315. IMPLEMENT_DYNAMIC(CInplaceUpperCase, CXTPPropertyGridInplaceEdit)
  316. BEGIN_MESSAGE_MAP(CInplaceUpperCase, CXTPPropertyGridInplaceEdit)
  317. //{{AFX_MSG_MAP(CXTPPropertyGridInplaceEdit)
  318. //}}AFX_MSG_MAP
  319. ON_WM_CHAR()
  320. END_MESSAGE_MAP()
  321. void CInplaceUpperCase::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
  322. {
  323. CString strChar((TCHAR)nChar), strUpper((TCHAR)nChar);
  324. strUpper.MakeUpper();
  325. if (strChar != strUpper) ReplaceSel(strUpper, TRUE);
  326. else CXTPPropertyGridInplaceEdit::OnChar(nChar, nRepCnt, nFlags);
  327. }
  328. ////////////////////////////////////////////////////////////////////////////////////
  329. ///////////////////////////////////////////////////////////////////////////////
  330. BEGIN_MESSAGE_MAP(CInplaceSlider, CSliderCtrl)
  331. ON_WM_CTLCOLOR_REFLECT()
  332. ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, OnCustomDraw)
  333. END_MESSAGE_MAP()
  334. HBRUSH CInplaceSlider::CtlColor(CDC* pDC, UINT /*nCtlColor*/)
  335. {
  336. class CGridView : public CXTPPropertyGridView
  337. {
  338. friend class CInplaceSlider;
  339. };
  340. CGridView* pGrid = (CGridView*)m_pItem->m_pGrid;
  341. COLORREF clr = pGrid->GetPaintManager()->GetItemMetrics()->m_clrBack;
  342. if (clr != m_clrBack || !m_brBack.GetSafeHandle())
  343. {
  344. m_brBack.DeleteObject();
  345. m_brBack.CreateSolidBrush(clr);
  346. m_clrBack = clr;
  347. }
  348. pDC->SetBkColor(m_clrBack);
  349. return m_brBack;
  350. }
  351. void CInplaceSlider::OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult)
  352. {
  353. LPNMCUSTOMDRAW lpCustDraw = (LPNMCUSTOMDRAW)pNMHDR;
  354. if(lpCustDraw->dwDrawStage == CDDS_PREPAINT)
  355. {
  356. int nValue = GetPos();
  357. if (nValue != m_nValue)
  358. {
  359. m_nValue = nValue;
  360. m_pItem->SetNumber(nValue);
  361. m_pItem->OnValueChanged(m_pItem->GetValue());
  362. m_pItem->GetGrid()->Invalidate(FALSE);
  363. }
  364. }
  365. *pResult = CDRF_DODEFAULT;
  366. }
  367. CCustomItemSlider::CCustomItemSlider(CString strCaption)
  368. : CXTPPropertyGridItemNumber(strCaption)
  369. {
  370. m_wndSlider.m_pItem = this;
  371. m_nFlags = 0;
  372. }
  373. void CCustomItemSlider::OnDeselect()
  374. {
  375. CXTPPropertyGridItem::OnDeselect();
  376. if (m_wndSlider.m_hWnd) m_wndSlider.DestroyWindow();
  377. }
  378. void CCustomItemSlider::OnSelect()
  379. {
  380. CXTPPropertyGridItem::OnSelect();
  381. CRect rc = GetValueRect();
  382. if (!m_bReadOnly)
  383. {
  384. CWindowDC dc(m_pGrid);
  385. CXTPFontDC font (&dc, GetGrid()->GetFont());
  386. m_nWidth = dc.GetTextExtent(_T("XXX")).cx;
  387. rc.left += m_nWidth + 2;
  388. if (rc.left >= rc.right)
  389. return;
  390. if (!m_wndSlider.m_hWnd)
  391. {
  392. m_wndSlider.Create(WS_CHILD|TBS_HORZ, rc, (CWnd*)m_pGrid, 0);
  393. }
  394. m_wndSlider.SetPos(GetNumber());
  395. m_wndSlider.SetRange(0, 100);
  396. m_wndSlider.MoveWindow(rc);
  397. m_wndSlider.ShowWindow(SW_SHOW);
  398. }
  399. }
  400. //////////////////////////////////////////////////////////////////////////
  401. // CCustomItemButton
  402. BEGIN_MESSAGE_MAP(CInplaceButton, CXTButton)
  403. ON_CONTROL_REFLECT(BN_CLICKED, OnClicked)
  404. ON_WM_SETCURSOR()
  405. END_MESSAGE_MAP()
  406. void CInplaceButton::OnClicked()
  407. {
  408. m_pItem->m_bValue = !m_pItem->m_bValue;
  409. m_pItem->OnValueChanged(m_pItem->GetValue());
  410. SetChecked(m_pItem->m_bValue);
  411. }
  412. BOOL CInplaceButton::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
  413. {
  414. ::SetCursor(AfxGetApp()->LoadStandardCursor(MAKEINTRESOURCE(32649)));
  415. return TRUE;
  416. }
  417. CCustomItemButton::CCustomItemButton(CString strCaption, BOOL bFullRowButton, BOOL bValue)
  418. : CXTPPropertyGridItem(bFullRowButton? _T(""): strCaption)
  419. {
  420. m_wndButton.m_pItem = this;
  421. m_nFlags = 0;
  422. m_bValue = bValue;
  423. m_strButtonText = strCaption;
  424. m_bFullRowButton = bFullRowButton;
  425. m_wndFont.CreateFont(12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, _T("Tahoma"));
  426. }
  427. BOOL CCustomItemButton::GetBool()
  428. {
  429. return m_bValue;
  430. }
  431. void CCustomItemButton::SetBool(BOOL bValue)
  432. {
  433. m_bValue = bValue;
  434. if (m_wndButton.GetSafeHwnd())
  435. m_wndButton.SetCheck(bValue);
  436. }
  437. BOOL CCustomItemButton::IsValueChanged()
  438. {
  439. return !m_bValue;
  440. }
  441. void CCustomItemButton::CreateButton()
  442. {
  443. if (IsVisible())
  444. {
  445. CRect rc;
  446. if (m_bFullRowButton)
  447. {
  448. rc = GetItemRect();
  449. rc.DeflateRect( m_nIndent * 14, 0, 0, 1);
  450. } else
  451. {
  452. rc = GetValueRect();
  453. }
  454. if (!m_wndButton.m_hWnd)
  455. {
  456. m_wndButton.Create(m_strButtonText, WS_CHILD|BS_FLAT|BS_NOTIFY|WS_VISIBLE|BS_OWNERDRAW, rc, (CWnd*)m_pGrid, 100);
  457. m_wndButton.SetFont(&m_wndFont);
  458. m_wndButton.SetTheme(new CXTButtonThemeOfficeXP(TRUE));
  459. }
  460. if (m_wndButton.GetChecked() != m_bValue) m_wndButton.SetChecked(m_bValue);
  461. m_wndButton.MoveWindow(rc);
  462. m_wndButton.Invalidate(FALSE);
  463. }
  464. else
  465. {
  466. m_wndButton.DestroyWindow();
  467. }
  468. }
  469. void CCustomItemButton::SetVisible(BOOL bVisible)
  470. {
  471. CXTPPropertyGridItem::SetVisible(bVisible);
  472. CreateButton();
  473. }
  474. void CCustomItemButton::OnIndexChanged()
  475. {
  476. CreateButton();
  477. }
  478. BOOL CCustomItemButton::OnDrawItemValue(CDC& /*dc*/, CRect /*rcValue*/)
  479. {
  480. CreateButton();
  481. return FALSE;
  482. }
  483. //////////////////////////////////////////////////////////////////////////
  484. // CCustomItemMenu
  485. void CCustomItemMenu::OnInplaceButtonDown(CXTPPropertyGridInplaceButton* pButton)
  486. {
  487. CMenu menu;
  488. menu.CreatePopupMenu();
  489. menu.InsertMenu(0, MF_BYPOSITION | MF_STRING, 1, _T("Choose 1"));
  490. menu.InsertMenu(1, MF_BYPOSITION | MF_STRING, 2, _T("Choose 2"));
  491. menu.InsertMenu(2, MF_BYPOSITION | MF_STRING, 3, _T("Choose 3"));
  492. CRect rc = pButton->GetRect();
  493. pButton->GetGrid()->ClientToScreen(&rc);
  494. XTPPaintManager()->SetTheme(xtpThemeWhidbey);
  495. UINT nCmd = CXTPCommandBars::TrackPopupMenu(&menu, TPM_RETURNCMD|TPM_NONOTIFY, 
  496. rc.right, rc.top, pButton->GetGrid(), 0);
  497. if (nCmd >0)
  498. {
  499. CString str;
  500. menu.GetMenuString(nCmd, str, MF_BYCOMMAND);
  501. OnValueChanged(str);
  502. }
  503. }