BeginPaint 和 GetDC 的一个区别

这个问题是在做9*9乘法表这个课后习题发现的~~

先给出我的结论:注意在 WM_PAINT 下不要使用hdc = GetDC(hwnd)的方式,因为这样会不停的触发WM_PAINT消息!

东西看上去就会闪烁!!

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
        HDC hdc;
        PAINTSTRUCT ps;
        RECT rect;
        int i,j=1,x,y = 0;
        TCHAR szBuffer[20];
        int xpos=100,ypos=100;
        switch (message)
        {
        case WM_PAINT://写在WM_PAINT里九九乘法表会闪烁,貌似一直都会有重绘消息产生!!!!
                hdc = BeginPaint(hwnd, &ps);
                wsprintf(szBuffer,TEXT("九九乘法表"));
                TextOut(hdc,xpos,ypos,szBuffer,lstrlen(szBuffer));
                ypos += 20;
                GetClientRect(hwnd,&rect);
                for (i = 1; i <= 9; i++)
                {
                        x = i;
                        for (j = 1; j <= i; j++)
                        {
                                y = j;
                                wsprintf(szBuffer,TEXT("%d * %d = %d"),x,y,x*y);
                                TextOut(hdc,xpos,ypos,szBuffer,lstrlen(szBuffer));
                                xpos += 100;
                        }
                        xpos = 100;
                        ypos += 20;
                }
                EndPaint(hwnd,&ps);
                return 0;

        case WM_LBUTTONDOWN:

                return 0;

        case WM_DESTROY:
                PostQuitMessage(0);
                return 0;
        }

        return DefWindowProc(hwnd, message, wParam, lParam);
}

2、采用 GetDC 的方式,“九九乘法表”会闪烁,貌似一直都会有重绘消息产生!!!!

//显示9*9乘法表,写在WM_PAINT里九九乘法表会闪烁,貌似一直都会有重绘消息产生!!!!
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
        HDC hdc;
        PAINTSTRUCT ps;
        RECT rect;
        int i,j=1,x,y = 0;
        TCHAR szBuffer[20];
        int xpos=100,ypos=100;
        switch (message)
        {
        case WM_PAINT:
                hdc = GetDC(hwnd);
                wsprintf(szBuffer,TEXT("九九乘法表"));
                TextOut(hdc,xpos,ypos,szBuffer,lstrlen(szBuffer));
                ypos += 20;
                GetClientRect(hwnd,&rect);
                for (i = 1; i <= 9; i++)
                {
                        x = i;
                        for (j = 1; j <= i; j++)
                        {
                                y = j;
                                wsprintf(szBuffer,TEXT("%d * %d = %d"),x,y,x*y);
                                TextOut(hdc,xpos,ypos,szBuffer,lstrlen(szBuffer));
                                xpos += 100;
                        }
                        xpos = 100;
                        ypos += 20;
                }
                ReleaseDC(hwnd,hdc);
                return 0;

        case WM_LBUTTONDOWN:

                return 0;

        case WM_DESTROY:
                PostQuitMessage(0);
                return 0;
        }

        return DefWindowProc(hwnd, message, wParam, lParam);
}

总结:

1、所谓的无效区域就是Update Region (需要跟新的区域),有效区域就是不需要跟新的区域。 如果存在无效区域,系统就会产生WM_PAINT 消息。

2、无效区域是可以被累加的,当队列中其他消息都被带走时,只剩下WM_PAINT 消息时,无效区域 统一重绘。

3、并不是重绘了,无效区域就消失了,使无效区域消失的方法就是调用BeginPaint 。所以如果不在 WM_PAINT消息处理函数中调用BeginPaint ,那么无效区域总是存在,从而会不停的产生WM_PAINT 消息。所以就会不停进入WM_PAINT 消息处理函数~~

时间: 2024-10-07 10:57:01

BeginPaint 和 GetDC 的一个区别的相关文章

BCB 中 Application->CreateForm 和 New 的一个区别

Application->Create 和 NEW 的一个区别 最近写windows服务的时候,恰巧碰到一个问题.我建立了一个DataModal,然后在Datamodal的OnCreate 事件中创建了另外一个类A的对象a.. a会去访问DataModal的全局指针.相当于下面这个东西: 发现,a访问的DataModal的全局指针有如下2种情况, 如果使用Application->CreateForm 创建,则a可以访问到DataModal的全局指针.即,用下面的方式创建: ? 如果用new的

remove()和直接使用system的一个区别

1.事出有因 今天在做一个从web页面中得到POST回应数据的时候,需要把临时文件夹里面(包含子文件)内容清空.本来一直使用的是system("rmdir /s /q ..//tmp//data.txt").后面测试使用system("del /s /q ..\\tmp\\data.txt")也是可以清空缓存数据文件的,但是发现这个每次都会显示出控制台的黑框,而且我这个文件夹是大概每隔2秒中,要清空一次的.所以删除多了之后,黑框会越来越多.总之很不好! 2.临时解决

版本python2和版本3.X的一个区别之一

print函数 虽然print语法是Python 3中一个很小的改动,且应该已经广为人知,但依然值得提一下:Python 2中的print语句被Python 3中的print()函数取代,这意味着在Python 3中必须用括号将需要输出的对象括起来. 在Python 2中使用额外的括号也是可以的.但反过来在Python 3中想以Python2的形式不带括号调用print函数时,会触发SyntaxError. Python 2 1 2 3 4 print 'Python', python_vers

Java 接口和抽象类区别

1.概述 一个软件设计的好坏,我想很大程度上取决于它的整体架构,而这个整体架构其实就是你对整个宏观商业业务的抽象框架,当代表业务逻辑的高层抽象层结构 合理时,你底层的具体实现需要考虑的就仅仅是一些算法和一些具体的业务实现了.当你需要再开发另一个相近的项目时,你以前的抽象层说不定还可以再次利用 .面对对象的设计,复用的重点其实应该是抽象层的复用,而不是具体某一个代码块的复用. 说到了抽象,我就不能不提到曾让我头痛的Java接口和Java抽象类了,这也是本文我想说的重点. 既然面向对象设计的重点在于

outline与border的区别

在浏览器里,当鼠标点击或使用Tab键让一个链接或者一个radio获得焦点的时候,该元素将会被一个轮廓虚线框围绕.这个轮廓虚线框就是 outline . outline 能告诉用户那一个可以激发事件的html元素获取了焦点,对钟爱键盘操作的用户尤其有意义.一个清晰悦目的outline设计能提高使用表单的用户体验. 另一方面,outline 也有些讨厌的地方,比如使用CSS设计的Tab(标签页)时,选择一个Tab之后,Tab上的轮廓虚线会一直显示,有些影响美观. CSS 的 outline 属性允许

Java中sychronized方法与sychronized块区别

一.举几个栗子?? 1.当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行.另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块. 2.当一个线程访问object的一个synchronized(this)同步代码块时,另一个线程仍然可以访问该object中的非synchronized(this)同步代码块. 3.当一个线程访问object的一个synchronized(this)同步代码块时,其他线程对ob

struct和class区别

转载来源:http://blog.sina.com.cn/s/blog_48f587a80100k630.html C++中的struct对C中的struct进行了扩充,它已经不再只是一个包含不同数据类型的数据结构了,它已经获取了太多的功能.struct能包含成员函数吗? 能!struct能继承吗? 能!!struct能实现多态吗? 能!!! 既然这些它都能实现,那它和class还能有什么区别? 最本质的一个区别就是默认的访问控制: 默认的继承访问权限 struct是public的,class是

009_02sendRedirect()和forward()方法的区别

先来看个请求转发的实例: 在这个例子中,我们编写一个PortalServlet,在这个Servlet中,首先判断访问用户是否已经登录,如果没有登录,则调用RequestDispatcher接口的include()方法,将请求转发给LoginServlet2,LoginServlet2在响应中发送登录表单:如果已经登录,则调用RequestDispatcher接口的forward()方法,请求转发给WelcomeYou界面,向用户显示欢迎信息. 1,PortalServlet.java 1 pac

C# 静态类与非静态类、静态成员的区别

静态类 静态类与非静态类的重要区别在于静态类不能实例化,也就是说,不能使用 new 关键字创建静态类类型的变量.在声明一个类时使用static关键字,具有两个方面的意义:首先,它防止程序员写代码来实例化该静态类:其次,它防止在类的内部声明任何实例字段或方法. 静态类是自C# 2.0才引入的,C# 1.0不支持静态类声明.程序员必须声明一个私有构造器.私有构造器禁止开发者在类的范围之外实例化类的实例.使用私有构造器的效果与使用静态类的效果非常相似.两者的区别在于,私有构造器方式仍然可以从类的内部对