C言語プログラミング覚書き
ホーム
覚書き

<リージョン>

まず最初に思いついたのは、変形フォームを作ることでした。 カラー作成ソフトなので、パレットのような形にしようと思ったのですが、 結果的にパレットには見えないようです。

スライドバー、エディットボックスなど、必要なものを隙間無く載せた状態での必要最小限 のフォームの大きさを計算してみると、2つの長方形を作成し、大きな長方形から小さい長方形 を除いたあのような形になりました。実際のプログラミング方法は、ウィンドウプロシージャで WM_CREATE メッセージがきたときに、以下のような処理をします。

	
    static HRGN hrgn, hrgn1, hrgn2;

    switch (msg) {
        case WM_CREATE:

            hrgn = CreateRectRgn(0, 0, 1, 1);
            hrgn1 = CreateRectRgn(0, 0, 234, 110);
            hrgn2 = CreateRectRgn(104, 32, 234, 51);
            CombineRgn(hrgn, hrgn1, hrgn2, RGN_DIFF);
            SetWindowRgn(hWnd, hrgn, TRUE);
	

CreateRectRgn で2つの長方形を作成し、CombineRgn で組み合わせ、 SetWindowRgn でウィンドウにあてはめます。各関数のプロトタイプは以下のようになります。


    HRGN CreateRectRgn(int nLeftRect,
                       int nTopRect,
                       int nRightRect,
                       int nBottomRect);

    int CombineRgn(HRGN hrgnDest,
                   HRGN hrgnSrc1,
                   HRGN hrgnSrc2,
                   int  fnCombineMode);

    int SetWindowRgn(HWND hWnd,
                     HRGN hRgn,
                     BOOL bRedraw);

CombineRgn の fnCombineMode には組み合わせ方法として次の5つのうち どれかを指定できます。

RGN_AND 2 つのリージョンの重なり合う領域を、新しいリージョンとします。
RGN_COPY hrgnSrc1 のコピーを作成します。
RGN_DIFF hrgnSrc1 リージョンのうち、hrgnSrc2 リージョンと重なる領域を削除し、 新しいリージョンとします。
RGN_OR 両方のリージョンの合わせた領域を新しいリージョンとします。
RGN_XOR 両方のリージョンの合わせた領域から、両方のリージョンが重なり合う 領域を除いた領域を、新しいリージョンとします。


上記の通り、その差をフォームにする場合には、第4引数に RGN_DIFF を使用します。 今回私が作成したのはかなり単純なものですが、これを利用すればもっと複雑な形を フォームにすることができます。






Copyright (c) 2003-2004 HIDEKAZU KAJIURA. All Rights Reserved.