2009-11-17 21 views
9

Windows VistaのC++でVS2005を使用してcreatewindow()APIを使用してウィンドウを作成しました。ウィンドウにイメージを描画する方法は?

私の要件は、そのウィンドウに画像を描画することです。 このアプリケーションではMFCを使用していません。

いくつかのコードスニペットで私を助けてください。

+0

についてあなたが一番好きな答えの横にある小さなチェックマークをクリックすると); – mpen

+1

ありがとうございました。 私はそれを以下の答えにしました。 –

答えて

25

問題が何であるか正確にはわからない:フォームにビットマップを描画するか、さまざまな画像形式、またはその両方で作業する方法を知りたい。とにかく下のビットマップをロードし、フォーム上でそれを描くことができる方法の例です:

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は、アイコン、カーソル、アニメーションカーソル、またはビットマップをロードします。 、あなたがここにLoading JPEG and GIF picturesまたはFreeImageまたはLeadToolsこのことができます

希望のようなサードパーティ製ツールからのWindowsイメージングコンポーネント(IWICBitmapDecoderを参照)、またはコードを使用することができる様々な画像フォーマットでの作業のためにhere

詳細

+0

こんにちはSerge、 それは、ウィンドウ上に画像を描くことの私の問題を解決しました。 ご協力いただきありがとうございます。 これはbmp、cur、icoファイルだけですので、pngをbmpに変換してから、このbmpをこの関数に渡します。 –

+0

誰でもMFCを使用せずにウィンドウ上にpng画像を置くことができます。 –

+2

私は誰かを救うことができるいくつかの周りの検索、私はこの答えを使用してみましたが、それは動作しませんでした。ポンキングした後、sizeof(ビットマップ)をsizeof(BITMAP)に変更しようとしましたが、コードが機能しました。 Windows 10でVisual Studio 2015を使用しています。 GetObject(hBitmap、sizeof(BITMAP)、&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

機能の終了時に一度もリリースされなかったHDCの漏れはありますか? Windows GDIのルール101:入手したら、それをリリースします。作成する場合は削除します。あなたはあなたのブラシ(作成/削除)でこれを正しく実行しましたが、クライアントのDC(Get/Release)で失敗しました。 – WhozCraig

+0

ああ、ありがとう:)私はそれを解決しました。中かっこを閉じる前に1行追加しました。 ReleaseDC(hWnd、hdc); –

関連する問題