Last Updated 2004/09/14
Programming Tips Visual C++ MFC ウィンドウ  索 引 
クライアント領域を消す
2004/09/14

タイトルバーやウィンドウ枠を残してクライアント領域は空洞にさせる.
(クライアント領域にある背面のウィンドウの操作を行う)
クライアント領域が透過されている感じである.
SetWindowRgn() でリージョンを登録すれば可能である.

リージョンとは,特定の形状の領域のことを指す.(矩形とか円とか多角形とか)
リージョンを設定すればリージョンの形状をウィンドウ領域と認識する.
リージョンを取り消せば通常の矩形がウィンドウ領域と認識する.


HRGN 型の変数(グローバルなど)を用意する.
また,キャプションの高さ,ボーダーの幅高さなどを格納する変数も用意する.

ウィンドウを作成する時に,
  CY = GetSystemMetrics(SM_CYCAPTION);
  BY = GetSystemMetrics(SM_CYFRAME);
  BX = GetSystemMetrics(SM_CXFRAME);
とする.

ウィンドウのリサイズ時(ハンドラ)には,

   HRGN WRgn;

   if( Rgn != 0 ) {   
      SetWindowRgn(hWnd, 0, false);    // hWnd はウインドウハンドル
      DeleteObject(Rgn);
   }
   
   Rgn = CreateRectRgn(0, 0, W, H);    // W H はウインドウの幅高さ
   WRgn = CreateRectRgn(BX, CY + BY, W - BX, H - BY);
   CombineRgn(Rgn, Rgn, WRgn, RGN_DIFF);
   SetWindowRgn(hWnd, Rgn, true);
   DeleteObject(WRgn);

とする.

あとはウインドウ破棄の時に
    SetWindowRgn(hWnd, 0, false);
    DeleteObject(Rgn);
を実行する.


参照
前後のTips
クライアント領域を消す

DSS ProgrammingTipsCGI Ver2.02