パスの設定について

[戻る]
apear 2007/01/19(金) 16:52:47
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 2007/01/19(金) 16:57:58
>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 2007/01/19(金) 17:05:21
> 2番目の、MoveToEx()〜LineTo()
> の後CloseFigure()、を指定しなくてもいいんでしょうか?

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

apear 2007/01/19(金) 19:35:01
[[解決]]
回答ありがとうございます!
>staticには深い意味があったんですね。
くわしい解説どうもでした。

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

古いスレッドには追加発言できません。