CloseFigure()を一度しか使ってませんが、
2番目の、MoveToEx()~LineTo()
の後CloseFigure()、を指定しなくてもいいんでしょうか?
FillRgn(hdc,hrgn,(HBRUSH)GetStockObject(BLACK_BRUSH));
はなぜswitchの外に書かれているんでしょうか?
教えてください。
LRESULT CALLBACK WndProc(HWND hwnd , UINT msg , WPARAM wp , LPARAM lp) {
HDC hdc;
PAINTSTRUCT ps;
static HRGN hrgn=NULL;
switch (msg) {
case WM_DESTROY:
if(hrgn)DeleteObject(hrgn);
PostQuitMessage(0);
return 0;
case WM_PAINT:
hdc = BeginPaint(hwnd , &ps);
if(!hrgn){
BeginPath(hdc); //* パスの定義を開始する *//
MoveToEx(hdc,10,10,NULL);
LineTo(hdc,210,10);
LineTo(hdc,210,110);
CloseFigure(hdc); //* 図形をここで閉じる *//
MoveToEx(hdc,10,112,NULL);
LineTo(hdc,210,112);
LineTo(hdc,10,12);
EndPath(hdc); //* パスを終了する。 *//
hrgn=PathToRegion(hdc); //* リージョンに変換 *//
}
FillRgn(hdc,hrgn,(HBRUSH)GetStockObject(BLACK_BRUSH));
EndPaint(hwnd , &ps);
return 0;
}
return DefWindowProc(hwnd , msg , wp , lp);
}
>FillRgn(hdc,hrgn,(HBRUSH)GetStockObject(BLACK_BRUSH));
>はなぜswitchの外に書かれているんでしょうか?
こっちだけ。
別にswitchの外に書いていませんよ。
case WM_PAINT:
if (XXXXXX) {}
// ここに書いてある
return;
}
if文のブロックの外になぜかいてあるかならば、
WM_PAINTを呼ぶ毎に同じ形状のhrgnを作成する必要がないからです。
1度作成してしまえば、hrgn は != NULL の状態になるので、2回目以降の
WM_PAINTの処理では、すでに作成済みのhrgnを使うようにしているのです。
(static変数としてhrgnを宣言しているのがポイント)
> 2番目の、MoveToEx()~LineTo()
> の後CloseFigure()、を指定しなくてもいいんでしょうか?
EndPathが自動的にパスを閉じますので問題無しです。
回答ありがとうございます!
>staticには深い意味があったんですね。
くわしい解説どうもでした。
>EndPathが自動的にパスを閉じますので問題無しです。
ほんとに、どうもありがとうございました!