2

他のアプリケーションが最大化されている場合でも、特定のモニターの任意のエッジに沿って常に表示される「ダッシュボード」アプリケーションを構築しています。必ずしも「常に上」にある必要はありませんが(必要ですが)、Windowsタスクバーのように、自分のデスクトップツールバーとして画面の一部にする必要があります。アプリケーションが最大化されている場合でも、ウィンドウはこの領域内にあるため、このウィンドウは常に表示されます(デスクトップ領域は小さくなります)。

アプリケーションのメインフォームをこのように画面の端に揃えるにはどうすればよいですか?

PS-画面の解像度の変更など、余分な処理のすべてに答える必要はありません...そもそも「画面の一部」として配置する方法を知っている必要があります。

4

2 に答える 2

7

Windowsタスクバーが内部で使用するアプリケーションデスクトップツールバーを探しています。これには、特定のスタイルのウィンドウを作成し、正しく設定してから、を使用してウィンドウと通信することが含まれSHAppBarMessageます。

かなり複雑になる可能性がありますが、ソースで利用できる無料のコンポーネントがいくつかあり(1つはTorryに、もう1つはDelphiPagesにあります)、基本的なシェルを使用して開始できます。

2番目のリンクのユニットの例(リンクのテキストによると、ソース付きのフリーウェアです-アプリケーションアイコンとファイルAppBar.pasから読み取られた説明が付いたボタンを備えたアプリランチャータスクバーを作成するために使用しました):.lnk

type
  TAppBarMessage = (abmNew, abmRemove, abmQueryPos, abmSetPos, abmGetState, 
                    abmGetTaskBarPos, abmActivate, abmGetAutoHideBar, 
                    abmSetAutoHideBar, abmWindowPosChanged);

  TAppBarEdge = (abeLeft, abeTop, abeRight, abeBottom, abeUnknown, abeFloat);

...

function TAppBar.AppBarMessage(abMessage: TAppBarMessage; 
  abEdge: TAppBarEdge; lParam: LPARAM; bRect: Boolean; var rc: TRect): UINT;
var
  abd: TAppBarData;
begin
  // Initialize an APPBARDATA structure
  abd.cbSize := sizeof(abd);
  abd.hWnd := Handle;
  abd.uCallbackMessage := WM_APPBARNOTIFY;
  abd.uEdge := Ord(abEdge);

  if bRect then
    abd.rc := rc
  else
    abd.rc := Rect(0, 0, 0, 0);

  abd.lParam := lParam;
  Result := SHAppBarMessage(Ord(abMessage), abd);

  // If the caller passed a rectangle, return the updated rectangle
  if bRect then
    rc := abd.rc;
end;
于 2013-03-26T23:45:38.330 に答える
0

他に何もない場合は、この情報を手動で判別できます。現在の解像度については、ユニット内のグローバルScreenオブジェクトを参照してください。(とのプロパティFormsを必ず確認してください。)MonitorCountMonitors

それと少しの基本的な計算の間で、モニターの端に合わせるためにフォームを設定するのはそれほど難しいことではありません。

于 2013-03-26T23:35:23.800 に答える