2015-10-09 2 views
0

Я изучаю программирование окон API. Однако я застрял в загрузке изображения и показе в окне.window programming API - LoadImage

#include <windows.h> 
#include <stdio.h> 

#define wname "mywin" 

LRESULT CALLBACK WndProc(HWND h,UINT im,WPARAM wp,LPARAM lp); 

int APIENTRY WinMain(HINSTANCE his, HINSTANCE prev,LPSTR cmd, int cshow) 
{   

    WNDCLASS wc; 

    wc.cbClsExtra=0; 
    wc.cbWndExtra=0; 
    wc.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH); 
    wc.hCursor=LoadCursor(NULL,IDC_ARROW); 
    wc.hIcon=LoadIcon(NULL,IDI_APPLICATION); 
    wc.lpszMenuName=NULL; 
    wc.style=CS_HREDRAW | CS_VREDRAW; 

    wc.hInstance = his;     
    wc.lpszClassName = wname;   
    wc.lpfnWndProc = (WNDPROC)WndProc;  

    RegisterClass(&wc); 

    HWND h = CreateWindow(wname, wname, WS_OVERLAPPEDWINDOW, 
     CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, 
     NULL, (HMENU) NULL, his, NULL); 

    ShowWindow(h, cshow); 

    MSG Message;  
    while(GetMessage(&Message,0,0,0)) 
    { 
     TranslateMessage(&Message); 
     DispatchMessage(&Message); 
    } 

} 

LRESULT CALLBACK WndProc(HWND h, UINT im, WPARAM wp, LPARAM lp) 
{ 
    HBITMAP static hbm; 
    HDC static mdc; 
    BITMAP static bm; 

    switch(im) 
    { 
     case WM_CREATE: 
     {   
      hbm = (HBITMAP) LoadImage(NULL, "../img/1.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); 
      GetObject(hbm, sizeof(bm), &bm); 

      if(!hbm) 
      { 
       MessageBox(h, "Error loading bitmap", "msg", MB_OK); 
      } 

      break;  
     } 

     case WM_PAINT: 
     { 
      HDC hdc = GetDC(h); 
      mdc = CreateCompatibleDC(hdc);  
      SelectObject(mdc, hbm); 

      BitBlt(hdc, 0, 0, bm.bmWidth, bm.bmHeight, mdc, 0, 0, SRCCOPY); 

      break;   
     } 
} 

Я пробовал этот код. Ошибка грамматика отсутствует, но результат является более странным. Изображение появляется, но без окна, и программа остановлена. Я думаю, что проблема находится на части WM_CREATE в 'LRESULT CALLBACK WndProc', но не может точно определить, что не так. ПОМОГИТЕ!!! (WinMain в порядке, здесь нет проблем)

+0

Похоже, вы удалили важную часть программы. Покажите [mcve], пожалуйста. –

+0

Поскольку это так распространено, я не буду публиковать код, просто укажу на то место, где он может быть найден: https://support.microsoft.com/en-us/kb/158898 – KevinDTimm

ответ

1

Кажется, у вас нет значения возврата для WndProc и, вероятно, сообщения Win32 не обрабатываются по умолчанию.

(после case WM_PAINT):

case WM_DESTROY: 
     PostQuitMessage(0); 
     break; 

    default: 
     return DefWindowProc(hWnd, message, wParam, lParam); 
    } 
    return 0; 
} 
+0

О, моя ошибка! Благодаря!! Я решил: D –