MainFrm.cpp
上传用户:kssdz899
上传日期:2007-01-08
资源大小:79k
文件大小:11k
源码类别:

钩子与API截获

开发平台:

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