+ -
当前位置:首页 → 问答吧 → 还是这个WM_ERASEBKGND 和WM_PAINT的问题,重绘ING

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

时间:2011-12-10

来源:互联网

之前觉得已经理解了,但怎么理论和实践就是有差距呢,
原因如下:
C/C++ code

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文字可以出来,(是不是贴图是背景,文字是前景),还是有点晕,请详细解答

作者: Lyntion   发布时间: 2011-12-10

hdc=BeginPaint(hwnd,&ps);
  ::GetClientRect(hwnd,&rect);
检查:
ps.rcPaint
试试:
HDC hwindc = ::GetDC(NULL);// not hwnd;
hmendc=CreateCompatibleDC(hwindc);

作者: schlafenhamster   发布时间: 2011-12-10

热门下载

更多