还是这个WM_ERASEBKGND 和WM_PAINT的问题,重绘ING

眉头一皱计上心来 2011-12-10 03:35:20
之前觉得已经理解了,但怎么理论和实践就是有差距呢,
原因如下:

LRESULT CALLBACK WndProc(HWND hwnd,UINT msg,WPARAM wparam,LPARAM lparam)
{
PAINTSTRUCT ps;
switch(msg)
{
case WM_ERASEBKGND:

return true;
case WM_PAINT:
hdc=BeginPaint(hwnd,&ps);
::GetClientRect(hwnd,&rect);
hmendc=CreateCompatibleDC(hdc);

hbtm=LoadBitmap(hInst,MAKEINTRESOURCE(bit[0]));

SelectObject(hmendc,hbtm);
GetObject(hbtm,sizeof(BITMAP),&bitmap);

StretchBlt(hdc,0,0,rect.right,rect.bottom,hmendc,0,0,bitmap.bmWidth,bitmap.bmHeight,SRCCOPY);

::TextOut(hdc,100,100,"图书管理系统",strlen("图书管理系统"));
::DeleteObject(hbtm);
DeleteDC(hmendc);
EndPaint(hwnd,&ps);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd,msg,wparam,lparam);
}


return 0;
}



已知
WM_ERASEBKGND 擦出背景色
WM_PAINT绘制前景色

、、、、、、、、、、、、、、、、、、、、、、
窗口刚生成时(即调用UpdateWindows哪个函数时),触发WM_ERASEBKGND消息和WM_PAINT消息,如果没有自定义WM_ERASEBKGND则DefWindowProc()会调用注册窗口类的画刷(wnd.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);),我想在WM_PAINT贴图,代码如上,窗口刚出来时,背景是默认画刷,然后我自定义WM_ERASEBKGND,返回true,通知系统,窗口背景已经擦除,而结果是背景为透明(就是没有调用DefWindowProc()),j就是说不管擦不擦除背景,贴图都不出来,只有第二次产生WM_PAINT(点击最大最小,覆盖等),贴图才出来,这个我就不明白了,不过在WM_PAINT里TextOut文字可以出来,(是不是贴图是背景,文字是前景),还是有点晕,请详细解答
...全文
191 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
向立天 2012-01-10
  • 打赏
  • 举报
回复
您好
我是本版版主
此帖已多日无人关注
请您及时结帖
如您认为问题没有解决可按无满意结帖处理
另外本版设置了疑难问题汇总帖
并已在版面置顶
相关规定其帖子中有说明
您可以根据规定提交您帖子的链接
如您目前不想结帖只需回帖说明
我们会删除此结帖通知

见此回复三日内无回应
我们将强制结帖
相关规定详见界面界面版关于版主结帖工作的具体办法
wwmfeng 2011-12-12
  • 打赏
  • 举报
回复
WM_PAINT 第一次肯定是进入的,调试一下,看看每个参数是否正确。
schlafenhamster 2011-12-10
  • 打赏
  • 举报
回复
hdc=BeginPaint(hwnd,&ps);
::GetClientRect(hwnd,&rect);
检查:
ps.rcPaint
试试:
HDC hwindc = ::GetDC(NULL);// not hwnd;
hmendc=CreateCompatibleDC(hwindc);

15,979

社区成员

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

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