2009-11-17 95 views
9

Ho creato una finestra con createwindow() api utilizzando VS2005 in C++ su Windows VistaCome disegnare un'immagine su una finestra?

Il mio requisito è quello di disegnare un'immagine (di qualsiasi formato) su quella finestra. Non sto usando alcun MFC in questa applicazione.

Please help me with some snippet di codice.

+0

È quando fai clic sul piccolo segno di spunta accanto alla risposta che ti piace di più;) – mpen

+1

grazie mark, l'ho fatto alla risposta qui sotto. –

risposta

25

non è esattamente sicuro qual è il tuo problema: disegna una bitmap sul modulo, o ti piacerebbe sapere come lavorare con vari formati di immagine, o entrambi. In ogni modo qui di seguito è un esempio di come è possibile caricare una bitmap e disegnare sul modulo:

HBITMAP hBitmap = NULL; 

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) 
{ 
    int wmId, wmEvent; 

    switch (message) 
    { 
<...> 

    case WM_CREATE: 
     hBitmap = (HBITMAP)LoadImage(hInst, L"c:\\test.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); 
     break; 
    case WM_PAINT: 
     PAINTSTRUCT  ps; 
     HDC    hdc; 
     BITMAP   bitmap; 
     HDC    hdcMem; 
     HGDIOBJ   oldBitmap; 

     hdc = BeginPaint(hWnd, &ps); 

     hdcMem = CreateCompatibleDC(hdc); 
     oldBitmap = SelectObject(hdcMem, hBitmap); 

     GetObject(hBitmap, sizeof(bitmap), &bitmap); 
     BitBlt(hdc, 0, 0, bitmap.bmWidth, bitmap.bmHeight, hdcMem, 0, 0, SRCCOPY); 

     SelectObject(hdcMem, oldBitmap); 
     DeleteDC(hdcMem); 

     EndPaint(hWnd, &ps); 
     break; 
    case WM_DESTROY: 
     DeleteObject(hBitmap); 
     PostQuitMessage(0); 
     break; 
    default: 
     return DefWindowProc(hWnd, message, wParam, lParam); 
    } 
    return 0; 
} 

LoadImage carica un'icona, cursore, cursori animati, o bitmap. Dettagli here

Per lavorare con vari formati di immagini è possibile utilizzare Windows Imaging Component (vedi IWICBitmapDecoder) o il codice da qui Loading JPEG and GIF pictures o strumenti 3rd party come FreeImage o LeadTools

speranza che questo aiuti, riguarda

+0

Ciao Serge, ha risolto il mio problema di disegnare l'immagine sulla finestra. grazie per l'aiuto. ma siccome questo richiede solo file bmp, cur e ico, ho bisogno di lavorare su convertendo png in bmp e poi passerò quel bmp a questa funzione –

+0

chiunque può guidarmi nel mettere immagine png sulla finestra senza usare alcun MFC –

+2

Se Posso salvare qualcuno a pochi minuti di ricerca in giro, ho provato a utilizzare questa risposta ma non ha funzionato. Dopo un po 'di tentativi ho provato a cambiare la sizeof (bitmap) in sizeof (BITMAP) e il codice ha funzionato. Utilizzo Visual Studio 2015 su Windows 10. Ecco la linea completa: GetObject (hBitmap, sizeof (BITMAP) e bitmap); –

2
void LoadScreen(HWND hWnd) { 
    RECT rect; 
    HDC hdc = GetDC(hWnd); 
    HBRUSH brush = CreatePatternBrush((HBITMAP)LoadImage(NULL, L"file.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE)); 
    GetWindowRect(hWnd, &rect); 
    FillRect(hdc, &rect, brush); 
    DeleteObject(brush); 
    ReleaseDC(hWnd, hdc); 
} 
+1

E l'HDC trapelato che non è mai stato rilasciato all'uscita dalla funzione? Regole GDI di Windows 101: se si ottiene, quindi rilasciarlo; se lo crei, quindi cancellalo. Lo hai fatto correttamente con il pennello (Crea/Elimina), ma non è riuscito a farlo con il tuo client DC (Scarica/Rilascio). – WhozCraig

+0

Ah, grazie :) l'ho risolto. Ho appena aggiunto una riga prima di chiudere la parentesi graffa. ReleaseDC (hWnd, hdc); –

Problemi correlati