孙鑫第9课--修改应用程序外观(工具栏、状态栏).doc_第1页
孙鑫第9课--修改应用程序外观(工具栏、状态栏).doc_第2页
孙鑫第9课--修改应用程序外观(工具栏、状态栏).doc_第3页
孙鑫第9课--修改应用程序外观(工具栏、状态栏).doc_第4页
孙鑫第9课--修改应用程序外观(工具栏、状态栏).doc_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

新建一个工程,MFC单文档,名字为Test,单文档。改变应用程序外观,应该在窗口创建之前修改。改变框架窗口的大小和外观,在BOOL CMainFrame:PreCreateWindow(CREATESTRUCT& cs)中修改。下面的程序是在窗口创建之前修改:BOOL CMainFrame:PreCreateWindow(CREATESTRUCT& cs)if( !CFrameWnd:PreCreateWindow(cs) )return FALSE;/ TODO: Modify the Window class or styles here by modifying/ the CREATESTRUCT cscs.cx=200;cs.cy=300;cs.style &= FWS_ADDTOTITLE;/cs.style = WS_OVERLAPPED | WS_SYSMENU | WS_BORDER;/或者这样也可以。cs.lpszName=标题;/将文档标题改为自己的标题,因为系统的SDI的style=WS_OVERLAPPEDWINDOW and FWS_ADDTOTITLE return TRUE;下面的代码是在窗口创建之后修改:在int CMainFrame:OnCreate(LPCREATESTRUCT lpCreateStruct)中添加:SetWindowLong(m_hWnd,GWL_STYLE,GetWindowLong(m_hWnd,GWL_STYLE)&WS_MAXIMIZEBOX );/没有了最大化框。修改窗口的图标,光标,背景。在BOOL CMainFrame:PreCreateWindow(CREATESTRUCT& cs)中添加:BOOL CMainFrame:PreCreateWindow(CREATESTRUCT& cs)if( !CFrameWnd:PreCreateWindow(cs) )return FALSE;/ TODO: Modify the Window class or styles here by modifying/ the CREATESTRUCT cs WNDCLASS wdcls;wdcls.cbClsExtra=0;wdcls.cbWndExtra=0;wdcls.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);wdcls.hCursor=LoadCursor(NULL,IDC_HELP);wdcls.hIcon=LoadIcon(NULL,IDI_ERROR);wdcls.hInstance=AfxGetInstanceHandle( );wdcls.lpfnWndProc=:DefWindowProc;wdcls.lpszClassName=newclass;wdcls.lpszMenuName=NULL;/不会影响菜单的创建wdcls.style=CS_HREDRAW|CS_VREDRAW;RegisterClass(&wdcls);cs.lpszClass=newclass;return TRUE;运行结果,仅ICON改变。背景和光标没有改变。(它们是VIEW类的,不是框架类的,要改变应该在VIEW类中);下面代码:BOOL CTestView:PreCreateWindow(CREATESTRUCT& cs)/ TODO: Modify the Window class or styles here by modifying/ the CREATESTRUCT cs cs.lpszClass=newclass;return CView:PreCreateWindow(cs);在框架类中只能修改图标,下面是另一种方法:BOOL CMainFrame:PreCreateWindow(CREATESTRUCT& cs)if( !CFrameWnd:PreCreateWindow(cs) )return FALSE;/ TODO: Modify the Window class or styles here by modifyingcs.lpszClass=AfxRegisterWndClass(CS_VREDRAW | CS_HREDRAW,0,0,:LoadIcon(NULL, IDI_APPLICATION);return TRUE;在VIEW类中修改光标,背景色。BOOL CTestView:PreCreateWindow(CREATESTRUCT& cs)/ TODO: Modify the Window class or styles here by modifying/ the CREATESTRUCT cs cs.lpszClass=AfxRegisterWndClass(CS_VREDRAW | CS_HREDRAW,:LoadCursor(NULL, IDC_HELP),(HBRUSH) :GetStockObject(BLACK_BRUSH),0);return CView:PreCreateWindow(cs);在窗口创建之后,修改也可以用下面的方法:在int CMainFrame:OnCreate(LPCREATESTRUCT lpCreateStruct)中添加:SetClassLong(m_hWnd,GCL_HICON,(LONG)LoadIcon(NULL,IDI_ERROR);在int CTestView:OnCreate(LPCREATESTRUCT lpCreateStruct) if (CView:OnCreate(lpCreateStruct) = -1)return -1;/ TODO: Add your specialized creation code hereSetClassLong(m_hWnd,GCL_HBRBACKGROUND,(LONG)GetStockObject(BLACK_BRUSH);return 0;下面完成一个不断变化的图标:创建三个ICON。为框架类添加:private:HICON m_hicon3;准备三幅图标:在int CMainFrame:OnCreate(LPCREATESTRUCT lpCreateStruct)前添加:extern CTestApp theApp;在int CMainFrame:OnCreate(LPCREATESTRUCT lpCreateStruct)中添加: m_hicon0=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDI_ICON1);m_hicon1=LoadIcon(AfxGetApp( )-m_hInstance,MAKEINTRESOURCE(IDI_ICON2);m_hicon2=LoadIcon(theApp.m_hInstance,MAKEINTRESOURCE(IDI_ICON3);SetTimer(1,1000,NULL);void CMainFrame:OnTimer(UINT nIDEvent) / TODO: Add your message handler code here and/or call defaultstatic int i=0;SetClassLong(m_hWnd,GCL_HICON,(LONG)m_hicon0);SetClassLong(m_hWnd,GCL_HICON,(LONG)m_hicon+i%3);CFrameWnd:OnTimer(nIDEvent);下面是工具栏的编程:为框架栏增加:CToolBar m_newToolBar;在资源中增加一个新的工具栏。在int CMainFrame:OnCreate(LPCREATESTRUCT lpCreateStruct)中添加下列代码:if (!m_newToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) |!m_newToolBar.LoadToolBar(IDR_TOOLBAR1)TRACE0(Failed to create toolbarn);return -1; / fail to createm_newToolBar.EnableDocking(CBRS_ALIGN_ANY);EnableDocking(CBRS_ALIGN_ANY);DockControlBar(&m_newToolBar);添加一个显示新工具栏的菜单项。并加上标记。void CMainFrame:OnNewToolbar() / TODO: Add your command handler code hereif (m_newToolBar.IsVisible()ShowControlBar( &m_newToolBar,FALSE,FALSE);/ ShowControlBar可以显示一个控件在原先的位置上。 else/m_newToolBar.ShowWindow(SW_SHOW);ShowControlBar( &m_newToolBar,TRUE,FALSE);或者:void CMainFrame:OnNewToolbar() / TODO: Add your command handler code hereCRect rect; /rect是用来存贮工具栏浮动时的位置的CFrameWnd* pParentFrame = m_newToolBar.GetDockingFrame();if(m_newToolBar.IsFloating() pParentFrame-GetWindowRect(&rect);/获取工具栏位置,并存贮在rect中if(m_newToolBar.IsWindowVisible()m_newToolBar.ShowWindow(SW_HIDE);elsem_newToolBar.ShowWindow(SW_SHOW);RecalcLayout();DockControlBar(&m_newToolBar);if(!rect.IsRectEmpty()FloatControlBar(&m_newToolBar,CPoint(rect.left,rect.top);/使工具栏浮动到/上面对比一下,就可以知道ShowControlBar的使用方便了。void CMainFrame:OnUpdateNewToolbar(CCmdUI* pCmdUI) / TODO: Add your command update UI handler code hereif (m_newToolBar.IsVisible()pCmdUI-SetCheck(1); elsepCmdUI-SetCheck(0);下面是状态栏的编程:在框架中:static UINT indicators =ID_SEPARATOR, / status line indicatorID_INDICATOR_CAPS,ID_INDICATOR_NUM,ID_INDICATOR_SCRL,ID_TIME,/show timeID_PROCESS/show process;在资源视图中的STRING中加入对ID_TIME和ID_PROCESS的说明;创建一个定时器,来显示时间。void CMainFrame:OnTimer(UINT nIDEvent) / TODO: Add your message handler code here and/or call defaultCString str;CTime t = CTime:GetCurrentTime();str=t.Format(%H:%M:%S);m_wndStatusBar.SetPaneText( 4, str);CFrameWnd:OnTimer(nIDEvent);在int CMainFrame:OnCreate(LPCREATESTRUCT lpCreateStruct)中添加:CString str;CTime t = CTime:GetCurrentTime();str=t.Format(%H:%M:%S);CClientDC dc(this);CSize size=dc.GetTextExtent(str) ;m_wndStatusBar.SetPaneInfo( 4, ID_TIME, SBPS_NORMAL, size.cx ); m_wndStatusBar.SetPaneText( 4, str);下面创建一个进度栏:为框架类增加:CProgressCtrl myCtrl;在int CMainFrame:OnCreate(LPCREATESTRUCT lpCreateStruct)CRect rect; m_wndStatusBar.GetItemRect( 5, &rect ); myCtrl.Create(WS_CHILD|WS_VISIBLE|PBS_SMOOTH, rect, &m_wndStatusBar, 1);/这样得到的rect是得不到的。因为在这时窗口在创建,是得不到窗口的区域大小的。myCtrl.SetPos(50); myCtrl.SetRange( 0, 100 );为此代码修改如下:在头文件中:#define UM_PROCRESS WM_USER+1(2:02)afx_msg void OnProgress();在。CPP中添加:ON_MESSAGE(UM_PROCRESS,OnProgress)在int CMainFrame:OnCreate(LPCREATESTRUCT lpCreateStruct)中添加:PostMessage(UM_PROCRESS);void CMainFrame:OnProgress()CRect rect; m_wndStatusBar.GetItemRect( 5, &rect ); myCtrl.Create(WS_CHILD|WS_VISIBLE/*|PBS_SMOOTH*/, rect, &m_wndStatusBar, 1);/这样得到的rect是得不到的。因为在这时窗口在创建,是得不到窗口的区域大小的。myCtrl.SetPos(50); myCtrl.SetRange( 0, 100 );上面的代码,当窗口变化的时候,进度栏会变化。下面是改进的代码:PostMessage(UM_PROCRESS);这句代码不要了。OnProgress()消息删除。void CMainFrame:OnPaint() CPaintDC dc(this); / device context for paintingCRect rect;m_wndStatusBar.GetItemRect( 5, &rect );if (!myCtrl.m_hWnd)myCtrl.Create(WS_CHILD|WS_VISIBLE/*|PBS_SMOOTH*/, rect, &m_wndStatusBar, 1);myCtrl.SetPos(50); myCtrl.SetRange( 0, 100 );elsemyCtrl.MoveWindow(rect);让进度栏动起来:在OnTimer中添加:myCtrl.SetStep(10);myCtrl.StepIt();下面将鼠标的坐标点在状态栏的第一个PANE显示出来。在框架中包含#i

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论