2013年8月7日水曜日

Windows API リサイズ&移動が可能な
枠なしウィンドウを作成する。(その①)

その②
その③

取りあえずここでは枠なしウィンドウを作成してみます。
リサイズは「その②」「その③」で扱います。

枠なしウィンドウ、若しくはタイトルバーの無いウィンドウを作ろうと思います。
まずスケルトンプログラムを
http://www.wgag.net/winapi/0012.html
から拝借して、骨格を完成させます。
次に模範となるプログラムを探します。
http://d.hatena.ne.jp/satosystems/20100108/1262947730
がいいですね。透過処理などを施していますが参考になりました。
最後にちゃんと調べます。少し違いますが、
http://ameblo.jp/kazukiokumura/entry-10483325989.html
が参考になりますね。
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
ここのスケルトンプルグラム、一部間違っており、
34行目は「hInst, NULL);」ではなく「hPrevInstance, NULL);」です。
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
一番下のリンクより、
どうやら WS_VISIBLE でウィンドウを可視状態に、 WS_POPUP でタイトルバーとウィンドウの境界を非表示にするようです。
様は、上記のスケルトンプログラムの
HWND hWnd = CreateWindow(
                szWndClass, _T("Title"),
                WS_OVERLAPPEDWINDOW,
                CW_USEDEFAULT, CW_USEDEFAULT,
                CW_USEDEFAULT, CW_USEDEFAULT,
                NULL, NULL,
                hInst, NULL);
の部分を
HWND hWnd = CreateWindow(
                szWndClass, _T("Title"),
                WS_POPUP | WS_VISIBLE,//←ココ!!!!
                0, 0,
                0, 0,
                NULL, NULL,
                hPrevInstance, NULL);

注:
WS_POPUP:は、ウィンドウが枠やタイトルバーを持たないクライアント領域だけで構成されるホップアップウィンドウである事を意味します。
WS_VISIBLE:はウィンドウが作成された時点で可視化する事を意味します。これを設定しない場合「ShowWindow(hWnd, nCmdShow);」を実行するまでウィンドウは可視化されません。
(今回は取りあえず意味も無く両方とも入れています。)

とすれば良いのだろうと思ったのですが、実行してみるとウィンドウが消えてしまいます。
(マウスでドラックしてラインが出るかどうかを見れば分かるのですが、)
見えていないのではなく、存在していないようです。
そこで、二番目のリンクのサンプルと比較してみると、この処理の後に
MoveWindow(hWnd, 100, 100, 200, 200, TRUE);
と実行されている事が分かりました。
(一ドット(あるいは0ドット)しか表示されていない)ウィンドウの表示を広げていると考えると納得できます。
そこで以下のように変更しました。
HWND hWnd = CreateWindow(
                szWndClass, _T("Title"),
                WS_POPUP | WS_VISIBLE,
                0, 0,
                0, 0,
                NULL, NULL,
                hPrevInstance, NULL);

 MoveWindow(hWnd, 100, 100, 200, 200, TRUE);
CW_USEDEFAULTの部分を全て0にしていますが、動作上は結局サイズが上書きされる事になるので関係ありません。(ただ、関係ないなら書かない方がコードが綺麗だと思う……。)
これで見事表示されるのですが、残念ながら私のデスクトップは背景が真っ白なので確認が困難です。
そこで、
    wc.hbrBackground = (HBRUSH) (COLOR_WINDOW + 1);

    wc.hbrBackground = (HBRUSH)BLACK_BRUSH;
と変更します。



ブログに掲載する関係でtabを半角スペース8個に置き換えています。
tabのままがいい方は以下のリンクからダウンロードしてください。
ダウンロード



全体としてのコードは以下のようになりました。

以下の灰色の四角が今回作ったウィンドウです。

0 件のコメント:

コメントを投稿