パスの設定について – プログラミング – Home

通知
すべてクリア

[解決済] パスの設定について


apear
 apear
(@apear)
ゲスト
結合: 18年前
投稿: 2
Topic starter  

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);
}


引用未解決
トピックタグ
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

>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を宣言しているのがポイント)


返信引用
Kerry
 Kerry
(@Kerry)
ゲスト
結合: 20年前
投稿: 192
 

> 2番目の、MoveToEx()~LineTo()
> の後CloseFigure()、を指定しなくてもいいんでしょうか?

EndPathが自動的にパスを閉じますので問題無しです。


返信引用
apear
 apear
(@apear)
ゲスト
結合: 18年前
投稿: 2
Topic starter  

回答ありがとうございます!
>staticには深い意味があったんですね。
くわしい解説どうもでした。

>EndPathが自動的にパスを閉じますので問題無しです。
ほんとに、どうもありがとうございました!


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました