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

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

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

Re[30]: フォームの表示方法


(過去ログ 20 を表示中)

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

■7596 / inTopicNo.1)  フォームの表示方法
  
□投稿者/ arion (1回)-(2007/09/11(Tue) 03:56:41)

分類:[C#] 

はじめまして。
Microsoft Visual C#.NETを使ってプログラミングを勉強しているarionといいます。
まだまだ初心者です。


現在ランチャのようなものを作りたいと思っています。
自分が理想としているものは、
・まず四角いフォームを表示させ(スタートボタン)、
・そのフォームの領域内でマウスをクリックしたまま領域の外に出ると、その方向に新しいフォームを表示させる。
(例:下方向に出たら、スタートボタンと同じ大きさのフォーム(マイドキュメントなどのアイコン)が1つ表示される)
・途中で方向を変えたらその方向にさらに表示される。

┌-┐ ┌――┐ ┌―――┐
└-┘→└――┘→└―――┘
 ↓         ↓
┌-┐      ┌―――┐
│-│      └――││
└-┘         └┘
 ↓
┌-┐
│-│
│-│
└-┘

このように、最初からたくさん表示されるのではなく、
領域を出た方向に1つずつ表示させていくアプリケーションを作成したいと思っています。

このようなことは実現可能でしょうか?

わかりずらかったら申し訳ないのですが、まわりに聞ける人がいないので困っています。
よろしくお願いします!


引用返信 編集キー/
■7597 / inTopicNo.2)  Re[1]: フォームの表示方法
□投稿者/ れい (118回)-(2007/09/11(Tue) 05:46:54)
No7596 (arion さん) に返信
> このように、最初からたくさん表示されるのではなく、
> 領域を出た方向に1つずつ表示させていくアプリケーションを作成したいと思っています。
>
> このようなことは実現可能でしょうか?

可能です。
矩形でないウィンドウになる場合はForm.Regionで設定したり、
WS_EX_LAYEREDスタイルを用いないといけません。
おそらくWS_EX_LAYEREDを用いるのがパフォーマンス的にもいいと思います。
「レイヤードウィンドウ」で調べてください。

ちょっと想像してみたんですが、なんか便利そうですね…。
ディレクトリ構造でも同じことができるといいかな。
引用返信 編集キー/
■7598 / inTopicNo.3)  Re[2]: フォームの表示方法
□投稿者/ arion (2回)-(2007/09/11(Tue) 07:13:38)
No7597 (れい さん) に返信

返信ありがとうございます!
助かります!!

> 矩形でないウィンドウになる場合はForm.Regionで設定したり、
> WS_EX_LAYEREDスタイルを用いないといけません。
> おそらくWS_EX_LAYEREDを用いるのがパフォーマンス的にもいいと思います。
> 「レイヤードウィンドウ」で調べてください。


自分の説明不足なんですが、作りたいフォームは
参考になる例として、CLaunchというランチャ(URL:http://hp.vector.co.jp/authors/VA018351/)のような見た目で、
このサイトのTOPページのランチャの絵で説明しますと、
例えば一番最初に表示されるのがIExplorerというアイコンだけで(このランチャのようなタブとかは要らないです。)、
マウスが下の領域に出たらマイコンのフォームが出て、マイコンのフォームから右にいったらマイネットのフォームが出る、
といったものを作りたいと思っています。

レイヤードウィンドウは使うべきなのでしょうか?
言っている事がわかりづらかったら申し訳ないのですがよろしくお願いします。



引用返信 編集キー/
■7599 / inTopicNo.4)  Re[3]: フォームの表示方法
□投稿者/ れい (119回)-(2007/09/11(Tue) 07:53:29)
No7598 (arion さん) に返信
> ■No7597 (れい さん) に返信
>
> 自分の説明不足なんですが、作りたいフォームは

いえ。説明不足ではありません。きちんと説明してると思います。
私はきちんと理解しているつもりです。

> レイヤードウィンドウは使うべきなのでしょうか?

はい。Formを組み合わせるのでも、Regionを使うのでもなく、
レイヤードウィンドウ1個で済ませるのがいいでしょう。

理由は下記2点。
・ウィンドウの縁、タイトルバー、コントロールボックスなどが要らない。
・ウィンドウの形を変える頻度が多い

Form.Regionだと縁などが描かれてしまいますので、自分で処理しないといけません。
また、形を変えるたびにちらつく場合があります。
複数のFormを組み合わせるのもちらついたり、重いのでダメです。

レイヤードなら、はじめから全部自分で描くので、余計なことを考えなくてすみます。
また、形を変えたときのちらつきはありません。(ちらつかずに1回の描画が重くなるだけ)

ランチャーですから、ちらついたり重かったりするのはいやですよね。
マウスを動かしたときにスムーズにアイコンが出てくるとかっこいいかな。
これなんかも、Regionではできません。

> 言っている事がわかりづらかったら申し訳ないのですがよろしくお願いします。

大丈夫です。明白にわかります。
いいのができたら使わせてください。
引用返信 編集キー/
■7606 / inTopicNo.5)  Re[4]: フォームの表示方法
□投稿者/ arion (3回)-(2007/09/11(Tue) 14:54:04)
>■No7597 (れい さん) に返信

返信ありがとうございます!

> はい。Formを組み合わせるのでも、Regionを使うのでもなく、
> レイヤードウィンドウ1個で済ませるのがいいでしょう。
>
> 理由は下記2点。
> ・ウィンドウの縁、タイトルバー、コントロールボックスなどが要らない。
> ・ウィンドウの形を変える頻度が多い
>
> Form.Regionだと縁などが描かれてしまいますので、自分で処理しないといけません。
> また、形を変えるたびにちらつく場合があります。
> 複数のFormを組み合わせるのもちらついたり、重いのでダメです。
>
> レイヤードなら、はじめから全部自分で描くので、余計なことを考えなくてすみます。
> また、形を変えたときのちらつきはありません。(ちらつかずに1回の描画が重くなるだけ)


れいさんの言うとおり確かにレイヤードウィンドウを使うとよさそうですね!
自分の言っている事がちゃんと伝わっているみたいで嬉しいです。

しかし自分で調べてみたのですがまだいまいち理解できません。
レイヤードウィンドウとはフォームを半透明とか透明にするものですよね?

> レイヤードウィンドウ1個で済ませるのがいいでしょう。
ということは作成するフォームは1つでよいということでしょうか?

最初その作成したフォームを透明にしておいて領域を出たらそこのアイコンだけを表示させるということでしょうか?

よろしくお願いします。
引用返信 編集キー/
■7611 / inTopicNo.6)  Re[5]: フォームの表示方法
□投稿者/ れい (122回)-(2007/09/11(Tue) 15:14:09)
No7606 (arion さん) に返信
> >■No7597 (れい さん) に返信
> しかし自分で調べてみたのですがまだいまいち理解できません。
> レイヤードウィンドウとはフォームを半透明とか透明にするものですよね?

いいえ。
それだけではありません。
様々な形状の物をデスクトップに表示したり、
それを動かしたり、そういったことができる仕組みのことです。

>>レイヤードウィンドウ1個で済ませるのがいいでしょう。
> ということは作成するフォームは1つでよいということでしょうか?

はい。
レイヤードウィンドウなフォーム一つで大丈夫です。

> 最初その作成したフォームを透明にしておいて領域を出たらそこのアイコンだけを表示させるということでしょうか?

「透明にしておく」というのはちょっと違いますね。
レイヤードウィンドウは何もしなければもともと全て透明、というか、何も表示されません。
(枠くらいは表示されたかな?)

「デスクトップと同じサイズの透明なビットマップに描く」というイメージですね。
そのビットマップはOSが管理してくれて、画面に自動で描画されます。
ですので、他の窓に隠されたりした場合の再描画は要りません。

描画方法が全然違うので、ButtonやTextBox、TreeViewなどはうまくやらないと動きません。
今回はそういったコントロールは必要ないですよね?

表示内容を変えたいとき、ウィンドウの外形を変えたいときに
画面に実際に表示したい内容のビットマップを作成し、
UpdateLayeredWindowに渡せばいいだけです。
透明色で塗られている場所は、実際に透明として出力され、
マウスのイベントなどもきちんと下の窓に伝わります。

引用返信 編集キー/
■7613 / inTopicNo.7)  Re[5]: フォームの表示方法
□投稿者/ 魔界の仮面弁士 (418回)-(2007/09/11(Tue) 15:23:51)
No7606 (arion さん) に返信
> 最初その作成したフォームを透明にしておいて領域を出たらそこのアイコンだけを表示させるということでしょうか?

特定の色で塗りつぶした Bitmap を用意して、それを Form に割り当てます。
Form の TransparencyKey にその色を指定すれば、フォーム全体が消えます。
その Bitmap の一部だけを別の色にしておけば、フォームの一部分だけが表示されます。

あとはマウス操作に応じて、Bitmap の塗りつぶし領域を変化させていったところ、
それっぽい動作になりました。

ただし、環境によっては透過してくれない場合がありますので、下記の対処方法を併用する必要があるかと。
http://support.microsoft.com/kb/822495
引用返信 編集キー/
■7617 / inTopicNo.8)  Re[6]: フォームの表示方法
□投稿者/ arion (4回)-(2007/09/11(Tue) 16:31:21)
No7613 (魔界の仮面弁士 さん) に返信

返信ありがとうございます!

> 特定の色で塗りつぶした Bitmap を用意して、それを Form に割り当てます。
> Form の TransparencyKey にその色を指定すれば、フォーム全体が消えます。
> その Bitmap の一部だけを別の色にしておけば、フォームの一部分だけが表示されます。

ここまではできました。

> あとはマウス操作に応じて、Bitmap の塗りつぶし領域を変化させていったところ、
> それっぽい動作になりました。

塗りつぶし領域を変化させるのはどのようにすればよろしいのでしょうか?
引用返信 編集キー/
■7618 / inTopicNo.9)  Re[7]: フォームの表示方法
□投稿者/ 魔界の仮面弁士 (419回)-(2007/09/11(Tue) 16:46:10)
No7617 (arion さん) に返信
> 塗りつぶし領域を変化させるのはどのようにすればよろしいのでしょうか?

Graphics.FromImage(対象Bitmap) で得た Grahpics に対して、
FillRectangle メソッドを実行してみてください。
引用返信 編集キー/
■7622 / inTopicNo.10)  Re[8]: フォームの表示方法
□投稿者/ arion (6回)-(2007/09/11(Tue) 17:59:44)
No7618 (魔界の仮面弁士 さん) に返信

返信ありがとうございます!

> Graphics.FromImage(対象Bitmap) で得た Grahpics に対して、
> FillRectangle メソッドを実行してみてください。

すいません。
試行錯誤してやってみましたが上手く実行できません。
記述の仕方がおかしいのかもしれないです。

新しいBitmapは用意する必要はあるのでしょうか?


もしよろしければ、
サンプルソースコードなどいただけないでしょうか?

よろしくおねがいします。
引用返信 編集キー/
■7623 / inTopicNo.11)  Re[6]: フォームの表示方法
□投稿者/ arion (8回)-(2007/09/11(Tue) 18:05:17)
No7597 (れい さん) に返信

返信ありがとうございます!


> 「透明にしておく」というのはちょっと違いますね。
> レイヤードウィンドウは何もしなければもともと全て透明、というか、何も表示されません。
> (枠くらいは表示されたかな?)
>
> 「デスクトップと同じサイズの透明なビットマップに描く」というイメージですね。
> そのビットマップはOSが管理してくれて、画面に自動で描画されます。
> ですので、他の窓に隠されたりした場合の再描画は要りません。

これは魔界の仮面弁士 さんが書いてくださったやり方でOKでしょうか?


> 描画方法が全然違うので、ButtonやTextBox、TreeViewなどはうまくやらないと動きません。
> 今回はそういったコントロールは必要ないですよね?

アイコンをクリックしたらその中身を表示したいのですが、それは実現可能だと思っていますが合っていますか?


> 表示内容を変えたいとき、ウィンドウの外形を変えたいときに
> 画面に実際に表示したい内容のビットマップを作成し、
> UpdateLayeredWindowに渡せばいいだけです。

これは何通りものbitmapを作ってその都度更新していく?ということでしょうか?


よろしくお願いします。
引用返信 編集キー/
■7624 / inTopicNo.12)  Re[9]: フォームの表示方法
□投稿者/ 魔界の仮面弁士 (420回)-(2007/09/11(Tue) 18:30:32)
No7622 (arion さん) に返信
> 新しいBitmapは用意する必要はあるのでしょうか?
Bitmap インスタンスを用意するのは、private Bitmap bmp = new Bitmap(〜, 〜); ですよね。
画面サイズは、Screen から得られます。

> サンプルソースコードなどいただけないでしょうか?
すみません。簡単な動作検証を行った後、すぐに消しちゃったんですよね…。(^_^;)
# ドラッグ位置に合わせて拡張することはできたけど、縮小処理まで書くのが面倒になったので。


で。今回の要件には適さないかも知れませんが、ドラッグ処理を伴わない手抜きな実装方法を:

(1) フォームの BorderStyle を None に設定しておきます。
(2) フォームに、Panel を 9 個貼ります。(縦横 3 つずつ、フォーム全体に隙間なく並べる)
(3) すべての Panel の BackColor を、任意の色に設定します。たとえば White とか。
(4) 中央の Panel のみ、Visible = true にし、それ以外は talse にします。
(5) フォームの TransparencyKey を、(2) で設定した色(White)にします。

このようにすると、フォームの中央部だけが表示された状態になるので、
あとはプログラムで、個々の Panel の Visible を 切り替えてやれば、
フォームの形が変化したように見えるかな…と。
引用返信 編集キー/
■7626 / inTopicNo.13)  Re[10]: フォームの表示方法
□投稿者/ 魔界の仮面弁士 (421回)-(2007/09/11(Tue) 18:56:35)
No7624 (魔界の仮面弁士) に返信
>>サンプルソースコードなどいただけないでしょうか?
> すみません。簡単な動作検証を行った後、すぐに消しちゃったんですよね…。(^_^;)
> # ドラッグ位置に合わせて拡張することはできたけど、縮小処理まで書くのが面倒になったので。

すみませんが、今は再度書き直す余力が無いので、コードの概要だけ書きます。
# 概要だけに、細かい意味が伝わらないかも知れませんが、そこは御容赦を。


その時の実験コードは、フォームを縦6個、横6個ぐらいの領域(セル)に見立てて、

  using (Graphics g = Graphics.FromImage( 背景指定用Bitmap ))
  using (Brush b = new SolidBrush( 標準の背景色 ))
  {
      // 一度、全部の領域を表示状態にする
      g.Clear(this.TransparencyKey);

      // CellArea は、各セルの表示状態を管理するための自作クラス
      // sheets は、それを管理するためのコレクションクラス
      foreach (CellArea cell in sheets)
      {
          if (cell.Visible)
          {
              // 可視領域だった場合は、その領域を背景色で塗りつぶす
              g.FillRectangle(b, cell.ClientRectangle);
          }
      }
  }

のようにして、BackgroundImage 用の Bitmap を再描画していました。
あとは、マウスのドラッグ処理に合わせて、MouseMove イベントあたりで、
sheets[行, 列].Visible を反転させる処理を書いた程度。

上記以外では、再描画目的でフォームの Invalidate も呼んでいたかも。

引用返信 編集キー/
■7627 / inTopicNo.14)  Re[7]: フォームの表示方法
□投稿者/ れい (123回)-(2007/09/11(Tue) 19:30:23)
No7623 (arion さん) に返信
> ■No7597 (れい さん) に返信
>
> これは魔界の仮面弁士 さんが書いてくださったやり方でOKでしょうか?

少し違いますが、
どちらも同じ仕組みを使っています。

> アイコンをクリックしたらその中身を表示したいのですが、それは実現可能だと思っていますが合っていますか?

アイコンの中身とは?

> これは何通りものbitmapを作ってその都度更新していく?ということでしょうか?

それでもいいですし、ファイルから読んでもいいですし、
自分でがりがり描いてもいいです。

引用返信 編集キー/
■7628 / inTopicNo.15)  Re[8]: フォームの表示方法
□投稿者/ arion (9回)-(2007/09/11(Tue) 19:53:04)
No7627 (れい さん) に返信

れいさん、魔界の仮面弁士さんありがとうございます!
すごく助かっています。

少し自分で取り組んでみたいと思います!
また深夜頃書き込みます。

よろしくお願いします。
引用返信 編集キー/
■7631 / inTopicNo.16)  Re[11]: フォームの表示方法
□投稿者/ 渋木宏明(ひどり) (352回)-(2007/09/11(Tue) 21:08:21)
渋木宏明(ひどり) さんの Web サイト
WPF を使った方が楽に希望通りの画面を作成できるんじゃないかと思うんですが、やっぱりそれじゃ駄目なんですよね。。。
引用返信 編集キー/
■7640 / inTopicNo.17)  Re[12]: フォームの表示方法
□投稿者/ れい (124回)-(2007/09/12(Wed) 08:29:44)
No7631 (渋木宏明(ひどり) さん) に返信
> WPF を使った方が楽に希望通りの画面を作成できるんじゃないかと思うんですが、やっぱりそれじゃ駄目なんですよね。。。

ダメなことないんでは?
むしろすごくいいことなんでは?

いまWPFを使うことのできる人で、
ランチャーを作りたいといって質問してくる人はまずいないだろうと
脳内で勝手に判断してただけですから。

ただ、参考資料が少ないので回答もめんどくさくなりますよね。
WPFのいい本というのも知りませんし。
いい参考URLも知りませんし。

ひどりさんがここで入門講座を開いてくれるなら
私もぜひ教えて欲しいです。
ぜひぜひ。
引用返信 編集キー/
■7642 / inTopicNo.18)  Re[13]: フォームの表示方法
□投稿者/ 渋木宏明(ひどり) (354回)-(2007/09/12(Wed) 08:57:13)
渋木宏明(ひどり) さんの Web サイト
> ただ、参考資料が少ないので回答もめんどくさくなりますよね。
> WPFのいい本というのも知りませんし。
> いい参考URLも知りませんし。
>
> ひどりさんがここで入門講座を開いてくれるなら
> 私もぜひ教えて欲しいです。
> ぜひぜひ。

んー、この辺なら Expression Blend いじってたら出きてしまうような。

MFC や Windows Forms の時もそうだったけど、テキトーにいじっていろいろ試してるうちになんとなーく出来る様になってたので、「正しい学習手順」てよくわかんないんですよね (^^;

電卓みたいな例題でいいのかな?

# 実は MFC の時、ヒトにはすすめるくせに、自分は Scribble を最後までやってないとゆーことは内緒ですw
引用返信 編集キー/
■7647 / inTopicNo.19)  Re[12]: フォームの表示方法
□投稿者/ 渋木宏明(ひどり) (355回)-(2007/09/12(Wed) 10:32:57)
渋木宏明(ひどり) さんの Web サイト
> WPF を使った方が楽に希望通りの画面を作成できるんじゃないかと思うんですが、やっぱりそれじゃ駄目なんですよね。。。

と、書いておいてアレですが (^^;

最初の記事をちゃんと読み直してみたんですが、要は四角いパネルみたいなウィンドウがマウスカーソルを追っかけて蛇のように表示されればいいわけですよね?

なら、Region とかややこしいことしないで、素直にトップレベルウィンドウをバンバン表示した方が簡単じゃない? そう何百枚も表示するわけでもないだろうし。

個々のパネルの角を丸くしたいとか言い出すと、1段も2段も難しくなってきますが。

引用返信 編集キー/
■7650 / inTopicNo.20)  Re[13]: フォームの表示方法
 
□投稿者/ 渋木宏明(ひどり) (356回)-(2007/09/12(Wed) 11:38:25)
渋木宏明(ひどり) さんの Web サイト
> なら、Region とかややこしいことしないで、素直にトップレベルウィンドウをバンバン表示した方が簡単じゃない? そう何百枚も表示するわけでもないだろうし。

簡単なサンプルを作ってみました。

http://hidori.jp/downloads/junktest/FormSnake-20070912.zip

ESC で終了します。
2枚目以降のパネルのどれかをクリックすると、MessageBox を表示して終了します。

手抜きなので

・既にパネルが存在しているエリアにもおかまいなしに新しいパネルを表示
・一度表示したパネルはマウスを戻しても消さない
・などなど

です (^^;


引用返信 編集キー/

次の20件>
トピック内ページ移動 / << 0 | 1 >>

管理者用

- Child Tree -