キャプションバーの幅

解決


モス  2008-01-08 23:03:06  No: 29220

閉じるボタン等のウィンドウ右上にあるボタン郡を除いた
キャプションバーの幅(ドラッグキャプチャーを受け付ける部分)
のみを取得したいのですが
キャプションバーについてるボタン郡の幅または
それを除いた幅は取得できるのでしょうか?


KHE00221  2008-01-08 23:34:50  No: 29221

キャプションバーのボタンのサイズは

GetSystemMetrics(SM_CXSIZE));

で求められます

>キャプションバーの幅(ドラッグキャプチャーを受け付ける部分)

ですが

ボタンが表示されている場所もドラッグキャプチャーを受け付ける部分です。


モス  2008-01-08 23:57:02  No: 29222

すいません言葉足らずだったようです
WM_SYSCOMMANDのSC_MOVEが通知される範囲と言う意味です。
Formを持てる部分?
ボタンの数*GetSystemMetrics(SM_CXSIZE))+余白のピクセル
と言うのが成立するみたいなので最悪でもこれでいけそうです。
ありがとうございます


モス  2008-01-09 00:29:46  No: 29223

すいませんプラットフォームによっては成立しませんでしたとさ。。


Fusa  2008-01-11 22:05:01  No: 29224

横幅サイズから
システムアイコンや右上のボタンサイズを引けばいいのかな。

参考になるかもしれませんので
リンクを書いておきます。

めもニャンだむ:非矩形なフォーム(3)
http://blog.livedoor.jp/junki560/archives/18042687.html


モス  2008-01-11 22:28:03  No: 29225

2000上ではそれで大丈夫なんですけど
XPとかVistaだとクラシックスタイル限定になってしまうのです
スペース幅とかボタンの幅が違くって
自前でCaptionBar作れって事ですかね?


n  2008-01-13 06:53:42  No: 29226

キャプションバーの端から1ピクセルずつ WM_NCHITTEST で調べてみるとか


みんみん  2008-01-15 08:16:49  No: 29227

>キャプションバーの端から1ピクセルずつ WM_NCHITTEST で調べてみるとか

以下のようにやってみましたが、やはりXPだと最小化ボタンの幅だけ
長くなってしまいます。
クラシックスタイルならうまくいきますが...

XPでは、

GetSystemMetrics(SM_CXSIZE))

でボタン一個分引けばちょうどいいようです。

procedure TForm1.Button1Click(Sender: TObject);
var
  i, HitCode, CapWidth: integer;
  pt: TSmallPoint;
begin
  CapWidth :=0;
  for i :=0 to Width -1 do
  begin
    pt :=SmallPoint(Left + i, Top + 5);
    HitCode :=DefWindowProc(Handle, WM_NCHITTEST, 0, integer(Pt));
    if HitCode =HTCAPTION then
      Inc(CapWidth)
    else begin
      if CapWidth <> 0 then
       Break;
    end;
  end;
  ShowMessage(IntToStr(CapWidth));
end;


モス  2008-01-17 02:30:15  No: 29228

Top +5がVistaだと依存してしまいますが
OSによってHTSYSMENUやHTLEFTやHTTOPLEFT
等返されるので枠線やアイコンを考慮する事で
CaptionBarの開始位置と終了位置が
ちゃんと取得できたっポイ!ので解決とします
ありがとうございましたとさ


モス  2008-01-17 02:31:21  No: 29229

チェック忘れ〜


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

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






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