[修正点]
- tdfPositionRelativeToWindow が指定された時のダイアログのセンタリング処理を見直した。(代替ダイアログ) <- Mod 38
- XP かつテーマ有効時のコマンドリンクボタンの描画処理を変更した。 <- Mod 39
説明:
Mod 38 はありていに言えば FireMonkey 対策です。意外 (?) かもしれませんが、SynTaskDialog は FireMonkey アプリケーションからも使えます…もちろん Windows 限定ですが。
uses ..., FMX.Platform.Win, Winapi.Windows, SynTaskDialog;
var Task: SynTaskDialog.TTaskDialogEx; begin with Task do begin Init; Base.Title := 'タイトル'; Base.Inst := 'インストラクション'; Base.Content := 'コンテンツ'; CommonButtons := [cbOK, cbCancel]; ButtonDef := mrCancel; DialogIcon := tiInformation; Flags := [tdfPositionRelativeToWindow, tdfAllowDialogCancellation]; if Execute(FmxHandleToHWND(Self.Handle)) = mrOk then ShowMessage('OK') else ShowMessage('Cancel'); end; end;
こんな感じで。ユニットスコープによるコンパイルエラーが出る場合にはプロジェクトオプションのユニットスコープ名に vcl を追加してください (或いはソースコードを書き換えて下さい)。
tdfPositionRelativeToWindow を使う場合には、Execute() の引数に Self.Handle ではなく、FmxHandleToHWND(Self.Handle) を渡します。従来ですと FMX フォームのウィンドウハンドルを渡しても親ウィンドウの中央に位置しませんでした。これは VCL 内の処理で親が TCustomForm (の派生) であるかを判断しているためです。この処理を変更し、本当の意味で親ウィンドウの中央に表示されるようにしました。あ、もちろんこれは代替ダイアログの話です。Vista またはそれ以降の場合には本物の TaskDialog が呼び出されますので、従来のものでも問題はありませんでした。
無責任だとは思うのですが、SynTaskDialog を FireMonkey から使って本当に副作用がないかどうかは判りませんし、動作保証もできない事をお断りしておきます。
Mod 39 はイマイチだった XP でのボタン描画 (ホバー時) を変更してみました。よっぽど変なテーマじゃない限りは大丈夫かと思われます。
|