MainFrm.cpp
上传用户:zhoushen
上传日期:2022-06-15
资源大小:84k
文件大小:11k
源码类别:

对话框与窗口

开发平台:

Visual C++

  1. // MainFrm.cpp : implementation of the CMainFrame class
  2. //
  3. // Contains menu option handlers for customisation of MDI child window
  4. // captions.
  5. //
  6. //
  7. #include "stdafx.h"
  8. #include "Resource.h"
  9. #include "CaptionDemo.h"
  10. #include "TitleDialog.h"
  11. #include "ColorPickDialog.h"
  12. #include "MaxLinesDialog.h"
  13. #include "BmpCaptionBackground.h"
  14. #include "ChildFrm.h"
  15. ///////////////
  16. // Includes for custom caption classes
  17. //
  18. #include "..CustomCaptionCaptionTextAttributes.h"
  19. #include "..CustomCaptionCaptionBackground.h"
  20. #include "..CustomCaptionGradientCaptionBackground.h"
  21. #include "MainFrm.h"
  22. #ifdef _DEBUG
  23. #define new DEBUG_NEW
  24. #undef THIS_FILE
  25. static char THIS_FILE[] = __FILE__;
  26. #endif
  27. /////////////////////////////////////////////////////////////////////////////
  28. // CMainFrame
  29. IMPLEMENT_DYNAMIC(CMainFrame, CMDIFrameWnd)
  30. BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWnd)
  31. //{{AFX_MSG_MAP(CMainFrame)
  32. ON_WM_CREATE()
  33. ON_COMMAND(ID_EDIT_SET_TITLE, OnEditSetTitle)
  34. ON_COMMAND(ID_EDIT_SET_ACTIVE_FONT, OnEditSetActiveFont)
  35. ON_COMMAND(ID_EDIT_SET_BMP_CAPTION, OnEditSetBmpCaption)
  36. ON_COMMAND(ID_EDIT_SET_GRADIENT_CAPTION, OnEditSetGradientCaption)
  37. ON_COMMAND(ID_EDIT_SET_DEFAULT_BACKGROUND, OnEditSetDefaultBackground)
  38. ON_COMMAND(ID_EDIT_SET_DEFAULT_ACTIVE_COLORS, OnEditSetDefaultActiveColors)
  39. ON_COMMAND(ID_EDIT_SET_ACTIVE_COLORS, OnEditSetActiveColors)
  40. ON_COMMAND(ID_EDIT_SET_DEFAULT_INACTIVE_COLORS, OnEditSetDefaultInactiveColors)
  41. ON_COMMAND(ID_EDIT_SET_INACTIVE_COLORS, OnEditSetInactiveColors)
  42. ON_COMMAND(ID_EDIT_SET_DEFAULT_FONT, OnEditSetDefaultFonts)
  43. // ON_COMMAND(ID_EDIT_CAPTION_MULTILINE, OnEditCaptionMultiline)
  44. // ON_COMMAND(ID_EDIT_CAPTION_SINGLELINE, OnEditCaptionSingleline)
  45. ON_COMMAND(ID_EDIT_SET_INACTIVE_FONT, OnEditSetInactiveFont)  
  46. //}}AFX_MSG_MAP
  47. END_MESSAGE_MAP()
  48. static UINT indicators[] =
  49. {
  50. ID_SEPARATOR,           // status line indicator
  51. ID_INDICATOR_CAPS,
  52. ID_INDICATOR_NUM,
  53. ID_INDICATOR_SCRL,
  54. };
  55. /////////////////////////////////////////////////////////////////////////////
  56. // CMainFrame construction/destruction
  57. CMainFrame::CMainFrame()
  58. {
  59. // TODO: add member initialization code here
  60. }
  61. CMainFrame::~CMainFrame()
  62. {
  63. }
  64. int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
  65. {
  66. if (CMDIFrameWnd::OnCreate(lpCreateStruct) == -1)
  67. return -1;
  68. if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
  69. | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
  70. !m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
  71. {
  72. TRACE0("Failed to create toolbarn");
  73. return -1;      // fail to create
  74. }
  75. if (!m_wndStatusBar.Create(this) ||
  76. !m_wndStatusBar.SetIndicators(indicators,
  77.   sizeof(indicators)/sizeof(UINT)))
  78. {
  79. TRACE0("Failed to create status barn");
  80. return -1;      // fail to create
  81. }
  82. // TODO: Delete these three lines if you don't want the toolbar to
  83. //  be dockable
  84. m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
  85. EnableDocking(CBRS_ALIGN_ANY);
  86. DockControlBar(&m_wndToolBar);
  87. return 0;
  88. }
  89. BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
  90. {
  91. if( !CMDIFrameWnd::PreCreateWindow(cs) )
  92. return FALSE;
  93. // TODO: Modify the Window class or styles here by modifying
  94. //  the CREATESTRUCT cs
  95. return TRUE;
  96. }
  97. /////////////////////////////////////////////////////////////////////////////
  98. // CMainFrame diagnostics
  99. #ifdef _DEBUG
  100. void CMainFrame::AssertValid() const
  101. {
  102. CMDIFrameWnd::AssertValid();
  103. }
  104. void CMainFrame::Dump(CDumpContext& dc) const
  105. {
  106. CMDIFrameWnd::Dump(dc);
  107. }
  108. #endif //_DEBUG
  109. /////////////////////////////////////////////////////////////////////////////
  110. // CMainFrame message handlers
  111. ////////////
  112. // Set the title of the active document
  113. //
  114. void CMainFrame::OnEditSetTitle() 
  115. {
  116. CMDIChildWnd* pChild = MDIGetActive();
  117. if (!pChild)
  118. return;
  119. CDocument* pActiveDoc = pChild->GetActiveDocument();
  120. if (!pActiveDoc)
  121. return;
  122. CTitleDialog titleDialog(this);
  123. pChild->GetWindowText(titleDialog.m_TitleEdit);
  124. if (titleDialog.DoModal() == IDOK)
  125. pActiveDoc->SetTitle(titleDialog.m_TitleEdit);
  126. }
  127. /////////////////
  128. // Allow user to change the active caption font
  129. //
  130. void CMainFrame::OnEditSetActiveFont() 
  131. {
  132. CCaption& caption = GetActiveMDICaption();
  133. /////////////
  134. // Get current caption active font details to display in dialog
  135. //
  136. LOGFONT lf;
  137. caption.GetTextAttributes()->GetActiveFont()->GetLogFont(&lf);
  138. //////////
  139. // Display font dialog with current font details
  140. //
  141. CFontDialog fontDlg(&lf);
  142. fontDlg.m_cf.Flags &= ~CF_EFFECTS;   // Disable special font effects
  143. if (fontDlg.DoModal() != IDOK)
  144. return;
  145. ///////////
  146. // Retrieve selected font and set into caption text attributes
  147. //
  148. fontDlg.GetCurrentFont(&lf);
  149. caption.GetTextAttributes()->SetActiveFont(lf);
  150. caption.Refresh();
  151. }
  152. /////////////////
  153. // Allow user to change the inactive caption font
  154. //
  155. void CMainFrame::OnEditSetInactiveFont() 
  156. {
  157. CCaption& caption = GetActiveMDICaption();
  158. /////////////
  159. // Get current caption inactive font details to display in dialog
  160. //
  161. LOGFONT lf;
  162. caption.GetTextAttributes()->GetInactiveFont()->GetLogFont(&lf);
  163. //////////
  164. // Display font dialog with current font details
  165. //
  166. CFontDialog fontDlg(&lf);
  167. fontDlg.m_cf.Flags &= ~CF_EFFECTS; // Disable special font effects
  168. if (fontDlg.DoModal() != IDOK)
  169. return;
  170. ///////////
  171. // Retrieve selected font and set into caption text attributes
  172. //
  173. fontDlg.GetCurrentFont(&lf);
  174. caption.GetTextAttributes()->SetInactiveFont(lf);
  175. caption.Refresh();
  176. }
  177. /////////////////
  178. // Allow user to reset the caption fonts to the system default
  179. //
  180. void CMainFrame::OnEditSetDefaultFonts() 
  181. {
  182. CCaption& caption = GetActiveMDICaption();
  183. caption.GetTextAttributes()->UseSystemFonts();
  184. caption.Refresh();
  185. }
  186. /////////////////
  187. // Allow user to set the caption background to a shaded gradient
  188. //
  189. void CMainFrame::OnEditSetGradientCaption() 
  190. {
  191. CCaption& caption = GetActiveMDICaption();
  192. //////////
  193. // Construct a gradient background object
  194. //
  195. CCaptionBackground* pNewBackground = new CGradientCaptionBackground();
  196. //////////
  197. // Copy the colours from the old background object
  198. //
  199. pNewBackground->SetCustomColors(*caption.GetBackground());
  200. ////////////
  201. // Set the new background
  202. //
  203. caption.SetBackground(pNewBackground);
  204. }
  205. /////////////////
  206. // Allow user to set the caption background to a bitmap
  207. //
  208. void CMainFrame::OnEditSetBmpCaption() 
  209. {
  210. CCaption& caption = GetActiveMDICaption();
  211. char path[MAX_PATH] = { '' };
  212. /////////////
  213. // Check for existing bitmap
  214. //
  215. CBmpCaptionBackground* pBmpBackground = dynamic_cast<CBmpCaptionBackground*>(caption.GetBackground());
  216. /////////////
  217. // Use previous bitmap path if valid, otherwise set to Windows directory
  218. //
  219. if (pBmpBackground && pBmpBackground->IsValid())
  220. {
  221. strcpy(path, pBmpBackground->GetPath());
  222. }
  223. else
  224. {
  225. GetWindowsDirectory(path, MAX_PATH);
  226. }
  227. /////////////
  228. // Display file dialog set to look for .BMP files in the path
  229. //
  230. DWORD flags = OFN_FILEMUSTEXIST|OFN_LONGNAMES;
  231. CFileDialog bmpDlg(TRUE, "bmp", 0, 0, "Bitmap Files (*.bmp)|*.bmp||", this);
  232. bmpDlg.m_ofn.lpstrInitialDir = path;
  233. if (bmpDlg.DoModal() != IDOK)
  234. return;
  235. ///////////////
  236. // Retrieve selected file path and set into new caption bitmap background
  237. //
  238. CString bmpFile = bmpDlg.GetPathName();
  239. caption.SetBackground(new CBmpCaptionBackground(bmpFile));
  240. }
  241. /////////////////
  242. // Allow user to reset the caption background to a plain default background
  243. //
  244. void CMainFrame::OnEditSetDefaultBackground() 
  245. {
  246. CCaption& caption = GetActiveMDICaption();
  247. ///////////
  248. // Construct a plain background object from the old background
  249. //
  250. CCaptionBackground* pNewBackground = new CCaptionBackground(*caption.GetBackground());
  251. ////////////
  252. // Set the new background
  253. //
  254. caption.SetBackground(pNewBackground);
  255. }
  256. /////////////////
  257. // Allow user to reset the active caption colours to the system defaults
  258. //
  259. void CMainFrame::OnEditSetDefaultActiveColors() 
  260. {
  261. CCaption& caption = GetActiveMDICaption();
  262. ////////////
  263. // Set active caption text and background colours to system defaults
  264. //
  265. caption.GetTextAttributes()->UseSystemActiveColor();
  266. caption.GetBackground()->UseSystemActiveColor();
  267. caption.Refresh();
  268. }
  269. /////////////////
  270. // Allow user to reset the inactive caption colours to the system defaults
  271. //
  272. void CMainFrame::OnEditSetDefaultInactiveColors() 
  273. {
  274. CCaption& caption = GetActiveMDICaption();
  275. caption.GetTextAttributes()->UseSystemInactiveColor();
  276. caption.GetBackground()->UseSystemInactiveColor();
  277. caption.Refresh();
  278. }
  279. /////////////////
  280. // Allow user to set the active caption colours
  281. //
  282. void CMainFrame::OnEditSetActiveColors() 
  283. {
  284. CCaption& caption = GetActiveMDICaption();
  285. /////////////
  286. // Get current active colours to show in colour picker
  287. //
  288. COLORREF colorTxt = caption.GetTextAttributes()->GetActiveColor();
  289. COLORREF colorBk = caption.GetBackground()->GetActiveColor();
  290. ////////////
  291. // Show colour picker and set selected text and background active colours into the caption
  292. //
  293. CColorPickDlg colorPickdlg(colorTxt, colorBk);
  294. if (colorPickdlg.DoModal() == IDOK)
  295. {
  296. caption.GetTextAttributes()->SetActiveColor(colorTxt);
  297. caption.GetBackground()->SetActiveColor(colorBk);
  298. caption.Refresh();
  299. }
  300. }
  301. /////////////////
  302. // Allow user to set the inactive caption colours
  303. //
  304. void CMainFrame::OnEditSetInactiveColors() 
  305. {
  306. CCaption& caption = GetActiveMDICaption();
  307. /////////////
  308. // Get current inactive colours to show in colour picker
  309. //
  310. COLORREF colorTxt = caption.GetTextAttributes()->GetInactiveColor();
  311. COLORREF colorBk = caption.GetBackground()->GetInactiveColor();
  312. ////////////
  313. // Show colour picker and set selected text and background inactive colours into the caption
  314. //
  315. CColorPickDlg colorPickdlg(colorTxt, colorBk);
  316. if (colorPickdlg.DoModal() == IDOK)
  317. {
  318. caption.GetTextAttributes()->SetInactiveColor(colorTxt);
  319. caption.GetBackground()->SetInactiveColor(colorBk);
  320. caption.Refresh();
  321. }
  322. }
  323. /////////////////
  324. // Allow user to set the maximum number of caption lines
  325. //
  326. void CMainFrame::OnEditCaptionMultiline() 
  327. {
  328. CMultiLineCaption& caption = GetActiveMDICaption();
  329. ///////////
  330. // Display dialog for input of maximum lines number and set result into caption
  331. //
  332. CMaxLinesDialog maxLinesDlg;
  333. maxLinesDlg.m_StrMaxLines.Format("%d", caption.GetMaxLines());
  334. if (maxLinesDlg.DoModal() == IDOK)
  335. {
  336. caption.SetMaxLines(atoi(maxLinesDlg.m_StrMaxLines));
  337. }  
  338. }
  339. /////////////////
  340. // Allow user to set a single caption line
  341. //
  342. void CMainFrame::OnEditCaptionSingleline() 
  343. {
  344. CMultiLineCaption& caption = GetActiveMDICaption();
  345. caption.SetMaxLines(1);
  346. }
  347. /////////////
  348. // Helper function to get the caption for the active MDI child frame
  349. //
  350. CMultiLineCaption& CMainFrame::GetActiveMDICaption()
  351. {
  352. CChildFrame* pChild = dynamic_cast<CChildFrame*>(MDIGetActive());
  353. CMultiLineCaption& caption = pChild->GetCaption();
  354. return caption;
  355. }