版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第七讲界面编程3/11/2024内容安排界面编程更改光标、标题图标、窗口背景工具栏编程状态栏编程更改窗口大小、标题、风格添加启动界面3/11/20242在窗口创建之前更改更改窗口大小、标题、风格如果希望在应用程序窗口创建之前修改它的大小、标题和风格,应该在CMainFrame类的PreCreateWindow成员函数进行。该函数有个类型是CREATESTRUCT结构的参数,如果在修改了这个参数中的成员变量的值,那么这种改变会反映到MFC底层代码中,当MFC底层代码调用CreateWindowEx函数去创建窗口时,它就会使用改变后的参数值去创建这个窗口。3/11/20243例:更改窗口大小BOOLCMainFrame::PreCreateWindow(CREATESTRUCT&cs){ if(!CFrameWnd::PreCreateWindow(cs)) returnFALSE;
cs.cx=300;
cs.cy=200; returnTRUE;}更改窗口大小、标题、风格3/11/20244BOOLCMainFrame::PreCreateWindow(CREATESTRUCT&cs){ if(!CFrameWnd::PreCreateWindow(cs)) returnFALSE;
cs.lpszName="暨南大学"; returnTRUE;}注意:此时应用程序的标题并未改变,原因及解决方法见下页。例:更改应用程序标题更改窗口大小、标题、风格3/11/20245在MFC框架程序中更改标题栏文字应注意框架的默认窗口样式是WS_OVERLAPPEDWINDOW和FWS_ADDTOTITLE样式的组合。其中FWS_ADDTOTITLE是MFC特定的一种样式,指示框架将文档标题添加到窗口标题上。因此,如果想让窗口显示自己的标题,只需将窗口的FWS_ADDTOTITLE样式去掉即可。设置窗口标题的代码之前加上:cs.style=cs.style&~FWS_ADDTOTITLE;
cs.style=
WS_OVERLAPPEDWINDOW;或者:更改窗口大小、标题、风格3/11/20246在窗口创建之后更改其风格在应用程序窗口创建之后修改它的风格属性,可在CMainFrame类的OnCreate函数中调用SetWindowLong函数实现。SetWindowLong(HWND
hWnd,int
nIndex,LONGdwNewLong)该函数的作用是改变制定窗口的属性(包括设置新的窗口风格、设置新的窗口过程、设置新的应用程序实例局柄等)。要改变窗口的风格,则将该函数的第二个参数指定为GWL_STYLE,然后由第三个参数指定新的窗口风格。更改窗口大小、标题、风格3/11/20247SetWindowLong实例更改窗口大小、标题、风格int
CMainFrame::OnCreate(LPCREATESTRUCT
lpCreateStruct){ 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);3/11/20248在窗口创建之后更改标题与大小在应用程序窗口创建之后修改标题,可在CMainFrame类的OnCreate函数中调用SetWindowText函数实现。更改窗口大小、标题、风格在应用程序窗口创建之后修改大小,可在CMainFrame类的OnCreate函数中调用SetWindowPos函数实现。3/11/20249内容安排界面编程更改光标、标题图标、窗口背景工具栏编程状态栏编程更改窗口大小、标题、风格添加启动界面3/11/202410修改光标、图标、背景的思路更改光标、标题栏图标、窗口背景之前对于窗口的大小、标题和风格是在创建窗口时设定的。而光标、图标和背景是在设计窗口类时指定的。窗口类的设计与注册是由MFC底层代码自动完成的,我们不可能、也不应该去修改MFC底层代码。但是我们可以编写自己的窗口类注册,然后让随后的窗口按照我们编写的窗口类去创建。3/11/202411在窗口创建之前更改更改光标、标题栏图标、窗口背景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;}3/11/202412以上代码存在的问题、原因及解决方法更改光标、标题栏图标、窗口背景
上述代码的运行结果是:仅仅是程序的标题栏图标发生了改变,但窗口的背景和光标没有改变。
原因是:视类窗口覆盖在主窗口上面,我们看到的窗口实际上是视类窗口,而上述代码修改的是框架类窗口的背景和光标。应用程序的图标属于框架窗口,因此上述程序运行后,图标发生了改变。
结论:在MFC中,如果要修改应用程序窗口的图标,则应该框架类中进行,因为框架窗口才有标题栏;如果要修改程序窗口的背景和光标,则应该在视类中进行。
解决方法:在视类的PreCreateWindow函数中添加代码:cs.lpszClass="hello";3/11/202413一个简单的修改函数更改光标、标题栏图标、窗口背景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);}3/11/202414在窗口创建之后更改更改光标、标题栏图标、窗口背景要在应用程序窗口创建之后修改它的光标、图标和背景,可在OnCreate函数中调用SetClassLong函数实现。SetClassLong(HWND
hWnd,int
nIndex,LONGdwNewLong)该函数的作用是:重新设置指定窗口所属窗口类的WNDCLASS结构体中指定数据成员的属性(包括设置新的窗口背景画刷、光标、图标和窗口类样式)。3/11/202415SetClassLong实例int
CMainFrame::OnCreate(LPCREATESTRUCT
lpCreateStruct){ ……
SetClassLong(m_hWnd,GCL_HICON,(LONG)LoadIcon(NULL,IDI_WARNING)); return0;}int
CUIView::OnCreate(LPCREATESTRUCT
lpCreateStruct){ ……
SetClassLong(m_hWnd,GCL_HBRBACKGROUND,(LONG)GetStockObject(BLACK_BRUSH));
SetClassLong(m_hWnd,GCL_HCURSOR,(LONG)LoadCursor(NULL,IDC_CROSS)); return0;}更改光标、标题栏图标、窗口背景3/11/202416动画图标更改窗口大小与标题栏文字加载图标资源、设置定时器、添加定时器消息响应函数int
CMainFrame::OnCreate(LPCREATESTRUCT
lpCreateStruct){ …… 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文件3/11/202417动画图标(续)更改窗口大小与标题栏文字voidCMainFrame::OnTimer(UINT
nIDEvent){ staticintindex=1;
SetClassLong(m_hWnd,GCL_HICON,(LONG)m_hIcon[index]); index=++index%4;
CFrameWnd::OnTimer(nIDEvent);}3/11/202418内容安排界面编程更改光标、标题图标、窗口背景工具栏编程状态栏编程添加启动界面更改窗口大小、标题、风格3/11/202419增加、删除工具栏按钮;响应按钮命令工具栏编程工具栏是把常用的菜单命令集合起来,以按钮的形式提供给用户使用,目的是方便用户的操作。工具按钮的添加、删除都在资源编辑器窗口中的工具栏编辑窗口中完成。添加按钮响应命令的方法与菜单相同。通常工具栏与其对应的菜单项ID相同,这样,在程序运行时。可以通过单击工具栏上的按钮来调用相应菜单项的命令。3/11/202420创建工具栏——4个步骤工具栏编程Step1:创建工具栏资源;Step2:构造CToolBar对象;Step3:调用Create或CreateEx函数创建Window工具栏(工具栏也是窗口)Step4:调用LoadToolBar函数加载工具栏资源。3/11/202421创建自定义工具栏工具栏编程
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);CToolBar
m_newToolBar;//主框类头文件添加工具栏按钮资源后,在主框类OnCreate函数中加入以下代码:3/11/202422显示和隐藏工具栏工具栏编程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());}3/11/202423显示和隐藏工具栏(更简单的方法)工具栏编程voidCMainFrame::OnTest(){
ShowControlBar(&m_newToolBar, !m_newToolBar.IsWindowVisible(),FALSE);}3/11/202424内容安排界面编程更改光标、标题图标、窗口背景工具栏编程状态栏编程添加启动界面更改窗口大小、标题、风格3/11/202425状态栏的提示行与指示器状态栏编程状态栏分为两部分:提示行与指示器。
左边最长的部分为提示行,通常用于显示菜单项或工具按钮的提示信息。右边由若干窗格组成的部分为状态栏指示器,通常用来显示大小写键、数字锁定键等信息。框架程序专门提供了一个indicators数组来管理提示行与指示器。如果要修改状态栏的外观,则只需在indicators数组中添加或减少相应的字符串资源ID即可。3/11/202426在指示器窗格中添加时钟显示状态栏编程①在资源编辑器中新增字符串资源ID:
IDS_TIMER时钟②将新的字符串资源ID添加到indicators数组中staticUINTindicators[]={ ID_SEPARATOR,//statuslineindicator
IDS_TIMER, ID_INDICATOR_CAPS, ID_INDICATOR_NUM, ID_INDICATOR_SCRL,};3/11/202427在指示器窗格中添加时钟显示(续)状态栏编程③获取系统当前时间(加在CMainFrame的OnCreate函数的后部)
CTimet=CTime::GetCurrentTime();
CString
str=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);3/11/202428在指示器窗格中添加时钟显示(续)状态栏编程⑤
调整窗格大小CStatusBar类的成员函数:SetPaneInfo,该函数可以为指定的窗格设置新的ID、样式和宽度。
CTimet=CTime::GetCurrentTime();
CString
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);⑥
在OnTimer中添加代码3/11/202429在提示行中添加鼠标坐标显示状态栏编程方法一:调用SetWindowText函数设置状态栏提示行文本voidCUIView::OnMouseMove(UINT
nFlags,CPointpoint){ //TODO:Addyourmessagehandlercodehereand/orcalldefault
CString
str;
str.Format("x=%d,y=%d",point.x,point.y); ((CMainFrame*)GetParent())->m_wndStatusBar.SetWindowText(str);
CView::OnMouseMove(nFlags,point);}3/11/202430在提示行中添加鼠标坐标显示状态
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年内科医师定期考核试题库150道含完整答案(全优)
- 2026年农村政策法规考试题库及答案
- 2026年全国翻译专业资格考试三级笔译综合能力模拟试卷及参考答案
- 2026年人工智能应用实践考试题含答案
- 麦肯锡-印度保险行业新赛道:从一场马拉松转型为人工智能驱动的十项全能赛事 Indias new insurance track The marathon becomes an AI-led decathlon
- 四川省眉山市东坡区苏祠初级中学2025-2026学年九年级上学期期中考试化学试卷(含答案)
- 转让合同:挖掘机转让合同5篇
- 2025年黑龙江省北安市高二生物下册期末考试模拟检测卷及完整答案(夺冠系列)
- 红色简约商务风企业宣传模板
- 标准化基础 2025 版标准理论与文件编写实务
- 2026年气瓶充装特种设备P证作业人员考试试题题库(附答案)
- 2025重庆铜梁区集中回引一批本土人才到村挂职36人考试模拟试题及答案解析
- 2025年矿业权评估师职业资格考试(矿业权评估实务与案例水气矿产资源(地热矿泉水)勘查与实物量估算)仿真试题及答案
- 2025年广东省军事理论竞赛题库
- 急慢性肾衰竭的护理常规
- 药事管理与法规药事管理与法规药事药事管理与药事组织段立华9
- 辱骂调解协议书模板
- 【MOOC】一生的健康锻炼-西南交通大学 中国大学慕课MOOC答案
- 血透中医护理
- 小学语文整本书阅读《没头脑和不高兴》导读课件
- 烽火岁月中的木刻 课件 2024-2025学年浙人美版(2024)初中美术七年级上册
评论
0/150
提交评论