第七讲 界面编程_第1页
第七讲 界面编程_第2页
第七讲 界面编程_第3页
第七讲 界面编程_第4页
第七讲 界面编程_第5页
已阅读5页,还剩29页未读 继续免费阅读

下载本文档

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

文档简介

第七讲界面编程2/5/2023内容安排界面编程更改光标、标题图标、窗口背景工具栏编程状态栏编程更改窗口大小、标题、风格添加启动界面2/5/20232在窗口创建之前更改更改窗口大小、标题、风格如果希望在应用程序窗口创建之前修改它的大小、标题和风格,应该在CMainFrame类的PreCreateWindow成员函数进行。该函数有个类型是CREATESTRUCT结构的参数,如果在修改了这个参数中的成员变量的值,那么这种改变会反映到MFC底层代码中,当MFC底层代码调用CreateWindowEx函数去创建窗口时,它就会使用改变后的参数值去创建这个窗口。2/5/20233例:更改窗口大小BOOLCMainFrame::PreCreateWindow(CREATESTRUCT&cs){ if(!CFrameWnd::PreCreateWindow(cs)) returnFALSE;

cs.cx=300; cs.cy=200; returnTRUE;}更改窗口大小、标题、风格2/5/20234BOOLCMainFrame::PreCreateWindow(CREATESTRUCT&cs){ if(!CFrameWnd::PreCreateWindow(cs)) returnFALSE;

cs.lpszName="暨南大学"; returnTRUE;}注意:此时应用程序的标题并未改变,原因及解决方法见下页。例:更改应用程序标题更改窗口大小、标题、风格2/5/20235在MFC框架程序中更改标题栏文字应注意框架的默认窗口样式是WS_OVERLAPPEDWINDOW和FWS_ADDTOTITLE样式的组合。其中FWS_ADDTOTITLE是MFC特定的一种样式,指示框架将文档标题添加到窗口标题上。因此,如果想让窗口显示自己的标题,只需将窗口的FWS_ADDTOTITLE样式去掉即可。设置窗口标题的代码之前加上:cs.style=cs.style&~FWS_ADDTOTITLE;cs.style=

WS_OVERLAPPEDWINDOW;或者:更改窗口大小、标题、风格2/5/20236在窗口创建之后更改其风格在应用程序窗口创建之后修改它的风格属性,可在CMainFrame类的OnCreate函数中调用SetWindowLong函数实现。SetWindowLong(HWNDhWnd,intnIndex,LONGdwNewLong)该函数的作用是改变制定窗口的属性(包括设置新的窗口风格、设置新的窗口过程、设置新的应用程序实例局柄等)。要改变窗口的风格,则将该函数的第二个参数指定为GWL_STYLE,然后由第三个参数指定新的窗口风格。更改窗口大小、标题、风格2/5/20237SetWindowLong实例更改窗口大小、标题、风格intCMainFrame::OnCreate(LPCREATESTRUCTlpCreateStruct){ if(CFrameWnd::OnCreate(lpCreateStruct)==-1) return-1; ……

SetWindowLong(m_hWnd,GWL_STYLE,WS_OVERLAPPEDWINDOW); return0;}如果是在已有类型的基础上进行修改的话,那么可以利用GetWindowLong这个函数获得这个窗口的现有类型,然后修改。例如:SetWindowLong(m_hWnd,GWL_STYLE,GetWindowLong(m_hWnd,GWL_STYLE)&~WS_MAXIMIZEBOX);2/5/20238在窗口创建之后更改标题与大小在应用程序窗口创建之后修改标题,可在CMainFrame类的OnCreate函数中调用SetWindowText函数实现。更改窗口大小、标题、风格在应用程序窗口创建之后修改大小,可在CMainFrame类的OnCreate函数中调用SetWindowPos函数实现。2/5/20239内容安排界面编程更改光标、标题图标、窗口背景工具栏编程状态栏编程更改窗口大小、标题、风格添加启动界面2/5/202310修改光标、图标、背景的思路更改光标、标题栏图标、窗口背景之前对于窗口的大小、标题和风格是在创建窗口时设定的。而光标、图标和背景是在设计窗口类时指定的。窗口类的设计与注册是由MFC底层代码自动完成的,我们不可能、也不应该去修改MFC底层代码。但是我们可以编写自己的窗口类注册,然后让随后的窗口按照我们编写的窗口类去创建。2/5/202311在窗口创建之前更改更改光标、标题栏图标、窗口背景BOOLCMainFrame::PreCreateWindow(CREATESTRUCT&cs){…… WNDCLASSMyWnd; MyWnd.cbClsExtra=NULL;MyWnd.cbWndExtra=NULL; MyWnd.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH); MyWnd.hCursor=LoadCursor(NULL,IDC_CROSS); MyWnd.hIcon=LoadIcon(NULL,IDI_WARNING); MyWnd.hInstance=AfxGetInstanceHandle(); MyWnd.lpfnWndProc=::DefWindowProc; MyWnd.lpszClassName="Hello"; MyWnd.lpszMenuName=NULL; MyWnd.style=CS_HREDRAW|CS_VREDRAW;RegisterClass(&MyWnd); cs.lpszClass="hello"; returnTRUE;}2/5/202312以上代码存在的问题、原因及解决方法更改光标、标题栏图标、窗口背景

上述代码的运行结果是:仅仅是程序的标题栏图标发生了改变,但窗口的背景和光标没有改变。

原因是:视类窗口覆盖在主窗口上面,我们看到的窗口实际上是视类窗口,而上述代码修改的是框架类窗口的背景和光标。应用程序的图标属于框架窗口,因此上述程序运行后,图标发生了改变。

结论:在MFC中,如果要修改应用程序窗口的图标,则应该框架类中进行,因为框架窗口才有标题栏;如果要修改程序窗口的背景和光标,则应该在视类中进行。

解决方法:在视类的PreCreateWindow函数中添加代码:cs.lpszClass="hello";2/5/202313一个简单的修改函数更改光标、标题栏图标、窗口背景BOOLCMainFrame::PreCreateWindow(CREATESTRUCT&cs){ if(!CFrameWnd::PreCreateWindow(cs)) returnFALSE; cs.lpszClass=AfxRegisterWndClass(CS_HREDRAW|CS_VREDRAW,0,0,LoadIcon(NULL,IDI_WARNING)); returnTRUE;}BOOLCUIView::PreCreateWindow(CREATESTRUCT&cs){ cs.lpszClass=AfxRegisterWndClass(CS_HREDRAW|CS_VREDRAW,LoadCursor(NULL,IDC_CROSS),(HBRUSH)GetStockObject(BLACK_BRUSH),0); returnCView::PreCreateWindow(cs);}2/5/202314在窗口创建之后更改更改光标、标题栏图标、窗口背景要在应用程序窗口创建之后修改它的光标、图标和背景,可在OnCreate函数中调用SetClassLong函数实现。SetClassLong(HWNDhWnd,intnIndex,LONGdwNewLong)该函数的作用是:重新设置指定窗口所属窗口类的WNDCLASS结构体中指定数据成员的属性(包括设置新的窗口背景画刷、光标、图标和窗口类样式)。2/5/202315SetClassLong实例intCMainFrame::OnCreate(LPCREATESTRUCTlpCreateStruct){ ……

SetClassLong(m_hWnd,GCL_HICON,(LONG)LoadIcon(NULL,IDI_WARNING)); return0;}intCUIView::OnCreate(LPCREATESTRUCTlpCreateStruct){ ……

SetClassLong(m_hWnd,GCL_HBRBACKGROUND,(LONG)GetStockObject(BLACK_BRUSH));

SetClassLong(m_hWnd,GCL_HCURSOR,(LONG)LoadCursor(NULL,IDC_CROSS)); return0;}更改光标、标题栏图标、窗口背景2/5/202316动画图标更改窗口大小与标题栏文字加载图标资源、设置定时器、添加定时器消息响应函数intCMainFrame::OnCreate(LPCREATESTRUCTlpCreateStruct){ …… m_hIcon[0]=::LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDI_ICON1)); m_hIcon[1]=::LoadIcon(theApp.m_hInstance,MAKEINTRESOURCE(IDI_ICON2)); m_hIcon[2]=::LoadIcon(AfxGetApp()->m_hInstance,MAKEINTRESOURCE(IDI_ICON3)); m_hIcon[3]=AfxGetApp()->LoadIcon(IDI_ICON4); SetClassLong(m_hWnd,GCL_HICON,(LONG)m_hIcon[0]);

SetTimer(1,1000,NULL); return0;}HICONm_hIcon[4];//MainFrm.h文件2/5/202317动画图标(续)更改窗口大小与标题栏文字voidCMainFrame::OnTimer(UINTnIDEvent){ staticintindex=1; SetClassLong(m_hWnd,GCL_HICON,(LONG)m_hIcon[index]); index=++index%4; CFrameWnd::OnTimer(nIDEvent);}2/5/202318内容安排界面编程更改光标、标题图标、窗口背景工具栏编程状态栏编程添加启动界面更改窗口大小、标题、风格2/5/202319增加、删除工具栏按钮;响应按钮命令工具栏编程工具栏是把常用的菜单命令集合起来,以按钮的形式提供给用户使用,目的是方便用户的操作。工具按钮的添加、删除都在资源编辑器窗口中的工具栏编辑窗口中完成。添加按钮响应命令的方法与菜单相同。通常工具栏与其对应的菜单项ID相同,这样,在程序运行时。可以通过单击工具栏上的按钮来调用相应菜单项的命令。2/5/202320创建工具栏——4个步骤工具栏编程Step1:创建工具栏资源;Step2:构造CToolBar对象;Step3:调用Create或CreateEx函数创建Window工具栏(工具栏也是窗口)Step4:调用LoadToolBar函数加载工具栏资源。2/5/202321创建自定义工具栏工具栏编程 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("Failedtocreatetoolbar\n"); return-1;//failtocreate } m_newToolBar.EnableDocking(CBRS_ALIGN_ANY);

DockControlBar(&m_newToolBar);CToolBarm_newToolBar;//主框类头文件添加工具栏按钮资源后,在主框类OnCreate函数中加入以下代码:2/5/202322显示和隐藏工具栏工具栏编程voidCMainFrame::OnTest(){ if(m_newToolBar.IsWindowVisible()) m_newToolBar.ShowWindow(SW_HIDE); else m_newToolBar.ShowWindow(SW_SHOW);

RecalcLayout();

DockControlBar(&m_newToolBar);}voidCMainFrame::OnUpdateTest(CCmdUI*pCmdUI){ pCmdUI->SetCheck(m_newToolBar.IsWindowVisible());}2/5/202323显示和隐藏工具栏(更简单的方法)工具栏编程voidCMainFrame::OnTest(){

ShowControlBar(&m_newToolBar, !m_newToolBar.IsWindowVisible(),FALSE);}2/5/202324内容安排界面编程更改光标、标题图标、窗口背景工具栏编程状态栏编程添加启动界面更改窗口大小、标题、风格2/5/202325状态栏的提示行与指示器状态栏编程状态栏分为两部分:提示行与指示器。

左边最长的部分为提示行,通常用于显示菜单项或工具按钮的提示信息。右边由若干窗格组成的部分为状态栏指示器,通常用来显示大小写键、数字锁定键等信息。框架程序专门提供了一个indicators数组来管理提示行与指示器。如果要修改状态栏的外观,则只需在indicators数组中添加或减少相应的字符串资源ID即可。2/5/202326在指示器窗格中添加时钟显示状态栏编程①在资源编辑器中新增字符串资源ID:IDS_TIMER时钟②将新的字符串资源ID添加到indicators数组中staticUINTindicators[]={ ID_SEPARATOR,//statuslineindicator

IDS_TIMER, ID_INDICATOR_CAPS, ID_INDICATOR_NUM, ID_INDICATOR_SCRL,};2/5/202327在指示器窗格中添加时钟显示(续)状态栏编程③获取系统当前时间(加在CMainFrame的OnCreate函数的后部) CTimet=CTime::GetCurrentTime(); CStringstr=t.Format("%H:%M:%:%S");④将字符串显示到状态栏的窗格上,调用CStatusBar类的成员函数SetPaneTextm_wndStatusBar.SetPaneText(1,str);如果不知道窗格的索引,可以调用CStatusBar类的成员函数CommandToIndex获得。intindex=0;index=m_wndStatusBar.CommandToIndex(IDS_TIMER);m_wndStatusBar.SetPaneText(index,str);2/5/202328在指示器窗格中添加时钟显示(续)状态栏编程⑤调整窗格大小CStatusBar类的成员函数:SetPaneInfo,该函数可以为指定的窗格设置新的ID、样式和宽度。 CTimet=CTime::GetCurrentTime(); CStringstr=t.Format("%H:%M:%:%S"); CClientDCdc(this); CSizesz=dc.GetTextExtent(str); m_wndStatusBar.SetPaneInfo(1,IDS_TIMER,SBPS_NORMAL,sz.cx); m_wndStatusBar.SetPaneText(1,str);⑥在OnTimer中添加代码2/5/202329在提示行中添加鼠标坐标显示状态栏编程方法一:调用SetWindowText函数设置状态栏提示行文本voidCUIView::OnMouseMove(UINTnFlags,CPointpoint){ //TODO:Addyourmessagehandlercodehereand/orcalldefault CStringstr; str.Format("x=%d,y=%d",point.x,point.y); ((CMainFrame*)GetParent())->m_wndStatusBar.SetWindowText(str); CView::OnMouseMove(nFlags,point);}2/5/202330在提示行中添加鼠标坐标显

温馨提示

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

评论

0/150

提交评论