閉じるボタン等のウィンドウ右上にあるボタン郡を除いた
キャプションバーの幅(ドラッグキャプチャーを受け付ける部分)
のみを取得したいのですが
キャプションバーについてるボタン郡の幅または
それを除いた幅は取得できるのでしょうか?
キャプションバーのボタンのサイズは
GetSystemMetrics(SM_CXSIZE));
で求められます
>キャプションバーの幅(ドラッグキャプチャーを受け付ける部分)
ですが
ボタンが表示されている場所もドラッグキャプチャーを受け付ける部分です。
すいません言葉足らずだったようです
WM_SYSCOMMANDのSC_MOVEが通知される範囲と言う意味です。
Formを持てる部分?
ボタンの数*GetSystemMetrics(SM_CXSIZE))+余白のピクセル
と言うのが成立するみたいなので最悪でもこれでいけそうです。
ありがとうございます
すいませんプラットフォームによっては成立しませんでしたとさ。。
横幅サイズから
システムアイコンや右上のボタンサイズを引けばいいのかな。
参考になるかもしれませんので
リンクを書いておきます。
めもニャンだむ:非矩形なフォーム(3)
http://blog.livedoor.jp/junki560/archives/18042687.html
2000上ではそれで大丈夫なんですけど
XPとかVistaだとクラシックスタイル限定になってしまうのです
スペース幅とかボタンの幅が違くって
自前でCaptionBar作れって事ですかね?
キャプションバーの端から1ピクセルずつ WM_NCHITTEST で調べてみるとか
>キャプションバーの端から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;
Top +5がVistaだと依存してしまいますが
OSによってHTSYSMENUやHTLEFTやHTTOPLEFT
等返されるので枠線やアイコンを考慮する事で
CaptionBarの開始位置と終了位置が
ちゃんと取得できたっポイ!ので解決とします
ありがとうございましたとさ
チェック忘れ〜
ツイート | ![]() |