WindowsXP、VisualStudio2010でC++(MFC)で開発を行っています。
ダイアログの一部を半透明化したいのですが、どうすれば実現できるでしょうか?
なんとかやってみたのですが、途中で手詰まりしていまい質問した次第です。
以下、詳細と挑戦した内容です。
ダイアログ1からダイアログ2を表示し(モーダレス)、
ダイアログ2の一部を半透明化したいです。
半透明化と、一部を透明化するの両立はできなそうだったため、
ダイアログ2を2枚のダイアログで表示しようとしています。
ダイアログ2にはピクチャコントロールが一つあり、そこをRGB(1,0,0)などで塗り、
SetLayeredWindowAttributesでRGB(1,0,0)を透明化しています。
ダイアログ2の裏に表示するダイアログ3は画像(自分で描画しています)を表示し
SetLayeredWindowAttributesを使い半透明化しています。
OnMoveやOnWindowPosChangingで使い一見、うまく表示できているのですが、
ダイアログ1を選択したときに、裏にあるべきはずのダイアログ3がダイアログ1の前に
表示されてしまいます。
というよりもダイアログ2以外のウィンドウがアクティブになると、
ダイアログ3がそれより前に来てしまいます。
他にもタスクバーにダイアログ3が表示されたり
半透明部分のイベントがとれなかったりするのですが
まずは上記の問題を解決してからだと考えています。
まったく違う方法でも良いので、何かアイデアがある方はご教示下さい。よろしくお願いします。
A 回答 (2件)
- 最新から表示
- 回答順に表示
No.2
- 回答日時:
>UpdateLayeredWindowというのはあまり知らなかったので調べてみたのですが、
>SetLayeredWindowAttributesの代わりに使用するということでしょうか?
はい。SetLayeredWindowAttributesを使用して、UpdataLayeredWindowを使うと
失敗します。
>SetLayeredWindowAttributesより処理が軽いという認識でしたが・・・
軽いかどうかはわかりませんが、Set~~はウィンドウ全体のα値や透過色を
設定するのに対して、Update~~は一部を半透明にしたり(もちろん全体も可能)、
細かいレイヤードな作業ができます。ただし、当然のことながら複雑かつめんどくさいです。
>「なぜUpdateLayeredWindowではなくSetLayeredWindowAttributesを使っているのか」
>ということでしたら、恥ずかしながらSetLayeredWindowAttributesを
>使う方法しか知らなかったためです。。。
細かいやり方はとても書ききれませんので、ざっくりとしたとこだけ。
1.CBitmap::CreateCompatibleBitmapでビットマップと、CDC::CreateCompatibleDCでスクリーン互換のDCを作って、半透明したい部分をBitBltで転送する。
2.1で出来たビットマップは透過情報がないDDBビットマップなので、透過情報をもつDIBSectionビットマップに変換する。手順は次のとおり。
2a.CreateDIBSectionでDIBSectionビットマップを作ってそのハンドルを取得する(戻値)。その際、
第二引数はBITMAP型へのポインタを指定するが、これでは透過情報があるピットマップは作成
できないので、BITMAPV5HEADER型へのポインタを指定すること。
2b.CreateDIBSectionの第四引数に作られた透過情報入力可能なビットマップのピクセルの配列ができているので、GetDIBitsで1.のDDBビットマップを転送する。
3.これで透過情報をもったDIBSectionビットマップが出来たので、2bの第四引数で受け取ったピクセルの透明度を任意に設定して、CDC::CreateCompatibleDCでスクリーン互換のDCを作ってSelectObjectでこのビットマップハンドルを結びつける。
4.これで準備ができたので、3.で取得したCDCへのポインタをCWnd::UpdateLayeredWindowの第四引数
に指定する。第一引数はスクリーンのDCへのポインタを指定して、第二、第三引数は透過させたい
左上の位置をスクリーン座標で、その幅、高さ(つまり、作ったビットマップの幅、高さと同じ)を
指定。第五引数は、作ったビットマップをどこからウィンドウに表示するかを指定するので、余分な
ビットマップを作っていなかったら(0, 0)位置からレイヤ表示する。
最後の3つの引数はSetLayeredWindowAttributesの引数と同じような機能で、ビットマップの各
ピクセルだけでなくここでも透過情報を設定できますが、今回はここは非透過で設定したほうが
分かりやすいかも。
この回答への補足
大変遅くなってしまい申し訳ありません。
回答ありがとうございます。
ご教示頂いた内容を自分なりに解釈して試してみましたが、うまくいきません。
ダイアログ1からダイアログ2を表示させ、ダイアログ2上のピクチャコントロールを半透明化しようとしています。
現象としては、ピクチャコントロールがある位置に画像が表示されるのですが、それ以外の領域が消えてしまいます。タイトルバーなども消えてしまいます。
また半透明化もされていません。
(UpdateLayeredWindowの引数のBLENDFUNCTION構造体でalpha値を設定すれば半透明化はされるのですが)
そのままだと何も操作できないのですが、一旦最小化して元のサイズに戻すと、
表示的にはあまり変わらないのですが、表示されている画像の上の方を触ると移動できたり、最小化ボタンや×ボタンを押しているように動作します。
画像で塗りつぶされているのですが、ピクチャコントロールのサイズのフォームができたイメージです。言葉で伝えるのは難しいのですが。
確かにけっこう複雑で全てをここでお聞きするのは難しいと思うのですが、参考サイトなどありましたらご教示頂けますでしょうか?
今更ながらのお願いで申し訳ありませんが、よろしくお願いします。
No.1
- 回答日時:
いろいろ工夫されているみたいですが、
>まったく違う方法でも良いので、何かアイデアがある方
アイディアではないですが、UpdateLayeredWindowは使えない状況ですか?
この回答への補足
遅くなってしまいましたが、回答ありがとうございます。
UpdateLayeredWindowというのはあまり知らなかったので調べてみたのですが、
SetLayeredWindowAttributesの代わりに使用するということでしょうか?
SetLayeredWindowAttributesより処理が軽いという認識でしたが・・・
「なぜUpdateLayeredWindowではなくSetLayeredWindowAttributesを使っているのか」
ということでしたら、恥ずかしながらSetLayeredWindowAttributesを
使う方法しか知らなかったためです。。。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/07/06 17:46
- Windows 10 MSアカウントの「個人設定をクラウドから削除します」は機能していないのでしょうか? 1 2022/11/20 17:01
- C言語・C++・C# Seleniumで「ファイルを開く」ダイアログボックスのフォルダ指定する方法を教えてください。 1 2022/05/09 07:38
- その他(プログラミング・Web制作) pythonでアプリが終了されたときに特定の処理を実行したい 2 2023/01/19 17:13
- YouTube Win10 Youtubeの動画を開くと、必ず右下に設定ダイアログ?が表示されます 2 2023/03/26 11:35
- Visual Basic(VBA) Application.Dialogs(xlDialogFileDelete).Showの件 1 2023/02/22 10:02
- Visual Basic(VBA) 動かなくなってしまった古いVBAを動くようにしたい 8 2022/09/20 13:57
- ゲーム フォートナイトがクラッシュする 3 2022/09/19 07:35
- Visual Basic(VBA) シートをコピーする下記記述でダイアログを用いた記述がわかりません?( A = Dir(ThisWor 4 2022/08/22 12:26
- その他(ソフトウェア) UnityのPublishing SettingsでCreate Keyを押しても反応しない 1 2023/06/27 01:03
このQ&Aを見た人はこんなQ&Aも見ています
-
10代と話して驚いたこと
先日10代の知り合いと話した際、フロッピーディスクの実物を見たことがない、と言われて驚きました。今後もこういうことが増えてくるのかと思うと不思議な気持ちです。
-
「平成」を感じるもの
「昭和レトロ」に続いて「平成レトロ」なる言葉が流行しています。 皆さんはどのようなモノ・コトに「平成」を感じますか?
-
「覚え間違い」を教えてください!
私はかなり長いこと「大団円」ということばを、たくさんの団員が祝ってくれるイメージで「大円団」だと間違えて覚えていました。
-
牛、豚、鶏、どれか一つ食べられなくなるとしたら?
牛肉、豚肉、鶏肉のうち、どれか一種類をこの先一生食べられなくなるとしたらどれを我慢しますか?
-
ギリギリ行けるお一人様のライン
おひとり様需要が増えているというニュースも耳にしますが、 あなたが「ギリギリ一人でも行ける!」という場所や行為を教えてください
-
画面を強制的に再描画させる方法
C言語・C++・C#
-
MFCダイアログボックスを最前面に表示
C言語・C++・C#
-
ラベル(スタティックテキスト)内での改行。
C言語・C++・C#
-
-
4
VC++でコントロールの境界線を描画する方法
C言語・C++・C#
-
5
MFCでbitmapを背景にしてstaticテキストを透過させる方法
C言語・C++・C#
-
6
C++ bmp 透過処理
C言語・C++・C#
-
7
タイトルバーやメニューバーの高さ取得
C言語・C++・C#
-
8
AfxBeginThread の引数について
C言語・C++・C#
-
9
ボタンの表示の色、フォントを変更したい
C言語・C++・C#
-
10
CStringのFindで文字列検索を行いたいのですが
C言語・C++・C#
-
11
ダイアログ内コントロールの位置取得について
C言語・C++・C#
-
12
MFC ダイアログ上のID取得について
C言語・C++・C#
-
13
ダイアログベースの再描画について
C言語・C++・C#
-
14
ボタン(コントロール)を丸くしたい
C言語・C++・C#
-
15
コンボボックスの高さを変更したい。
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/22】このサンタクロースは偽物だと気付いた理由とは?
- ・お風呂の温度、何℃にしてますか?
- ・とっておきの「まかない飯」を教えて下さい!
- ・2024年のうちにやっておきたいこと、ここで宣言しませんか?
- ・いけず言葉しりとり
- ・土曜の昼、学校帰りの昼メシの思い出
- ・忘れられない激○○料理
- ・あなたにとってのゴールデンタイムはいつですか?
- ・とっておきの「夜食」教えて下さい
- ・これまでで一番「情けなかったとき」はいつですか?
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
メッセージボックスを大きくす...
-
MFCでinputbox
-
MFCダイアログボックスを最前面...
-
フォーム上のリストボックスに...
-
VC++2010 最小化のアイコン 無...
-
ダイアログのボタンが押せない
-
エディットコントロールの色の...
-
ボタンの表示の色、フォントを...
-
ダイアログの表示位置の保存
-
コンボボックスのドロップダウ...
-
MFC ポップアップメニューのチ...
-
SetWindowLong()でタイトルバー...
-
C# ボタンコントロール内で文字...
-
ダイアログボックスで指定した...
-
vbscriptで、ファイル選択ダイ...
-
エクセルで作った新しいウイン...
-
「アイテムは収集されました」...
-
グラフの交点の求め方(Excel)
-
コントロールの書式設定で、“コ...
-
コンボボックス内の文字サイズ変更
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
メッセージボックスを大きくす...
-
フォーム上のリストボックスに...
-
コンボボックスのドロップダウ...
-
ボタンの表示の色、フォントを...
-
メッセージボックスのボタン文...
-
vbscriptで、ファイル選択ダイ...
-
リソースファイルとは・・・
-
ダイアログの表示位置の保存
-
ダイアログボックスで指定した...
-
ダイアログの上のテキストボッ...
-
'int' から 'LPCSTR' に変換で...
-
confirmダイアログの表示文字に...
-
C# ボタンコントロール内で文字...
-
MFC ポップアップメニューのチ...
-
MFCダイアログボックスを最前面...
-
エディットコントロールの色の...
-
ボタンの配置を変更したい
-
ツールチップの表示
-
ダイアログにプレビュー表示
-
VC(Ver6.0)でダイアログサイズ...
おすすめ情報