リボンコントロールのバグ? (Vistaでカットオフが発生します)

StackOverflow https://stackoverflow.com/questions/631961

  •  08-07-2019
  •  | 
  •  

質問

リボンバーとステータスバーのみを含む単純なフォームを作成すると、カットオフになることがわかりました。ステータスバーの上に表示されるコントロールは、後で削除されました。存在するコントロールが何であれ、同じカットオフが発生します。その後、ステータスバーとアンプを削除しました。代わりにメモコントロールを配置して同じ結果を得ます。

リボンバーなし: リボンバーなし
(ソース: xrw.bc.ca

リボンバー付き: with ribbon bar
(ソース: xrw.bc.ca

これは、端から2、4、および8ピクセルを描画して説明しました。

非最大化
(ソース: xrw.bc.ca
maximized
(ソース: 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に移動する必要があるためです...私のために。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top