- - PR -
Messengerのような画面制御について
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2007-06-06 17:06
れいさん、回答ありがとうございます。
MainMenuコントロールの存在を知りませんでした。。。 MainMenuを使うことで思ったような動作をできそうだと思ったのですが、MainMenuクラスには ・Visible が存在しませんでした。 タイトルバーを非表示にするには、やはりいったんDisposeして、再度表示する時にnewしなければならないでしょうか? | ||||||||
|
投稿日時: 2007-06-06 17:23
自己レスですいません。
> ・Visible >が存在しませんでした。 フォームの ・Menu にMainMenuをセットしなければ表示されないことがわかりました。 表示する時 ・This.Menu = mainMenu; // MainMenuクラスを設定 表示しない時 ・This.Menu = null; 上記で、表示/非表示は制御できました m(__)m ただ、相変わらず画面がすごくちらついてしいます。。。 引き続き、いろいろ試してみます。 | ||||||||
|
投稿日時: 2007-06-06 23:51
LayeredWindowよりSetWindowRgnのほうがよさそうです。
これで再描画はおきません。 縁がないときはサイズ変更できないとか、 xボタンがないとか、 その辺なんとかしないといけませんが。 [ メッセージ編集済み 編集者: れい 編集日時 2007-06-07 00:10 ] | ||||||||
|
投稿日時: 2007-06-07 01:58
Form.Region では駄目です? | ||||||||
|
投稿日時: 2007-06-07 02:56
? 投稿したコードではControl.Region使ってますよ。 Control.Regionだと再描画されてしまいますが、 SetWindowRgnだと再描画を1回防ぐことができるのでその分得ですが、 そのためにアンマネージ使うのもめんどくさいので Regionプロパティでいいんじゃないでしょうか。 試してみましたがちらつきはどっちも見えませんでした。 | ||||||||
|
投稿日時: 2007-06-09 13:07
れいさん、渋木宏明(ひどり)さん回答ありがとうございます。
返答遅れて申し訳ありませんでした m(__)m れいさんが提示してくれたソースで実際に確認してみたところ、切替時のちらつきはほぼ皆無となりました。 同時にメニューバーも非表示にしてくれるので、この動きは非常に助かります。 Form.Regionというプロパティは今まで使ったことないので、提示いいただいたソースでなぜちらつかなくなったのか今後のために調べてみます。 とても助かりました。 ありがとうございました。 | ||||||||
|
投稿日時: 2007-06-09 14:43
たぶたびの質問で申し訳ありません。
提示していただいた方法では画面にちらつきがないので、この方法で実装しようかと思っていたのですが、フォーム移動は座標値を取得することでできたのですが、 ・画面サイズ変更 のロジックが、 ・this.FormBorderStyle = FormBorderStyle.None; でタイトルバーを表示/非表示制御していた時のロジックだと異常な動きをするようになってしまいました。 おそらくフォームの制御方法を変えたからだと思いますが、今の動きが把握できてなくて。。。 ↓ ↓ (長くなるので、横方向の処理のみ抜粋) ↓ // ------------------ // フォームサイズ取得 // ------------------ int size = SystemInformation.FrameBorderSize.Width; int rightPos = this.ClientRectangle.Width - size; Point p = e.Location; // ---------------------------------- // フォームサイズ変更処理中でない場合 // ---------------------------------- if (サイズ変更処理中) ←マウスUpイベントで処理を解除しています。 { // ------------------------------ // カーソル位置で表示カーソル変更 // ------------------------------ if (p.X <= size) { this.Cursor = Cursors.SizeWE; isRightBound = false; } else if (rightPos <= p.X) { this.Cursor = Cursors.SizeWE; isRightBound = true; } else { this.Cursor = Cursors.Default; isRightBound = false; } } else { // ------------------ // 標準カーソルの以外 // ------------------ if (this.Cursor != Cursors.Default) { p = PointToScreen(e.Location); Rectangle rect = this.Bounds; // ---------- // 右辺選択時 // ---------- if (isRightBound) { rect.Width = e.Location.X; } else { rect.X = p.X; rect.Width -= e.Location.X; } this.Bounds = rect; } } ↑ ↑ ↑ 上記の場合、まずフォームの外枠(左・下・右)が表示されてしまいます。。。 なんとなくですが、フォームのサイズ自体が変わらずに可視範囲だけ狭まるような動きになっているみたいです。(フォーム端を判別する処理に入らなくなります。) 今デバッグしながら調査しているのですが、もしスマートなサイズ変更方法があればアドバイスいただきたいと思い、書き込みました。 わかる方いたら、ご指導願います。 よろしくお願いします。 | ||||||||
|
投稿日時: 2007-06-09 19:46
Windowsアプリは16bitの時代からの歴史の上になりたってますので、 こうしたい場合はこうする、 というような鉄則がたくさんあります。 一見で実現できそうで、実はうまくいかない、 みたいな場合は、違う簡単な実現方法がある場合が多々あります。 簡単な実現方法がない場合は、絶対に無理だったり。 extreamさんのコードのどこがうまくいかないかは試してないのでわかりませんが、 MouseDownやUpのイベントで移動やリサイズを行っても、 まともにうごきません。 #昔散々がんばって無理だったので、見たくもない・・・ サイズ変更は以下のようなコードを用いるのが簡単です。 私はForm系のアプリはVBなので、VBのコードですが。
どういう意味のコードかは、説明めんどくさいので 自分で調べてください。 あとアドバイスがひとつ。 フォームの移動にはHTCAPTIONを使うといいですよ。 |