BeginPaint 和 GetDC 的一個區別

來源:互聯網
上載者:User

標籤:

這個問題是在做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 訊息處理函數~~

BeginPaint 和 GetDC 的一個區別

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.