C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: コンポーネントの背景の透明化


(過去ログ 11 を表示中)

[トピック内 17 記事 (1 - 17 表示)]  << 0 >>

■2557 / inTopicNo.1)  コンポーネントの背景の透明化
  
□投稿者/ まこ (1回)-(2007/04/12(Thu) 10:57:34)

分類:[C# (Windows)] 

初めまして、初心者のまこです。

現在コンポーネントを作成しているのですが、Panelを元にして
円を書いたり線を引いたりと領域内に描画をしています。

実際に作成したコンポーネントを貼り付けると描画されたものは正しく表示されるのですが、
背景が塗潰されていて自分のコンポーネントより裏に配置されているコンポーネントが
隠れてしまいました。

ここで描画した部分以外は背景を透明にし、裏にあるコンポーネントを表示したいのですが、
何か方法はありますでしょうか?

いろいろと調べてみましたが、コンポーネントを貼り付けたFORMから親の設定をするなど
FORMに貼り付けてから設定するものが多く、コンポーネント内部の処理でできるものは見つけられませんでした。

コンポーネント作成したのはいろいろ使いまわしをするために作成したので、
毎回FORMのソースコード内に透明化させる処理を入れたくありません。

何かいい方法はありませんでしょうか?

みなさんの力を貸してください。
それでは、よろしくお願いします。

引用返信 編集キー/
■2564 / inTopicNo.2)  Re[1]: コンポーネントの背景の透明化
□投稿者/ 渋木宏明(ひどり) (164回)-(2007/04/12(Thu) 12:00:35)
渋木宏明(ひどり) さんの Web サイト
> 何かいい方法はありませんでしょうか?

画期的な方法はありません。
これ、意外と難しいんですよ。

技術的に不可能ではないですが、従来の Windows のコントロールの描画の仕組みにも問題があって、かなり工数をかけないとそこそこのレベルが達成できないし、それでもなお下に置いたコントロールの性質やらのせいでチラつきが出たりします。

もし本気で取り組む気があるなら、Windows の GDI やウィンドウの管理方法について徹底的に学んでください。

引用返信 編集キー/
■2577 / inTopicNo.3)  Re[1]: コンポーネントの背景の透明化
□投稿者/ 刈歩 菜良 (51回)-(2007/04/12(Thu) 13:24:18)
刈歩 菜良 さんの Web サイト
> ここで描画した部分以外は背景を透明にし、裏にあるコンポーネントを表示したいのですが、
> 何か方法はありますでしょうか?
単純に透過させたいだけでしょうか?
それでしたらコンポーネントの背景色をColor.Transparentに指定すればOKです。
しかし、透過色はデフォルトで設定できないので、コンポーネントのコンストラクターの中のInitializeComponent呼び出しより前に

SetStyle(ControlStyles.UserPaint, true);   //デフォルト値なので省略可
SetStyle(ControlStyles.SupportsTransparentBackColor, true);  //これが大事

と記述する必要があります。
それからコードでコンポーネントの背景に透過色を指定します。
BackColor = Color.Transparent;

上記3行をまとめて書いてしまえばOKです。

IDEのデザイナー上では透過色を指定できないので、必ずコードで指定してください。
引用返信 編集キー/
■2590 / inTopicNo.4)  Re[2]: コンポーネントの背景の透明化
□投稿者/ まこ (2回)-(2007/04/12(Thu) 15:12:40)
お返事ありがとうございます。

> 画期的な方法はありません。
> これ、意外と難しいんですよ。
そうですかぁ・・・。残念ですねぇ〜

設定何かでコンポーネントが存在しないかのように裏のコンポーネント類を描画させて
自分も背景を透明にして描画できればうまくいくかなぁ〜なんて考えてました。

> 技術的に不可能ではないですが、従来の Windows のコントロールの描画の仕組みにも問題があって、かなり工数をかけないとそこそこのレベルが達成できないし、それでもなお下に置いたコントロールの性質やらのせいでチラつきが出たりします。
上で考えた方法もなんとなくチラつくとは思いました。

> もし本気で取り組む気があるなら、Windows の GDI やウィンドウの管理方法について徹底的に学んでください。
時間もある程度限られていて今回C#初めてなので評価している段階なんですが、
おとなしくVC++でやっていったほうがいいんですかねぇ??

ちなみに渋木さんにはVC++のメーリングリストでお世話になったことがあります。(笑

渋木さん的にはVC++はいつか無くなる気がしますか??



No2564 (渋木宏明(ひどり) さん) に返信
>>何かいい方法はありませんでしょうか?
>
> 画期的な方法はありません。
> これ、意外と難しいんですよ。
>
> 技術的に不可能ではないですが、従来の Windows のコントロールの描画の仕組みにも問題があって、かなり工数をかけないとそこそこのレベルが達成できないし、それでもなお下に置いたコントロールの性質やらのせいでチラつきが出たりします。
>
> もし本気で取り組む気があるなら、Windows の GDI やウィンドウの管理方法について徹底的に学んでください。
>

引用返信 編集キー/
■2593 / inTopicNo.5)  Re[2]: コンポーネントの背景の透明化
□投稿者/ まこ (3回)-(2007/04/12(Thu) 15:21:20)
お返事ありがとうございます。まこです。

一応コンストラクタで
this.SetStyle(
	ControlStyles.SupportsTransparentBackColor |
	ControlStyles.Opaque |
	ControlStyles.DoubleBuffer |         // 描画をバッファで実行する
	ControlStyles.UserPaint |            // 描画は(OSでなく)独自に行う
	ControlStyles.AllPaintingInWmPaint,  // WM_ERASEBKGND を無視する
	true ) ;                             // 指定したスタイルを適用「する」
というのはやっています。

あとは
// 透明度
public int BackAlfaColor
{
	get
	{
		return BackColor.A;
	}
	set
	{
		if ((value >= 0) && (value <= 255))
		{
			BackColor = Color.FromArgb(value , BackColor);
			Invalidate();
		}
	}
}
こんなのも作って透明度を変えれるようにもしました。

これをやって実際のフォームに貼り付けるとコンポーネントの背景が真っ黒になってしまいました。
多分自コンポーネントがあるせいで裏のコンポーネントがかぶっているエリアは描画してくれないのかなぁと
そんな気がしています。

■No2577 (刈歩 菜良 さん) に返信
>>ここで描画した部分以外は背景を透明にし、裏にあるコンポーネントを表示したいのですが、
>>何か方法はありますでしょうか?
> 単純に透過させたいだけでしょうか?
> それでしたらコンポーネントの背景色をColor.Transparentに指定すればOKです。
> しかし、透過色はデフォルトで設定できないので、コンポーネントのコンストラクターの中のInitializeComponent呼び出しより前に
> 
> SetStyle(ControlStyles.UserPaint, true);   //デフォルト値なので省略可
> SetStyle(ControlStyles.SupportsTransparentBackColor, true);  //これが大事
> 
> と記述する必要があります。
> それからコードでコンポーネントの背景に透過色を指定します。
> BackColor = Color.Transparent;
> 
> 上記3行をまとめて書いてしまえばOKです。
> 
> IDEのデザイナー上では透過色を指定できないので、必ずコードで指定してください。

引用返信 編集キー/
■2598 / inTopicNo.6)  Re[3]: コンポーネントの背景の透明化
□投稿者/ 刈歩 菜良 (52回)-(2007/04/12(Thu) 15:45:36)
刈歩 菜良 さんの Web サイト
> こんなのも作って透明度を変えれるようにもしました。
ここちょいと引っかかります。
透明度(Opacity)じゃなくって、透過色(Transparent)を使わないといけないと思うのですが...
# いや、Opacityプロパティを使ってるって意味ではなくって、単純に英語でね。

>BackColor = Color.Transparent;
これ試されました?
引用返信 編集キー/
■2602 / inTopicNo.7)  Re[4]: コンポーネントの背景の透明化
□投稿者/ まこ (4回)-(2007/04/12(Thu) 16:05:32)
ども。まこです。
お返事ありがとうございます。

> >BackColor = Color.Transparent;
はい。一番初めにネットで検索した時に書いてあったので試してみましたがだめでした。

Color.Transparentは使ったイメージがフォームに色を合わせるだけのような感じでした。
フォームと自コンポーネントの間にエディットボックスなどをいれると表示されませんでした。


No2598 (刈歩 菜良 さん) に返信
>>こんなのも作って透明度を変えれるようにもしました。
> ここちょいと引っかかります。
> 透明度(Opacity)じゃなくって、透過色(Transparent)を使わないといけないと思うのですが...
> # いや、Opacityプロパティを使ってるって意味ではなくって、単純に英語でね。
>
> >BackColor = Color.Transparent;
> これ試されました?
引用返信 編集キー/
■2606 / inTopicNo.8)  Re[3]: コンポーネントの背景の透明化
□投稿者/ 渋木宏明(ひどり) (168回)-(2007/04/12(Thu) 16:23:28)
渋木宏明(ひどり) さんの Web サイト
> 設定何かでコンポーネントが存在しないかのように裏のコンポーネント類を描画させて
> 自分も背景を透明にして描画できればうまくいくかなぁ〜なんて考えてました。

元々の Windows GDI には「透明色」というのが存在しないのです。

なので、「コントロールを透明に見せる」古典的な手法は

・自分の影に隠れたコントロール(とフォーム)に自分が居る場所に描画させる。
・「透明色にしたいところ*以外*」を描画する。

という流れになります。

WPF は GDI とまるで異なる原理に基づく原理なので、いとも簡単に背景の透けさせることができるんですが。。。

> 渋木さん的にはVC++はいつか無くなる気がしますか??

Windows が滅ばない限り、生き残りはするでしょうね。
でも、使用される範囲は年々縮小してくんじゃないでしょうか。

引用返信 編集キー/
■2608 / inTopicNo.9)  Re[4]: コンポーネントの背景の透明化
□投稿者/ 刈歩 菜良 (53回)-(2007/04/12(Thu) 16:29:27)
刈歩 菜良 さんの Web サイト
まこさん
> はい。一番初めにネットで検索した時に書いてあったので試してみましたがだめでした。
失礼しました。
<(_ _)>


渋木さん
> WPF は GDI とまるで異なる原理に基づく原理なので、いとも簡単に背景の透けさせることができるんですが。。。
WPFだとできるんですねぇ。
しかしいまだβだし業務アプリだと厳しいんでしょうか?
ん?でも、βなのは開発環境だけだから、運用的にはOK?
引用返信 編集キー/
■2631 / inTopicNo.10)  Re[4]: コンポーネントの背景の透明化
□投稿者/ まこ (5回)-(2007/04/12(Thu) 17:31:16)
>渋木さん
返信ありがとうございます。まこです。

> 元々の Windows GDI には「透明色」というのが存在しないのです。
すみません。言葉が足りませんでした。
背景を透明にして=背景を書かずに自分の書きたいものだけ書くです。すみません。。。

> WPF は GDI とまるで異なる原理に基づく原理なので、いとも簡単に背景の透けさせることができるんですが。。。
WPFとはなんでしょうか?
初めて聞く言葉だったのでネットで検索してみましたが文字が短いためかうまくヒットしませんでした。
初心者ですみません。。。

>>渋木さん的にはVC++はいつか無くなる気がしますか??
>
> Windows が滅ばない限り、生き残りはするでしょうね。
> でも、使用される範囲は年々縮小してくんじゃないでしょうか。
そうですかぁ〜。やはりずっと続けていくわけにはいかなそうですねぇ。。。
変な質問にまで答えていただいてすみません。。


引用返信 編集キー/
■2632 / inTopicNo.11)  Re[5]: コンポーネントの背景の透明化
□投稿者/ まこ (6回)-(2007/04/12(Thu) 17:36:27)
2度書きすみません。まこです。

WPF見つかりました。
>WPF(Windows Presentation Foundation)ですね。
※なぜかPfwで検索してました(汗

Frameworks3.0で使用可能と書いてありましたが、XPや2000でも使えるんですかね??


引用返信 編集キー/
■2633 / inTopicNo.12)  Re[5]: コンポーネントの背景の透明化
□投稿者/ επιστημη (477回)-(2007/04/12(Thu) 17:40:39)
επιστημη さんの Web サイト
>>Windows が滅ばない限り、生き残りはするでしょうね。
>>でも、使用される範囲は年々縮小してくんじゃないでしょうか。
> そうですかぁ〜。やはりずっと続けていくわけにはいかなそうですねぇ。。。

たった一人の"憶測"を鵜呑みにしますか。

考えようによっちゃアレですよ。
縮小に伴い使えるヒトも少なくなります。
だからアナタがVC++やれるとチヤホヤしてもらえっかも。

引用返信 編集キー/
■2635 / inTopicNo.13)  Re[6]: コンポーネントの背景の透明化
□投稿者/ 刈歩 菜良 (55回)-(2007/04/12(Thu) 18:44:18)
刈歩 菜良 さんの Web サイト
> Frameworks3.0で使用可能と書いてありましたが、XPや2000でも使えるんですかね??
使えるのはWindows XP + SP2とWindows Server 2003とVistaとLonghornだけです。

WPFのプログラマ向け基礎としては
http://codezine.jp/a/article/aid/910.aspx
ここなのかなぁ。

でも、まこさんのやりたいことは書いてないかも...
引用返信 編集キー/
■2659 / inTopicNo.14)  Re[6]: コンポーネントの背景の透明化
□投稿者/ まこ (7回)-(2007/04/13(Fri) 10:20:34)
お返事ありがとうございます。まこです。

> たった一人の"憶測"を鵜呑みにしますか。
VC++とC#に長けている上にMicrosoftMVPの渋木さんの意見なので
私的にはたった一人の憶測程度のものではないと思っています。

> だからアナタがVC++やれるとチヤホヤしてもらえっかも。
なかなかいい考えですが、どこのメーカーでもC#でプログラムを組むようになってしまったら
いくらVC++ができても使ってもらえそうにありません。
それに今までVC++をやってきた人はたくさんいるのでチヤホヤされないかもですねぇ〜


No2633 (επιστημη さん) に返信
> >>Windows が滅ばない限り、生き残りはするでしょうね。
> >>でも、使用される範囲は年々縮小してくんじゃないでしょうか。
>>そうですかぁ〜。やはりずっと続けていくわけにはいかなそうですねぇ。。。
>
> たった一人の"憶測"を鵜呑みにしますか。
>
> 考えようによっちゃアレですよ。
> 縮小に伴い使えるヒトも少なくなります。
> だからアナタがVC++やれるとチヤホヤしてもらえっかも。
>
引用返信 編集キー/
■2660 / inTopicNo.15)  Re[7]: コンポーネントの背景の透明化
□投稿者/ まこ (8回)-(2007/04/13(Fri) 10:26:55)
刈歩 菜良 さん
お返事ありがとうございます。まこです。

> 使えるのはWindows XP + SP2とWindows Server 2003とVistaとLonghornだけです。
そうですかぁ・・・2000がだめだと過去のものの改修時はOSからのセットアップになりそうですねぇ・・・

> でも、まこさんのやりたいことは書いてないかも...
まだチョットしか見ていませんが面白そうなのでじっくりと見させていただきます。


それとなかなか難しそうってことで解決にしようかとおもいます。

お答えいただいた皆様ありがとうございました。
解決済み
引用返信 編集キー/
■2694 / inTopicNo.16)  Re[7]: コンポーネントの背景の透明化
□投稿者/ 渋木宏明(ひどり) (175回)-(2007/04/13(Fri) 14:27:03)
渋木宏明(ひどり) さんの Web サイト
>>たった一人の"憶測"を鵜呑みにしますか。
> VC++とC#に長けている上にMicrosoftMVPの渋木さんの意見なので
> 私的にはたった一人の憶測程度のものではないと思っています。

C++ に関して言えばεπさん以上に長けている人を探すのも難しいでしょうね ;-)

統計値などを基にしての発言ではないので憶測と言われればそれまでですが、個人的にはそういう雰囲気を「肌で感じている」ます。

現状ですら、既に VC++ は Windows プラットフォーム向けアプリケーション開発の主力ではありません。
Excel VBA や ACCESS、VB なんかで作られた物件が大多数と思います。

VC++ に関して言うと、ドライバや API のラッパなど下回りの整備にまだまだ活躍の場は残されているでしょうが、Windows プラットフォーム向けにおける、いわゆるアプリケーション開発という場での利用は今のところ縮小のシナリオしか僕には見えてきません。

元々業務系アプリケーションには VB6 で作られているものが多いはずで、これらは今後徐々に .NET に移行していくことが想像されますが、新たに VC++ で作り直されるケースを探すのはかなり難しいんじゃないでしょうか。

市販アプリケーションは業務アプリケーションに比べて様々な理由から .NET への以降が難しかったりしますが、それでも各社さんそろそろマジメに検討している頃なのではないかと想像します。(「してる」知り合いも居ますし)

>>だからアナタがVC++やれるとチヤホヤしてもらえっかも。
> なかなかいい考えですが、どこのメーカーでもC#でプログラムを組むようになってしまったら
> いくらVC++ができても使ってもらえそうにありません。
> それに今までVC++をやってきた人はたくさんいるのでチヤホヤされないかもですねぇ〜

VC++ に関して言えば僕も疑問です。
何かとても重大な変化が無い限り、利用範囲が縮小していくのは間違いないと思っています。

が、C++ 言語に関して言うと、組み込み系などの業界でまだまだ第一線の言語として使われる可能性は高いです。
この手の業界ってやっと C から C++ への移行をしているところがあるくらいですし。

例えばiアプリなんかは java で記述できますが、プラットフォームの制限がきついため、「記述言語が java」なだけで java の利便性を十二分に生かせるような書き方はとても出来ません。(アセンブラかと思いましたw)
個人的には、あれなら C++ で書いた方が遥かにマシだと思います。

引用返信 編集キー/
■2696 / inTopicNo.17)  Re[8]: コンポーネントの背景の透明化
□投稿者/ 渋木宏明(ひどり) (176回)-(2007/04/13(Fri) 14:31:33)
渋木宏明(ひどり) さんの Web サイト
>>使えるのはWindows XP + SP2とWindows Server 2003とVistaとLonghornだけです。
> そうですかぁ・・・2000がだめだと過去のものの改修時はOSからのセットアップになりそうですねぇ・・・

2000 で使えないとまだ少し厳しい面はありますが、2000 はサポート期限も切れていることですし、あともう少しじっと待っていれば。。。

わんくまでも WPF のセミナーがあるんで、都合が付くようなら出席してみてはどうでしょう?

>>でも、まこさんのやりたいことは書いてないかも...
> まだチョットしか見ていませんが面白そうなのでじっくりと見させていただきます。

WPF では特別なコードを書く必要は全くありません。
「背景色を透明」に設定したパネルに、好きに描画すればOK。

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -