⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 subject_45225.htm

📁 vc
💻 HTM
字号:
<p>
序号:45225 发表者:泥巴鱼 发表日期:2003-06-27 18:02:26
<br>主题:新手问:150分,求教三个子菜单问题
<br>内容:&nbsp;&nbsp; 1.我在一级菜单"车辆"下面用AppendMenu()添加子菜单"车1",如果原来没有一个子菜单,那么程序运行出错,说是引用了'read'属性的内存,点"确定"后整个程序关闭.但如果"车辆"下面原本就已经含有一个子菜单"全体",再在程序里面用AppendMenu()就能正常添加子菜单"车1".申明一点:"车辆"菜单的Popup属性我是选上的.<BR>&nbsp;&nbsp; 2.我的代码如下:<BR>&nbsp;&nbsp;&nbsp;&nbsp;static int x=400;<BR>&nbsp;&nbsp;&nbsp;&nbsp;CMenu *pMenu=GetMenu();<BR>&nbsp;&nbsp;&nbsp;&nbsp;CMenu *pSubMenu=pMenu-&gt;GetSubMenu(4);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pSubMenu-&gt;AppendMenu(MF_STRING,x,"车1");<BR>&nbsp;&nbsp;&nbsp;&nbsp;DrawMenuBar();<BR>&nbsp;&nbsp;&nbsp;&nbsp; 是仿造别人写的.AppendMenu的第二个参数nIDNewItem是ID号对吧?这里面直接用x是不是不好?我看别的文章说的,好像应该先在VIEW/RESOURCE SYMBOLS里添加一个ID号(比如ID_NEW),再用AppendMenu(MF_STRING,ID_NEW,"车1").但是如果要添加的子菜单数目不定呢?象我的程序,就是远程接收到多少车牌号,就要添加多少个子菜单,总不能先定义一堆ID号吧?<BR>&nbsp;&nbsp; 3.还有就是这些子菜单都要调用一个函数,比如NewDlg.DoModol();这个NewDlg.DoModol();应该写在哪儿,子菜单要做哪些设置才能实现这个目标?<BR>&nbsp;&nbsp; 谢谢帮助!!
<br><a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p>
<hr size=1>
<blockquote><p>
回复者:泥巴鱼 回复日期:2003-06-30 17:37:10
<br>内容:自己顶一下!
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:泥巴鱼 回复日期:2003-07-01 11:44:17
<br>内容:在别处找到部分答案,但是又有新问题.贴出来请大家参详:<BR>我的子菜单添加代码如下:<BR>void CGpsDlg::OnButton1() <BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;// TODO: Add your control notification handler code here<BR>&nbsp;&nbsp;&nbsp;&nbsp;//用来测试添加菜单项<BR>&nbsp;&nbsp;&nbsp;&nbsp;//static unsigned int x=100001;<BR>&nbsp;&nbsp;&nbsp;&nbsp;CMenu *pMenu=GetMenu();<BR>&nbsp;&nbsp;&nbsp;&nbsp;CMenu *pSubMenu=pMenu-&gt;GetSubMenu(4);<BR>&nbsp;&nbsp;&nbsp;&nbsp;pSubMenu-&gt;AppendMenu(MF_STRING,100001,"车1");<BR>&nbsp;&nbsp;&nbsp;&nbsp;DrawMenuBar();<BR>}<BR>调用对话框的函数写在OnCmdMsg()里面:<BR>BOOL CGpsDlg::OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo) <BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;// TODO: Add your specialized code here and/or call the base class<BR>&nbsp;&nbsp;&nbsp;&nbsp;//测试<BR>&nbsp;&nbsp;&nbsp;&nbsp;if(nID&gt;100000)<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CLOGDLG dlg;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dlg.DoModal();<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;return CDialog::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo);<BR>}<BR>这样点击"车1",程序没有反应.如果改成pSubMenu-&gt;AppendMenu(MF_STRING,50001,"车1");和if(nID&gt;50000),在点击"车1"后出来两次对话框,这样应该怎么改正?(我猜想是不是因为在点击"车1"之前需要先点击它的上一级菜单"车辆"的缘故?瞎猜的^_^)<BR>问题2:这样作是不是不太严密?如果程序自动生成的某个ID号大于50000不是会出漏子?我一开始把ID改成10001,结果点好多按钮都能出来对话框,晕了半天才想起来看看Resource Symbols,发现就是因为有部分按钮的ID号&gt;10000的缘故,汗...<BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
<font color=red>答案被接受</font><br>回复者:counter-bug 回复日期:2003-07-01 13:55:40
<br>内容:1.CMenu *pSubMenu=pMenu-&gt;GetSubMenu(4); 无法获得没有子菜单的下拉菜单。可能要添加整列MENU才行,不知道你有没有找到其他办法,如果有,贴出来,让我也学一学。<BR>2.调用对话框的函数写在写在OnCommand里,不做在OnCmdMsg()<BR>3.是不严密,好在编译时已能知道定义的ID值,所以也无所谓。不过最好定义两个边界值ID_CAR_MIN , ID_CAR_MAX 。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:泥巴鱼 回复日期:2003-07-01 15:27:50
<br>内容:1.没有找到其它方法:(<BR>2.以前都没有用过类似OnCommand()和OnCmdMsg()这样的响应函数,不知道分别适用于什么情况.我查MSDN加自己测试,觉得OnCmdMsg()好像是对每一次鼠标点击都会响应.而OnCommand()仅对菜单和快捷键响应.不对的地方请指正.<BR>3.OnCmdMsg()中有nID这个参数代表ID,OnCommand()里面怎么表示ID呢?MSDN说"The low-order word of wParam identifies the command ID of the menu item",不明白应该怎么做.:(<BR>4.使用OnCmdMsg()时,出现两次对话框,为什么?如果用OnCommand()是不是就没有这个问题了?<BR>谢谢counter-bug !!
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:泥巴鱼 回复日期:2003-07-01 17:47:42
<br>内容:up!
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:counter-bug 回复日期:2003-07-01 17:55:10
<br>内容:2.两者几乎没什么区别,OnCommand 在OnCmdMsg()上一层。<BR>3.这是为了区分一个命令是从一个菜单上来的还是快捷键来的。<BR>&nbsp;&nbsp;如果是菜单上来的则不变,如果是从快捷键来的高字段会加1<BR>&nbsp;&nbsp;如:<BR>&nbsp;&nbsp;假设菜单中有个Copy命令,ID = 0x00000001, 对应快捷键Ctrl+C<BR>&nbsp;&nbsp;如果我们从菜单激活这个命令就是0x00000001, 如果按Ctrl+C激活就是0x00010001。<BR>&nbsp;&nbsp;不明白微软为什么要这么做,这样会带来很多问题。如果我再有个菜单ID恰好是0x00010001,那么程序就没办法区分了,:(。一个Bug!<BR><BR>4.OnCmdMsg()要处理COMMAND和UPDATE_COMMAND_UI,所以要出现两次<BR>&nbsp;&nbsp;Command只收到COMMAND消息<BR>2003-7-1 17:58:05

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -