Officeアシスタントのイルカのような透過処理を行うには

解決


U-1  2003-01-19 00:15:05  No: 76829  IP: [192.*.*.*]

初めまして。U-1と申します。
 VBでの透過処理でご質問したい事がございます。
 
 例えば、Offceアシスタントのイルカみたいに画像のキャラ部分のみを残して
 周りを透過にするという処理を行いたいのです。
 
 マスク画像からBitBltというAPIを使用して背景の透明化を行い
 Pictureボックスに表示、その後SetWindowRgnを用いてフォームを
 透過するという方法を試してみたのですが、その方法だと
 画像の背景を透明化しても、透明化した背景にPictureボックスの
 背景(BackColor)が残ってしまいます。
 BeginPath〜EndPathでパスを形成する方法でも、BitBltでは
 パスを形成出来ないみたいです。
 あと考えられるのは、1ピクセルずつ読み込んでリージョンを形成する
 方法が考えられますが、方法が分かりませんし、複雑な画像に
 なるとつらいかと思われます。
 何か良い方法がございましたらご教示下さい。簡単なソースが
 あると嬉しいです。よろしくお願いします。

編集 削除
たかみちえ  URL  2003-01-19 00:31:54  No: 76830  IP: [192.*.*.*]

編集エリアに直に書くなんてどうでしょう?
Officeはそんなことやってないような気がしますけど。

  Delphiでやったことを変換してみただけなので、間違いはあるかもしれません。

  編集エリアコントロールをEdit1とします。
-----------------------------------------
  一番最初(フォームの作成時とか?)に、
hEditDC = GetDC(Edit1.hWnd) // Edit1のデバイスコンテキストを取得、hEditDC(グローバル変数)に格納
  そして、一番最後(フォームの破棄時とか?)に
ReleaseDC(Edit1.hWnd,hEditDC) // デバイスコンテキスト開放
  ReleaseDCとGetDCはAPIなので、宣言を追加しておいてください。

  それからあとは、それまでやっているとおりです。
BitbltでhDCを要求されたら、そこにhEditDCを使うようにします。

  どうでしょうか?速さはあまり期待できないかもしれません。
再描画のときにも処理をしないといけないので、サブクラス化が必要です。
TRichEdit(Delphiでのリッチテキストボックス)の色分けに使ったものですけど。

  うーん、素直に透過する方法を探したほうが早い気がする(^^ゞ

編集 削除
Say  2003-01-19 06:16:33  No: 76831  IP: [192.*.*.*]

OS依存(Win2000以降)でよければ、
レイヤードウィンドウが簡単ですが・・・。

編集 削除
U-1  2003-01-20 00:08:16  No: 76832  IP: [192.*.*.*]

たかみちえさん、Sayさん、ご回答ありがとうございます。
色々と試行錯誤した結果、1ピクセルずつ読み込んでリージョンを
形成する方法をとりました。(某HPに方法が載っていた為)
ありがとうございました。また何かありましたら
よろしくお願いします。

編集 削除