【C语言+SDK】工程中,如何把一副位图文件作为窗口的背景?
请做过的朋友给一个思路!开发环境:【WinXP/VC++6.0/C/SDK】

解决方案 »

  1.   

    你是说
    【C语言+API】吗?
      

  2.   

    处理WM_ERASEBKGND或直接在WM_PAINT中画.HDC hdc=GetDC(hWnd); // 如果是在WM_PAINT中, 需要PAINTSTRUCT ps; hdc=BeginPaint(hWnd, &ps);
    DrawBackGround(hdc, szFileName);
    ReleaseDC(hWnd, hdc); //如果是在WM_PAINT中, EndPaint(hWnd, &ps);
    void DrawBackGround(HWND hWnd, HDC hdc, LPCTSTR lpszFileName)
    {
    RECT rt;
    GetClientRect(hWnd, &rt);
    //**如果是 bmp文件, 
    HDC hMemDC=CreateCompatibleDC(hdc);
    HBITMAP hBitmap=(HBITMAP)LoadImage(...); 
    BIMTAP bm;
    GetObject(hBitmap, sizeof(bm), &bm);
    hBitmap=(HBITMAP)SelectObject(hdc, hBitmap);
    BitBlt(hdc, 0, 0, bm.bmWidth,bm.bmHeight, hMemDC, 0, 0, SRCCOPY);
    //缩放位图StretchBlt(hdc, 0, 0, rt.right, rt.bottom, hMemDC, 0, 0, bm.bmWidth, bm.bmHeight, SRCCOPY);
    hBitmap=(HBITMAP)SelectObject(hdc, hBitmap);
    DeleteObject(hBitmap);
    DeleteDC(hMemDC);
    //** 如果是jpg/png/gif等格式, 
    //** 可参考http://blog.csdn.net/chehw/archive/2007/11/01/1860624.aspx中的方法直接绘制
    }
    用SDK时有很多细节需要考虑, 
    1. 首先注册窗口类时wndClassEx.style是否包含了CS_HREDRAW|CS_VREDRAW:
    如果包含了该风格, 当窗口大小改变时会自动刷新窗口, 但会造成窗口闪烁. 
    我一般情况下窗口类中不包含上述style, 在处理WM_SIZE时手工重新绘制(注: 不要简单的调用InvalidateRect, 否则效果与包含CS_HREDRAW|CS_VREDRAW时的一样)
    2. 可以声明一个类成员变量m_hMemDC或全局变量g_hMemDC, 在窗口加载时提前创建内存兼容DC并将图片选入, 这样每次重绘时只要BitBlt就可以了.
    此时可以考虑在WM_PAINT中重绘背景, RECT &rc=ps.rcPaint; BitBlt(hdc, rc.left, rc.top, rc.right-rc.left, rc.bottom-rc.top, m_hMemDC, rc.left, rc.top, SRCCOPH);3. 如果需要缩放位图, WM_SIZE中创建一个相应大小的内存兼容DC, 选入m_hMemDC, 再创建一个临时内存DC, 将文件位图StretchBlt至m_hMemDC中
      

  3.   

    VC中的WIN32 APP 不行吗,初始化的时候 
    ::LoadImage(..);
    在 LRESULT CALLBACK WndProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) 中处理
    {
    // ....
        case WM_PAINT:
            hdc = BeginPaint (hWnd, &ps);
            // 显示位图
            EndPaint (hWnd, &ps);
    //...
    }
      

  4.   


    LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    int wmId, wmEvent;
    PAINTSTRUCT ps;
    HDC hdc;
        HBITMAP hbm;
    HBRUSH hbr;
    RECT   ClientRect;
    switch (message)
    {
    case WM_COMMAND:
    wmId    = LOWORD(wParam);
    wmEvent = HIWORD(wParam);
    // 分析菜单选择:
    switch (wmId)
    {
    case IDM_ABOUT:
    DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
    break;
    case IDM_EXIT:
    DestroyWindow(hWnd);
    break;
    default:
    return DefWindowProc(hWnd, message, wParam, lParam);
    }
    break;
    case WM_PAINT:
    hdc = BeginPaint(hWnd, &ps);
    // TODO: 在此添加任意绘图代码...
    EndPaint(hWnd, &ps);
    break;
    case WM_DESTROY:
    PostQuitMessage(0);
    break;
    case WM_ERASEBKGND://添加WM_ERASEBKGND消息的处理
                       //IDB_BITMAP1为添加的位图资源
     hbm=LoadBitmap(hInst,MAKEINTRESOURCE(IDB_BITMAP1));
     hdc=(HDC)wParam;
     hbr=CreatePatternBrush(hbm);
     GetClientRect(hWnd,&ClientRect);
     FillRect(hdc,&ClientRect,hbr);  
    break;
    default:
    return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
    }