VC高手请进:右键菜单响应与视图更新的问题

我给对话框程序添加了一个右键menu,点击右键菜单项后程序捕获onCommand消息后立即响应,视图(准确的说是openGL绘图区)更新。问题是onCommand消息响应... 我给对话框程序添加了一个右键menu,点击右键菜单项后程序捕获onCommand消息后立即响应,视图(准确的说是openGL绘图区)更新。问题是onCommand消息响应时右键菜单还没消失,那些被菜单挡住的区域就不会被openGL绘制。菜单消失后,遮盖区填补的是视图更新前的图样,达不到完全更新的效果。我想问:有没有方法截获右键菜单消失时的消息??因为在此消息处更新视图才可实现预期效果啊。许多字处理软件也会经常遇到这样的问题,不知道它们是怎样解决的呀?
敬请高手解答啊,感激不尽!
目前还没有满意答案,重申一下问题:我用的是对话框框架,在PICTURE控件里用openGL绘图。点击右键,弹出菜单出现在PICTURE控件里,遮住了某一块图像。选中菜单中某一项后,onComand中会立即响应更新数据,并在PICTURE中重新绘图。问题在于此时菜单尚未消失,openGL无法更新被遮住的部分。菜单消失后,被遮区域是之前的图像。有人说我逻辑有问题,废话,这样的逻辑无法实现更新才来提问的啊!我的想法是右键菜单消失后才调用openGL更新视图,这样就不会有遮住的部分。问题是我怎么知道右键菜单何时消失?或者说右键菜单消失时会引发什么消息?我想最佳的方案是onCommand消息里更新数据,在右键菜单消失的消息里调用openGL重绘,不知大家有何高见?

再问一句:右键菜单消失会引起OnPaint消息吗?如果是的话,在此问题中是对话框接收到OnPaint消息还是PICTURE控件接收到OnPaint消息?
展开
 我来答
silvergingko
2011-08-23 · TA获得超过5945个赞
知道小有建树答主
回答量:688
采纳率:0%
帮助的人:871万
展开全部
OpenGL 没学过。

但,我感觉楼主的程序逻辑是不正确的,不正确的程序架构,会随着程序功能的逐渐增强而引发一连串的问题。
我所理解的正确架构是这样的(不涉及动画,楼主的若是动画,直接无视以下内容):
一个窗口程序,要展现给用户的,无非是一堆的数据而已,这些数据的展现可以是朴素的,也可以是绚丽的。
数据的处理可以是任何时候发生,没有定式,依据程序的需要;而绘图尽可能在 WM_PAINT 发生时进行。譬如像楼主,点击了右键菜单,希望能刷新窗口。窗口之所以要刷新,是因为程序的数据发生变化了,(没有变化,干嘛要重绘,对吧)。此时,楼主将数据的呈现在 OnCommand 中进行就是错误的,在 OnCommand 中,可以进行一些数据处理,甚至是双缓冲技术的内存DC重绘也可以,然后调用 InvalidXXX函数告诉窗口,窗口中的图形界面需要被重绘。在 OnPaint 或 OnDraw 中,读取和程序界面有关的数据,然后绘制出来就 OK 了。
举个例子:
窗口负责呈现一个立方体。

将立方体的八个点保存在程序中,在 OnDraw 中,读取八个点,然会利用一些绘图函数,甚至是楼主需要的 OpenGL ,将立方体画出来。在 OnCommand 中,根据需要计算八个点是否被改变了,然后保存新的坐标点,计算完后,调用 InvalidXXX 通知窗口需要重绘,这样当下一次 OnDraw 来临时,OnDraw 绘制的肯定是新坐标的立方体。
当然,右键菜单消失后也会引发窗口重绘的,OnDraw 会被调用,而且绘制的是新坐标的立方体。
简而言之,不要在 OnDraw 以外进行绘图,不要在 OnDraw 中进行数据处理。
何处淬吴钩
2011-08-24 · TA获得超过5045个赞
知道大有可为答主
回答量:2947
采纳率:50%
帮助的人:2419万
展开全部
这是因为你的OpenGL绘图后窗口不可见部分(即右键菜单挡住的部分)重绘了,把你的GL绘图结果覆盖了。
解决办法:
在窗口绘制函数里进行OPenGL绘图,捕获onCommand消息后重绘窗口。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
luosiyong
2011-08-27 · TA获得超过3256个赞
知道大有可为答主
回答量:1090
采纳率:0%
帮助的人:1631万
展开全部
首先要知道你绘图是怎么做的。
是 PeekMessage 有消息就处理消息,没有消息就是OpenGL渲染呢?
还是在OnPaint中绘制的图像。
如果是前者,那就没问题的,因为每秒几十帧是不影响你说的问题的。
如果不是后者,那绘图逻辑就有问题。
【补充】
菜单消失,被遮挡的窗口都会有WM_PAINT消息的。需要派生PICTURE控件类,并重写它的OnPaint,PICTURE是一个STATIC的控件。
PICTURE里面的OnPaint用OpenGL绘制一遍才能更新显示。
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
手机用户24445
2011-08-25 · TA获得超过278个赞
知道小有建树答主
回答量:689
采纳率:0%
帮助的人:393万
展开全部
重装下系统吧 有也可能是哪个软件冲突了
去控制面版里看看 删掉些没用的垃圾程序
中文上网哪种 ..
然后重启..
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
手机用户27831
2011-08-24 · 超过10用户采纳过TA的回答
知道答主
回答量:117
采纳率:100%
帮助的人:93.1万
展开全部
重装下系统吧 有也可能是哪个软件冲突了
去控制面版里看看 删掉些没用的垃圾程序
中文上网哪种 ..
然后重启..
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式