帮我看看问题出在什么地方!

时间:2022-12-27 23:29:55
我刚刚开始学mfc,我想做一个五子棋得游戏!
遇到了很多得问题!想请各位大侠帮我找找毛病出在什么地方!

1:在我做的一个基于对话框的程序中!
当程序AfxMessagebox一个对话框的时候;当我用拖动这个弹出的对话框移动的时候,我的主对话有明显的闪烁!
请问,这个时候产生的是什么消息阿?
应该是WM_paint消息吧,怎么做才能避免闪烁阿?
2:
用CDC,CClientDC,CpaintDC,画图形,到底有什么本质得区别!
3;
怎样使用计时类?
就是计算两个人下棋的时间阿!

8 个解决方案

#1


1. 没错,是WM_PAINT
2. CDC 是 CClientDC, CPaintDC的基类。
   CPaintDC与其它两个有本质的区别,区别在 CPaintDC 是 调用 BeginPaint函数构造的。
3. 通常,你可以使用定时器(我不知道你的计时类是谁提供的)或者系统时间来确定下棋的时  间。这一点你没说清楚,不过也不是什么问题。

回到第一点:怎么做才能避免闪烁。
首先要了解为什么会闪烁。
  1. 当窗口画面被更改时,Windows会发送WM_EARSEBACKGROUND和WM_PAINT消息。默认的WM_EARSEBACKGROUND会用窗口背景刷子把窗口刷一次。因此,如果你的窗口处理这个消息,使它不作任何事,那么你的画面闪烁就会有较大的改观。
  2. WM_PAINT中需对画面进行重画。如果你只重画真正需重画的范围,那么重画时间将缩短许多,也减少了闪烁。 (不过,如果你画面不是很复杂,效果不明显)
  3. 重画时,对屏幕的操作越少,速度超快,闪烁就越少。通常采用双缓冲,可以将屏幕操作减少到一次,速度最快,几乎没有闪烁。所谓双缓冲,最简单的实现是,创建一个内存位图,先对此位图进行重画,然后用blt操作一次写到屏幕上。
  4. 如果您还不满意,那么就要直接操作显示内存了。较容易的方法是使用DirectX实现。

ok??




   

#2


1.你可能是在重画窗口的时候,重画的不仅仅是无效区,你可能不整个窗口都重画了!
2.CDC 设备环境. CClientDC:客户区设备环境,如 不包括标题工具条菜单等, CPaintDC是一个特殊的 DC,主要用来处理 Windows 的 WM_PAINT 消息!
3.用来计时的函数非常多,如果是要求不精确(你的要求当然不精确,0.1s 就够了)可以使用最长使用的 
SYSTEMTIME sysTime;
GetSystemTime( &sysTime );

  

#3


up push

#4


窗口重画是比较麻烦的事情,我也碰到过几次,不过还是不怎么理解,哪位高手能说的更详细一些阿!

#5


Muf(沐枫)已经说得够详细的了!!!

#6


Muf(沐枫)已经说得够详细的了!!!

#7


Muf(沐枫)已经说得够详细的了!!!

#8


在问一个问题!
请问,
如果控制,在菜单的前面加“对号"
我是到是oCmdUI->setCheck("变量");
请问这个变量怎么使用阿?

#1


1. 没错,是WM_PAINT
2. CDC 是 CClientDC, CPaintDC的基类。
   CPaintDC与其它两个有本质的区别,区别在 CPaintDC 是 调用 BeginPaint函数构造的。
3. 通常,你可以使用定时器(我不知道你的计时类是谁提供的)或者系统时间来确定下棋的时  间。这一点你没说清楚,不过也不是什么问题。

回到第一点:怎么做才能避免闪烁。
首先要了解为什么会闪烁。
  1. 当窗口画面被更改时,Windows会发送WM_EARSEBACKGROUND和WM_PAINT消息。默认的WM_EARSEBACKGROUND会用窗口背景刷子把窗口刷一次。因此,如果你的窗口处理这个消息,使它不作任何事,那么你的画面闪烁就会有较大的改观。
  2. WM_PAINT中需对画面进行重画。如果你只重画真正需重画的范围,那么重画时间将缩短许多,也减少了闪烁。 (不过,如果你画面不是很复杂,效果不明显)
  3. 重画时,对屏幕的操作越少,速度超快,闪烁就越少。通常采用双缓冲,可以将屏幕操作减少到一次,速度最快,几乎没有闪烁。所谓双缓冲,最简单的实现是,创建一个内存位图,先对此位图进行重画,然后用blt操作一次写到屏幕上。
  4. 如果您还不满意,那么就要直接操作显示内存了。较容易的方法是使用DirectX实现。

ok??




   

#2


1.你可能是在重画窗口的时候,重画的不仅仅是无效区,你可能不整个窗口都重画了!
2.CDC 设备环境. CClientDC:客户区设备环境,如 不包括标题工具条菜单等, CPaintDC是一个特殊的 DC,主要用来处理 Windows 的 WM_PAINT 消息!
3.用来计时的函数非常多,如果是要求不精确(你的要求当然不精确,0.1s 就够了)可以使用最长使用的 
SYSTEMTIME sysTime;
GetSystemTime( &sysTime );

  

#3


up push

#4


窗口重画是比较麻烦的事情,我也碰到过几次,不过还是不怎么理解,哪位高手能说的更详细一些阿!

#5


Muf(沐枫)已经说得够详细的了!!!

#6


Muf(沐枫)已经说得够详细的了!!!

#7


Muf(沐枫)已经说得够详细的了!!!

#8


在问一个问题!
请问,
如果控制,在菜单的前面加“对号"
我是到是oCmdUI->setCheck("变量");
请问这个变量怎么使用阿?