QK中(1/20)
   あのnifexがSEとPGの間を漂いつつ綴る日々。 母の財布からお金を取ったのは僕ではありません 。
プロフィール

 nifex

Author: nifex
更新頻度低下中。物理的には居ます。

mail & msn mess. :
  nifex@saku2.com

skype :
nifexnifex


当サイトはosakaフォントを使うと割と読みやすいかもしれませんがまぁ好きにするといいよ




このサイトについて




押すと押せます

最近の記事

最近のコメント

最近のトラックバック

カテゴリー

過去ログ

カレンダー

10 | 2017/11 | 12
- - - 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 - -

ブログ検索

 スポンサーサイト
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

スポンサー広告 | このエントリのURL
(--/--/--(--) --:--)

 VB6で半透明(レイヤード)ウィンドウ


世の中は.NETだjavaだとカッコイイ言語が騒がれているが。

頭の中にある「やりたいこと」を10分でPG化出来るという理由で、仕事の補助ツールは全てVB6で作っている俺である。(※納品するプログラムではなく、あくまで自分のためだけのユーティリティ)


VC++も勉強中だが、やっぱり構想の具現化速度は今のところVB6が最速をマークしている(俺調べ)。
動作が遅いとかランタイムが要るとかオブジェクト指向がなんちゃってだとか正規表現が使えないとか色々反論はあろうが、現に一番役に立っているから仕方ない。

同じような開発環境でいえばDelphiとかPowerBuilderとかHSPとかN-Scripterとかがあるんだろうがそんないろいろ勉強出来ないっつぅ話なわけよ。



この類のツールに求められるのは

 ・"特定用途についてだけは著しい効率上昇が見込める"
 ・"作成に時間がかからない"

といった要件である。言い換えれば使い捨てだな。
もちろん汎用性は高いに越したことはないがそこに時間がかかってしまっては本末転倒なので、俺の場合割り切って行き当たりばったりコードにしてしまう。バグを抑えるためにある程度の構造化は行うが、使い回しはほとんど考えなかったりするわけだな。
例えばイベントプロシージャにSQL文をパースするコードをずらずら書いたりしてしまう。よい子はあんまり真似してはいけない。


さて、そんな感じで作ってきたツール達の中でも予想以上に"使える"ものが生まれた場合、やっぱり愛着がわいてくるのが人情というもの。空き時間を見つけてはちょっとずつ無駄な粋な機能をつけてニヤニヤするのもまた一興であろう?

今日紹介するのはそんな!ちょっとだけニヤニヤ出来るが実は無駄、なコードの中の1つである。


結論から言うとwindowの半透明化。ていうかタイトルでバレバレ。機能的には無駄でしかないが、見栄えがかっちょよくなってニヤニヤできる。結局時間かかっちまってるじゃねぇかって矛盾がまたインチキプログラマっぽくてグーと言わねばなるまい。なるまい、じゃねぇよ。



半透明(layered)ウィンドウは当然windowsプログラムなら開発環境に関係なく実現可能であるが、前述の通りVB6でやってみようと思う。
とは言っても単にAPIを呼ぶだけだ。実に簡単。
-------------------------------

Public Declare Function GetWindowLong 
Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long,
ByVal nIndex As Long) As Long
Public Declare Function SetWindowLong
Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long,
ByVal nIndex As Long,
ByVal dwNewLong As Long) As Long
Public Declare Function SetLayeredWindowAttributes
Lib "user32" (ByVal hwnd As Long,
ByVal crKey As Long,
ByVal bAlpha As Long,
ByVal dwFlags As Long) As Integer

Public Const LWA_ALPHA = &H2 Public Const GWL_EXSTYLE = &HFFEC Public Const WS_EX_LAYERED = &H80000
-------------------------------

まずはこんなAPI宣言を標準モジュールあたりにでも書いておく。
後半の定数宣言は別にしないで直で値を書いてもいいが普通は宣言する。慣例だからな。

あとはあれだ、半透明にしたいwindowのスタイルをレイヤードにしてやってアルファブレンドすればヨイ。
-------------------------------

'対象のハンドラに対しWS_EX_LAYEREDを追加
Dim lngStyle As Long
lngStyle = GetWindowLong(Me.hwnd, GWL_EXSTYLE)
Call SetWindowLong(Me.hwnd, 
GWL_EXSTYLE,
lngStyle Or WS_EX_LAYERED) 'アルファ値をセット Call SetLayeredWindowAttributes(Me.hwnd, 0, 125, LWA_ALPHA)
-------------------------------

レイヤードにした時点でマシンパワーによっては超絶重くなったりするが半透明てのはそういうもんだ。むしろ今時半透明にしたぐらいで重くなるようなグラボつかってるなら買い換えちめー

※WS_EX_LAYEREDを追加、ってのはレイヤードのビットを立てるって意味。ビット演算の論理和ってことだな。
しかる後0~255の範囲内でアルファ値をセットしてやればそのウィンドウは半透明になる。このコードだとだいたい透明度50%ぐらいだ。


もし半透明にならねぇよ、ていうかAPIの呼出がそもそも失敗すんだけどって人がいればOSをwin2k以上に入れ直すことを強くオススメする。でもMeとか使ってる人がいたらある意味面白いのでそのままあと10年ぐらい突っ走って頂きたい(だが半透明は諦めろ)。



ちなみに普通のに戻すにはレイヤードのビットを元に戻す。今度は否定の論理積。
-------------------------------

'対象のハンドラに対しWS_EX_LAYEREDを取り除く
Dim lngStyle As Long
lngStyle = GetWindowLong(Me.hwnd, GWL_EXSTYLE)
Call SetWindowLong(Me.hwnd, 
GWL_EXSTYLE,
lngStyle And not(WS_EX_LAYERED))
-------------------------------

あ、今更だが文中のコードはエントリ用に改行してあるのであしからず。そのまま貼り付けるとコンパイルエラーになるぞ。気をつけろ。エラーが出たらせめて赤いな!って力いっぱい叫べ。気が紛れるかもしれない。


アルファ値をセットできるのはレイヤードウィンドウ時のみ。
スライドバーとかで透明度を制御できるようにしたいならレイヤードウィンドウのままSetLayeredWindowAttributes()を連続で呼べばいい。



なーんていろいろ試してみたんだが、ぶっちゃけ半透明のままのウィンドウってのはな、


とてつもなく見づらい。。


字が読めねぇええんだよ。Vistaのaeroみたいに部分的に適用できるなら実用性を損なわないでスタイリッシュにもできるんだが、このAPIではそのウィンドウ全体を半透明、もしくはそのウィンドウ上にのってるある一色を全透明にする、ってことしかできない。ていうか俺にはそれしか出来なかった。

-------------------------------

'指定色のみ透明に。
'(以下は真っ白(&HFFFFFF)の部分だけ穴が開いたように見える
Call SetLayeredWindowAttributes(Me.hwnd,
&HFFFFFF,
0,
LWA_COLORKEY)
-------------------------------

ど、どっちにしろ使い道が('A`)




まぁせっかくなので俺様いろいろ考えた。
がこんなもんしか浮かばなかった。。


自力フェードイン実装

更にスライド効果

(※右クリ保存→拡張子.jsを削除、で実行してみて頂きたい。なんでかっつぅとexeそのままだとアップできねぇのよこの鯖)



び、微妙 ^^^^^^;;;;;;;;




ん?こいつのソースはどうなってんだだと?
まぁタイマーコントロールでアルファ値を制御してるだけだ。実際のソースは載せねぇ。なにもかも載せたらつまんねぇだろ?
いいか、決して

ソースだけ間違って消してしまい、
2度と同じ動きが再現できなくなった

とかそういうことではない。断じて違うからな?そっそんな直感だけでいつもコード書いてるわけじゃ無いんだからねっ!?



ていうかそんな器用な消し方をしたことが驚愕だ>俺様

スポンサーサイト

テーマ:プログラミング - ジャンル:コンピュータ

プログラミング | このエントリのURL | トラックバック:1 | comment:0
(2007/03/01(木) 22:46)

<<ジョン・バトラー | ホーム | ジャバー(風呂から上がる音)。>>

コメント
コメントの投稿

管理者にだけ表示を許可する

トラックバック
トラックバックURLはこちら
http://nifex.blog37.fc2.com/tb.php/176-1f59f52f
この記事にトラックバックする(FC2ブログユーザー)

  アルファブレンドとは??
アルファブレンドαブレンド(アルファブレンド)とは、二つの画像の係数(α値)により合成すること。とくにゲームの開発に必須の技術で、別々に描かれた背景とキャラクターとを合成するのに使われる。.wikilis{font-size:10px;color:#666666;}Quotation:Wikiped
コンピューターグラフィックス | 2007/03/02(金) 20:01

This site is powered by Macromedia Studio MX. (contains DreamWeaver MX ' FireWorks MX)

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。