喫茶XRAYトップページ

[スレッド全体
]

[10213] ShellExecute等返信 削除
2016/7/22 (金) 17:04:02 Mr.XRAY
[ShellExecute等]
http://www.freeml.com/delphi-users/4477/latest

これもコードが変.
良い子の皆さんは,コードは必ずコピペしてね.
えっ !? お前もな ! ハイ,肝に銘じて...

>Form1.Top+Form1.Height と Form2.Top の値が同じでも
>4ドットの空きができてしまいます。


これは,以下の現象ですね.多分.

[01_Vista 以降の拡張フレームのウィンドウ ]
http://mrxray.on.coocan.jp/Delphi/plSamples/368_ScreenCaptureTest.htm#01

動作確認は,Windows 10(1511 ビルド 10586) + Delphi XE(UP1) Pro


//-------------------------------------------------------------------------
//  Windows Vista以降では,フォームのフレームの仕様が拡張されている
//  これを考慮したウィンドウのTRect構造体の値を取得
//  usesにDWMAPIが必要
//-------------------------------------------------------------------------
function GetWindowRectForVista(hWindow: HWND): TRect;
var
  LRect : TRect;
begin
  //Windows Vista以降は拡張フレーム
  if CheckWin32Version(6, 0) then begin
    //拡張したウィンドウのフレームのTRect構造体の値を取得
    DwmGetWindowAttribute(hWindow,
                          DWMWA_EXTENDED_FRAME_BOUNDS,
                          @LRect,
                          SizeOf(TRect));
  end else begin
    GetWindowRect(hWindow, LRect);
  end;
  Result := LRect;
end;

//-------------------------------------------------------------------------
//  Form1のすぐ下にForm2を表示
//  GetWindowRect関数で取得する場合と同じ結果になる
//-------------------------------------------------------------------------
procedure TForm1.Button1Click(Sender: TObject);
begin
  Form2.Left := Self.Left;
  Form2.Top  := Self.Top + Self.Height;
  Form2.Show;
end;

//-------------------------------------------------------------------------
//  Form1のすぐ下にForm2を表示
//  Windows Vista 以降のフレームに対応したウィンドウの高さを取得して処理
//-------------------------------------------------------------------------
procedure TForm1.Button2Click(Sender: TObject);
var
  LRect : TRect;
begin
  LRect := GetWindowRectForVista(Form1.Handle);
  Form2.Left := Self.Left;
  Form2.Top  := Self.Top + (LRect.Bottom - LRect.Top);
  Form2.Show;
end;


※ 私の環境では「空き」は 7 ドットです (ML の質問者の環境では 4 ドット)


[10214] ふる〜い Delphiの方への参考返信 削除
2016/7/22 (金) 17:09:34 Mr.XRAY
> [01_Vista 以降の拡張フレームのウィンドウ ]
> http://mrxray.on.coocan.jp/Delphi/plSamples/368_ScreenCaptureTest.htm#01


DwmGetWindowAttribute が実装されていないふる〜い Delphi の方への参考

function DwmGetWindowAttribute(hwnd: HWND; dwAttribute: DWORD;
  pvAttribute: Pointer; cbAttribute: DWORD): HResult; stdcall;

  DWMWA_EXTENDED_FRAME_BOUNDS = 9;


TForm の Width, Height が,相当する値を返してくれればいいと思った方,
それでは個人的に困るんです.
TForm.Width, TForm.Height の値を使用して,フォーム内のコントロールの配置
をしているのがあるんです !!
そういうこをしてもらうと Windows のバージョンで配置が変わってしまって,
困るんです !!


[10221] Re:ふる〜い Delphiの方への参考返信 削除
2016/7/23 (土) 18:57:12 Mr.XRAY
> function DwmGetWindowAttribute(hwnd: HWND; dwAttribute: DWORD;
>   pvAttribute: Pointer; cbAttribute: DWORD): HResult; stdcall;
>
>   DWMWA_EXTENDED_FRAME_BOUNDS = 9;


「delphi DwmGetWindowAttribute」でググったら 3 番目にありました.

http://www.delphipraxis.net/159936-form-mit-bssingle-unter-aero-zu-gross.html

関数のところだけコピペして動作確認してみました.
後は前のテストコードと同じです.
動作確認は Windows 10(1511 ビルド 10586) 64 bit + Delphi 7 Pro
Form1 と Form2 の間に隙間があるように見えますが,隙間ではありません.
Windows 10 ではウィンドウのフレームが青いのです.それです.

追加したコードです.

const
  DWMWA_EXTENDED_FRAME_BOUNDS = 9;

function DwmGetWindowAttribute(hwnd: HWND; dwAttribute: DWORD; pvAttribute: Pointer; cbAttribute: DWORD): HResult; stdcall;
  external 'dwmapi.dll';



[10224] Re2:ふる〜い Delphiの方への参考返信 削除
2016/7/23 (土) 22:23:16 Mr.XRAY
> 動作確認は Windows 10(1511 ビルド 10586) 64 bit + Delphi 7 Pro

というわけで,Delphi 3 でも EXE を作成して確認してみました.



[▼次のスレッド]
INCM/CMT
Cyclamen v3.82