新建一个单文档工程Style: 1、 修改窗口的大小、位置等信息: 在窗口创建之前修改窗口的信息。 在CMainFrame类中的PreCreateWindow()改变结构体变量cs中相应成员的值,就可以改变相应窗口的信息。 如: 改变窗口的大小: cs.cx=300; cs.cy=200; 改变窗口的显示位置: cs.x=100; cs.y=100; 修改窗口的标题: cs.style&=~FWS_ADDTOTITLE; //cs.style=WS_OVERLAPPEDWINDOW; //窗口的类型是由FWS_ADDTOTITLE和WS_OVERLAPPEDWINDOW进行“或”操作组合在一起的,这里就是将FWS_ADDTOTITLE取反,并和style进行与操作,来消去FWS_ADDTOTITLE这一项。 cs.lpszName="索广宇不开心"; 在窗口创建之后改变窗口的信息。 在CMainFrame类中的OnCreate()中可以调用SetWindowLong()来改变窗口的相关信息。如: SetWindowLong(m_hWnd,GWL_STYLE,WS_OVERLAPPEDWINDOW); //这和在窗口创建前,直接修改cs.style是类似的。 SetWindowLong(m_hWnd,GWL_STYLE,GetWindowLong(m_hWnd,GWL_STYLE)&~WS_MAXIMIZEBOX);//去掉窗口最大化的功能。GetWindowLong()是得到窗口的类型。它和WS_MAXIMIZEBOX进行“与”操作是去掉了最大化的功能。 2、 改变窗口的图标、光标和背景 在窗口创建之前改变窗口的信息: 第一种方法: 这些信息都是在MFC的底层代码中,我们不能去修改,但我们可以编写自己的窗口类,让程序随后执行它们,就可以修改了。 在CMainFrame类的PreCreateWindow()中。在这里编写并注册自己的窗口类,如下: 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="suolpiao"; wndcls.lpszMenuName=NULL; wndcls.style=CS_HREDRAW | CS_VREDRAW; RegisterClass(&wndcls); 在框架类中,让程序执行自己编写的窗口类,就在CMainFrame类的PreCreateWindow()中作如下修改:cs.lpszClass="suolpiao"; 在视类中,让程序执行自己编写的窗口类,就在视类中的PreCreateWindow()中,作如下修改:cs.lpszClass="suolpiao"; 第二种方法: LPCTSTR AFXAPI AfxRegisterWndClass( UINT nClassStyle, HCURSOR hCursor = 0, HBRUSH hbrBackground = 0, HICON hIcon = 0 ); 函数的应用 ① 在CMainFrame类中的PreCreateWindow(CREATESTRUCT& cs)函数中,添加如下语句,可以改变图标: cs.lpszClass=AfxRegisterWndClass(CS_HREDRAW|CS_VREDRAW,0,0,LoadIcon(NULL,IDI_WARNING)); ② 在视类中的PreCreateWindow()中,添加如下语句,可以改变窗口的光标和背景: cs.lpszClass=AfxRegisterWndClass(CS_HREDRAW|CS_VREDRAW,LoadCursor(NULL,IDC_HELP), (HBRUSH)GetStockObject(BLACK_BRUSH),0); 在窗口创建之后改变窗口的信息 改变图标: 在CMainFrame类中的OnCreate()函数中添加如下语句: SetClassLong(m_hWnd,GCL_HICON,(LONG)LoadIcon(NULL,IDI_ERROR)); 改变光标和背景: 在视类中添加一个ON_CREATE消息响应函数OnCreate(),在其中添加如下语句: SetClassLong(m_hWnd,GCL_HBRBACKGROUND,(LONG)GetStockObject(BLACK_BRUSH)); SetClassLong(m_hWnd,GCL_HCURSOR,(LONG)LoadCursor(NULL,IDC_HELP)); 3、 让图标不断变化 ① 添加5个图标资源。 ② 在CMainFrame类中,添加一个HICON类型的数组:HICON m_hIcons[5]用来存储新建的5个图标资源。 ③ 在CMainFrame类中的OnCreate()函数中,添加如下语句: m_hIcons[0]=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDI_ICON1)); m_hIcons[1]=LoadIcon(theApp.m_hInstance,MAKEINTRESOURCE(IDI_ICON2)); m_hIcons[2]=LoadIcon(AfxGetApp()->m_hInstance,MAKEINTRESOURCE(IDI_ICON3)); m_hIcons[3]=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDI_ICON4)); m_hIcons[4]=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDI_ICON5)); SetClassLong(m_hWnd,GCL_HICON,(LONG)m_hIcons[0]);//将图标初始化为第一个ICON SetTimer(1,1000,NULL);//设置一个定时器 注:LoadIcon()的第一个参数是当前窗口的一个句柄,此处用了三种获得该句柄的方法,第二种方法要注意,theApp是一个全局的对象,在CMainFrame类中,要想用这个对象,就得在该类中,声明这个对象,用该语句:extern CMy9StyleApp theApp。 ④ 在CMainFrame类中,添加一个消息响应函数OnTimer(),如下: void CMainFrame::OnTimer(UINT nIDEvent) { // TODO: Add your message handler code here and/or call default static int index=1; SetClassLong(m_hWnd,GCL_HICON,(LONG)m_hIcons[index]); index=++index%5; CFrameWnd::OnTimer(nIDEvent); } 4、 工具栏的编程 添加一个工具栏按钮,并让它和菜单栏里的一项对应起来: ① 在菜单栏中,新添加一个菜单项,改变其ID和标题。 ② 对新添加的菜单项,进行命令响应。 ③ 在资源的Toolbar中,新建一个工具栏按钮,在该按钮上,双击,改变其ID,使其和新建的菜单项的ID相同。(over) 注:在资源的Toolbar中,将新建的按钮,向右拖动,和左边的按钮离开一定的距离,则在窗口中,可以看见分隔符。 自己创建一个工具栏: ① 在资源中,新建一个工具栏 ② 在CMainFrame类中,新建一个工具栏对象:CToolBar m_newToolBar; ③ 在CMainFrame类中的OnCreate()函数中添加如下: 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 toolbar/n"); return -1; // fail to create } m_newToolBar.EnableDocking(CBRS_ALIGN_ANY);//使工具栏可以在任何位置停靠 EnableDocking(CBRS_ALIGN_ANY);//使窗口可以在任何位置被停靠 DockControlBar(&m_newToolBar);//停靠工具栏 ④ 在菜单栏的“查看”子菜单下,新建一个“新的工具栏”菜单项,并对其进行命令响应: void CMainFrame::OnNewTool() { // 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);//将工具栏停靠在窗口上 } 或是: void CMainFrame::OnNewTool() { // TODO: Add your command handler code here ShowControlBar(&m_newToolBar,!m_newToolBar.IsWindowVisible(),FALSE); //用该函数最佳 } ⑤ 创建菜单标记: 在“新的工具栏”上用ClassWizard创建一个UPDATE_COMMAND_UI命令响应函数,在该函数中,作如下处理: void CMainFrame::OnUpdateNewtool(CCmdUI* pCmdUI) { pCmdUI->SetCheck(m_newToolBar.IsWindowVisible()); //调用m_newToolBar.IsWindowVisible(),如果工具栏显示,返回真,否则,返回假。 } 5、 状态栏的编程 在状态栏上编写一个显示当前时间的时间栏: ① 在资源中的String Table中,添加一个字符串“时间栏”,ID号为IDS_TIMER。 ② 在MainFrm.cpp中,把IDS_TIMER添加到indicators数组中,如下: static UINT indicators[] = { ID_SEPARATOR, // status line indicator IDS_TIMER, IDS_PROGRESS, ID_INDICATOR_CAPS, ID_INDICATOR_NUM, ID_INDICATOR_SCRL, }; ③ 在CMainFram类中的OnCreate()中,添加如下语句: CTime t=CTime::GetCurrentTime(); CString str; str=t.Format("%H:%M:%S");//将当前的时间转换成字符串的形式。 CClientDC dc(this); CSize sz=dc.GetTextExtent(str); int index; index=m_wndStatusBar.CommandToIndex(IDS_TIMER);//把字符串的ID号改变成索引 m_wndStatusBar.SetPaneInfo(index,IDS_TIMER,SBPS_NORMAL,sz.cx);//设置时间栏的大小 m_wndStatusBar.SetPaneText(index,str);//设置时间栏的内容 (注:SetPaneInfo()的第一个参数是IDS_TIMER在indicators数组中所处的索引号,为1) ④ 再在定时器的响应函数中,添加如下语句: CTime t=CTime::GetCurrentTime(); CString str; str=t.Format("%H:%M:%S"); CClientDC dc(this); CSize sz=dc.GetTextExtent(str); m_wndStatusBar.SetPaneInfo(1,IDS_TIMER,SBPS_NORMAL,sz.cx); m_wndStatusBar.SetPaneText(1,str); (即没隔一秒钟执行一次这些语句,则没隔一秒钟取一次当前的时间并输出。) 在状态栏上编写一个进度栏: ① 在CMainFrame类中,添加一个进度栏对象:CProgressCtrl m_progress ② 在CMainFrame类中,添加一个ON_PAINT命令响应函数,该命令是在窗口发生重绘时调用的。 ③ 在该函数中,作如下处理: void CMainFrame::OnPaint() { CPaintDC dc(this); // device context for painting // TODO: Add your message handler code here CRect rect; m_wndStatusBar.GetItemRect(2,&rect);//获得进度栏的矩形大小,第一个参数是进度栏的索引号。 if(!m_progress.m_hWnd) {//如果该进度栏还没有被创建 m_progress.Create(WS_CHILD|WS_VISIBLE|PBS_SMOOTH, rect,&m_wndStatusBar,123); //创建一个进度栏,详见MSDN } else {//如果进度栏已被创建,则只需要移动进度栏窗口就可以了。 m_progress.MoveWindow(&rect); } // Do not call CFrameWnd::OnPaint() for painting messages } ④ 在OnTimer()函数中,添加如下语句: m_progress.StepIt();//让进度随定时器动起来,还可以通过SetStep()来设定步长。 6、 在状态栏上显示鼠标的坐标: 在视类中,添加一个WM_MOUSEMOVE消息响应函数,其中作如下操作: void CMy9StyleView::OnMouseMove(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default CString str; str.Format("x=%d,y=%d",point.x,point.y); //以下是四种设置状态栏的文本的方式: ((CMainFrame *)GetParent())->m_wndStatusBar.SetWindowText(str); //调用父窗口的指针,设置状态栏的文本信息 //((CMainFrame *)GetParent())->SetMessageText(str); // SetMessageText()就是专门用来设置状态栏的文本的,它是CMainFrame类的一个成员函数 //((CMainFrame *)GetParent())->GetMessageBar()->SetWindowText(str); // GetMessageBar()也是CMainFrame类的成员函数,获得指向状态栏的指针。 //GetParent()->GetDescendantWindow(AFX_IDW_STATUS_BAR)->SetWindowText(str); // GetDescendantWindow()是CWnd类的成员函数,用来获得指定ID的指针。AFX_IDW_STATUS_BAR是状态栏的指针。 CView::OnMouseMove(nFlags, point); } 7、 启动画面的添加: 按以下步骤添加: Project—Add To Project—Components and Controls,找到Visual C++ Components文件夹,再找到Splash Screen类,导入即可。Visual C++ Components文件夹中都是MFC事先编写好的类,用时只需要导入即可。