关于 InvalidateRect (hwnd, NULL, TRUE)函数

zhangbinnpu zhangbinnpu 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
这是《windows程序设计》中的例题,在case WM_PAINT:分支中用了InvalidateRect (hwnd, NULL, TRUE)函数,但是我去掉这个函数以后程序也可以正常运行,请那位达人给解释一下用法和原因!
#include <windows.h>

LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,

PSTR szCmdLine, int iCmdShow)

{

static TCHAR szAppName[] = TEXT ("Bezier") ;

HWND hwnd ;

MSG msg ;

WNDCLASS wndclass ;


wndclass.style = CS_HREDRAW | CS_VREDRAW ;

wndclass.lpfnWndProc= WndProc ;

wndclass.cbClsExtra = 0 ;

wndclass.cbWndExtra = 0 ;

wndclass.hInstance = hInstance ;

wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ;

wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;

wndclass.hbrBackground= (HBRUSH) GetStockObject (WHITE_BRUSH) ;

wndclass.lpszMenuName= NULL ;

wndclass.lpszClassName= szAppName ;



if (!RegisterClass (&wndclass))

{

MessageBox (NULL, TEXT ("Program requires Windows NT!"),

szAppName, MB_ICONERROR) ;

return 0 ;

}



hwnd = CreateWindow (szAppName, TEXT ("Bezier Splines"),

WS_OVERLAPPEDWINDOW,

CW_USEDEFAULT, CW_USEDEFAULT,

CW_USEDEFAULT, CW_USEDEFAULT,

NULL, NULL, hInstance, NULL) ;



ShowWindow (hwnd, iCmdShow) ;

UpdateWindow (hwnd) ;



while (GetMessage (&msg, NULL, 0, 0))

{

TranslateMessage (&msg) ;

DispatchMessage (&msg) ;

}

return msg.wParam ;

}


void DrawBezier (HDC hdc, POINT apt[])

{

PolyBezier (hdc, apt, 4) ;

MoveToEx (hdc, apt[0].x, apt[0].y, NULL) ;

LineTo (hdc, apt[1].x, apt[1].y) ;



MoveToEx (hdc, apt[2].x, apt[2].y, NULL) ;

LineTo (hdc, apt[3].x, apt[3].y) ;

}

LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)

{

static POINT apt[4] ;

HDC hdc ;

int cxClient, cyClient ;

PAINTSTRUCT ps ;


switch (message)

{

case WM_SIZE:

cxClient = LOWORD (lParam) ;

cyClient = HIWORD (lParam) ;



apt[0].x = cxClient / 4 ;

apt[0].y = cyClient / 2 ;



apt[1].x = cxClient / 2 ;

apt[1].y = cyClient / 4 ;



apt[2].x = cxClient / 2 ;

apt[2].y = 3 * cyClient / 4 ;



apt[3].x = 3 * cxClient / 4 ;

apt[3].y = cyClient / 2 ;



return 0 ;


case WM_LBUTTONDOWN:

case WM_RBUTTONDOWN:

case WM_MOUSEMOVE:

if (wParam & MK_LBUTTON || wParam & MK_RBUTTON)

{

hdc = GetDC (hwnd) ;

SelectObject (hdc, GetStockObject (WHITE_PEN)) ;

DrawBezier (hdc, apt) ;



if (wParam & MK_LBUTTON)

{

apt[1].x = LOWORD (lParam) ;

apt[1].y = HIWORD (lParam) ;

}



if (wParam & MK_RBUTTON)

{

apt[2].x = LOWORD (lParam) ;

apt[2].y = HIWORD (lParam) ;

}



SelectObject (hdc, GetStockObject (BLACK_PEN)) ;

DrawBezier (hdc, apt) ;

ReleaseDC (hwnd, hdc) ;

}

return 0 ;

case WM_PAINT:

InvalidateRect (hwnd, NULL, TRUE) ;



hdc = BeginPaint (hwnd, &ps) ;



DrawBezier (hdc, apt) ;



EndPaint (hwnd, &ps) ;

return 0 ;



case WM_DESTROY:

PostQuitMessage (0) ;

return 0 ;

}

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

}
...全文
评论 11
收藏 已收藏
分享
返回顶部
zhangbinnpu
VC/MFC 16,550 成员 421,606 内容