Windows VistaのC++でVS2005を使用してcreatewindow()APIを使用してウィンドウを作成しました。ウィンドウにイメージを描画する方法は?
私の要件は、そのウィンドウに画像を描画することです。 このアプリケーションではMFCを使用していません。
いくつかのコードスニペットで私を助けてください。
Windows VistaのC++でVS2005を使用してcreatewindow()APIを使用してウィンドウを作成しました。ウィンドウにイメージを描画する方法は?
私の要件は、そのウィンドウに画像を描画することです。 このアプリケーションではMFCを使用していません。
いくつかのコードスニペットで私を助けてください。
問題が何であるか正確にはわからない:フォームにビットマップを描画するか、さまざまな画像形式、またはその両方で作業する方法を知りたい。とにかく下のビットマップをロードし、フォーム上でそれを描くことができる方法の例です:
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
詳細
こんにちはSerge、 それは、ウィンドウ上に画像を描くことの私の問題を解決しました。 ご協力いただきありがとうございます。 これはbmp、cur、icoファイルだけですので、pngをbmpに変換してから、このbmpをこの関数に渡します。 –
誰でもMFCを使用せずにウィンドウ上にpng画像を置くことができます。 –
私は誰かを救うことができるいくつかの周りの検索、私はこの答えを使用してみましたが、それは動作しませんでした。ポンキングした後、sizeof(ビットマップ)をsizeof(BITMAP)に変更しようとしましたが、コードが機能しました。 Windows 10でVisual Studio 2015を使用しています。 GetObject(hBitmap、sizeof(BITMAP)、&bitmap); –
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);
}
機能の終了時に一度もリリースされなかったHDCの漏れはありますか? Windows GDIのルール101:入手したら、それをリリースします。作成する場合は削除します。あなたはあなたのブラシ(作成/削除)でこれを正しく実行しましたが、クライアントのDC(Get/Release)で失敗しました。 – WhozCraig
ああ、ありがとう:)私はそれを解決しました。中かっこを閉じる前に1行追加しました。 ReleaseDC(hWnd、hdc); –
についてあなたが一番好きな答えの横にある小さなチェックマークをクリックすると); – mpen
ありがとうございました。 私はそれを以下の答えにしました。 –