SampleView.cpp
上传用户:szcanmei
上传日期:2007-01-02
资源大小:48k
文件大小:7k
源码类别:

菜单

开发平台:

Visual C++

  1. // A flat popup menu for controls
  2. // Copyright (c) 1999 Andy Brown <andy@mirage.dabsol.co.uk>
  3. // You may do whatever you like with this file, I just don't care.
  4. #include "stdafx.h"
  5. #include "SampleView.h"
  6. #include "FlatPopupMenu.h"
  7. #include "resource.h"
  8. #ifdef _DEBUG
  9. #define new DEBUG_NEW
  10. #undef THIS_FILE
  11. static char THIS_FILE[] = __FILE__;
  12. #endif
  13. IMPLEMENT_DYNCREATE(CSampleView, CView)
  14. /***************/
  15. /* Message map */
  16. /***************/
  17. BEGIN_MESSAGE_MAP(CSampleView, CView)
  18. //{{AFX_MSG_MAP(CSampleView)
  19. ON_WM_CONTEXTMENU()
  20. ON_WM_LBUTTONUP()
  21. //}}AFX_MSG_MAP
  22. END_MESSAGE_MAP()
  23. /***************/
  24. /* Constructor */
  25. /***************/
  26. CSampleView::CSampleView()
  27. {
  28. m_pFont=NULL;
  29. m_pBrush=NULL;
  30. m_crBack=PALETTERGB(192,192,192);
  31. m_crText=PALETTERGB(0,0,0);
  32. m_bCheck1=true;
  33. m_bCheck2=false;
  34. }
  35. /**************/
  36. /* Destructor */
  37. /**************/
  38. CSampleView::~CSampleView()
  39. {
  40. if(m_pFont)
  41. delete m_pFont;
  42. if(m_pBrush)
  43. delete m_pBrush;
  44. }
  45. /***********/
  46. /* Draw it */
  47. /***********/
  48. void CSampleView::OnDraw(CDC *pDC)
  49. {
  50. int  x,y,nDC,width1,width2;
  51. TEXTMETRIC tm;
  52. CRect  rect;
  53. if(m_pFont==NULL)
  54. {
  55. m_pFont=new CFont;
  56. m_pFont->CreatePointFont(10,"MS Sans Serif");
  57. GetTextMetrics(*pDC,&tm);
  58. m_Height=tm.tmHeight;
  59. }
  60. if(m_pBrush==NULL)
  61. {
  62. m_pBrush=new CBrush;
  63. m_pBrush->CreateSolidBrush(m_crBack);
  64. }
  65. nDC=pDC->SaveDC();
  66. x=10;
  67. y=10;
  68. pDC->SelectObject(m_pFont);
  69. pDC->SelectObject(m_pBrush);
  70. pDC->SelectStockObject(BLACK_PEN);
  71. pDC->SetTextColor(m_crText);
  72. pDC->SetBkMode(TRANSPARENT);
  73. m_rcControl.left=10;
  74. m_rcControl.top=10;
  75. m_rcControl.right=200;
  76. m_rcControl.bottom=100;
  77. pDC->Rectangle(m_rcControl);
  78. width1=pDC->GetTextExtent("File").cx;
  79. pDC->Rectangle(x,y,x+width1+9,y+m_Height);
  80. pDC->TextOut(x+4,y+1,"File");
  81. x+=width1+8;
  82. width2=pDC->GetTextExtent("Edit").cx;
  83. pDC->Rectangle(x,y,x+width2+8,y+m_Height);
  84. pDC->TextOut(x+4,y+1,"Edit");
  85. rect.left=10;
  86. rect.right=200;
  87. rect.top=10+m_Height+10;
  88. rect.bottom=100;
  89. m_rcFile.left=10;
  90. m_rcFile.top=10;
  91. m_rcFile.right=10+width1+8;
  92. m_rcFile.bottom=10+m_Height;
  93. m_rcEdit.left=m_rcFile.right;
  94. m_rcEdit.right=m_rcEdit.left+width2+8;
  95. m_rcEdit.top=10;
  96. m_rcEdit.bottom=10+m_Height;
  97. pDC->DrawText("select a menu title or right-click here to test the flat popup menu",rect,DT_CENTER | DT_WORDBREAK);
  98. pDC->RestoreDC(nDC);
  99. }
  100. /***************************/
  101. /* CSampleView diagnostics */
  102. /***************************/
  103. #ifdef _DEBUG
  104. void CSampleView::AssertValid() const
  105. {
  106. CView::AssertValid();
  107. }
  108. void CSampleView::Dump(CDumpContext& dc) const
  109. {
  110. CView::Dump(dc);
  111. }
  112. #endif
  113. /******************/
  114. /* WM_CONTEXTMENU */
  115. /******************/
  116. void CSampleView::OnContextMenu(CWnd *pWnd,CPoint point)
  117. {
  118. ScreenToClient(&point);
  119. if(m_rcControl.PtInRect(point))
  120. ControlMenu(point);
  121. }
  122. /******************/
  123. /* Left button up */
  124. /******************/
  125. void CSampleView::OnLButtonUp(UINT nFlags, CPoint point) 
  126. {
  127. if(m_rcFile.PtInRect(point))
  128. FileMenu();
  129. else if(m_rcEdit.PtInRect(point))
  130. EditMenu();
  131. }
  132. /*************/
  133. /* File menu */
  134. /*************/
  135. void CSampleView::FileMenu(void)
  136. {
  137. CFlatPopupMenu menu;
  138. CPoint  p;
  139. int  id;
  140. TCHAR  szBuffer[100];
  141. // set some of the colors
  142. menu.SetColor(CFlatPopupMenu::colorBorder,m_crText);
  143. menu.SetColor(CFlatPopupMenu::colorText,m_crText);
  144. menu.SetColor(CFlatPopupMenu::colorBackground,m_crBack);
  145. // create it
  146. menu.Create(AfxGetInstanceHandle(),IDB_FILE);
  147. // add some items
  148. menu.AppendItem(0,"&New...",1,0);
  149. menu.AppendItem(0,"&Open...",2,1);
  150. menu.AppendItem(0,"Close",3);
  151. menu.AppendItem(CFlatPopupMenu::itemSeparator,NULL,0);
  152. menu.AppendItem(0,"&Save",4,2);
  153. menu.AppendItem(0,"Save &As...",5);
  154. menu.AppendItem(0,"Save A&ll",6,3);
  155. menu.AppendItem(CFlatPopupMenu::itemSeparator,NULL,0);
  156. menu.AppendItem(0,"Page Set&up",7);
  157. menu.AppendItem(0,"&Print...",8,4);
  158. // track it
  159. p.x=m_rcFile.left;
  160. p.y=m_rcFile.bottom-1;
  161. ClientToScreen(&p);
  162. id=menu.Track(p.x,p.y,NULL,true);
  163. if(id>0)
  164. {
  165. wsprintf(szBuffer,"selected id #%d",id);
  166. AfxMessageBox(szBuffer);
  167. }
  168. }
  169. /*************/
  170. /* Edit menu */
  171. /*************/
  172. void CSampleView::EditMenu(void)
  173. {
  174. CFlatPopupMenu menu;
  175. CPoint  p;
  176. int  id;
  177. TCHAR  szBuffer[100];
  178. // set some of the colors
  179. menu.SetColor(CFlatPopupMenu::colorBorder,m_crText);
  180. menu.SetColor(CFlatPopupMenu::colorText,m_crText);
  181. menu.SetColor(CFlatPopupMenu::colorBackground,m_crBack);
  182. // create it
  183. menu.Create(AfxGetInstanceHandle(),IDB_EDIT);
  184. // add some items
  185. menu.AppendItem(0,"&Undo",1,0);
  186. menu.AppendItem(0,"&Redo",2,1);
  187. menu.AppendItem(CFlatPopupMenu::itemSeparator,NULL,0);
  188. menu.AppendItem(0,"Cu&t",3,2);
  189. menu.AppendItem(0,"&Copy",4,3);
  190. menu.AppendItem(0,"&Paste",5,4);
  191. menu.AppendItem(0,"&Delete",6,5);
  192. menu.AppendItem(CFlatPopupMenu::itemSeparator,NULL,0);
  193. menu.AppendItem(0,"Select A&ll",7);
  194. // track it
  195. p.x=m_rcEdit.left;
  196. p.y=m_rcEdit.bottom-1;
  197. ClientToScreen(&p);
  198. id=menu.Track(p.x,p.y,NULL,true);
  199. if(id>0)
  200. {
  201. wsprintf(szBuffer,"selected id #%d",id);
  202. AfxMessageBox(szBuffer);
  203. }
  204. }
  205. /****************/
  206. /* control menu */
  207. /****************/
  208. void CSampleView::ControlMenu(CPoint point)
  209. {
  210. CFlatPopupMenu menu,submenu;
  211. CPoint  p;
  212. // set some of the colors
  213. menu.SetColor(CFlatPopupMenu::colorBorder,m_crText);
  214. menu.SetColor(CFlatPopupMenu::colorText,m_crText);
  215. menu.SetColor(CFlatPopupMenu::colorBackground,m_crBack);
  216. submenu.SetColor(CFlatPopupMenu::colorBorder,m_crText);
  217. submenu.SetColor(CFlatPopupMenu::colorText,m_crText);
  218. submenu.SetColor(CFlatPopupMenu::colorBackground,m_crBack);
  219. // create it
  220. menu.Create(AfxGetInstanceHandle(),IDB_CONTROL);
  221. submenu.Create(AfxGetInstanceHandle(),IDB_CONTROL);
  222. // add some items
  223. menu.AppendItem(CFlatPopupMenu::itemBold | CFlatPopupMenu::itemNotSelectable,"A Title",0);
  224. menu.AppendItem(CFlatPopupMenu::itemSeparator,NULL,0);
  225. menu.AppendItem(0,"Checkable item &1",1,m_bCheck1 ? 1 : 0);
  226. menu.AppendItem(0,"Checkable item &2",2,m_bCheck2 ? 1 : 0);
  227. menu.AppendItem(CFlatPopupMenu::itemSeparator,NULL,0);
  228. menu.AppendPopup(0,"Colors",submenu);
  229. submenu.AppendItem(0,"&Background",3);
  230. submenu.AppendItem(0,"&Text",4);
  231. // track it
  232. ClientToScreen(&point);
  233. switch(menu.Track(point.x,point.y,NULL,true))
  234. {
  235. case 1:
  236. m_bCheck1^=true;
  237. break;
  238. case 2:
  239. m_bCheck2^=true;
  240. break;
  241. case 3:
  242. EditColor(m_crBack);
  243. break;
  244. case 4:
  245. EditColor(m_crText);
  246. break;
  247. }
  248. }
  249. /****************/
  250. /* Edit a color */
  251. /****************/
  252. void CSampleView::EditColor(COLORREF& cr)
  253. {
  254. CColorDialog dlg;
  255. dlg.m_cc.rgbResult=cr;
  256. if(dlg.DoModal()==IDOK)
  257. {
  258. cr=dlg.GetColor();
  259. delete m_pBrush;
  260. m_pBrush=NULL;
  261. Invalidate();
  262. }
  263. }