0

ダイアログボックス(Visual Studio 2010 Professional)のボタンコントロールでPNGをレンダリングしようとしています。いくつかの調査を行った後、私はBMPファイルに対して機能する次の方法を見つけました。

HBITMAP hBitmap = (HBITMAP) LoadImage(NULL, L"test.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);

SendMessage(GetDlgItem(hDlg, IDC_BUTTON1), BM_SETIMAGE, IMAGE_BITMAP, (LPARAM)hBitmap);

ただし、これはPNGファイルでは機能しません。さらに調査した結果、GDI+を使用してこれを行う簡単な方法があることがわかりました。

HBITMAP hBitmap;
Gdiplus::Bitmap b(L"a.png");
b.GetHBITMAP(NULL, &hBitmap);

SendMessage(GetDlgItem(hDlg, IDC_BUTTON1), BM_SETIMAGE, IMAGE_BITMAP, (LPARAM)hBitmap);

プログラムの他の場所ではGDI+を使用していませんが、この単純なタスクを実行するために、ヘッダーを含め、ライブラリにリンクして初期化する必要があります。このトラブルのすべての価値がありますか?これを行うためのより標準的な方法はありますか?

1つのボタンで複数のPNG(一部は透明)をレンダリングする予定です。

編集:HBITMAPの作成に使用している(わずかに変更された)CreateDIBSectionFromBitmapSource()関数は、次の場所にあります。

http://archive.msdn.microsoft.com/Project/Download/FileDownload.aspx?ProjectName=win7wicsamples&DownloadId=7549

4

2 に答える 2

0

ボタンコントロールでPNGを「レンダリング」するという意味で、もう少し具体的に教えてください。

ボタンに.PNG画像を貼り付けようとしている場合は、もっと簡単な方法があります。ボタンをクリックして、プロパティメニューの[外観]に移動します。[BackgroundImage]をクリックし、ローカルリソースを選択してから、画像を参照して読み込みます。終わり。

これがあなたの意図することではない場合、私は研究を提案するかもしれません

System.Drawing.ImageおよびGDI+の使用

私は実際にここに座ってGDI+を学んでいます。あらかじめご了承ください。学ぶのに1時間半かかります。

于 2012-11-16T04:55:04.977 に答える
0

GDI+ は、さまざまな形式の画像を読み取ってレンダリングするための標準的な方法です。これを行う別の方法は、PNG デコーダー コンポーネントを作成し、そこからストリームを取得して LoadImage 関数に渡すことです。これは、まさに GDI+ がバックグラウンドで行うことです。イメージ形式のエンコーダーとデコーダーは、ウィンドウ イメージング コンポーネントの一部です。

複数の画像に対してデコードとレンダリングがどのように実行されるかは、探しているものによって異なりますが、私にはわかりません。少しだけコメントさせてください。ボタンの背景画像オプションを使用して現在行っていることは、画像を一度デコードしてビットマップとして保持することです。これにより、ペイントを行う必要があるときにビットマップの準備が整い、デコードを行う必要がなくなります。これは、ボタンの背景画像の描画でも行われることです。ボタン コンポーネントは、渡されたビットマップ ハンドルを保持し、再描画する必要があるたびに同じものを描画します。Bitblt を使用して直接ディスプレイ デバイスに描画するため、ビットマップの描画のパフォーマンスについて心配する必要はないと思います。

于 2012-11-16T05:38:56.040 に答える