Formタイトルバーを消してもウィンドウ枠を残すには?

解決


めじな  2007-11-01 19:50:33  No: 28158

実行時にFormのタイトルバーを消したウィンドウが必要となり、現在以下のような方法を取っています。

・BorderStyleプロパティ = bsDialog
・FormCreate時の処理
  SetWindowLong(Self.Handle, GWL_STYLE,
                GetWindowLong(Self.Handle, GWL_STYLE) xor WS_CAPTION);

通常のフォームは、OSがXPの場合でXPスタイル(クラッシックスタイルではない、という意味です)だと青やシルバーなどのウィンドウ枠が表示されますが
上記手法を取ると枠はあるのですがXPスタイルが無効?(青枠でない)になります。
他のフォームと見た目が違う(枠線だけですが。。。)ため、可能であればタイトルバーなしウィンドウでも青枠を表示したいと考えています。

宜しくお願いします。

環境:Del2006 win32 + WindowsXP Pro SP2 です。


WM_NCPAINT  2007-11-02 00:01:51  No: 28159

ムリヤリ自前で。

procedure TForm1.WMNCPaint(var Msg: TWMNCPaint);
var
  R: TRect;
begin
  inherited;
  with TCanvas.Create do try
   Handle := GetWindowDC(Self.Handle);
   Brush.Style := bsClear;
   Pen.Mode := pmCopy;
   Pen.Color := clActiveCaption; //clBlue;
   Pen.Width := 3;
   GetWindowRect(Self.Handle, R);
   RoundRect(1, 1, R.Right-R.Left-1, R.Bottom-R.Top-1, 2, 2);
  finally
   ReleaseDC(Self.Handle, Handle);
   Free;
  end;


めじな  2007-11-02 01:54:58  No: 28160

ありがとうございます。出来ました。

描画系は今までほとんどやっていなかったので勉強になります。
あとはOSの判定やクラシックスタイルなのか、などの判定を入れていい感じにしていこうと思います。


めじな  2007-11-02 18:17:29  No: 28161

解決済みマークを付けた後ですがその後について。

今回の要件ではOSはWin2K、XPだけとなっています。
昨日、XPのクラシックスタイルで確認した所、タイトルバーが残ってしまいました。Win2Kは環境を作っていないのでまだ未確認です。
こちらはおいおい調べようと考えています。


無問題  2007-11-02 18:36:01  No: 28162

XPのクラシックスタイルでも、Win2Kでも、タイトルバーは
問題なく消えてくれるよ。


めじな  2007-11-02 23:39:03  No: 28163

やっと原因が分かりました。
FormCreate時にデバッグ用にShowMessageしていたのですが、この後にSetWindowLongでスタイル設定するとタイトルバーが表示されてしまうようです。
ShowMessageする前にSetWindowLongでスタイル設定すればタイトルバーは表示されませんでした。
いずれはなくなるメッセージダイアログですがこんな事もあるのですね。
XPスタイルだと問題ないし。。。orz


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加