以前、アルファ値付きのウィンドウを作りたくて、
リージョンではなくレイヤードウィンドウについて色々調べてたのですが、なかなかうまくいかず。
結局HSPは32bitのウィンドウではなくて24bitのウィンドウのために、
アルファ値付きは不可能なんだと勝手に決めつけ断念していました・・・

それで、もう1度、昨日から再度調査しなおしていたのですが、
UpdateLayeredWindowを使えばいいことが判明!
駄目もとで、一度HSPで作ってみようと頑張ったら完成しました!

32bitのDIBの作り方は、すぽいと君のBITMAPのコピー処理の時に勉強してたので、そこらへんを流用。
何とか動いたんだけど、なんとなくで動いている部分もありプログラム的にはちょっと心配。
ゲームとかと違って、Windowsプログラムはソース自体は短いのに理解するまでが大変だ。

ちなみに、ただ単に透過色指定のSetLayeredWindowAttributesを利用したレイヤードウィンドウや、リージョンウィンドウと比べると
やっぱり、半透明の値をしっかりもっているので、UpdateLayeredWindowで作ったウィンドウはめっちゃきれい!!

アルファチャンネル付きレイヤードウィンドウとの比較画像

下の方は、ディザリング処理と言うか、灰色の中間色が透過されないためギザギザしている・・・

モジュール化して公開してみたのでよかったら使ってください!
なたでラボHSPのモジュールの「レイヤードウィンドウ総合モジュール」です。
Windows2000はGetLayeredWindowAttributesがないので動きません。

関連記事

  • HSPで高DPI対応ソフトを作ろうHSPで高DPI対応ソフトを作ろう こんにちは! 久しぶりにHSPの記事を書きたいと思います! 今回は、HSPの高DPI対応です。 はじめに 高DPIとはなんぞや、という説明をします。 昔のディスプレイは、1ドットのサイズが細かくないため、 1ピクセル=1ドットのような設計がほとんどでした。 そして、1ピクセルの大きさも、どのディスプレイもだいたい同じようなサイズ(96dpi)でし […] Posted in プログラミング
  • マップオンデマンドの地図更新でパスワードが入力できないマップオンデマンドの地図更新でパスワードが入力できない 車を購入時にカーナビとしてNSZT-W61Gを付けたのですが、 カーナビ購入してから3年間はマップ情報のバージョンアップが無料ということで、 バージョンアップをしようとしました。 バージョンアップ方法の流れ 1. 購入時についていた「マップオンデマンドセットアップディスク」のDVDでセットアップツールをインストール 2. 「GAZOO」を無料でユーザー登録(「TOYOTA […] Posted in 雑記
  • 3Dネット対戦ゲーム作成日記 part63Dネット対戦ゲーム作成日記 part6 やったー 意外に簡単に裏面の処理ができちゃった! まさか2つのベクトルの外積の計算式がこんなところで役に立つなんて。 ただ1つの面を調べるのに8回もatan使ってます。 速度は大丈夫かな、描写速度よりは計算速度のほうが速いからいいけど。 だれか4点から右方向に回転か、左方向に回転か調べる方法でもっといい方法があったら教えて下さい^^ /*4点が左回 […] Posted in ゲーム制作
  • メディアンカットによる減色アルゴリズムメディアンカットによる減色アルゴリズム 3日前から、いつものHSP言語で減色プログラムを作ってたのですが、なかなか難しい。 メディアンカットを実装したいんだけど、資料がないんですよねー。 ということで、減色アルゴリズムを調べた形跡を紹介します。 減色アルゴリズム1 1. 全ての色からある程度階調を落とした色数のヒストグラム作成 2. 色数を多い方から昇順でソートする。 3. […] Posted in ライブラリ制作
  • HSPで人工無能の制作日記 part 3 (final)HSPで人工無能の制作日記 part 3 (final) ついに、HSPで人工無能が完成しました。 Yahooチャットルームで泳がせて1400単語覚えました。 それで初めてネットの友達に人工無能としゃべってもらいました。 これはMSNチャットでしゃべったものです。 実際の人工無能との会話例1 なたで(プログラム) の発言: イジイジ 友達(人間) の発言: うん なたで(プログラム) […] Posted in ツール制作
  • Bresenhamアルゴリズムで線分の計算は早いのかなBresenhamアルゴリズムで線分の計算は早いのかな 以前、直線を描くのにこんなのを作った。 特に工夫点もない、素直な方法である。 #module "linem" #deffunc line2 int line_x1,int line_y1,int line_x2,int line_y2 line_xabs = abs(line_x1-line_x2) line_yabs = […] Posted in アルゴリズム