2011-04-26 30 views
1

如何在運行時在WIN32中更改窗口的背景圖像?如何更改win32中窗口的圖像?

我使用CreateWindow()創建了窗口。然後我有一個LoadImage按鈕,打開一個模型對話框(打開文件對話框)...現在我想使用此對話框返回的文件名作爲窗口的圖像。

回答

5

窗口背景沒有本地概念,您必須手動繪製圖像,通常在WM_ERASEBKGND消息中。如果您使用MFC,您可以查看這篇文章:http://www.codeproject.com/KB/graphics/picturewindow.aspx

+0

感謝Felice ....我沒有使用MFC。該程序僅在覈心WIN32 API ..... – aProgrammer 2011-04-26 12:12:39

+0

@ArtsitOf編程以及這個想法是相同的:攔截WM_ERASEBKGND – 2011-04-26 12:19:21

0

A static control可以有一個背景圖像(雖然它只限於位圖)。你可以把一個靜態的子控件放在你的窗口內(大小從邊到邊),並將其設置爲背景。

如果您想要像透明度那樣的奇妙圖像處理,您需要手動執行此操作。

1

一塊什麼CoreyStup解釋示例代碼,在窗口回調:

switch (message) 
{ 
    case WM_CREATE: 
    { 
     HBITMAP hImage = (HBITMAP)LoadImage(NULL, L"guibg.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); 
     HWND hImageView = CreateWindowEx(NULL, L"STATIC", NULL, SS_BITMAP | WS_VISIBLE | WS_CHILD, 0, 00, 500, 600, hWnd, (HMENU)IMAGE_VIEW, GetModuleHandle(NULL), NULL); 
     SendMessage(hImageView, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM)hImage); 
... 

積分也fritzone誰回答此此類似線程:How to add picture box in win32 API using visual c++

注:使用位圖的油漆產生,否則LoadImage可能會返回NULL而不會出現錯誤,並且圖像將不可見。

2

編譯下面的代碼。

在文本框中寫入文件名並按更改背景。

我使用的是mingw 4.7。

你只能使用.bmp圖像,如果你想使用其他圖像,你必須使用GdiPluse。

#include <windows.h> 

//variables 
HWND hwnd01, label01; 
HBITMAP hBitmap01 = NULL; 

//functions 
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); 



int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, 
       LPSTR lpCmdLine, int nCmdShow) 
{ 
MSG msg ; 
WNDCLASS wc = {0}; 
wc.lpszClassName = TEXT("GUI01"); 
wc.hInstance  = hInstance ; 
wc.hbrBackground = GetSysColorBrush(COLOR_3DFACE); 
wc.lpfnWndProc = WndProc ; 
wc.hCursor  = LoadCursor(0, IDC_ARROW); 


RegisterClass(&wc); 
hwnd01 = CreateWindow(wc.lpszClassName, TEXT("GUI01 Headline"), 
      WS_OVERLAPPEDWINDOW | WS_VISIBLE, 
      150, 150, 330, 150, 0, 0, hInstance, 0); 

while(GetMessage(&msg, NULL, 0, 0)) { 
TranslateMessage(&msg); 
DispatchMessage(&msg); 
} 
return (int) msg.wParam; 
} 

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) 
{ 
switch(msg) 
{ 
case WM_CREATE: 
{ 
    CreateWindow(TEXT("button"), TEXT("Change Background"), 
       WS_VISIBLE | WS_CHILD , 
       20, 50, 140, 25, 
       hwnd, (HMENU) 1, NULL, NULL); 

    CreateWindow(TEXT("button"), TEXT("Quit"), 
       WS_VISIBLE | WS_CHILD , 
       190, 50, 80, 25, 
       hwnd, (HMENU) 2, NULL, NULL); 
    label01 = CreateWindow(TEXT("Edit"), TEXT("Label"), 
       WS_VISIBLE | WS_CHILD, 
       20, 10, 280, 25, 
       hwnd, (HMENU) 3, NULL, NULL); 
    break; 
} 

    case WM_COMMAND: 
    { 
    if (LOWORD(wParam) == 1) { 
     TCHAR* string01 = new TCHAR[300]; 

     GetWindowText(label01, string01, 300); 
     hBitmap01 = (HBITMAP)LoadImage(NULL, string01, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); 

     if (hBitmap01==NULL) 
     MessageBox(NULL, "Error Loading Image.", "ERROR", MB_ICONWARNING | MB_DEFBUTTON2); 
     else 
     InvalidateRect(hwnd01, NULL, TRUE); 
    } 

    if (LOWORD(wParam) == 2) { 
      PostQuitMessage(0); 
    } 

    break; 
    } 
case WM_PAINT: 
{ 
    PAINTSTRUCT  ps01; 
    HDC    hdc01; 
    BITMAP   bitmap01; 
    HDC    hdcMem01; 
    HGDIOBJ   oldBitmap01; 

    hdc01 = BeginPaint(hwnd01, &ps01); 

    hdcMem01 = CreateCompatibleDC(hdc01); 
    oldBitmap01 = SelectObject(hdcMem01, hBitmap01); 

    GetObject(hBitmap01, sizeof(bitmap01), &bitmap01); 
    BitBlt(hdc01, 0, 0, bitmap01.bmWidth, bitmap01.bmHeight, hdcMem01, 0, 0, SRCCOPY); 

    SelectObject(hdcMem01, oldBitmap01); 
    DeleteDC(hdcMem01); 

    EndPaint(hwnd01, &ps01); 

    break; 
} 

    case WM_DESTROY: 
    { 
    PostQuitMessage(0); 
    break; 
    } 
} 
return DefWindowProc(hwnd, msg, wParam, lParam); 
}