2014-02-10 4 views
1

Позвольте мне начать с того, что я очень новой для приложений MFC, поэтому, пожалуйста, медведь со мной ...Как изменить изображение в окне MFC приложения

Я хотел бы создать окно с изображением (скажем, зеленый свет). При необходимости я хочу, чтобы приложение меняло изображение (на желтый или красный свет). У меня есть код, который будет создавать окно и отобразить изображение (зеленый свет), но это не будет обновлять изображение (если я == 15 или я == 50)

#include "resource.h" 

using namespace std; 

const char g_szClassName[] = "myWindowClass"; 

HBITMAP Light = NULL; 

// Step 4: the Window Procedure 
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) 
{ 
    switch (msg) 
    { 
    case WM_PAINT: 
     { 
      BITMAP bm; 
      PAINTSTRUCT ps; 

      HDC hdc = BeginPaint(hwnd, &ps); 

      HDC hdcMem = CreateCompatibleDC(hdc); 
      HBITMAP hbmOld = (HBITMAP)SelectObject(hdcMem, Light); 

      GetObject(Light, sizeof(bm), &bm); 

      BitBlt(hdc, 20, 180, bm.bmWidth, bm.bmHeight, hdcMem, 0, 0, SRCCOPY); 

      SelectObject(hdcMem, hbmOld); 
      DeleteDC(hdcMem); 

      EndPaint(hwnd, &ps); 
     } 
    case WM_CREATE: 
     { 
      Light = LoadBitmap(GetModuleHandle(NULL), MAKEINTRESOURCE(IDB_BITMAP1)); 
     } 
     break; 
    case WM_COMMAND: 
     switch (LOWORD(wParam)) 
     { 

     } 
     break; 
    case WM_CLOSE: 
     DestroyWindow(hwnd); 
     break; 
    case WM_DESTROY: 
    { 
     DeleteObject(Light); 
     PostQuitMessage(0); 
    } 
     break; 
    default: 
     return DefWindowProc(hwnd, msg, wParam, lParam); 
    } 
    return 0; 
} 

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, 
    LPSTR lpCmdLine, int nCmdShow) 
{ 
    WNDCLASSEX wc; 
    HWND hwnd; 
    MSG Msg; 
    int eventCode; 

    int i = 0; 

    wc.cbSize = sizeof(WNDCLASSEX); 
    wc.style = 0; 
    wc.lpfnWndProc = WndProc; 
    wc.cbClsExtra = 0; 
    wc.cbWndExtra = 0; 
    wc.hInstance = hInstance; 
    wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); 
    wc.hCursor = LoadCursor(NULL, IDC_ARROW); 
    wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); 
    wc.lpszMenuName = NULL; 
    wc.lpszClassName = (LPCSTR)g_szClassName; 
    wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION); 

    if (!RegisterClassEx(&wc)) 
    { 
     MessageBox(NULL, (LPCSTR)"Window Registration Failed!", (LPCSTR)"Error!", 
      MB_ICONEXCLAMATION | MB_OK); 
     return 0; 
    } 

    // Step 2: Creating the Window 
    hwnd = CreateWindowEx(
     WS_EX_CLIENTEDGE, 
     (LPCSTR)g_szClassName, 
     (LPCSTR)"Test Picture", 
     WS_OVERLAPPEDWINDOW, 
     CW_USEDEFAULT, CW_USEDEFAULT, 420, 280, 
     NULL, NULL, hInstance, NULL); 

    if (hwnd == NULL) 
    { 
     MessageBox(NULL, (LPCSTR)"Window Creation Failed!", (LPCSTR)"Error!", 
      MB_ICONEXCLAMATION | MB_OK); 
     return 0; 
    } 

    ShowWindow(hwnd, nCmdShow); 
    UpdateWindow(hwnd); 

    // Step 3: The Message Loop 
    while (GetMessage(&Msg, NULL, 0, 0) > 0) 
    { 
     TranslateMessage(&Msg); 
     DispatchMessage(&Msg); 

     if (i == 15) 
     { 
      Light = LoadBitmap(GetModuleHandle(NULL), MAKEINTRESOURCE(IDB_BITMAP3)); 
      UpdateWindow(hwnd); 
     } 
     else if (i == 50) 
     { 
      Light = LoadBitmap(GetModuleHandle(NULL), MAKEINTRESOURCE(IDB_BITMAP2)); 
      UpdateWindow(hwnd); 
     } 
     i++; 
    } 

    return Msg.wParam; 
} 

Я думал, что я мог бы сделать

Light = LoadBitmap(GetModuleHandle(NULL), MAKEINTRESOURCE(IDB_BITMAP3)); 
UpdateWindow(hwnd); 

обновить снимок окна, но я был неправ :(... что я мог бы использовать, чтобы изменить имидж?

+0

Вы установили точки останова и выполнили код? Вы проверяли коды возврата из вызовов API? – rrirower

+0

Я не вижу MFC здесь, просто материал Windows API. MFC * может сделать это проще (CTimer и т. Д.). – crashmstr

ответ

2

Вы должны вызвать InvalidateRect вызвать перерисовку. UpdateWindow ничего не делает если недопустимая область окна пуста.

Смежные вопросы