第九课
如何修改MFC AppWizard向导生成的框架程序的外观和大小,修改图标、光标、背景的三种方法。如何增加和删除工具栏按钮,如何给应用程序增加工具栏,如何显示和隐藏工具栏。定制状态栏,在状态栏中添加时钟显示,CTime类及其用法。在状态栏中添加进度条(主窗口产生后立即产生进度条的巧妙思想,不能在 OnCreate函数中直接处理,要用到自定义消息的方法)。鼠标坐标显示,在CView中获取状态栏对象的几种方式。如何为应用程序添加启动画面。
修改窗口样式外观,注册自己的窗口类
只能改变图标
- BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
- {
- if( !CFrameWnd::PreCreateWindow(cs) )
- return FALSE;
- // cs.cx=300;
- // cs.cy=200;
- //cs.style&=~FWS_ADDTOTITLE;
- //cs.style=WS_OVERLAPPEDWINDOW;
- //cs.lpszName="http://www.sunxin.org";
- /*WNDCLASS wndcls;
- wndcls.cbClsExtra=0;
- wndcls.cbWndExtra=0;
- wndcls.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);
- wndcls.hCursor=LoadCursor(NULL,IDC_HELP);
- wndcls.hIcon=LoadIcon(NULL,IDI_ERROR);
- wndcls.hInstance=AfxGetInstanceHandle();
- wndcls.lpfnWndProc=::DefWindowProc;
- wndcls.lpszClassName="sunxin.org";
- wndcls.lpszMenuName=NULL;
- wndcls.style=CS_HREDRAW | CS_VREDRAW;
- RegisterClass(&wndcls);
- cs.lpszClass="sunxin.org";*/
- //cs.lpszClass=AfxRegisterWndClass(CS_HREDRAW | CS_VREDRAW,0,0,
- // LoadIcon(NULL,IDI_WARNING));
- //cs.lpszClass=AfxRegisterWndClass(CS_HREDRAW | CS_VREDRAW);
- return TRUE;
- }
在程序运行时修改程序窗口风格
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
SetWindowLong(m_hWnd,GWL_STYLE,WS_OVERLAPPEDWINDOW);
SetWindowLong(m_hWnd,GWL_STYLE,GetWindowLong(m_hWnd,GWL_STYLE)& ~WS_MAXIMIZEBOX);
/SetClassLong(m_hWnd,GCL_HICON,(LONG)LoadIcon(NULL,IDI_ERROR));
- 窗口的背景和光标在这里修改
- BOOL CStyleView::PreCreateWindow(CREATESTRUCT& cs)
- {
- // TODO: Modify the Window class or styles here by modifying
- // the CREATESTRUCT cs
- //cs.lpszClass="sunxin.org";
- //cs.lpszClass=AfxRegisterWndClass(CS_HREDRAW | CS_VREDRAW,
- // LoadCursor(NULL,IDC_CROSS),(HBRUSH)GetStockObject(BLACK_BRUSH),0);
- //cs.lpszClass=AfxRegisterWndClass(CS_HREDRAW | CS_VREDRAW);
- return CView::PreCreateWindow(cs);
- }
在框架窗口中只能修改图标,为了修改图标需要重写窗口类,太麻烦,MFC中提供了一个全局函数,AfxRegisterWndClass()修改、设定一个窗口类的类型,光标、背景、图标。返回一个注册成功的窗口类类名。如果只修改类的类型(wndcls.style),只要第一个参数,其它取默认值。
LPCTSTR AFXAPI AfxRegisterWndClass(
UINT nClassStyle,
HCURSOR hCursor = 0,
HBRUSH hbrBackground = 0,
HICON hIcon = 0
);
cs.lpszClass=AfxRegisterWndClass(CS_HREDRAW | CS_VREDRAW,0,0,
LoadIcon(NULL,IDI_WARNING));
获得当前实例号hInstance的三种方法
1.利用全局afx函数即AfxGetInstanceHandle(),在任何地方都可用,相对来说比较方便…
2.在类的全局定义引入extern App的那个类(如CmyApp)theApp,然后调用theApp.m_hInstance即可
3.利用全局AfxGetApp()函数,利用AfxGetApp()->m_hInstance即可!
hInstance=(HINSTANCE)GetWindowLong(hwnd,GWL_HINSTANCE);
或者响应WM_CREATE 消息,hInstance=(LPCREATESTRUCT)lParam->hInstance;
创建一个CToolBar步骤
1 Create a toolbar resource. 创建一个资源
2 Construct the CToolBar object.创建一个对象在CMainFrame
3 Call the Create (or CreateEx) function to create the Windows toolbar and attach it to the CToolBar object.调用函数创建窗口然后吸附在主窗口上
4 Call LoadToolBar to load the toolbar resource. 加载资源
Otherwise, follow these steps:
1 Construct the CToolBar object. 创建对象
2 Call the Create (or CreateEx) function to create the Windows toolbar and attach it to the CToolBar object.调用函数创建窗口然后吸附在主窗口上
3 Call LoadBitmap to load the bitmap that contains the toolbar button images.加载位图
4 Call SetButtons to set the button style and associate each button with an image in the bitmap.设置位图
- 在int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)中
- if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
- | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
- !m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
- {
- TRACE0("Failed to create toolbar\n");
- return -1; // fail to create
- }
- m_newToolBar.EnableDocking(CBRS_ALIGN_ANY);
- DockControlBar(&m_newToolBar);
- 自定义工具栏
- void CMainFrame::OnViewNewtool()
- {
- // TODO: Add your command handler code here
- /*if(m_newToolBar.IsWindowVisible())判断是否可视
- {
- m_newToolBar.ShowWindow(SW_HIDE);
- }
- else
- {
- m_newToolBar.ShowWindow(SW_SHOW);
- }
- RecalcLayout();调整工具栏的横条
- DockControlBar(&m_newToolBar);*/停靠工具栏
- ShowControlBar(&m_newToolBar,!m_newToolBar.IsWindowVisible(),FALSE);这个函数可以实现上面的功能,比较好
- }
- 状态栏
- 状态栏指示器数组
- static UINT indicators[] =
- {
- ID_SEPARATOR, // status line indicator
- IDS_TIMER,
- IDS_PROGRESS,
- ID_INDICATOR_CAPS,
- ID_INDICATOR_NUM,
- ID_INDICATOR_SCRL,
- };
- CStatusBar
- 加载面板字符串
- int index=0;
- index=m_wndStatusBar.CommandToIndex(IDS_TIMER);获取面板索引值
- m_wndStatusBar.SetPaneInfo(index,IDS_TIMER,SBPS_NORMAL,sz.cx);设置指示器面板是信息
- m_wndStatusBar.SetPaneText(index,str);
- CSize sz=dc.GetTextExtent(str);得到字符串显示的宽度和高度
- Cprocgressctrl进度栏控件
- CProgressCtrl m_progress;
- 设置进度控件到状态栏
- CRect rect;
- m_wndStatusBar.GetItemRect(2,&rect);
- m_progress.Create(WS_CHILD | WS_VISIBLE | PBS_SMOOTH,
- rect,&m_wndStatusBar,123);
- m_progress.SetPos(50);
- m_progress.StepIt();设置进度栏进度前进
- SetMessageText(str);设置状态栏的的文本
- //((CMainFrame*)GetParent())->m_wndStatusBar.SetWindowText(str);
- //((CMainFrame*)GetParent())->SetMessageText(str);
- //((CMainFrame*)GetParent())->GetMessageBar()->SetWindowText(str);
- GetParent()->GetDescendantWindow(AFX_IDW_STATUS_BAR)->SetWindowText(str);得到子孙窗口
启动画面和右键那样的弹出菜单都需要组件控件的支持。
CSplashWnd::ShowSplashScreen(this);启动画面
本文出自 “不曾远去” 博客,谢绝转载!