リボンコントロールのバグ? (Vistaでカットオフが発生します)
-
08-07-2019 - |
質問
リボンバーとステータスバーのみを含む単純なフォームを作成すると、カットオフになることがわかりました。ステータスバーの上に表示されるコントロールは、後で削除されました。存在するコントロールが何であれ、同じカットオフが発生します。その後、ステータスバーとアンプを削除しました。代わりにメモコントロールを配置して同じ結果を得ます。
リボンバーなし:
(ソース: xrw.bc.ca )
リボンバー付き:
(ソース: xrw.bc.ca )
これは、端から2、4、および8ピクセルを描画して説明しました。
(ソース: xrw.bc.ca )
(ソース: xrw.bc.ca )
Chris Livelyが以下で述べているように、サイズの計算に間違いがあったことは明らかです。どうすれば修正できますか?
コメントありがとうございます!
解決
以前の回答で問題を誤解しました。
この誤算問題に対する回避策があります(すぐに)思いつきました。
SC_MAXIMIZE wParamパラメーターを使用して、WM_SYSCOMMANDのカスタムメッセージハンドラーを使用できます。その後、次を使用してフォームのサイズを変更できます。
type
TForm1 = class(TForm)
// other stuff
procedure WMSyscommand(var Msg: TWMSYSCOMMAND); message WM_SYSCOMMAND;
procedure TForm1.WMSysCommand(var Msg: TWMSYSCOMMAND);
var
R: TRect;
begin
// Test for SC_MAXIMIZE. If found...
if Msg.CmdType = SC_MAXIMIZE then
begin
SystemParametersInfo(SPI_GETWORKAREA, 0, @R, 0);
Top := R.Top;
Left := R.Left;
Width := R.Right - R.Left;
Height := R.Bottom - R.Top;
Msg.Result := 0; // Message handled
end
else
DefaultHandler(Msg);
end;
上記のコード(Aero / Glassを有効にしたVista 32ビットHome Premiumでテスト済み)は正常に動作します。
他のヒント
ケン・ホワイトが提案した解決策にはいくつかの問題があります:
- 最大化ボタンはアクティブのままで、最大化されたウィンドウでサイズ変更ハンドルを使用できます
- ウィンドウを以前のサイズに戻すことができません。
だから私は以下を提案します:
// add to form object
procedure WMGetMinMaxInfo(var mmInfo : TWMGETMINMAXINFO); message WM_GETMINMAXINFO;
// implementation
procedure TfrmMain.WMGetMinMaxInfo(var mmInfo: TWMGETMINMAXINFO);
var
R: TRect;
begin
with mmInfo.MinMaxInfo^ do
begin
SystemParametersInfo(SPI_GETWORKAREA, 0, @R, 0);
ptMaxPosition.X := R.Left;
ptMaxPosition.Y := R.Top;
ptMaxSize.X := R.Right - R.Left;
ptMaxSize.Y := R.Bottom - R.Top-1;
end;
end;
理想的ではありません。デフォルトハンドラーが再アサートしないように(何らかの理由で)maxHeightを-1に調整し、ウィンドウを-8、-8に移動する必要があるためです...私のために。
所属していません StackOverflow