管理人のふたこと Tweet
「マウスのお供」で文字にアンチエイリアスを効かせる方法を模索してみる
公開日:2020/01/01
12月19日のブログと前回の記事でも書いたとおり、マウスのお供では、表示している文字にアンチエイリアス(=スクリーンフォントの縁を滑らかにする)が効かないような措置を施しています。今回は、何とか解決する方法がないものかと、策を練りたいと思います。
アンチエイリアスって何?とか、現在のバージョンのマウスのお供でアンチエイリアスを無効化している理由については、前回の記事を参照してください。
目次
【解決策1】 いったん文字描画してから、各ピクセルの色値をアルファ値と読み替えてピクセル単位の不透明度を決める
まずは、アンチエイリアスを有効にしたフォントを作成し、そのフォントで
①DrawText() APIでメモリデバイスコンテキスト上に文字を描画します。
② ①で描画したメモリデバイスコンテキスト上から、GetPixel() APIで1ピクセルずつ値を読むかなんかして、各ピクセルのRGBの値を読み取ります。
あるいは、GetDIBSection() APIをかましておいて、各ピクセルの色の値をDWORD値としてアクセスできるようにしておくのもアリか。アルファ値のチャネルを使えるようにした上でのGetDIBSection() APIを使う方法はこちらを参考で。
読み取った各ピクセルのRGB値のうち、とりあえず代表としてBlueの値を取り出し、そのままアルファ値として採用します。
③ 各ピクセルのRGB値については、表示したい文字の色をベタで塗っておきます。
④ ③が描画されたウィンドウを、②の各ピクセルの不透明度を適用したレイヤーウィンドウとし表示することで、背景色に対して各ピクセル毎の半通過状態を実現した表示を行います。
上記のうち②については、技術的にはあまり定かではありません。本当にこんなことが実現できるのかはわかりません。
アルファ値を使えるようにしたメモリデバイスコンテキスト上にDrawText()した文字は本当に表示されるのか?(確か、DrawText() はアルファ値のチャネルを「描画」してくれないので、全通過になっちゃうという話を聞いたことがあるはず)
同じく、ベタ塗をするためのPatBlt() APIもアルファ値のチャネルを使えるようにしたメモリデバイスコンテキスト上に描画できるのか?
DrawText()で描画した各ピクセルをGetDIBSection()で取得したDWORD列から読み取ることができるのか?
事前に調べなければならないことがたくさんあります。
また現在、マウスのお供の表示をフェードイン/フェードアウトするためにSetLayeredWindowAttributes() APIを多用していますが、ピクセル毎の半通過度を指定できるUpdateLayeredWindow() APIとの併用はできないため、フェードイン/フェードアウト処理の部分の作り直しが必要になります。
【解決策2】 背景の全ピクセルを自ウィンドウ上にコピーして、その上に文字を描画する
「マウスのお供」が文字を描画しようとする領域(透明なウィンドウ。以後は「自ウィンドウ」と呼びます)の背景部分(デスクトップと他アプリケーション)の全ピクセルを、自ウィンドウ上へ転写して、その上に文字を描画します。
背景を、
マウスのお供の自ウィンドウ上に、
背景を全部転写し、
転写した画像上に文字を描画します。
たしか、CAPTUREBLTをつけずに、デスクトップ+他ウィンドウの映っている領域の画像を転写しようとすると、その上に半通過ウィンドウが乗っていても、半通過ウィンドウのことは無視してコピーをしてくれるはず(未検証)なので、その手段が使えるならば、技術的には可能な気がします。
ただ、マウスを少しでも動かしたら…というか、マウスのお供の背景となるデスクトップや他ウィンドウの描画内容が少しでも変わったら、マウスのお供の自ウィンドウ上に再転写し文字を描き直しになるため、処理負荷は非常に高そうな気がします。
(動画ソフト上に「マウスのお供」の文字が出る場面を想像したら…現在はOSが適切に処理をしてくれていますが、それを自力で処理しなければならないことになると、処理量の多さに寒気がします)
かといって、【解決策1】の方が処理負荷が低いかといえば、各ピクセルを読み取って半通過ウィンドウを秒単位で更新する作業がそんなに軽いとも思えません。どっちもどっちな気がしています。
【続き】続きは解決策が定まったら。もしかしたら来年以降になってしまうかも。
本ページへは、自己責任の範囲内であれば自由にリンクしていただいて構いません。
本ページに掲載されている内容は、自由にお使いいただいて構いませんが、必ずしも筆者が内容を保証するものではありませんので、ご利用に際しては自己の責任においてお使いいただきますよう、お願いいたします。
このページのURLやアンカーは、サーバ運営・サイト運営・ページ運営・その他の都合により無告知で一時的あるいは永遠に消滅したり、変更したりする可能性がありますので、あらかじめご了承下さい。
本ページは、公開から1年半経過後の任意のタイミングで削除される予定です。本ページの内容は複製・公開していただいて構いません。