初めまして。U-1と申します。
VBでの透過処理でご質問したい事がございます。
例えば、Offceアシスタントのイルカみたいに画像のキャラ部分のみを残して
周りを透過にするという処理を行いたいのです。
マスク画像からBitBltというAPIを使用して背景の透明化を行い
Pictureボックスに表示、その後SetWindowRgnを用いてフォームを
透過するという方法を試してみたのですが、その方法だと
画像の背景を透明化しても、透明化した背景にPictureボックスの
背景(BackColor)が残ってしまいます。
BeginPath〜EndPathでパスを形成する方法でも、BitBltでは
パスを形成出来ないみたいです。
あと考えられるのは、1ピクセルずつ読み込んでリージョンを形成する
方法が考えられますが、方法が分かりませんし、複雑な画像に
なるとつらいかと思われます。
何か良い方法がございましたらご教示下さい。簡単なソースが
あると嬉しいです。よろしくお願いします。
編集エリアに直に書くなんてどうでしょう?
Officeはそんなことやってないような気がしますけど。
Delphiでやったことを変換してみただけなので、間違いはあるかもしれません。
編集エリアコントロールをEdit1とします。
-----------------------------------------
一番最初(フォームの作成時とか?)に、
hEditDC = GetDC(Edit1.hWnd) // Edit1のデバイスコンテキストを取得、hEditDC(グローバル変数)に格納
そして、一番最後(フォームの破棄時とか?)に
ReleaseDC(Edit1.hWnd,hEditDC) // デバイスコンテキスト開放
ReleaseDCとGetDCはAPIなので、宣言を追加しておいてください。
それからあとは、それまでやっているとおりです。
BitbltでhDCを要求されたら、そこにhEditDCを使うようにします。
どうでしょうか?速さはあまり期待できないかもしれません。
再描画のときにも処理をしないといけないので、サブクラス化が必要です。
TRichEdit(Delphiでのリッチテキストボックス)の色分けに使ったものですけど。
うーん、素直に透過する方法を探したほうが早い気がする(^^ゞ
OS依存(Win2000以降)でよければ、
レイヤードウィンドウが簡単ですが・・・。
たかみちえさん、Sayさん、ご回答ありがとうございます。
色々と試行錯誤した結果、1ピクセルずつ読み込んでリージョンを
形成する方法をとりました。(某HPに方法が載っていた為)
ありがとうございました。また何かありましたら
よろしくお願いします。
ツイート | ![]() |