我是这样想的:
Invalidate(hWnd, NULL, TRUE) 它是先用背景颜色把原来的图擦除掉,
然后发一个WM_PAINT消息,执行WM_PAINT下面的代码.
如果是InvalidateRect(hWnd, NULL, FALSE);它将不擦除原来的图而直接
发一个WM_PAINT消息,使之执行WM_PAINT下面的代码.
可是事实好像跟我想象有出入了.
我做了一个简单的试验,在WM_PAINT里让它画一条直线,
单击鼠标左键的时候,调用InvalidateRect(hWnd,NULL, TRUE) ;
结果是当单击鼠标左键的时候,直线看不见了.
在最小化再还原的时候,又看到了.
也就是说在InvalidatRect之后并没有执行WM_PAINT里面的代码,只是简单地擦除.这是怎么回事??
它们是怎么工作的??
是不是我的理解有误?
下面是主要的代码.我用的是VC6.的Aplication工程.
switch (message)
{
case WM_PAINT :
hDC = GetDC(hWnd) ;
MoveToEx(hDC, 0, 150, NULL) ;
LineTo(hDC, 300, 150) ;
ReleaseDC(hWnd, hDC) ;
break ;
case WM_LBUTTONDOWN:
InvalidateRect(hWnd, NULL, TRUE) ;
break ;
case WM_DESTROY :
PostQuitMessage (0) ;
return 0 ;
}
Invalidate(hWnd, NULL, TRUE) 它是先用背景颜色把原来的图擦除掉,
然后发一个WM_PAINT消息,执行WM_PAINT下面的代码.
如果是InvalidateRect(hWnd, NULL, FALSE);它将不擦除原来的图而直接
发一个WM_PAINT消息,使之执行WM_PAINT下面的代码.
可是事实好像跟我想象有出入了.
我做了一个简单的试验,在WM_PAINT里让它画一条直线,
单击鼠标左键的时候,调用InvalidateRect(hWnd,NULL, TRUE) ;
结果是当单击鼠标左键的时候,直线看不见了.
在最小化再还原的时候,又看到了.
也就是说在InvalidatRect之后并没有执行WM_PAINT里面的代码,只是简单地擦除.这是怎么回事??
它们是怎么工作的??
是不是我的理解有误?
下面是主要的代码.我用的是VC6.的Aplication工程.
switch (message)
{
case WM_PAINT :
hDC = GetDC(hWnd) ;
MoveToEx(hDC, 0, 150, NULL) ;
LineTo(hDC, 300, 150) ;
ReleaseDC(hWnd, hDC) ;
break ;
case WM_LBUTTONDOWN:
InvalidateRect(hWnd, NULL, TRUE) ;
break ;
case WM_DESTROY :
PostQuitMessage (0) ;
return 0 ;
}
解决方案 »
- 请问什么图像格式同时支持索引色和透明通道。。
- 模拟鼠标单击控件的操作
- 如何让资源编辑器中的对话框成为主窗口的控件
- 高分求,现在要写个本地数据库
- 一个奇怪的关于CMenu析构的问题
- 再提一个简单问题关于Invalidate()与SendMessage(hWnd,WM_PAINT,0,0)
- 问题
- 请问用VC做数据库做报表用什么方法?
- 怎样向notepad的edit子窗口postmessage(post hook来的message),使它显示大写字母
- 各位大侠帮忙啊,关于 CListCtrl 中 CHeaderCtrl 的问题!!
- 为什么我的程序不能删除所有CListCtrl中所选的items呢?
- 请教用CFILE打开一个文本文件
hDC = GetDC(hWnd) ;
MoveToEx(hDC, 0, 150, NULL) ;
LineTo(hDC, 300, 150) ;
ReleaseDC(hWnd, hDC) ;
break ;不要用getdc,用BeginPaint和EndPaint ,其余的地方没错
第三个参数为TRUE时,在WM_PAINT时调用BeginPaint的时候擦除背景
在WM_PAINT的代码里面的应该由BeginPaint/EndPaint来得到DC,我猜可能使这个问题引起的,没有EndPaint的话,无效区域不会被清空,你试试看
但是用GetDC为什么不行呢??
是因为GetDC不能清除无效区??
还是因为在WM_PAINT时调用BeginPaint的时候擦除背景,
用GetDC获得的DC无效吗??