InvalidateRect(hwnd, NULL, false);有什么用???

later 2002-12-21 10:06:56
我发现用InvalidateRect(hwnd, NULL, false);和不用此函数的效果差不多啊??
高手解释一下,为什么啊?
如果我用InvalidateRect(hwnd, NULL, true);时,就会发现仅仅移动鼠标它也会不断的重绘绘图去,真是很不爽,哪位解释一下撒
...全文
742 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
NowCan 2002-12-22
  • 打赏
  • 举报
回复
其实一般是不用调用这个函数的。
向你说的移动鼠标也导致重绘,一定是你在MOUSE_MOVE里面调用了这个函数
zswzwy 2002-12-22
  • 打赏
  • 举报
回复
invalidate(false)//擦背景
invalidate(true)//不擦背景

不要放在鼠标移动里
later 2002-12-22
  • 打赏
  • 举报
回复
不用调用这个函数?
我还是不大明白,对了,我这里有一个代码,大家试试看

//====== The Following Program will be used in Computer Graphics course.==========
//============ Designed by Mr. Xiake.610004 =====================
//========================== Sept. 4, 2001 ============================

#include <windows.h>
#include <tchar.H>
#include <math.h>

#define NUM 1000 //You'd better to change it to 10, just test the effect
#define TWOPI (2 * 3.14159)
void line ( HWND hwnd , POINT ptbeg ,POINT ptend);
void floodfill4(int x,int y,COLORREF oldcolor);
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
static TCHAR szAppName[] = TEXT("Hello");
HWND hwnd ;
MSG msg;
WNDCLASS wndclass ;

wndclass.style = CS_HREDRAW | CS_VREDRAW ;
wndclass.lpfnWndProc = WndProc ; // the address of a window procedure used for all
// windows based on the class WNDCLASS
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 ;
//each window class is assigned a name, here is "Hello"

if (!RegisterClass (&wndclass))
{
MessageBox(NULL, TEXT("This program requires Windows NT!"),
szAppName, MB_ICONERROR) ;
return 0;
}
hwnd = CreateWindow(szAppName ,
// window class name which is assigned in WNDCLASS object wndclass
TEXT("The Hello Program"),
//window's caption (title name)
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, //initial x position
CW_USEDEFAULT, //initial y position
CW_USEDEFAULT, //initial x size
CW_USEDEFAULT, //initial y size
NULL,
NULL,
hInstance,
NULL);
ShowWindow(hwnd, iCmdShow);
UpdateWindow(hwnd) ;



while(GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg) ;
DispatchMessage(&msg);
}
return msg.wParam ;
}


LRESULT CALLBACK WndProc (HWND hwnd, UINT message,
WPARAM wParam, LPARAM lParam)
{
static BOOL mm,nn;
static HDC hdc ;
PAINTSTRUCT ps ;
RECT rect ;
static TCHAR str[100];

static int cxClient, cyClient ; //should be equal to cx and cy
static int min ,MouseDown, dx, dy;

COLORREF crColor;
static int i;
HBRUSH hBrush;
int top;
static POINT mouseb,moused ,ptb, ptd ,apt[2];

switch (message)
{

case WM_CREATE:
// here we can do some initialization jobs.
hdc = GetDC(hwnd); //get the client area the device context
//.... initialize device context attributes
ReleaseDC(hwnd, hdc) ;
return 0 ;

case WM_PAINT:
hdc =BeginPaint(hwnd, &ps);
GetClientRect(hwnd, &rect);

//crColor = RGB(152, 255, 255) ;
// hBrush = CreateSolidBrush(crColor);
// SelectObject (hdc, hBrush);
/*if(i=0; i<(top-1);i++)
{
MoveToEx ( hdc ,apt[i].x ,apt[i].y , NULL);
LineTo ( hdc , apt[i+1].x, apt[i+1].y);
}
if(nn)
{
MoveToEx ( hdc ,apt[0].x ,apt[0].y , NULL);
LineTo ( hdc , apt[top-1].x, apt[top-1].y);

}*/
if( nn)
{ SelectObject (hdc, GetStockObject (BLACK_BRUSH));
line ( hwnd , ptb,ptd);
}
if(mm)
{
SelectObject (hdc, GetStockObject (BLACK_BRUSH));
line ( hwnd , ptb,ptd);

}
DeleteObject(hBrush);


EndPaint(hwnd, &ps);
return 0;

case WM_SIZE:
cxClient = LOWORD(lParam) ;
cyClient = HIWORD(lParam) ;
min = cxClient ;
if (min > cyClient) min = cyClient ;
return 0 ;


return 0 ;
case WM_LBUTTONDOWN:
SetCursor(LoadCursor(NULL ,IDC_CROSS));
mm=TRUE;
//apt[top].x = LOWORD(lParam) ;
//apt[top].y = HIWORD(lParam) ;
//top++;
mouseb.x=moused.x=LOWORD (lParam);
mouseb.y=moused.y=HIWORD (lParam);
line ( hwnd , mouseb ,moused);

return 0;
case WM_MOUSEMOVE:
if(mm)
{
SetCursor(LoadCursor(NULL ,IDC_CROSS));
moused.x=LOWORD(lParam);
moused.y=HIWORD(lParam);
line ( hwnd , mouseb ,moused);
InvalidateRect (hwnd ,NULL, TRUE);
}
return 0;
case WM_LBUTTONUP:
if(mm)

{SetCursor(LoadCursor(NULL ,IDC_ARROW));

mm=false;
nn=true;
ptb=mouseb;
ptd.x=LOWORD(lParam);
ptd.y=HIWORD(lParam);
line ( hwnd , ptb ,ptd);
InvalidateRect (hwnd ,NULL, FALSE);
}
return 0 ;

case WM_KEYDOWN:
switch(wParam)
{
case VK_HOME:
break;
case VK_END:
break;
case VK_PRIOR:
MessageBox(hwnd, TEXT("PageUp key down"),TEXT("键盘"), MB_OK);
break;
case VK_NEXT:
MessageBox(hwnd, TEXT("PageDown key down"),TEXT("键盘"), MB_OK);
break ;
case VK_LEFT:
case VK_RIGHT:
case VK_UP:
case VK_DOWN:
MessageBox(hwnd, TEXT("Direction key down"),TEXT("键盘"), MB_OK);
break ;
case VK_DELETE:
MessageBox(hwnd, TEXT("Delete key down"),TEXT("键盘"), MB_OK);
break;
}
return 0;
case WM_CHAR:
switch (wParam)
{
case '\b':
MessageBox(hwnd, TEXT("Backspace key down"),TEXT("键盘"), MB_OK);
break;
case 'Q':
case 'q': //Esacpe key
SendMessage(hwnd, WM_CLOSE,0, 0);
}
return 0;

case WM_CLOSE:
if(IDYES == MessageBox(hwnd, TEXT("Do you want to exit?"),
TEXT("Exit Window Hint"),
MB_DEFBUTTON2 | MB_ICONQUESTION | MB_YESNO))
PostQuitMessage(0); //if click yes, then ready to quit the program
return 0; //else, don't quit the program

case WM_DESTROY:
PostQuitMessage(0);
return 0 ;
}
return DefWindowProc(hwnd, message, wParam, lParam);
}
void floodfill4(int x,int y,COLORREF oldcolor)
{ HDC hdc;
if( GetPixel(hdc, x, y)==oldcolor )
{SetPixel(hdc, x, y, RGB(200, 100, 100));
floodfill4(x,y+1,oldcolor);
floodfill4(x,y-1,oldcolor);
floodfill4(x-1,y,oldcolor);
floodfill4(x+1,y,oldcolor);
}
}
void line ( HWND hwnd , POINT ptbeg ,POINT ptend)
{
HDC hdc ;
hdc = GetDC ( hwnd );
SelectObject ( hdc ,GetStockObject(NULL_BRUSH));
MoveToEx ( hdc ,ptbeg.x ,ptbeg.y ,NULL);
LineTo ( hdc ,ptend.x ,ptend.y);
ReleaseDC ( hwnd ,hdc );
}
hnyyy 2002-12-21
  • 打赏
  • 举报
回复
这两个都用于声明客户区无效,当下一个WM_PAINT消息到来时发生重画。
其中InvalidateRect(hwnd, NULL, true);重画时将擦除背景。
InvalidateRect(hwnd, NULL, false);重画时不擦除背景。

仅仅移动鼠标它也会不断的重绘?
因为你在WM_MOUSEMOVE消息处理中不断声明无效导致重画。你应该在确实要画或删除些新东西时才声明该区域无效。

19,469

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧