はじめに
Delphi UCL (旧 UniversalCL) は Delphi 用 UWP コントロール VCL です。
モダンな見た目ですが、描画は高速です。
Delphi UCL
Delphi UCL は GitHub で公開されています。
インストール
- リポジトリをローカルに保存します。
-
DelphiUCL.groupproj
を IDE で開きます。 -
DelphiUCLPackage.bpl
を右クリックし、[インストール] を選びます。 -
DelphiUCL\Source
をライブラリパスに追加します。
使い方
既存の VCL と使い方はほぼ同じです。
Windows 11 でデモを実行する場合には、フォームの DoubleBuffered プロパティを False に変更してください。
おわりに
折角なので、Windows 11 における DoubleBuffered
プロパティの問題点について。
1. 背景描画がおかしくなるコントロールがある
コンボボックス系の背景にゴミが描画される事があります 1。
インターポーザークラスを使って置き換える事も可能ですが、TCustomComboBox から派生しているコンボボックスがあれば、そちらにも同様のインターポーザークラスを作成しなくてはなりません。
TComboBox = class(Vcl.StdCtrls.TComboBox)
procedure WMEraseBkgnd(var Message: TWmEraseBkgnd); message WM_ERASEBKGND;
end;
...
procedure TComboBox.WMEraseBkgnd(var Message: TWmEraseBkgnd);
begin
FillRect(Message.DC, ClientRect, Brush.Handle);
inherited;
end;
See also:
2. ボタン透過の一貫性
Windows 11 のボタンは恐らく半透明です。このため、ボタンの下にコントロールがあるとそれが透けて描画されます。
それはいいのですが、親コントロールの DoubleBuffered
が True の場合のみ、TButton の背景が透けなくなります。親コントロールの DoubleBuffered
が False の場合には、TButton の DoubleBuffered
を True にしても背景は透けたままです。つまり、DoubleBuffered
の状態によってボタン透過の一貫性がない事になります。
解決方法
とりあえずの解決方法は DoubleBuffered
プロパティを False にする事です。「ボタンの下にあるコントロールを透過させたくない」というのは、
- ボタンの下に不要な物を置かない
- パネルのようなコンテナの上に配置する
という対処方法しかないと思います。いずれにせよ、ソースコードがあればですが。
この問題、別に最新版の Delphi だけで起こる現象ではなく、古い Delphi でも発生するのです。実行形式ファイルしか存在しない Delphi / C++Builder アプリケーションを Windows 11 で動作させるつもりなのであれば、ゴミ描画とボタン透過のチェックを入念に行ってください。
フォームの DoubleBuffered
プロパティは False がデフォルトなので、DoubleBuffered
プロパティをフォームだけでコントロールしているのであれば、リソースエディタでフォームを書き換えて回避する事ができます 2。
この問題は 11.1 Alexandria で解決されたようです。
この問題は Windows 11 の KB5013943 で解決されたようです。
https://support.microsoft.com/en-us/topic/may-10-2022-kb5013943-os-build-22000-675-14aa767a-aa87-414e-8491-b6e845541755
See also:
- RSP-36020: DoubleBuffered Bug on Windows 11 (Quality Portal)
- Resource Hacker (angusj.com)
- Windows 11環境でフォーム上のTButtonなどのコンポーネントの色が透過する (Support Wiki)