孙鑫C++第九堂课要点
1、修改窗口的属性和尺寸在CMainFrame类中的PreCreateWindow函数中进行,在显示窗口之前操作
2、如果要将显示窗口的标题改掉,需要下面操作
1 BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) 2 { 3 if( !CFrameWnd::PreCreateWindow(cs) ) 4 return FALSE; 5 // TODO: 在此处通过修改 6 // CREATESTRUCT cs 来修改窗口类或样式 7 cs.style&=~FWS_ADDTOTITLE; //FWS_ADDTOTITLE是窗口设置的默认形式,视图告诉框架以视类的文件名来显示窗口,如果需要重新写,那么要将其去掉 8 cs.lpszName="浙江大学"; 9 return TRUE; 10 }
前后的形式对比:
3、在窗口创建后,可在CMainFrame类中OnCreate函数中进行修改,Window函数中SetWindowLong改变指定窗口的属性,GetWindowLong获取指定窗口的信息;
1 SetWindowLong(m_hWnd,GWL_STYLE,WS_OVERLAPPEDWINDOW); //创建窗口后,再改变窗口的样式 2 SetWindowLong(m_hWnd,GWL_STYLE,GetWindowLong(m_hWnd,GWL_STYLE)&~WS_MAXIMIZEBOX);//去掉最大化操作
4、直接用函数AfxRegisterWndClass注册窗口类,在CMainFrame和CView中的PreCreateWindow函数中写程序,可以修改窗口样式、光标、图标、背景等。
//CS_HREDRAW表示窗口的宽度发生改变引起重绘,CS_VREDRAW表示窗口的高度发生改变引起重绘, cs.lpszClass=AfxRegisterWndClass(CS_HREDRAW|CS_VREDRAW,0,0,LoadIcon(NULL,IDI_WARNING));
5、在已创建的窗口中,修改其光标和图标,用SetClassLong
6、工程目录的res文件夹主要来放置工程的资源文件;一个类文件中要调用另外一个类文件中已经定义的全局变量,当然这两个均不是继承与派生关系,需要在该类文件中加extern,例如 extern CTestApp theApp
7、实现图标不断的运动
首先将3个图标资源文件导入,然后在CMainFrame类创建HICON类型的m_hIcons[3]的数组,在OnCreate函数中,调入
1 extern Cmfctest16App theApp; 2 int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) 3 { 4 if (CFrameWnd::OnCreate(lpCreateStruct) == -1) 5 return -1; 6 7 if (!m_wndStatusBar.Create(this)) 8 { 9 TRACE0("未能创建状态栏\n"); 10 return -1; // 未能创建 11 } 12 m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT)); 13 14 m_hIcons[0]=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDI_ICON1));//AfxGetInstanceHandle获取当前应用程序(注意而不是当前窗口)的实例句柄,MAKEINTRESOURCE定义的宏,将资源视图的ID转化为字符串 15 m_hIcons[1]=LoadIcon(theApp.m_hInstance,MAKEINTRESOURCE(IDI_ICON2)); //extern Cmfctest16App theApp; 16 m_hIcons[2]=LoadIcon(AfxGetApp()->m_hInstance,MAKEINTRESOURCE(IDI_ICON3)); //AfxGetApp()返回应用程序CWinApp对象(theApp)的指针 17 return 0; 18 }
8、定时器的设置:(前面设有SetTimer()函数)
1 // CMainFrame 消息处理程序 2 void CMainFrame::OnTimer(UINT_PTR nIDEvent) 3 { 4 // TODO: 在此添加消息处理程序代码和/或调用默认值 5 static int index=1; //注意这里的静态变量 6 SetClassLong(m_hWnd,GCL_HICON,(LONG)m_hIcons[index]); 7 index=++index%3; //index始终在0~2之间循环 8 CFrameWnd::OnTimer(nIDEvent); 9 }
9、工具栏的设置、加入分隔符、删除等操作
要使用VC6.0传统的工具栏,要在创建工程向导中,“用户界面功能”中选择“使用经典菜单”下“使用传统的停靠工具栏”;在资源视图Toolbar下的IDR_MAINFRAME中修改工具栏,其中删除某个图标,不要用delete,要将该图标拖到工具栏其他的地方,则图标自动消失。
10、工具栏的显示与隐藏(两种方法)
1 // CMainFrame 消息处理程序 2 void CMainFrame::OnNewTool() 3 { 4 //第1种方法 5 if (m_toolbar.IsVisible()) //m_toolbar为声明的CToolBar的对象,IsVisible表示该控件是否显示(bool型函数) 6 { 7 m_toolbar.ShowWindow(SW_HIDE); 8 } 9 else 10 { 11 m_toolbar.ShowWindow(SW_SHOW); 12 } 13 14 //第2种方法 15 ShowControlBar(&m_toolbar,!m_toolbar.IsWindowVisible(),FALSE); 16 }
11、RecalcLayout()当工具条开启或者关闭,框架窗口发生改变时
12、在子菜单项中添加复选标记
1 void CMainFrame::OnUpdateNewTool(CCmdUI *pCmdUI) 2 { 3 // TODO: 在此添加命令更新用户界面处理程序代码 4 pCmdUI->SetCheck(m_toolbar.IsWindowVisible()); 5 }