標記の件、Windows10でフォームのサイズ、位置が思い通りになりません。
下記で(ディスプレイの横幅1920、拡大率?は100%です)、左右に 7dot ほど隙間ができます。
何がかわってしまったのでしょうか?
宜しくお願いします。
procedure TForm1.FormCreate(Sender: TObject);
begin
Width:= 1920;
Left:= 0;
end;
そのあとで、ボタンのクリックイベントか何かでWidth、Leftを表示させたらどのような値になっていますか?
# 相変わらずWindowsのテーマが悪さをしてる気が…
1920 と 0 になっています。
※VCLです。
FireMonkeyだとさらに変になります。(左に大きくずれてしまう)
宜しくお願いします。
これだとVCLではうまくいきます。
ご参考まで。
procedure TForm1.FormCreate(Sender: TObject);
var
W: Integer;
begin
W := Form1.Width - ClientWidth;
Left := 0 - (W div 2);
Width := 1920 + W;
end;
フォームの Widthは一番外側のサイズなので Width で指定しても装飾の分 ClientWidthは減って正常なのではないでしょうか?
ClientWidth を 画面一杯にする場合は余計な装飾が使われないフォームの種類を使えば良いかと思われます。
通りすがりさん、takeさん、返信ありがとうござます。
環境を書いていませんでした。
10.1Berlinです。
10.2Tokyoでも試しましたが状況は同じです。
わかったのは、
・スタイルなしだと、Win10では Left、Widthが思い通りにならない(一回り小さくなる)
・なにかしらスタイルありだと、Win10でも Left、Widthが思い通りになるようです。
話がかみあってないかもしれませんが
Leftを0に設定しても画面左端に行かない(Leftが0にならない)という話であれば
Windowsのスタイルが邪魔しているのでプログラム上から超えるのはちょっと厳しい
画面一杯に自分のフォームを広げて Imageとかで 1920x1080のサイズの画像を表示しようとしたら
フォームとの隙間が邪魔で全体が表示できないという話であれば枠のフチが0ピクセルのフォームの種類を使うということ
W := Form1.Width - ClientWidth; の例で
えっとForm1のスコープ内だから
W := Form1.Width - Form1.ClientWidth;
と同等だっけ?
これが0にならないってことならフォームの外側とフォームの内側を区切るフチがある
ってことなんじゃないの?
>左右に 7dot ほど隙間ができます。
Windows Vista 以降では,フォームのキャプション部分とフレームの部分は,
DWM (Desktop Window Manager) が描画を実行しています.
したがって,これは Delphi の問題というわけではありません.
実際のウィンドウの幅 (フォームの幅ではなく) は,例えば以下のようにして取得できます.
procedure TForm1.Button1Click(Sender: TObject);
var
LRect : TRect;
LWidth : Integer;
begin
//DwmXXXの使用にはusesにDWMAPIが必要
DwmGetWindowAttribute(Handle,
DWMWA_EXTENDED_FRAME_BOUNDS,
@LRect,
SizeOf(LRect));
LWidth := LRect.Right - LRect.Left;
ShowMessage(IntToStr(LWidth));
end;
ツイート | ![]() |