VC技巧三 - 界面 在MFC加入"这是什么?"的帮助提示 MFC在CPropertySheet中封装了属性,但不支持标题的"这是什么?"帮助提示.函数 CPropertySheet::OnNcCreate()屏蔽了扩展风格WS_EX_CONTEXTHELP, 因此,即使 你在构造函数中加入了扩展风格,它也不能出现在窗口中. 解决方法很简单,在继承类中设置好风格位,如下所示: BOOL CWhatsThisPropertySheet::OnNcCreate( LPCREATESTRUCT lpCreateStruct) ( if(!CPropertySheet::OnNcCreate(lpCreateStruct)) return FALSE; //显式地定义此风格 //CPropertySheet默认是关 ModifyStyleEx(0, WS_EX_CONTEXTHELP); return true; ) 精通工具条 VC++的工具条有很多特性,但有时候也会让你感到困惑. 这里有一些使它们服服贴 贴的小技巧. 要移走一个工具条项,只须将它拖到空工具条的右边,然后点击右上角的关闭按钮. 注意显示在浮动工具条菜单条上的工具条的名称,可以通过右击菜单条来关闭 一 个工具条,使之挂起.反过来,激活一个挂起的工具条,右击你菜单条或另一个工具 条,然后选中 你想看到的工具条的名字. 如果你想同时开关好几个工具条,不用一个一个地去右击,使用菜单上的工具, 用 户化菜单命令,会出现工具条制表顺序对话框,然后进行选择. 这个对话框也允许 挂起干扰你的工具条,或者增大看不见工具条按钮的图标. 你可以在调试时使用和编辑代码时不同的工具条布局,而二者不互相干扰.当你发 现浮动工具条停在不期望的位置时,按住Ctrl键,然后用鼠标将它移到旁边去, 当 你停下来的时候,它不再回去,即使你把它放在另一个工具条的上面. 如何改变视窗的背景颜色 Windows向窗口发送一个WM_ERASEBKGND消息通知该窗口擦除背景,可以使用 ClassWizard重载该消息的缺省处理程序来擦除背景(实际是画),并返回 TRUE以防止Windows擦除窗口。 //Paint area that needs to be erased. BOOL CSampleView : : OnEraseBkgnd (CDC* pDC) { // Create a pruple brush. CBrush Brush (RGB (128 , 0 , 128) ); // Select the brush into the device context . CBrush* pOldBrush = pDC—>SelcetObject (&brush); // Get the area that needs to be erased . CRect reClip ; pDC—>GetCilpBox (&rcClip); //Paint the area. pDC—> PatBlt (rcClip.left , rcClip.top , rcClip.Width ( ) , rcClip.Height ( ) , PATCOPY ); //Unselect brush out of device context . pDC—>SelectObject (pOldBrush ); // Return nonzero to half fruther processing . return TRUE; } 为MFC应用程序添加全屏幕显示功能 在CMainFrame类中添加下列成员变量和成员函数(使用ClassWizard),下面是这 些变量和函数的功能说明: 成员变量: BOOL m_bFullScreen; //全屏幕显示标志 CRect m_FullScreenWindowRect; //全屏幕显示窗口Rect WINDOWPLACEMENT m_wpPrev; //用于保存正常视图时的窗口位置信息 CToolBar * m_wndFullScreenBar; //全屏幕显示时的浮动工具条 成员函数: void OnMenuFullscreen(); //全屏幕显示的处理函数 void OnGetMinMaxInfo(); //捕获WM_GETMINMAXINFO消息以便允许你增加窗口大小 void OnUpdateViewFullScreen(); //更新“全屏幕显示”菜单的状态 源码 void CMainFrame::OnMenuFullscreen() {//全屏幕显示的处理函数 RECT rectDesktop; WINDOWPLACEMENT wpNew; if (m_bFullScreen) {//全屏幕显示模式 //隐藏工具条和状态条 m_wndStatusBar.ShowWindow(SW_HIDE); m_wndToolBar.ShowWindow(SW_HIDE); //保存正常视图时的窗口位置信息以便恢复原来状态 GetWindowPlacement (&m_wpPrev); m_wpPrev.length = sizeof m_wpPrev; //调整RECT为新的窗口尺寸 ::GetWindowRect ( ::GetDesktopWindow(), &rectDesktop ); ::AdjustWindowRectEx(&rectDesktop, GetStyle(), TRUE, GetExStyle()); //保存RECT以便OnGetMinMaxInfo()使用 m_FullScreenWindowRect = rectDesktop; wpNew = m_wpPrev; wpNew.showCmd = SW_SHOWNORMAL; wpNew.rcNormalPosition = rectDesktop; //生成新的工具条 m_wndFullScreenBar=new CToolBar; if(!m_wndFullScreenBar->Create(this, CBRS_SIZE_DYNAMIC|CBRS_FLOATING) || !m_wndFullScreenBar->LoadToolBar(IDR_FULLSCREEN)) { TRACE0("Failed to create toolbar\n"); return; // fail to create } //不允许工具条停泊 m_wndFullScreenBar->EnableDocking(FALSE); m_wndFullScreenBar->SetWindowPos(0,100,100,0,0,SWP_NOSIZE |SWP_NOZORDER|SWP_NOACTIVATE|SWP_SHOWWINDOW); m_wndFullScreenBar->SetWindowText(_T("全屏幕显示")); FloatControlBar(m_wndFullScreenBar, CPoint(100,100)); m_bFullScreen=TRUE; } else {//正常显示模式 //删除全屏幕工具条 m_wndFullScreenBar->DestroyWindow(); delete m_wndFullScreenBar; m_bFullScreen=FALSE; //恢复工具条和状态条 m_wndStatusBar.ShowWindow(SW_SHOWNORMAL); m_wndToolBar.ShowWindow(SW_SHOWNORMAL); wpNew = m_wpPrev; } //设置窗口显示状态 SetWindowPlacement ( &wpNew ); } void CMainFrame::OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI) { if (m_bFullScreen) { lpMMI->ptMaxSize.y = m_FullScreenWindowRect.Height(); lpMMI->ptMaxTrackSize.y = lpMMI->ptMaxSize.y; lpMMI->ptMaxSize.x = m_FullScreenWindowRect.Width(); lpMMI->ptMaxTrackSize.x = lpMMI->ptMaxSize.x; } } void CMainFrame::OnUpdateMenuFullscreen(CCmdUI* pCmdUI) {//更新菜单的状态 pCmdUI->Enable(); pCmdUI->SetCheck(m_bFullScreen); }