如何他一个位图做为窗体的背景啊
好象是响应 WM ERASEBKGND
具体如何做

解决方案 »

  1.   

    看程序段: 
    BOOL C**View::OnEraseBkgnd(CDC* pDC) 

       // 设置所要求背景色的刷子 
       CBrush backBrush(RGB(255, 128, 128)); //把这里的颜色刷子换为你的位图刷子
       // 保存旧刷子 
       CBrush* pOldBrush = pDC->SelectObject(&backBrush); 
       CRect rect; 
       pDC->GetClipBox(&rect);   // 擦除所需的区域 
       pDC->PatBlt(rect.left, rect.top, rect.Width(), rect.Height(), PATCOPY); 
       pDC->SelectObject(pOldBrush); 
       return TRUE; 
    }
      

  2.   

    //把这里的颜色刷子换为你的位图刷子
    CBrush brush;
    CBitmap bmp;
    bmp.LoadBitmap(ID_BITMAP);//ID_BITMAP是你的位图资源
    brush.CreatePatternBrush(&bmp);
    bmp.DeleteObject();
      

  3.   

    哦,把你的CBrush定义为窗口的类成员变量,不要在函数体里定义
      

  4.   

    导入一个位图标识为IDB_BK
    定义两个全局变量 
    HBITMAP bmp;
    HBRUSH brush;LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    int wmId, wmEvent;
    PAINTSTRUCT ps;
    HDC hdc;
    HBRUSH org;
    TCHAR szHello[MAX_LOADSTRING];
    LoadString(hInst, IDS_HELLO, szHello, MAX_LOADSTRING); switch (message) 
    {
    case WM_COMMAND:
    wmId    = LOWORD(wParam); 
    wmEvent = HIWORD(wParam); 
    // Parse the menu selections:
    switch (wmId)
    {
    case IDM_ABOUT:
       DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About);
       break;
    case IDM_EXIT:
       DestroyWindow(hWnd);
       break;
    default:
       return DefWindowProc(hWnd, message, wParam, lParam);
    }
    break;
    case WM_PAINT:
    hdc = BeginPaint(hWnd, &ps);
    // TODO: Add any drawing code here...
    RECT rt;
    GetClientRect(hWnd, &rt);
    DrawText(hdc, szHello, strlen(szHello), &rt, DT_CENTER);
    EndPaint(hWnd, &ps);
    break;
    case WM_ERASEBKGND:
    //memdc = CreateCompatibleDC((HDC)wParam);
    hdc = (HDC)wParam;
    org = (HBRUSH)SelectObject(hdc,brush);

    GetClientRect(hWnd,&rt);
    PatBlt(hdc,rt.left,rt.top,rt.right - rt.left,rt.bottom - rt.top,PATCOPY); SelectObject(hdc,org);
    return 0;
    case WM_CREATE:
    bmp = LoadBitmap(GetModuleHandle(NULL),MAKEINTRESOURCE(IDB_BK));
    brush = CreatePatternBrush(bmp);
    break;
    case WM_DESTROY:
    DeleteObject(brush);
    DeleteObject(bmp);
    PostQuitMessage(0);
    break;
    default:
    return DefWindowProc(hWnd, message, wParam, lParam);
       }
       return 0;
    }
      

  5.   

    在OnPaint里面也可以画。
    可以参考:
    CPaintDC dc(this);
            CRect rect;
            GetClientRect(&rect);//得到窗体的大小
            CDC dcMem; 
            dcMem.CreateCompatibleDC(&dc); 
            CBitmap bmpBackground;
            bmpBackground.LoadBitmap(IDB_BITMAPBACKGROUND);//加载背景图片
            BITMAP bitMap;
            bmpBackground.GetBitmap(&bitMap);
            CBitmap *pbmpOld=dcMem.SelectObject(&bmpBackground);
            dc.StretchBlt(0,0,rect.Width(),rect.Height(),&dcMem,0,0,bitMap.bmWidth,bitMap.bmHeight,SRCCOPY);//画窗体文章名称:仿制金山毒霸专杀工具界面文章地址:http://www.vckbase.com/document/viewdoc/?id=491
      

  6.   

    参考这里的,很详细
    http://community.csdn.net/Expert/topic/3151/3151136.xml?temp=.3077509
      

  7.   

    Dialog背景图象在CODEGURU看到一个MDI CLIENT以位图为背景的例子,
    受到启发,在DIALOG中相似地模仿了以下,效果很好。
    主要要点是处理背景擦除消息时在DIALOG CLIENT区域画
    位图,代码如下:
    BOOL CBmpbgDlg::OnEraseBkgnd(CDC* pDC)
    {
    CRect rect;
    GetClientRect(&rect); 
    BITMAP bm;
    CDC dcMem;
    m_pBmp->GetObject(sizeof(BITMAP),(LPVOID)&bm);
    dcMem.CreateCompatibleDC(NULL);
    CBitmap* pOldBitmap = dcMem.SelectObject(m_pBmp);
    for (register int nX=0;nXBitBlt(nX,nY,bm.bmWidth,bm.bmHeight,&dcMem,0,0,SRCCOPY);
    dcMem.SelectObject(pOldBitmap); 
    return TRUE;
      

  8.   

    //Erase dialog background and draw bitmap background
    BOOL CWwwDlg::OnEraseBkgnd(CDC* pDC)
    {
    CDC MemDC;
    CBitmap bitmap;
    //From resources by load bitmap
    if(!bitmap.LoadBitmap(IDB_BITMAP1))
    return FALSE;
    MemDC.CreateCompatibleDC(pDC);
    CBitmap* pOldbit = MemDC.SelectObject(&bitmap);
    CRect rect;
    GetClientRect(&rect);
    pDC->BitBlt(0,0,rect.Width(),rect.Height(),&MemDC,0,0,SRCCOPY);
    MemDC.SelectObject(pOldbit); return TRUE;
    }//ON_WM_ERASEBKGND这个消息涵数ClassWizard是不提供的要手工添加进去.
    //函数原型:afx_msg BOOL OnEraseBkgnd(CDC* pDC);