VC高手请进:右键菜单响应与视图更新的问题
我给对话框程序添加了一个右键menu,点击右键菜单项后程序捕获onCommand消息后立即响应,视图(准确的说是openGL绘图区)更新。问题是onCommand消息响应...
我给对话框程序添加了一个右键menu,点击右键菜单项后程序捕获onCommand消息后立即响应,视图(准确的说是openGL绘图区)更新。问题是onCommand消息响应时右键菜单还没消失,那些被菜单挡住的区域就不会被openGL绘制。菜单消失后,遮盖区填补的是视图更新前的图样,达不到完全更新的效果。我想问:有没有方法截获右键菜单消失时的消息??因为在此消息处更新视图才可实现预期效果啊。许多字处理软件也会经常遇到这样的问题,不知道它们是怎样解决的呀?
敬请高手解答啊,感激不尽!
目前还没有满意答案,重申一下问题:我用的是对话框框架,在PICTURE控件里用openGL绘图。点击右键,弹出菜单出现在PICTURE控件里,遮住了某一块图像。选中菜单中某一项后,onComand中会立即响应更新数据,并在PICTURE中重新绘图。问题在于此时菜单尚未消失,openGL无法更新被遮住的部分。菜单消失后,被遮区域是之前的图像。有人说我逻辑有问题,废话,这样的逻辑无法实现更新才来提问的啊!我的想法是右键菜单消失后才调用openGL更新视图,这样就不会有遮住的部分。问题是我怎么知道右键菜单何时消失?或者说右键菜单消失时会引发什么消息?我想最佳的方案是onCommand消息里更新数据,在右键菜单消失的消息里调用openGL重绘,不知大家有何高见?
再问一句:右键菜单消失会引起OnPaint消息吗?如果是的话,在此问题中是对话框接收到OnPaint消息还是PICTURE控件接收到OnPaint消息? 展开
敬请高手解答啊,感激不尽!
目前还没有满意答案,重申一下问题:我用的是对话框框架,在PICTURE控件里用openGL绘图。点击右键,弹出菜单出现在PICTURE控件里,遮住了某一块图像。选中菜单中某一项后,onComand中会立即响应更新数据,并在PICTURE中重新绘图。问题在于此时菜单尚未消失,openGL无法更新被遮住的部分。菜单消失后,被遮区域是之前的图像。有人说我逻辑有问题,废话,这样的逻辑无法实现更新才来提问的啊!我的想法是右键菜单消失后才调用openGL更新视图,这样就不会有遮住的部分。问题是我怎么知道右键菜单何时消失?或者说右键菜单消失时会引发什么消息?我想最佳的方案是onCommand消息里更新数据,在右键菜单消失的消息里调用openGL重绘,不知大家有何高见?
再问一句:右键菜单消失会引起OnPaint消息吗?如果是的话,在此问题中是对话框接收到OnPaint消息还是PICTURE控件接收到OnPaint消息? 展开
5个回答
展开全部
OpenGL 没学过。
但,我感觉楼主的程序逻辑是不正确的,不正确的程序架构,会随着程序功能的逐渐增强而引发一连串的问题。
我所理解的正确架构是这样的(不涉及动画,楼主的若是动画,直接无视以下内容):
一个窗口程序,要展现给用户的,无非是一堆的数据而已,这些数据的展现可以是朴素的,也可以是绚丽的。
数据的处理可以是任何时候发生,没有定式,依据程序的需要;而绘图尽可能在 WM_PAINT 发生时进行。譬如像楼主,点击了右键菜单,希望能刷新窗口。窗口之所以要刷新,是因为程序的数据发生变化了,(没有变化,干嘛要重绘,对吧)。此时,楼主将数据的呈现在 OnCommand 中进行就是错误的,在 OnCommand 中,可以进行一些数据处理,甚至是双缓冲技术的内存DC重绘也可以,然后调用 InvalidXXX函数告诉窗口,窗口中的图形界面需要被重绘。在 OnPaint 或 OnDraw 中,读取和程序界面有关的数据,然后绘制出来就 OK 了。
举个例子:
窗口负责呈现一个立方体。
将立方体的八个点保存在程序中,在 OnDraw 中,读取八个点,然会利用一些绘图函数,甚至是楼主需要的 OpenGL ,将立方体画出来。在 OnCommand 中,根据需要计算八个点是否被改变了,然后保存新的坐标点,计算完后,调用 InvalidXXX 通知窗口需要重绘,这样当下一次 OnDraw 来临时,OnDraw 绘制的肯定是新坐标的立方体。
当然,右键菜单消失后也会引发窗口重绘的,OnDraw 会被调用,而且绘制的是新坐标的立方体。
简而言之,不要在 OnDraw 以外进行绘图,不要在 OnDraw 中进行数据处理。
但,我感觉楼主的程序逻辑是不正确的,不正确的程序架构,会随着程序功能的逐渐增强而引发一连串的问题。
我所理解的正确架构是这样的(不涉及动画,楼主的若是动画,直接无视以下内容):
一个窗口程序,要展现给用户的,无非是一堆的数据而已,这些数据的展现可以是朴素的,也可以是绚丽的。
数据的处理可以是任何时候发生,没有定式,依据程序的需要;而绘图尽可能在 WM_PAINT 发生时进行。譬如像楼主,点击了右键菜单,希望能刷新窗口。窗口之所以要刷新,是因为程序的数据发生变化了,(没有变化,干嘛要重绘,对吧)。此时,楼主将数据的呈现在 OnCommand 中进行就是错误的,在 OnCommand 中,可以进行一些数据处理,甚至是双缓冲技术的内存DC重绘也可以,然后调用 InvalidXXX函数告诉窗口,窗口中的图形界面需要被重绘。在 OnPaint 或 OnDraw 中,读取和程序界面有关的数据,然后绘制出来就 OK 了。
举个例子:
窗口负责呈现一个立方体。
将立方体的八个点保存在程序中,在 OnDraw 中,读取八个点,然会利用一些绘图函数,甚至是楼主需要的 OpenGL ,将立方体画出来。在 OnCommand 中,根据需要计算八个点是否被改变了,然后保存新的坐标点,计算完后,调用 InvalidXXX 通知窗口需要重绘,这样当下一次 OnDraw 来临时,OnDraw 绘制的肯定是新坐标的立方体。
当然,右键菜单消失后也会引发窗口重绘的,OnDraw 会被调用,而且绘制的是新坐标的立方体。
简而言之,不要在 OnDraw 以外进行绘图,不要在 OnDraw 中进行数据处理。
展开全部
这是因为你的OpenGL绘图后窗口不可见部分(即右键菜单挡住的部分)重绘了,把你的GL绘图结果覆盖了。
解决办法:
在窗口绘制函数里进行OPenGL绘图,捕获onCommand消息后重绘窗口。
解决办法:
在窗口绘制函数里进行OPenGL绘图,捕获onCommand消息后重绘窗口。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
首先要知道你绘图是怎么做的。
是 PeekMessage 有消息就处理消息,没有消息就是OpenGL渲染呢?
还是在OnPaint中绘制的图像。
如果是前者,那就没问题的,因为每秒几十帧是不影响你说的问题的。
如果不是后者,那绘图逻辑就有问题。
【补充】
菜单消失,被遮挡的窗口都会有WM_PAINT消息的。需要派生PICTURE控件类,并重写它的OnPaint,PICTURE是一个STATIC的控件。
PICTURE里面的OnPaint用OpenGL绘制一遍才能更新显示。
是 PeekMessage 有消息就处理消息,没有消息就是OpenGL渲染呢?
还是在OnPaint中绘制的图像。
如果是前者,那就没问题的,因为每秒几十帧是不影响你说的问题的。
如果不是后者,那绘图逻辑就有问题。
【补充】
菜单消失,被遮挡的窗口都会有WM_PAINT消息的。需要派生PICTURE控件类,并重写它的OnPaint,PICTURE是一个STATIC的控件。
PICTURE里面的OnPaint用OpenGL绘制一遍才能更新显示。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
重装下系统吧 有也可能是哪个软件冲突了
去控制面版里看看 删掉些没用的垃圾程序
中文上网哪种 ..
然后重启..
去控制面版里看看 删掉些没用的垃圾程序
中文上网哪种 ..
然后重启..
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
重装下系统吧 有也可能是哪个软件冲突了
去控制面版里看看 删掉些没用的垃圾程序
中文上网哪种 ..
然后重启..
去控制面版里看看 删掉些没用的垃圾程序
中文上网哪种 ..
然后重启..
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询