Sakerjin 发表于 2015-9-15 23:08:42

win32编程中出现闪烁

/*
       程序实现的是输入字符并且在窗口显示出来,按下backspace键的时候消去一个
*/
下面是主要代码
i,还有szBuffer设置为全局变量
case WM_CHAR:
            
            switch(wParam)
            {
                  case '\b':
                         i--;
                         if(i<=0)
                         i=0;
                        szBuffer=' ';
                     break;
             default:                     
                        szBuffer=wParam;
                        i++;
                        szBuffer=0;
            }
               break;
         caseWM_PAINT:
               GetClientRect(hwnd,&rect);
               hdc=BeginPaint(hwnd,&ps);
               DrawText(hdc,szBuffer,-1,&rect,DT_LEFT);
                InvalidateRect(hwnd,&rect,false);//这一句如果不加上的话字符为什么不显示,加上之后就会闪烁,问一下有没有其他方案
               EndPaint(hwnd,&ps);
               return 0;



求助,希望有更好的解决方案

santaclaus 发表于 2015-9-16 08:01:34

本帖最后由 santaclaus 于 2015-9-16 08:04 编辑

将以下两句移动WM_CHAR消息里,即该switch后面,break之前:
GetClientRect(hwnd,&rect);
DrawText(hdc,szBuffer,-1,&rect,DT_LEFT);

Sakerjin 发表于 2015-9-19 22:56:36

santaclaus 发表于 2015-9-16 08:01
将以下两句移动WM_CHAR消息里,即该switch后面,break之前:
GetClientRect(hwnd,&rect);
DrawText(hdc ...

多谢你了,我的问题是这样解决的
把绘制代码放到WM_CHAR 中
并且在此之前获取设备环境描述表句柄
如果按照你的代码,没有设备描述表句柄,我输入不了汉字,你也可以试试
不管怎么,还是谢谢你了,

santaclaus 发表于 2015-9-19 23:07:19

我说错了,是GetClientRect和InvalidateRect两句那到WM_CHAR里。Draw*还是你原来的样子。

Sakerjin 发表于 2015-9-22 00:02:08

santaclaus 发表于 2015-9-19 23:07
我说错了,是GetClientRect和InvalidateRect两句那到WM_CHAR里。Draw*还是你原来的样子。

完美解决,多谢大神

freeparty 发表于 2015-9-26 07:33:18

去掉InvalidateRect(hwnd,&rect,false);这句代码,这句代码是用来强制刷新界面的。

jies147 发表于 2015-9-28 10:30:01

将InvalidateRect(hwnd,&rect,false)改为InvalidateRect(hwnd,NULL,false),并放在WM_CHAR的break之前就可以了
页: [1]
查看完整版本: win32编程中出现闪烁