基于对话框程序用ON_UPDATE_COMMAND_UI更新菜单
C++文档
1、变量名的约定2、函数的重载一般在什么情况下用?重载构成的条件,函数名一样,参数数量不同或者参数类型不同。
3、函数的定义部分和实现部分分开。
头文件定义:#ifndef……#endif实现部分,类成员函数实现格式:类名::成员函数名4、虚函数与多态、纯虚函数虚函数的定义和实现部分注意事项:定义的时候加Virtual关键字,实现的时候则不需要。
虚函数一般会和多态一起使用根据同一类事物的不同状态调用不同各自的行为,这中能力就叫做多态C++的多态性用一句话概括就是:在基类的函数前加上Virtual关键字,在派生类中重写该函数,运行时将会根据对象的实际类型来调用相应的函数。
纯虚函数:是被标明为不具体实现的虚成员函数,这个不太了解。
5、函数的覆盖构成函数覆盖的条件:基类函数必须是虚函数发生覆盖的函数要分别位于派生类和基类中函数名称与参数列表必须完全相同6、函数的隐藏函数的隐藏分为两种情况:派生类函数和基类函数完全相同,基类函数中没有使用Virtual关键字派生类函数和基类函数函数名相同,但参数列表不同。
7、MFC菜单命令更新机制当要显示菜单时,操作系统发出WM_INITMENUPOPUP消息,然后由程序窗口的基类如CFrameWnd接管。
它会创建一个CCmdUI对象,并与程序的第一个菜单项相关联,调用该对象的一个成员函数DoUpdate()。
这个函数会发出CN_UPDATE_COMMAND_UI消息,这条消息带有一个指向CCmdUI对象的指针。
这时,系统会判断是否存在一个ON_UPDATE_COMMAND_UI宏去捕捉这个菜单消息。
如果找到这样一个宏,就调用相应的消息响应函数进行处理。
8、对话框模态对话框与非模态对话框的区别9、输入焦点的传递10、CWnd类创建一个窗口的参数问题Parent:指向拥有该窗口的窗口指针(是父窗体或Owner);Menu:指向内存中的一个对象,作为它的菜单使用(搞不太清楚,到底是个什么东西),创建的是一个子窗口,用该参数标识空间ID;如果是重叠窗口或者弹出窗口,则用该参数定义窗口的菜单。
第4章 菜单工具栏与状态栏new
VC++应用程序编程
1、设置标记(bool) m_enable m_checkr m_checke
CTempView::CTempView() { // TODO: add construction code here m_checke=false; m_checkr=false; m_enable=false; }
【例4.2】为例4.1中增加的菜单项添加消息处理函数。
void CLi4_1View::OnRectangle() { // TODO: Add your command handler code here CClientDC dc(this); dc.Rectangle(10,10,200,100); } void CLi4_1View::OnEllipse() { // TODO: Add your command handler code here CClientDC dc(this); dc.Ellipse(250,100,450,250); }
选中该菜单项并按Ins键,再双击该空白菜 单项进行编辑。
VC++应用程序编程
2.属性对话框的设置 用于输入菜单项的标识符(ID)、标题(Caption)和菜 单项在状态栏上显示的提示(Prompt)信息等。
菜单项的标 识符(ID)
菜单项在状态栏上 显示的提示信息
标题
VC++应用程序编程
VC++应用程序编程
VC++应用程序编程
基本菜单操作
2 1
200
201
202
203
访问菜单项:ID或位置索引 访问子菜单:仅索引号访问
0 0 1 2 3
C++课后习题
C++课后习题第一章1.选择题(1) 应用程序向导AppWizard的作用是,通过类向导可以增加消息映射和成员变量。
(2) 项目工作区窗格一般在集成开发环境的左侧,他展示一个项目的几个方面,他们分别是类视图、资源视图和文件视图。
(3)用户可以通过项目工作区窗格的资源视图来查看资源。
(4)项目工作区文件的扩展名为.dsw(5)菜单选择可以通过两种方法来进行:一种是鼠标选择;另一种是键盘选择(6)编译程序的快捷键是Ctrl+F7 ,链接程序的快捷键是F7 ,运行程序的快捷键是Ctrl+F5(7)编译微型条工具栏最右边按钮的功能是Insert/Remove Breakpoint(8)快捷键或菜单及相关资料符号的前缀是IDR2.选择题(1)用应用程序向导AppWizard创建C++源文件,应选择(A )选项卡。
A.FilesB.ProjectsC.WorkspacesD.Other Documents(2)项目文件的扩展名( B )。
A. .exeB. .dspC. .dswD. .cpp(3)Standard 工具栏中最左边按钮与(C )菜单命令的功能一样。
A.NewB.New FileC.New Text FileD.New Workspace(4)Windows资源提供的资料编辑器不能编辑(C )。
A.菜单B.工作栏C.状态栏D.位图3.判断题(1)通过应用程序向导AppWizard建立的程序不能被立即执行。
(×)(2)打开一个项目,只需打开对应的项目工作区文件。
(√)(3)用户可以通过选择T ools | Customize菜单命令设置集成开发环境的工具栏。
(√)(4)在同一项目中,Visual C++在内部用来标识资源的资源符号不能重复。
(√)(5)在Windows环境下,资源与程序源代码紧密相关。
(×)4.简答题(1)什么是项目?它是由什么组成的?(2)解释项目工作区中各个视图的功能。
对话框在onsize()函数让控件随着窗口大小变化的问题
对话框在onsize()函数让控件随着窗⼝⼤⼩变化的问题/topics/340087563⼀在头⽂件中定义 POINT Old;//存放对话框的宽和⾼。
OnInitDialog() 中计录宽和⾼。
CRect rect;GetClientRect(&rect); //取客户区⼤⼩Old.x=rect.right-rect.left;Old.y=rect.bottom-rect.top;⼆添加 WM_SIZE消息:if(nType==SIZE_RESTORED||nType==SIZE_MAXIMIZED)//窗体⼤⼩发⽣变动。
处理函数resize{resize();}三添加resize函数void CMy2610Dlg::resize(){float fsp[2];POINT Newp; //获取现在对话框的⼤⼩CRect recta;GetClientRect(&recta); //取客户区⼤⼩Newp.x=recta.right-recta.left;Newp.y=recta.bottom-recta.top;fsp[0]=(float)Newp.x/Old.x;fsp[1]=(float)Newp.y/Old.y;CRect Rect;int woc;CPoint OldTLPoint,TLPoint; //左上⾓CPoint OldBRPoint,BRPoint; //右下⾓HWND hwndChild=::GetWindow(m_hWnd,GW_CHILD); //列出所有控件while(hwndChild){woc=::GetDlgCtrlID(hwndChild);//取得IDGetDlgItem(woc)->GetWindowRect(Rect);ScreenToClient(Rect);OldTLPoint = Rect.TopLeft();TLPoint.x = long(OldTLPoint.x*fsp[0]);TLPoint.y = long(OldTLPoint.y*fsp[1]);OldBRPoint = Rect.BottomRight();BRPoint.x = long(OldBRPoint.x *fsp[0]);BRPoint.y = long(OldBRPoint.y *fsp[1]); //⾼度不可读的控件(如:combBox),不要改变此值.Rect.SetRect(TLPoint,BRPoint);GetDlgItem(woc)->MoveWindow(Rect,TRUE);hwndChild=::GetWindow(hwndChild, GW_HWNDNEXT);}Old=Newp;}注:若只要最⼤化,不⽤拖动可以不⽤设置下⾯的需要拖动的需要设置中⽂版:右击对话框属性--样式--边框(调整⼤⼩)英⽂版:Styles--Border--选择Risizing,BRPoint.y = long(OldBRPoint.y *fsp[1]); //⾼度不可读的控件(如:combBox),不要改变此值.这点没太说清楚,遍历控件,如果遍历到combBox的时候,加判断,不要执⾏这句代码,也就是不要试图改变BRPoint.y的值,否则的话,combBox内就会没内容,困扰了好长时间才找到原因,是因为combBox的⾼度不可读。
c++考试题
VC习题1下列对于WinMain函数的描述中,错误的是()。
A)WinMain函数的名称是固定的B)WinMain函数是Windows程序的入口点C)WinMain函数不能有参数D)窗口函数与WinMain的关联是通过窗口类的注册实现的以下四个特性中哪一个不属于面向对象的三大特性()。
A)封装性B)多态性C)抽象性D)继承性下列关键字中哪一个不是用于类的访问控制的()。
A)public B)friend C)private D)protected下面四个MFC类中哪一个是管理MFC应用程序的()。
A)CWinApp B)CMainFrame C)CDocument D)CView下列类中不属于MFC框架基本类的是()。
A)CWinApp B)CFrameWnd C)CView D)CObject传统的软件开发主要采用过程驱动的方法,而Windows程序的开发使用消息驱动模型,该模型靠事件机制来实现其功能。
主框架类是应用程序中负责控制菜单、工具栏和状态栏等界面元素的最主要的类。
命令视图类文档类文档模板类框架窗口类应用程序类VC习题2VC开发环境可以生成的基于MFC appwizard的应用程序类型有单文档/视图结构、多文档/视图结构和基本对话框。
包含类定义的文件称为头文件,包含类中成员函数实现代码的文件称为源文件,包含资源信息的文件称为资源文件。
ResourceView的主要功是编辑当前工程中的资源。
应用程序向导的主要功能是帮助生产应用程序。
类向导的主要功能是管理各个类中的消息。
项目工作区窗口一般在开发环境的左侧,它包含工程的多个方面,分别是classview 、fileview 和resource view 。
项目工作区文件的扩展名为.dsw 。
VC习题3下列选项中哪一个不是命令消息的触发途径:单击对话框中的按钮。
Windows应用程序的消息来源主要包括输入消息、控制消息和系统消息、用户消息。
发送消息可以采用的两个函数是postmessage 和sendmessage 。
Windows程序设计-大学模拟题(附答案)
《Windows程序设计》模拟题一,单选题1.所有的Windows应用程序都是由()驱动的.A.事件B.消息C.命令D.菜单[答案]:B2.一般应用程序不会派生自己的()类.A.主框架B.视图C.菜单D.文档[答案]:C3.MessageBox不能完成()功能.A.接收用户输入B.显示消息C.改变对话框标题D.显示问号图标[答案]:A4.Windows系统中的消息不包括().A.标准Windows消息B.控件消息C.命令消息D.视图消息[答案]:D5.()函数是从CView继承来的成员函数,用于刷新整个视图窗口屏幕.A.InvalidateB.MouseMoveC.PaintD.Brush[答案]:A6.菜单()消息,处理菜单状态的动态变化.A.UPDA TE_UIB.UPDATEMANDD.UPDA TE_COMMAND_UI[答案]:DmdUI类的常用成员函数()使菜单项前增加或清除√标志.A.SetCheckB.SetRadioC.SetTextD.Enable[答案]:A8.编辑菜单时为使字母下带下划线,应使用助记符().A.@B.#C.&D.$[答案]:CmdUI类的常用成员函数()使菜单项前增加或清除圆点标志.A.SetCheckB.SetRadioC.SetTextD.Enable[答案]:BmdUI类的常用成员函数()设置菜单项有效或无效.A.SetCheckB.SetRadioC.SetTextD.Enable[答案]:DmdUI类的常用成员函数()改变菜单项文本.A.SetCheckB.SetRadioC.SetTextD.Enable[答案]:C12.CDC的常用函数()可以绘制矩形.A.EllipseB.RectangleC.ArcD.Circle[答案]:B13.应用程序可以使用GDI创建3种类型的图形输出,不包括().A.矢量图形C.光栅图形D.文本[答案]:B14.CDC的常用函数()可以绘制内接矩形的圆.A.EllipseB.RectangleC.ArcD.Circle[答案]:A15.()函数用于在指定位置输出字符串.A.PrintB.TextOutC.ScanfD.Write[答案]:B16.在View的在普通成员函数体内用()获得设备环境.A.CDCB.CWindowDClientDClassDC[答案]:C17.创建画笔不需要给出()参数.A.风格B.宽度C.颜色D.长度[答案]:D18.实线画笔的风格应用()宏.A.PS_SOLIDB.PS_DASHC.PS_DOTD.PS_DASHDOT[答案]:A19.实心画刷只需要定义().A.填充样式B.填充颜色C.填充模式[答案]:B20.对话框()描述对话框的外观和控件布局,在资源描述文件中有对话框的定义.A.资源B.类C.模板D.数据[答案]:A21.调用对话框类的对象的方法,创建并显示模态对话框.A.Print()B.Create()C.DoModal()D.Show()[答案]:C22.CDialog中的()成员函数用于成员变量和控件之间的数据传递.A.ExchangeB.ToDoC.EXTD.UpdateData[答案]:D23.静态控件不包括().A.静态文本B.按钮C.静态图片D.组框[答案]:B24.()不是编辑框的消息.A.BN_CLICKEDB.EN_CHANGEC.EN_KILLFOCUSD.EN_SETFOCUS[答案]:A25.()设置进度条的当前位置.A.SetRangeB.SetStepC.SetPosD.StepIt[答案]:C26.()设置进度条范围.A.SetRangeB.SetStepC.SetPosD.StepIt[答案]:A27.()设置进度条填充步长.A.SetRangeB.SetStepC.SetPosD.StepIt[答案]:B28.()让进度条前进一个步长.A.SetRangeB.SetStepC.SetPosD.StepIt[答案]:D29.文档和视图的关系是().A.一对一B.一对多C.多对一D.多对多[答案]:B30.在视图类中获得文档类对象指针用函数().A.GetDocumentB.UpdateAllViewsC.OnUpdateD.SetModifiedFlag[答案]:A31.Win32应用程序入口函数是().A.MainB.EntranceC.WinMainD.Inlet[答案]:C32.创建窗口工作()不在WinMain中完成.A.设计窗口类B.注册窗口类C.创建窗口D.窗口过程[答案]:D33.项目文件的扩展名是().A.exeB.dspC.dswD.cpp[答案]:B34.利用ClassWizard不能().A.建立新类B.进行消息映射C.增加类的成员变量D.插入资源[答案]:D35.下列()不是MFC消息映射机制有关的宏.A.DECLARE_MESSAGE_MAPB.BEGIN_MESSAGE_MAPC.DECLARE_SERIALD.END_MESSAGE_MAP[答案]:C36.要使鼠标箭头在按钮上暂停时能显示工具栏按钮提示,必须设置工具栏的风格为().A.CBRS_TOOLTIPSB.CBRS_FL YBYC.CBRS_NOALIGND.WS_VISIBLE[答案]:B37.当滑块滑动时,滑块条控件将发送滚动消息来通知父窗口,水平滑动条发送()消息.A.WM_CHARB.WM_HSCROLLC.WM_VSCROLLD.WM_CHANGE[答案]:B38.要将模式对话框在屏幕上显示需要用到().A.CreateB.DoModalC.OnOKD.构造函数[答案]:B39.当滑块滑动时,滑块条控件将发送滚动消息来通知父窗口,垂直滑动条发送()消息.A.WM_CHARB.WM_HSCROLLC.WM_VSCROLLD.WM_CHANGE[答案]:C40.以下控件中,()没有Caption属性.A.按钮B.组框C.编辑框D.静态文本框[答案]:C41.关于工具栏,菜单和加速键的关系,正确的说法是().A.工具按钮与菜单必须一一对应B.工具栏与加速键一一对应C.工具按钮不必与菜单一一对应D.菜单与加速键一一对应[答案]:C42.使用GetDC()获取的设备上下文在退出时,必须调用()释放设备上下文.A.ReleaseDC()B.deleteC.DeleteDC()D.Detach()[答案]:A43.列表框CListBox类的成员函数()用来向列表框增加列表项.A.AddString()B.DeleteString()C.ResetContent()D.FindString()E.GetCount()[答案]:A44.列表框CListBox类的成员函数()用来清除列表项所有项目.A.AddString()B.DeleteString()C.ResetContent()D.FindString()E.GetCount()[答案]:C45.下面()不是MFC设备环境类CDC类的派生类.A.GDIB.CPaintDClientDCD.CWindowDC[答案]:A46.()是非模态对话框.A.查找对话框B.字体对话框C.段落对话框D.颜色对话框[答案]:A47.使用()通用对话框类可用打开文件.A.CFileDialogolorDialogC.CPrintDialogD.CFontDialog[答案]:A48.常见的菜单类型不包括().A.自动菜单B.主菜单C.弹出菜单D.快捷菜单[答案]:A49.下列()不是MFCCDC类中常用的函数.A.TextOutB.EllipseC.RectangleD.CreateRedText[答案]:D50.对话框的功能被封装在()类中.A.CWndB.CDialogC.CObjectmdTarget[答案]:B51.Windows标准控件的属性设置通常由三个选项卡构成,不包括()A.ColorB.GeneralC.StyleD.ExtendStyles[答案]:A52.菜单项助记符前用()引导.A.%B.&C.#D.$[答案]:B53.更新菜单状态的消息是().MANDB.UPDATEC.UPDATE_COMMAND_UID.INV ALIDATE[答案]:C54.能间接调用视图类的OnDraw函数的是()A.OnTimerB.LButtonDownC.SerializeD.Invalidate[答案]:D55.下列()不是MFC消息映射机制有关的宏.A.DECLARE_MESSAGE_MAPB.BEGIN_MESSAGE_MAPC.DECLARE_SERIALD.END_MESSAGE_MAP[答案]:C56.下面()不是GDI对象.A.CFontB.CPalettelientDCD.CBitmap[答案]:C57.列表框的类型不包括()A.SimpleB.DropdownC.DropListD.Scroll[答案]:D58.设置编辑框控件的文本内容,可使用函数()A.SetWindowTextB.SetSelC.ReplaceSelD.GetWindowText[答案]:A59.使用()函数获取的设备上下文在退出时必须调用ReleaseDC释放.A.GetWindowsDCB.GetDCC.GetDesktopDCD.GetClientDC[答案]:B60.类CButton不是下列()控件对应的类.A.命令按钮B.单选按钮C.复选框D.静态文本框[答案]:D61.列表框CListBox类的成员函数()用来返回列表框的列表项总数.A.AddString()B.DeleteString()C.ResetContent()D.FindString()E.GetCount()[答案]:F62.滑动条是由滑动块和刻度线构成,按指定增量移动,CSliderCtrl类的成员函数()代表设置滑动块位置.A.SetRange()B.SetPos()C.SetTic()D.SetPoint()E.SetTicFreq()[答案]:B63.滑动条是由滑动块和刻度线构成,按指定增量移动,CSliderCtrl类的成员函数()代表设置刻度线位置,一次只能设置一个刻度线,用于手动设置刻度线.A.SetRange()B.SetPos()C.SetTic()D.SetPoint()E.SetTicFreq()[答案]:C64.滑动条是由滑动块和刻度线构成,按指定增量移动,CSliderCtrl类的成员函数()代表设置刻度线的疏密程度,配合Autoticks属性使用,每隔一定单位自动显示一条刻度线.A.SetRange()B.SetPos()C.SetTic()D.SetPoint()E.SetTicFreq()[答案]:F二,判断题1.UpdateData(true)函数完成成员变量的值传递给控件的操作.[答案]:F2.基于对话框的应用程序,也有文档类和视图类.[答案]:F3.调用DestroyWindow函数完成非模态对话框的销毁工作.[答案]:T4.每个对话框资源都会关联一个对话框类,常派生于CDialog,通过该类对象间接操纵对话框. [答案]:T5.基于对话框的应用程序在运行时也有菜单栏.[答案]:F6.对话框的功能被封装在CDialog类中.[答案]:T7.使用CColorDialog通过对话框类可以显示颜色对话框.[答案]:T8.DDX为对话框数据交换用.[答案]:T9.DDV完成成员变量和控件之间的交换.[答案]:F10.OnOK函数中进行对话框的初始化工作.[答案]:F11.对话框只由对话框类组成.[答案]:F12.从对话框的工作方式看,对话框可分为模式对话框和非模式对话框.[答案]:T13.查找对话框是模式对话框.[答案]:F14.颜色对话框是非模式对话框.[答案]:F15.每一个单选按钮在对话框类中都可以映射一个int类型值变量.[答案]:F16.当编辑框中的文本已被改变,在新的文本显示之后发送EN_CHANGE通知消息.[答案]:T17.CButton类控件只有按键按钮一种类型.[答案]:F18.一组单选按钮在组中的序号从1开始.[答案]:F19.向列表框增加列表项只能使用CListBox类成员的AddString函数.[答案]:F20.一个旋转按钮控件与一个相伴的控件一起使用时,该控件的Tab键次序必须大于旋转按钮. [答案]:F21.进度条控件的操作封装在CProgressCtrl类.[答案]:T22.多个静态文本控件必须有不同的ID号.[答案]:F23.调用Create成员函数创建动态分割窗口.[答案]:T24.调用Create成员函数创建静态分割窗口.[答案]:F25.视图派生类的成员函数通过调用GetDocument函数得到当前文档对象的指针.[答案]:T26.用户可以通过项目工作区窗口的ResourceView视图来查看资源.[答案]:T27.利用MFC编程时,所有的消息与消息处理函数的添加都必须采用ClassWizard类向导来完成.[答案]:F28.窗口是Windows应用程序的基本操作单元,是应用程序与用户之间交互的接口环境,也是系统管理应用程序的基本单位.[答案]:T29.Windows应用程序的入口也是main函数.[答案]:F30.键盘鼠标消息都是命令消息.[答案]:F31.使用MFCAppWizard[exe]向导创建应用程序框架时,向导生成的文件名和类名是不可以更改的.[答案]:F32.消息映射是将消息处理函数与要处理的特定消息连接起来的一种机制.[答案]:T33.命令消息是由菜单项,工具栏按钮和快捷键等用户界面对象发出的WM_COMMAND消息.[答案]:T34.用快捷键F9既可设置断点,又可取消断点.[答案]:T35.调试程序时,会同时出现Variable窗口和Watch窗口.[答案]:T36.Windows是一个基于事件的消息驱动系统.[答案]:T37.MFC采用消息映射来处理消息.[答案]:T38.WM_RBUTTONDOWN是鼠标右键按下时产生的消息.[答案]:T39.给菜单项定义快捷键,只需在菜单项属性设置对话框的Caption文本框中说明即可. [答案]:F40.快捷菜单一般出现在鼠标箭头的位置.[答案]:T41.UPDATE_COMMAND是更新命令用户接口消息.[答案]:F42.工具栏停靠特性只能设置一次.[答案]:T43.状态栏的功能由CToolBar类实现.[答案]:F44.CMenu类,CToolBar类和CStatusBar类的根基类是相同的.[答案]:T45.菜单选择只可以通过鼠标操作来完成.[答案]:F46.状态栏可以通过资源编辑器来编辑.[答案]:F47.MFC应用程序框架为状态栏定义的静态数组indicators放在MainFrm.h文件中. [答案]:F48.在菜单设计时,&字符的作用是使其后的字符加下划线.[答案]:TlientDC代表整个窗口的设备环境.[答案]:F50.删除CPen对象可调用CPen对象的DeleteObject函数.[答案]:F51.DDB又称GDI位图,它依赖于具体设备,只能存在于内存中.[答案]:T52.创建阴影画刷函数是CreateHatchBrush.[答案]:T53.深绿色RGB值为(0,128,0).[答案]:T54.Windows引入GDI的主要目的是为了实现设备相关性.[答案]:F55.Windows用COLORREF类型的数据存放颜色.[答案]:T56.Windows是按图形方式输出字符的.[答案]:T57.TextOut是CDC类中常用的文本输出函数.[答案]:T58.创建画笔后必须调用CDC类的成员函数SelectObject将画笔选人当前设备环境. [答案]:T59.对话框创建后,发送WM_CREATE消息,在该消息处理代码中创建各控件.[答案]:T60.通过AppWizard建立的程序不能被立即执行.[答案]:F61.打开一个项目,只需打开对应的项目工作区文件.[答案]:T62.在同一项目中,VisualC++在内部用来标识资源的资源符号不能重复.[答案]:T63.在Windows环境下,资源与程序源代码紧密相关.[答案]:F64.用户可以通过选择Tools|Customize菜单命令设置集成开发环境的工具栏.[答案]:T65.项目工作区文件的扩展名为dwp.[答案]:F66.Ctrl+F5是编辑程序的快捷键.[答案]:F67.F7是运行程序的快捷键.[答案]:F三,填空题1.项目工作区文件的扩展名是###.[答案]:dsw2.修改公司,描述等信息需用###编辑器.[答案]:Version3.利用###可以快速创建各种风格的应用程序框架,并可自动生成程序通用的源代码.[答案]:应用程序向导4.启动VisualC++,进入VisualC++IDE,从###菜单上选择New菜单项,此时将弹出New对话框[答案]:应用程序向导5.利用###可以快速创建各种风格的应用程序框架,并可自动生成程序通用的源代码[答案]:File6.句柄是Windows使用的一种无重复整数,主要用来###.[答案]:标识应用程序中的一个对象7.一个单文档的MFC应用程序框架一般包括5个类:应用程序类,框架窗口类,###,文档类和文档模板类.[答案]:视图类8.用户点击菜单项后,会产生###消息.[答案]:WM_COMMAND9.改变菜单项文本是使用CCmdUI类的###成员函数.[答案]:SetText10.处理菜单命令消息首先会在###类中.[答案]:视图11.弹出快捷菜单使用的是CMenu类的###函数.[答案]:TrackPopupMenu12.在状态栏中添加文本使用的是CStatusBar类的###函数.[答案]:SetPaneText13.与DOS字符方式下的输出不同,Windows是按###方式输出的.[答案]:图形14.为了体系Windows的设备无关性,应用程序的输出面向一个称为###的虚拟逻辑设备. [答案]:设备环境15.可以利用CGdiObject类的成员函数###将GDI对象设置成指定的库存对象.[答案]:CreateStockObject16.对话框的主要功能是###和输出信息.[答案]:接收用户输入17.使用###函数可用创建非模式对话框.[答案]:Create18.每个控件最多只能关联Control和Value类型成员变量各###个.[答案]:119.一组单选按钮在对话框类中只能映射一个###类型值变量,对应单选按钮在组中的序号,序号从0开始.[答案]:int。
VC++工具栏与状态栏
指针;dwStyle指定状态栏的风格,除了标准的 Windows风格外,还可以是CBRS_TOP(状态栏
既然我们已经取得应用程序的指针所以马上就能得到应用程序对象的公共数据成员mpmainwnd它是一个指向cwin应用程序的主窗口的指针利用这个指针我们又可使用该指针所指向的对象cwin对象的成员函数getdescendantwindow这个函数的作用是求得某个子窗口即状态栏这个窗口的指针
工具栏与状态栏
BOOL LoadToolBar(LPCTSTR lpszResourceName);
BOOL LoadToolBar(UINT nIDResource); 参数lpszResourceName指向被重载的工具栏 资源名字的指针,参数nIDResource为被重 载的工具栏资源的ID。
13
14
2 状态栏
lpIDArray所指向的数组元素的个数。该函数按照 数组lpIDArray中的对应元素的值设定标识符ID
19
的值,加载由每个ID所指定的字符串资源,并把字 符串设置为标识符的文字。如果该函数操作成功, 在返回一个非0值,否则返回0。 2、SetPaneInfo()函数
函数SetPaneInfo()用于设置给定索引值的指示器 ID、风格和宽度。它的原型为:
6
工具栏按钮可以以按钮、复选框或单选框的形 式出现和起作用,默认情况下以按钮形式出现。 若想让工具栏按钮以复选框形式出现时,应将风 格TBBS_ CHECKBOX赋给该CToolBar对象或在一个 ON_UNDATE_COMMAND_UI处理程序中使用某个 CCmdUI对象的SetCheck函数;如果按钮为单选框 形式,那么应在命令更新处理函数中调用 CCmdUI::SetRadio。
为对话框增加菜单
为对话框增加菜单1.为对话框创建一个菜单资源IDR_MENU1。
2. 在对话框的属性对话框中在Menu属性中选择刚创建的菜单资源IDR_MENU1。
此时保存编译后,在对话框中就可看到菜单。
3.点击快捷键Ctrl + W,在“Add a Class”对话框中选择已存在的对话框类“Select an existing class”,打开“Select Class”对话框。
4. 选择对话框类,本例中的类名为CDlgDlg,选中进入下一步。
5. 进入MFC ClassWizard对话框,在消息映射属性页中,为菜单增加消息处理函数,本例中为“打开文件”菜单增加COMMAND处理函数,增加的函数名为OnFileOpen。
6.编辑OnFileOpen函数代码,实现自己定义的功能,本例只是简单显示“关于”对话框。
void CDlgDlg::OnFileOpen(){CAboutDlg dlgAbout;dlgAbout.DoModal();}编译运行后,点击文件菜单的子菜单“打开文件”,将弹出“关于”对话框,如下图所示。
接下来为对话框添加右键菜单。
1.为对话框增加事件2.在打开的对话框中,在左侧的消息/事件列表中选择WM_CONTEXTMENU,添加OnContextMenu函数。
3. 编辑代码如下。
void CDlgDlg::OnContextMenu(CWnd* pWnd, CPoint point){CMenu MyMenu;MyMenu.LoadMenu(IDR_MENU1);CMenu* pMyMenu=MyMenu.GetSubMenu(0);pMyMenu->TrackPopupMenu(TPM_LEFTBUTTON|TPM_LEFTALIGN,point.x ,point.y,this);MyMenu.DestroyMenu();}显示效果:很简单,但很实用。
C#Winform跨线程更新UI控件常用方法汇总
C#Winform跨线程更新UI控件常⽤⽅法汇总概述C#Winform编程中,跨线程直接更新UI控件的做法是不正确的,会时常出现“线程间操作⽆效: 从不是创建控件的线程访问它”的异常。
处理跨线程更新Winform UI控件常⽤的⽅法有4种:下⽂中对以上3种⽅法应⽤进⾏举例说明,希望能对初识C# Winform的同学们有些帮助。
成⽂表分享交流之意,惶恐⽔平有限,⽂中理解和表述有错误之处还请⼤家多被批评指正。
更新记录:2018年2⽉3⽇,根据⽹友评论提⽰更新错别字,BegainInvoke=》BeginInvoke。
正⽂1. 通过UI线程的SynchronizationContext的Post/Send⽅法更新⽤法://共分三步//第⼀步:获取UI线程同步上下⽂(在窗体构造函数或FormLoad事件中)///<summary>/// UI线程的同步上下⽂///</summary>SynchronizationContext m_SyncContext = null;public Form1(){InitializeComponent();//获取UI线程同步上下⽂m_SyncContext = SynchronizationContext.Current;//Control.CheckForIllegalCrossThreadCalls = false;}//第⼆步:定义线程的主体⽅法///<summary>///线程的主体⽅法///</summary>private void ThreadProcSafePost(){//...执⾏线程任务//在线程中更新UI(通过UI线程同步上下⽂m_SyncContext)m_SyncContext.Post(SetTextSafePost, "This text was set safely by SynchronizationContext-Post.");//...执⾏线程其他任务}//第三步:定义更新UI控件的⽅法///<summary>///更新⽂本框内容的⽅法///</summary>///<param name="text"></param>private void SetTextSafePost(object text){this.textBox1.Text = text.ToString();}//之后,启动线程///<summary>///启动线程按钮事件///</summary>///<param name="sender"></param>///<param name="e"></param>private void setSafePostBtn_Click(object sender, EventArgs e){this.demoThread = new Thread(new ThreadStart(this.ThreadProcSafePost));this.demoThread.Start();}说明:三处加粗部分是关键。
qt update语句用法
qt update语句用法摘要:一、引言二、Qt update语句简介1.Qt update语句的作用2.Qt update语句的语法三、Qt update语句的用法1.更新控件属性2.更新控件文本3.更新控件状态4.更新控件布局四、Qt update语句的注意事项1.避免过度使用update语句2.注意update语句与槽函数的配合五、总结正文:一、引言Qt是一款跨平台的C++应用程序框架,广泛应用于图形界面程序的开发。
在Qt中,update语句是一种用于更新控件状态、属性、文本和布局的重要手段。
本文将详细介绍Qt update语句的用法及注意事项。
二、Qt update语句简介1.Qt update语句的作用Qt update语句主要用于同步UI界面与程序逻辑,使界面能够实时反映程序状态的变化。
当程序逻辑发生变化时,通过调用update语句,可以通知Qt重新绘制界面,以展示最新的状态。
2.Qt update语句的语法Qt update语句的基本语法如下:```cppupdate();```在一些情况下,update语句还可以与其他操作符结合使用,如:```cppupdate(int msecs); // 延迟更新,参数为毫秒数update(QRect rect); // 更新指定区域update(QWidget *widget); // 更新指定子widget```三、Qt update语句的用法1.更新控件属性当程序逻辑需要改变控件属性时,可以使用update语句。
例如,当某个按钮被选中时,可以通过更新按钮的属性来改变其外观:```cppbutton->setChecked(true);update();2.更新控件文本当需要实时更新控件文本时,可以使用update语句。
例如,在计算器程序中,当用户输入一个数字后,需要更新显示框中的文本:```cppdisplay->setText(QString::number(number));update();```3.更新控件状态当控件的状态需要实时更新时,可以使用update语句。
单文档窗口状态条的“就绪”怎么去掉?
1.资源编辑器中,把每个菜单项的Prompt一栏去掉(或者直接文本打开.rc,把不需要的替为空)........2.搜索工程中"就绪", 应该在.rc中,把"就绪"换成"",3.更高级的办法是:响应WM_SETMESSAGESTRING消息:ON_MESSAGE(WM_SETMESSAGESTRING, OnSetMessageString)LRESULT CMainFrame::OnSetMessageString(WPARAM wParam, LPARAM lParam){LRESULT lr = CFrameWnd::OnSetMessageString(wParam, lParam);WPARAM w = AFX_IDS_IDLEMESSAGE;if (wParam == AFX_IDS_IDLEMESSAGE) {m_wndStatusBar.SetPaneText(0, "", TRUE);//或者直接return lr;}return lr;}如何动态的改变菜单项在状态栏中的提示:重载CFrameWnd的virtual void GetMessageString(UINT nID, CString& rMessage) const;函数实现:--------------------------------------------------------------------------------void CMainFrame::GetMessageString(UINT nID, CString& rMessage) const{if(nID == ID_FILE_NEW) //这里可以动态改变{rMessage = "Create new file!";return;}CFrameWnd::GetMessageString(nID,rMessage); //调用默认的处理过程}/p-93735033.html在MFC程序中如果使用默认的状态栏的话,其第一栏在空闲时显示的是“就绪”,如果用户点击菜单,还会用于显示菜单栏的提示文本,如“建立新文档”等。
菜单以及与菜单相关联的操作
菜单的结构
300 301
主任室
3 楼 层 2 1
302
303
304
0 0 1 房间 2
3பைடு நூலகம்
4
获取菜单栏
菜单栏是属于框架的,在框架类中可以通过GetMenu
方法去得到菜单栏。
CMenu类提供了函数对菜单进行操作。
GetSubMenu可以获取一个子菜单。
GetMenu和GetSubMenu都是返回指向菜单的指针,但 前者是返回指向菜单栏的指针,而后者返回指向子 菜单的指针。
命令更新
菜单项状态的维护是依赖于CN_UPDATE_COMMAND_UI消 息,谁捕获CN_UPDATE_COMMAND_UI消息,MFC就在其 创建一个CCmdUI对象。
可以通过手工或利用ClassWizard在消息映射中添加 ON_UPDATE_COMMAND_UI宏来捕获CN_UPDATE_COMMAND_UI 消息。
对插入的菜单项Hello进行菜单的响应
动态创建的菜单如何去添加菜单消息响应函数,当然
手动去添加。我们借助ClassWizard为一个类去添加一个菜单 响应的命令消息的方法,然后照猫画虎去填写。
(1)在头文件中声明函数原型。
afx_msg void OnHello();
(2)对于命令消息,用ONCOMMAND宏来响应的。 在源文件中ON_COMMAND(111,OnHello) (3)函数本身,在源文件中 void CMainFrame::OnHello() { MessageBox("Hello!"); }
• 通告消息
由控件产生的消息,例如,按钮的单击,列表框的选择等均产生此类 消息,为的是向其父窗口(通常是对话框)通知事件的发生。这类消息也 是以WM_COMMAND形式呈现。 从CCmdTarget派生的类,都可以接收到这类消息。
MFC中用户界面元素更新原理(UPDATE_COMMAND_UI)
大家在编程的过程中一定遇到过这种情况:需要根据某个变量的值来设定菜单项是否被选中,设置工具栏按钮是否被按下或者在状态栏中显示一些信息。
MFC提供了一种机制来帮助我们完成这项工作:只要用ClassWizard给相应的菜单项或者工具栏按钮添加一个UPDATE_COMMAND_UI处理函数,在其中用CcmdUI::SetCheck等函数来设置这些用户界面元素的状态就可以了。
但是MFC 是怎么实现这个功能的呢?首先让我们来看看菜单状态更新的实现方法。
首先要知道,当你点现了一个有子菜单的菜单项时(比如菜单栏上的“文件”),系统会向拥有这个菜单的窗口发送一个WM_INITMENUPOPUP,下面是MFC对这个消息的默认处理:void CFrameWnd::OnInitMenuPopup(CMenu* pMenu, UINT nIndex, BOOL bSysMenu){//为了说明问题,我省略了很多代码CCmdUI state;state.m_pMenu = pMenu;state.m_nIndexMax = pMenu->GetMenuItemCount();for (state.m_nIndex = 0; state.m_nIndex <state.m_nIndexMax;state.m_nIndex++){state.m_nID = pMenu->GetMenuItemID(state.m_nIndex);if (state.m_nID == (UINT)-1){//m_nID==-1表示它下面还有popup menu(就那种带右箭头的菜单项),//它是不会自动deisable的}else{state.m_pSubMenu = NULL;state.DoUpdate(this, m_bAutoMenuEnable && state.m_nID < 0xF000);}}下面是CCmdUI::DoUpdate的代码:BOOL CCmdUI::DoUpdate(CCmdTarget* pTarget, BOOL bDisableIfNoHndler){m_bEnableChanged = FALSE;BOOL bResult=pTarget->OnCmdMsg(m_nID,CN_UPDATE_COMMAND_UI,this, NULL);if (bDisableIfNoHndler && !m_bEnableChanged){AFX_CMDHANDLERINFO info;info.pTarget = NULL;BOOL bHandler = pTarget->OnCmdMsg(m_nID, CN_COMMAND, this, &info);Enable(bHandler);}return bResult;}DoUpdate的流程就是:先向你的菜单项发一个CN_UPDATE_COMMAND_UI命令消息,让你的菜单项来进行显示前的更新,这就是你在classwizard中可以看到的UPDATE_COMMADN_UI消息,你加的处理函数就是在这个时候被调用的。
BMP文件图像模糊化处理的设计报告
《沟通与协作实训》实习报告专业班级:学号:姓名:2013年7月第一部分认知实习总结经过这五天的认知实习我收获很大,首先是我们的东营之旅,回到我们的老校区,在那里的食堂吃饭,看荟萃湖盛开的荷花,看“东营版”的创造太阳雕塑,参观各个学院的办公楼,教学楼,实验楼,包括宿舍,都让我觉得有种新鲜感,那是种陌生又熟悉的感觉,作为石油大学的学生,看见老校区着实有种情切的感觉,尤其是来到我们计算机与通信工程学院楼前,脑中浮现出的是我的学长们在这所建筑物中拼搏的景象,听见老师讲述当年的一切,我们都很感兴趣心中充满了好奇,暗暗为自己加油,希望有一天我们走出校门的时候,也能做出与我们学校名声相配的成绩,只有这样才不会辱没我们石油大学这六十年的光辉校史,只有这样才对得起师长的教诲,只有这样我们才能称自己是石大人,因为我们有艰苦奋斗的传统,有令人羡慕的成绩,我为你感到骄傲石油大学。
之后我们来到了东营的中国联通公司,在那里我们参观了它的计算中心,我非常兴奋,因为第一次看见那么多的网线,和那么大的主机,那么多的机器,之前我从未想过我所学习的软件工程专业竟然需要这么多的设备来支持,我知道这些设备运行的背后是靠着大量的代码来支撑的,只是多么好的硬件和软件相结合啊,让我不禁感叹这个计算机的世界真是太美秒了,它带动着整个世界在飞速发展,而我有一天也会投身在这一行业,发挥自己的力量,燃烧总记得光和热,为社会奉献自己的力量,第一次来联通公司的内部,感觉这里很神秘,在里面我们还了解到了GIS,看见工作人员通过电脑实时查看道路交通状况,甚至连那个车在做什么有没有在工作都看的一清二楚,我又一次感到自己要学的东西还有太多太多,自己不知道的世界还很大很大,自己要看清自己的渺小,通过不断学习来充实自己的大脑,希望自己可以在计算机领域可以取得令自己满意的成绩,因为这个领域真的是太神奇了,如果只是表面的认识我会觉得很失败,因此我会努力学习,在更深层次认识计算机,认识软件工程。
skyblu操作
skyblue_Rect程序操作步骤一.打开VC 6.0创建MFC 单文档应用程序,工程名为skyblue_Rect。
二.创建控件,菜单等。
○1.插入图标:在资源视图里的LCON右击插入LCONID号改为:IDI_ICON_SETID号改为:IDI_ICON_STARTID号改为:IDI_ICON_PAUSEID号改为:IDI_ICON_ENDID号改为:IDR_MAINFRAME○2.插入对话框:在资源视图里的DIALOG中插入一个对话框资源,ID号改为:IDD_DLG_OPTION。
控件名控件类型ID号其它设置游戏区域大小:静态文本默认默认游戏级别选择:静态文本默认默认方块样式选择:静态文本默认默认游戏区域大小组合框:组合框IDC_COMBO_AREA 数据选项卡:12行10列18行15列24行20列30行25列游戏级别选择组合框:组合框IDC_COMBO_LEVEL 数据选项卡第一级: 入门级第二级: 初级第三级: 中级第四级: 中高级第五级: 高级第六级: 顶级方块样式选择:组合框IDC_COMBO_BLOCK_SYTLE 数据选项卡:深蓝兰白条纹绿白块纹兰百条纹紫色网格背景复选框IDC_CHECK_GRID 默认背景音乐复选框IDC_CHECK_MUSIC 默认把“确定”,“取消”按钮移至下方。
对话框改为“游戏设置”。
○3.编辑游戏菜单:1.标明:游戏(G):标明:&S. 开始游戏ID: ID_GAME_START标明:&P. 游戏暂停ID: ID_GAME_PAUSH标明:&E. 游戏结束ID:ID_GAME_END标明:&O. 游戏设置ID:ID_GAME_OPTION标明:X. 退出系统ID:ID_GAME_EXIT2. 标明:选项(&O):标明:&I. 游戏级别,选择弹出复选框标明:&M. 音乐ID: ID_OPTION_MUSIC3.帮助菜单:标明:&H. 帮助ID: ID_HELP_HELP标明:&A. 关于设计者ID: ID_HELP_ABOUT三.在类视图中编辑CSkyblue_RectView中申明变量,函数,并添加函数代码。
快捷键和控制条
4.2
// TODO: Add your message handler code here
CMenu menu; if(menu.LoadMenu(IDR_POPUP_MENU))
{
CMenu *pPopup=menu.GetSubMenu(0); pPopup->TrackPopupMenu (TPM_LEFTALIGN|TPM_RIGHTBUTTON, point.x, point.y,this); } }
菜单项属性对话框
编辑菜单项的属性
该对话框中各选项的含义分别是: “ID”文本框:菜单项的唯一标识,可由系 统生成,也可由用户自定义。 “标题”文本框:用户可见的菜单项名称。
编辑菜单项的属性
复选框:相应的菜单项被一条水平 分隔线分隔。 复选框:相应菜单项前显示选中标 记√。 复选框:相应菜单项含有弹出式子 菜单。 复选框:菜单被禁用。
添加新菜单项
用户往往不满足于AppWizard自动生成的菜 单项,比如创建文件翻译系统中的菜单栏 时,除以上菜单项外可能还需要对翻译语 言提供选择菜单项。这时就需要用户根据 自己的实际需要手动为菜单栏添加菜单项。
编辑菜单项的属性
在为菜单项添加名称时,系统已经自动打 开一个名为“Menu Item Properties” 的对话 框。输入的菜单项名称将会出现在“标题” 文本框处。
4.2
pMainFrame->m_nRectLeft = m_nX1;
2. 控制菜单状态 3. 使用快捷键
返回第4章
程序的实现步骤
1、利用AppWizard生成程序框架(MenuTest) 2、编辑资源 3、加入菜单消息处理函数 4、菜单命令的更新控制
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
else
{
// Normal menu item.
// Auto enable/disable if frame window has m_bAutoMenuEnable
// set and command is _not_ a system command.
{
int nIndexMax = ::GetMenuItemCount(hParentMenu);
for (int nIndex = 0; nIndex < nIndexMax; nIndex++)
{
if (::GetSubMenu(hParentMenu, nIndex) == pPopupMenu->m_hMenu)
void CTestDlg::OnUpdateFileExit(CCmdUI* pCmdUI)
{
.
pCmdUI->SetCheck(TRUE); // 没有文字前显示选定标记.
pCmdUI->SetRadio(TRUE); // 没有在文字前显示点.
pCmdUI->SetText("Close"); //没有更改菜单文字.
CCmdUI state;
state.m_pMenu = pPopupMenu;
ASSERT(state.m_pOther == NULL);
ASSERT(state.m_pParentMenu == NULL);
// Determine if menu is popup in top-level menu and set m_pOther to
state.m_pSubMenu = NULL;
state.DoUpdate(this, FALSE);
}
// Adjust for menu deletions and additions.
UINT nCount = pPopupMenu->GetMenuItemCount();
2009-05-11 21:58在基于对话框的MFC应用应用程序中,自己给对话框建立一个菜单,想让菜单选中后,对应的菜单项前显示“对勾”或“点”,但无法用ON_UPDATE_COMMAND_UI Nhomakorabea新菜单。
从命令用户界面处理函数(Command UI handler)改变菜单状态(启用/禁用,选择/取消选择,更改文字)在由对话框处理时没有正常工作。
pPopupMenu->GetMenuItemID(state.m_nIndex) == state.m_nID)
{
state.m_nIndex++;
}
}
state.m_nIndexMax = nCount;
state.m_pSubMenu = pPopupMenu->GetSubMenu(state.m_nIndex);
if (state.m_pSubMenu == NULL ||
(state.m_nID = state.m_pSubMenu->GetMenuItemID(0)) == 0 ||
state.m_pParentMenu = pPopupMenu; // Parent == child for tracking popup.
else if ((hParentMenu = ::GetMenu(m_hWnd)) != NULL)
{
CWnd* pParent = this;
if (nCount < state.m_nIndexMax)
{
state.m_nIndex -= (state.m_nIndexMax - nCount);
while (state.m_nIndex < nCount &&
{
// When popup is found, m_pParentMenu is containing menu.
state.m_pParentMenu = CMenu::FromHandle(hParentMenu);
}
原因
在下拉菜单显示的时候, WM_INITMENUPOPUP消息被先发送以显示菜单项。MFC CFrameWnd::OnInitMenuPopup 函数遍历菜单项并为每个菜单项调用更新命令处理函数(如果有的话).菜单的外观被更新以反映它的状态(启用/禁用,选择/取消选择)
更新用户界面机制在基于对话框的应用程序中不能工作,因为CDialog没有OnInitMenuPopup 处理函数,而使用CWnd's 默认处理函数,该函数没有为菜单项调用更新命令处理函数。
// Child windows don't have menus--need to go to the top!
if (pParent != NULL &&
(hParentMenu = ::GetMenu(pParent->m_hWnd)) != NULL)
// it if so (m_pParentMenu == NULL indicates that it is secondary popup).
HMENU hParentMenu;
if (AfxGetThreadState()->m_hTrackingMenu == pPopupMenu->m_hMenu)
void CTestDlg::OnInitMenuPopup(CMenu *pPopupMenu, UINT nIndex,BOOL bSysMenu)
{
ASSERT(pPopupMenu != NULL);
// Check the enabled state of various menu items.
state.m_nID == (UINT)-1)
{
continue; // First item of popup can't be routed to.
}
state.DoUpdate(this, TRUE); // Popups are never auto disabled.
........................
//}}AFX_MSG_MAP
ON_WM_INITMENUPOPUP()
END_MESSAGE_MAP()
在你的对话框类中添加OnInitMenuPopup成员函数且复制下列代码到该函数(注意:代码基本上是从CFrameWnd::OnInitMenuPopup(在WinFrm.cpp中)复制过来的):
解决
适用下列步骤解决此问题
在消息映射中添加ON_WM_INITMENUPOPUP 项:
BEGIN_MESSAGE_MAP(CTestDlg, CDialog)
//{{AFX_MSG_MAP(CTestDlg)
........................
ASSERT(state.m_pOther == NULL);
ASSERT(state.m_pMenu != NULL);
if (state.m_nID == (UINT)-1)
{
// Possibly a popup menu, route to first item of that popup.
break;
}
}
}
}
state.m_nIndexMax = pPopupMenu->GetMenuItemCount();
for (state.m_nIndex = 0; state.m_nIndex < state.m_nIndexMax;
}
}
state.m_nIndex++)
{
state.m_nID = pPopupMenu->GetMenuItemID(state.m_nIndex);
if (state.m_nID == 0)
continue; // Menu separator or invalid cmd - ignore it.