「Windows API/画像の操作」の版間の差分

削除された内容 追加された内容
編集の要約なし
M source->syntax
46 行
 
とにかくコードは、
<sourcesyntaxhighlight lang=c>
HBITMAP hbmp;
 
52 行
hbmp = (HBITMAP)LoadImage(NULL, TEXT("yomikomittai_gazou.bmp"), IMAGE_BITMAP, 0, 0,
LR_LOADFROMFILE | LR_CREATEDIBSECTION);
</syntaxhighlight>
</source>
 
のようになる。このような順序で、宣言することになる。上のコードでは、「yomikomittai_gazou」という名前のビットマップ画像を読み込む。
70 行
まず、表示先の画面は、通常の設定では「hdc」という名前である。
 
<sourcesyntaxhighlight lang=c>
TextOut(hdc, 10, 30, TEXT("テスト"), 3);
</syntaxhighlight>
</source>
のように、通常の設定では「hdc」という名前の画面が、ウィンドウ内の画像表示用の画面である。
 
80 行
例えば、もし画像作成用の画面の名前を hbackDC にするなら、下記のように宣言する。
 
<sourcesyntaxhighlight lang=c>
HDC hbackDC = CreateCompatibleDC(hdc);
</syntaxhighlight>
</source>
 
こうすることで、 hdc と互換性のある、画像作成用の領域が確保される。
91 行
 
そして、 hbackDC で作成した画像を表示するには、例えば
<sourcesyntaxhighlight lang=c>
BitBlt(hdc, 0, 0, 700, 500, hbackDC, 0, 0, SRCCOPY);
</syntaxhighlight>
</source>
のように、hdcに転写しなければならない。
 
105 行
==== 後片付けが必要 ====
使い終わった画像操作用ハンドルは、
<sourcesyntaxhighlight lang=c>
DeleteObject(hbmp);
</syntaxhighlight>
</source>
で削除しなければならない。(そういう仕様になっている。削除しないと、一例として、画像描画の関数ブロックを2回目以降に利用するときに、前回の画像描画で使用した画像がメモリ内に残ってたりして、画像がバグったりする。)
 
 
しかし、使用中のほかの画面や画像と関連づけてると削除できない(そういう仕様)ので、
<sourcesyntaxhighlight lang=c>
hbmp = NULL;
DeleteObject(hbmp);
</syntaxhighlight>
</source>
のように、NULLを入れてから削除すると、確実に削除できる。
 
使い終わった、画像作成用の画面を削除する場合は、DeleteDC を使う。これまた、使用中のほかのハンドルと関連づけていると削除できない(そういう仕様)ので、
 
<sourcesyntaxhighlight lang=c>
SelectObject(hbackDC, NULL);
DeleteDC(hbackDC);
</syntaxhighlight>
</source>
のように、NULLと関連づけさせてから、削除することで、確実に削除できる。
 
133 行
=== 入門 ===
単に
<sourcesyntaxhighlight lang=c>
#pragma comment(lib,"Gdiplus.lib")
#include <ole2.h>
#include <gdiplus.h>
using namespace Gdiplus;
</syntaxhighlight>
</source>
と冒頭に書くだけで、GDI+をインクルードできる。
 
144 行
なお、原理的には
 
<sourcesyntaxhighlight lang=c>
#include <ole2.h>
#include <gdiplus.h>
</syntaxhighlight>
</source>
だけでもインクルードできるが、しかし[https://docs.microsoft.com/ja-jp/windows/win32/api/gdiplusheaders/nf-gdiplusheaders-image-removepropertyitem MSDN『Image::RemovePropertyItem method』 ]にあるGDI+のサンプルコードにある命令のいくつかを使う際に、上述の <code>#pragma comment(lib,"Gdiplus.lib")</code> や <code>using namespace Gdiplus;</code> が必要になる。
 
165 行
 
::(動作確認: 2020年4月14日に、下記コードで Visual Studio 2019 にて動作することを確認ずみ)
<sourcesyntaxhighlight lang=c>
case WM_PAINT:
{
191 行
}
break;
</syntaxhighlight>
</source>
 
:※ wikiでは、なんかダミー変数側の「graphics」「image」などが青文字にハイライトされたりして、いかにも型名っぽく見えるかもしれない。だが、Visual Studio では、ここの部分は黒文字になる。
199 行
単に、下記のように、繰り返しで、
 
<sourcesyntaxhighlight lang=c>
// 画像の読み込み「image」は変数名。
Image ○○(L"test.png");
205 行
// 画像の描画。 ダミー変数 graphics を仲介して描画する必要がある.
graphics.DrawImage(&○○, 0, 0, ○○.GetWidth(), ○○.GetHeight());
</syntaxhighlight>
</source>
 
の部分を必要な画像の枚数と同じ回数だけ、繰り返せばいい。
212 行
つまり、コード例は、
 
<sourcesyntaxhighlight lang=c>
case WM_PAINT:
{
250 行
}
break;
</syntaxhighlight>
</source>
 
のようになる。
285 行
 
;winMAin側
<sourcesyntaxhighlight lang=c>
 
int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
304 行
// 以上、MSDN からの引用.
 
</syntaxhighlight>
</source>
 
 
;WM_PAINT 側
 
<sourcesyntaxhighlight lang=c>
Graphics graphics(hdc);
 
317 行
// 画像の描画。 ダミー変数 graphics を仲介して描画する必要がある.
graphics.DrawImage(&image2, 0, 0, image2.GetWidth(), image2.GetHeight());
</syntaxhighlight>
</source>