SkinMenuTestDlg.cpp
上传用户:weijiexitu
上传日期:2007-01-18
资源大小:54k
文件大小:7k
源码类别:

菜单

开发平台:

WINDOWS

  1. // SkinMenuTestDlg.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "SkinMenuTest.h"
  5. #include "SkinMenuTestDlg.h"
  6. #ifndef NO_SKIN_INI
  7. #include "..skinwindowsskininiglobalsfile.h"
  8. #endif
  9. #include "..skinwindowsskinmenumgr.h"
  10. #include "..skinwindowsskinbase.h"
  11. #ifdef _DEBUG
  12. #define new DEBUG_NEW
  13. #undef THIS_FILE
  14. static char THIS_FILE[] = __FILE__;
  15. #endif
  16. enum { COLOR_DEF, COLOR_COFFEE, COLOR_BLUE };
  17. /////////////////////////////////////////////////////////////////////////////
  18. // CSkinMenuTestDlg dialog
  19. CSkinMenuTestDlg::CSkinMenuTestDlg(CWnd* pParent /*=NULL*/)
  20. : CDialog(CSkinMenuTestDlg::IDD, pParent)
  21. {
  22. //{{AFX_DATA_INIT(CSkinMenuTestDlg)
  23. m_sSkinPath = _T("");
  24. m_nColorScheme = COLOR_BLUE;
  25. m_bGradient = TRUE;
  26. m_bSidebar = TRUE;
  27. m_sEdit = _T("Edit Control");
  28. //}}AFX_DATA_INIT
  29. // Note that LoadIcon does not require a subsequent DestroyIcon in Win32
  30. m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
  31. }
  32. void CSkinMenuTestDlg::DoDataExchange(CDataExchange* pDX)
  33. {
  34. CDialog::DoDataExchange(pDX);
  35. //{{AFX_DATA_MAP(CSkinMenuTestDlg)
  36. DDX_Control(pDX, IDC_EXPLORER1, m_browser);
  37. DDX_Text(pDX, IDC_SKINPATH, m_sSkinPath);
  38. DDX_CBIndex(pDX, IDC_COLORSCHEME, m_nColorScheme);
  39. DDX_Check(pDX, IDC_GRADIENT, m_bGradient);
  40. DDX_Check(pDX, IDC_SIDEBAR, m_bSidebar);
  41. DDX_Text(pDX, IDC_EDIT, m_sEdit);
  42. //}}AFX_DATA_MAP
  43. }
  44. BEGIN_MESSAGE_MAP(CSkinMenuTestDlg, CDialog)
  45. //{{AFX_MSG_MAP(CSkinMenuTestDlg)
  46. ON_WM_PAINT()
  47. ON_WM_QUERYDRAGICON()
  48. ON_BN_CLICKED(IDC_BROWSE, OnBrowse)
  49. ON_CBN_SELCHANGE(IDC_COLORSCHEME, OnSelchangeColorscheme)
  50. ON_WM_ERASEBKGND()
  51. ON_BN_CLICKED(IDC_GRADIENT, OnGradientChange)
  52. ON_BN_CLICKED(IDC_SIDEBAR, OnSidebarChange)
  53. ON_COMMAND(ID_FILE_BROWSE, OnBrowse)
  54. ON_WM_CONTEXTMENU()
  55. //}}AFX_MSG_MAP
  56. END_MESSAGE_MAP()
  57. /////////////////////////////////////////////////////////////////////////////
  58. // CSkinMenuTestDlg message handlers
  59. BOOL CSkinMenuTestDlg::OnInitDialog()
  60. {
  61. CDialog::OnInitDialog();
  62. // Set the icon for this dialog.  The framework does this automatically
  63. //  when the application's main window is not a dialog
  64. SetIcon(m_hIcon, TRUE); // Set big icon
  65. SetIcon(m_hIcon, FALSE); // Set small icon
  66. m_browser.Navigate("about:blank", NULL, NULL, NULL, NULL);
  67. ResetMenuMgr();
  68. return TRUE;  // return TRUE  unless you set the focus to a control
  69. }
  70. // If you add a minimize button to your dialog, you will need the code below
  71. //  to draw the icon.  For MFC applications using the document/view model,
  72. //  this is automatically done for you by the framework.
  73. void CSkinMenuTestDlg::OnPaint() 
  74. {
  75. if (IsIconic())
  76. {
  77. CPaintDC dc(this); // device context for painting
  78. SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
  79. // Center icon in client rectangle
  80. int cxIcon = GetSystemMetrics(SM_CXICON);
  81. int cyIcon = GetSystemMetrics(SM_CYICON);
  82. CRect rect;
  83. GetClientRect(&rect);
  84. int x = (rect.Width() - cxIcon + 1) / 2;
  85. int y = (rect.Height() - cyIcon + 1) / 2;
  86. // Draw the icon
  87. dc.DrawIcon(x, y, m_hIcon);
  88. }
  89. else
  90. {
  91. CDialog::OnPaint();
  92. }
  93. }
  94. // The system calls this to obtain the cursor to display while the user drags
  95. //  the minimized window.
  96. HCURSOR CSkinMenuTestDlg::OnQueryDragIcon()
  97. {
  98. return (HCURSOR) m_hIcon;
  99. }
  100. void CSkinMenuTestDlg::OnBrowse() 
  101. {
  102. #ifndef NO_SKIN_INI
  103. CFileDialog dialog(TRUE, NULL, m_sSkinPath, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, 
  104. "Skins (*.xml)|*.xml||");
  105. if (dialog.DoModal() == IDOK)
  106. {
  107. CSkinIniGlobalsFile sif;
  108. CString sSkinPath = dialog.GetPathName();
  109. if (sif.LoadSkin(sSkinPath))
  110. {
  111. CSkinMenuMgr::LoadSkin(&sif);
  112. m_sSkinPath = sSkinPath;
  113. UpdateData(FALSE);
  114. }
  115. else
  116. {
  117. CString sMessage;
  118. sMessage.Format("'%s' is not a skin definition file or does not contain all the necessary resources", sSkinPath);
  119. AfxMessageBox(sMessage);
  120. }
  121. }
  122. #else
  123. // generic browse to display file open
  124. CFileDialog dialog(TRUE, NULL, "", OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, 
  125. "All Files (*.*)|*.*||");
  126. dialog.DoModal();
  127. #endif
  128. }
  129. void CSkinMenuTestDlg::OnSelchangeColorscheme() 
  130. {
  131. UpdateData();
  132. ResetMenuMgr();
  133. }
  134. void CSkinMenuTestDlg::ResetMenuMgr()
  135. {
  136. CSkinMenuMgr::Initialize((m_bSidebar ? SKMS_SIDEBAR : 0) | SKMS_FLAT, 8);
  137. CSkinMenu::SetRenderer(this);
  138. switch (m_nColorScheme)
  139. {
  140. case COLOR_DEF:
  141. CSkinMenuMgr::ClearColors();
  142. break;
  143. case COLOR_COFFEE:
  144. CSkinMenuMgr::SetColor(COLOR_MENU, RGB(248, 242, 224));
  145. CSkinMenuMgr::SetColor(COLOR_WINDOWTEXT, RGB(110, 90, 25));
  146. CSkinMenuMgr::SetColor(COLOR_HIGHLIGHTTEXT, RGB(255, 255, 255));
  147. CSkinMenuMgr::SetColor(COLOR_3DSHADOW, RGB(150, 130, 70));
  148. break;
  149. case COLOR_BLUE:
  150. CSkinMenuMgr::SetColor(COLOR_MENU, RGB(200, 235, 255));
  151. CSkinMenuMgr::SetColor(COLOR_WINDOWTEXT, RGB(0, 70, 100));
  152. CSkinMenuMgr::SetColor(COLOR_HIGHLIGHTTEXT, RGB(255, 255, 255));
  153. CSkinMenuMgr::SetColor(COLOR_3DSHADOW, RGB(70, 100, 130));
  154. break;
  155. }
  156. }
  157. BOOL CSkinMenuTestDlg::DrawMenuNonClientBkgnd(CDC* pDC, LPRECT pRect)
  158. {
  159. if (m_bGradient)
  160. {
  161. DrawGradientBkgnd(pDC, pRect, NULL);
  162. return TRUE;
  163. }
  164. else
  165. return FALSE;
  166. }
  167. BOOL CSkinMenuTestDlg::DrawMenuClientBkgnd(CDC* pDC, LPRECT pRect, LPRECT pClip)
  168. {
  169. if (m_bGradient)
  170. {
  171. DrawGradientBkgnd(pDC, pRect, pClip);
  172. return TRUE;
  173. }
  174. else
  175. return FALSE;
  176. }
  177. void CSkinMenuTestDlg::DrawGradientBkgnd(CDC* pDC, LPRECT pRect, LPRECT pClip)
  178. {
  179. COLORREF crFrom = CSkinMenuMgr::GetColor(COLOR_MENU);
  180. COLORREF crTo = RGB(255, 255, 255);
  181. if (pClip)
  182. {
  183. // ensure that pClip is at least 100 pixels high else the 
  184. // gradient has artifacts
  185. CRect rClip(pClip), rRect(pRect);
  186. if (rClip.Height() < 100 && rRect.Height() > 100)
  187. {
  188. rClip.InflateRect(0, (min(rRect.Height(), 100) - rClip.Height()) / 2);
  189. if (rClip.top < rRect.top)
  190. rClip.OffsetRect(0, rRect.top - rClip.top);
  191. else if (rClip.bottom > rRect.bottom)
  192. rClip.OffsetRect(0, rRect.bottom - rClip.bottom);
  193. }
  194. float fHeight = (float)rRect.Height();
  195. float fFromFactor = (pRect->bottom - rClip.top) / fHeight;
  196. float fToFactor = (pRect->bottom - rClip.bottom) / fHeight;
  197. crFrom = CSkinBase::BlendColors(crFrom, crTo, fFromFactor);
  198. crTo = CSkinBase::BlendColors(crFrom, crTo, fToFactor);
  199. CSkinBase::GradientFill(pDC, rClip, crFrom, crTo, FALSE);
  200. }
  201. else
  202. CSkinBase::GradientFill(pDC, pRect, crFrom, crTo, FALSE);
  203. }
  204. BOOL CSkinMenuTestDlg::DrawMenuSidebar(CDC* pDC, LPRECT pRect, LPCTSTR szTitle)
  205. {
  206. if (m_bGradient)
  207. {
  208. COLORREF crColor = CSkinMenuMgr::GetColor(COLOR_3DSHADOW);
  209. COLORREF crFrom = crColor;
  210. COLORREF crTo = CSkinBase::VaryColor(crFrom, 2.0f);
  211. CSkinBase::GradientFill(pDC, pRect, crFrom, crTo, FALSE);
  212. return TRUE;
  213. }
  214. else 
  215. {
  216. COLORREF crColor = CSkinMenuMgr::GetColor(COLOR_3DSHADOW);
  217. pDC->FillSolidRect(pRect, crColor);
  218. return TRUE;
  219. }
  220. return FALSE;
  221. }
  222. BOOL CSkinMenuTestDlg::DrawMenuBorder(CDC* pDC, LPRECT pRect)
  223. {
  224. return FALSE;
  225. }
  226. BOOL CSkinMenuTestDlg::OnEraseBkgnd(CDC* pDC) 
  227. {
  228. return CDialog::OnEraseBkgnd(pDC);
  229. }
  230. void CSkinMenuTestDlg::OnGradientChange() 
  231. {
  232. UpdateData();
  233. }
  234. void CSkinMenuTestDlg::OnSidebarChange() 
  235. {
  236. UpdateData();
  237. ResetMenuMgr();
  238. }
  239. void CSkinMenuTestDlg::OnContextMenu(CWnd* pWnd, CPoint point) 
  240. {
  241. if (pWnd != this)
  242. return;
  243. CMenu menu;
  244. if (menu.LoadMenu(IDR_DIALOG_CONTEXT))
  245. {
  246. CMenu* pSub = menu.GetSubMenu(0);
  247. if (pSub)
  248. pSub->TrackPopupMenu(TPM_LEFTALIGN, point.x, point.y, this);
  249. }
  250. }