- PR -

Messengerのような画面制御について

投稿者投稿内容
extream
ベテラン
会議室デビュー日: 2005/12/26
投稿数: 83
投稿日時: 2007-06-06 09:52
環境
 VS2005 C#
 Windows Vista(ultimate)

メッセーンジャーでは、「Alt」キーを押下すると
 ・タイトルバー
 ・メニューバー
の表示/非表示が制御できます。
で、これと同じような制御をしようと思って、以下のようにコーディングしたのですが、Locationを変えているからだと思うのですが、とても画面がちらつきます。

---------------------------------------
// -------------
// Altキー押下時
// -------------
if (key == Keys.Alt)
{
int x;
int y;
Point before;
Point after;

// ------------------------------------
// 現在タイトルバーを表示していない場合
// ------------------------------------
if (this.FormBorderStyle == FormBorderStyle.None)
{
before = PointToScreen(this.Location);

this.FormBorderStyle = FormBorderStyle.Sizable; // タイトルバー表示
menu.Visible = true; // メニューバー表示

after = PointToScreen(this.Location);
}
else
{
before = PointToScreen(this.Location);

this.FormBorderStyle = FormBorderStyle.None;
menu.Visible = false;

after = PointToScreen(this.Location);
}
x = after.X - before.X;
y = after.Y - before.Y;

// 位置を変更
this.Location = new Point(this.Location.X - x, this.Location.Y - y);
}
---------------------------------------


画面をちらつかせないで表示位置を変更するにはどのような工夫をすればよいのでしょうか?


わかる方いたら、アドバイスよろしくお願いします。
まどか
ぬし
会議室デビュー日: 2005/09/06
投稿数: 372
お住まい・勤務地: ますのすし管区
投稿日時: 2007-06-06 10:24
#言うだけ言ってみる
Visibleの制御をFalseなら最初に、Trueなら最後にやるとか。
extream
ベテラン
会議室デビュー日: 2005/12/26
投稿数: 83
投稿日時: 2007-06-06 11:10
まどかさん、回答ありがとうございます。


>Visibleの制御を〜

menu.Visibleの事ですよね?
一応、まどかさんの言ったとおりにやってみたのですが、ちらついてしました。


なお、今気づいたのですが、メッセンジャーだとFORM領域の外にメニューバーが表示されていました。。。
(私のやり方だと、FORM領域内にメニューバーが表示されます(Dock=Top))


メッセンジャーと全く同じにする場合、Formの領域も変更する必要があるのでしょうか?
その場合、全コントロールの配置を変えなければならないような気が・・・



メッセンジャーと同じような画面制御を簡単にできる方法ってあるでしょうか?
れい
ぬし
会議室デビュー日: 2005/11/01
投稿数: 346
投稿日時: 2007-06-06 11:22
いろいろな手があります。

今のコードを利用するなら
FormのVisibleをいじるとらくでしょう。
BorderやMenuをいじるまえにForm.Visible=Falseとして、
位置を変えてからVisible=Trueにします。
これだと描画が1回ですので、あまりちらつきません。
1回は描画が行われるので、ちらっとはしますが。

Messengerでやっているのは、
非矩形ウィンドウを使う方法です。
UpdateLayeredWindow関数で調べたらよいと思いますよ。
まどか
ぬし
会議室デビュー日: 2005/09/06
投稿数: 372
お住まい・勤務地: ますのすし管区
投稿日時: 2007-06-06 11:29
#これも言うだけ言ってみる
あ、Form.Visibleと勘違いしてました。
Form.VisibleもFalseとTrueで囲んでみるとか。
あとはSuspendLayoutやResumelayoutとか。

描画系はよくわかんない。。。
れい
ぬし
会議室デビュー日: 2005/11/01
投稿数: 346
投稿日時: 2007-06-06 11:29
引用:

extreamさんの書き込み (2007-06-06 11:10) より:

なお、今気づいたのですが、メッセンジャーだとFORM領域の外にメニューバーが表示されていました。。。
(私のやり方だと、FORM領域内にメニューバーが表示されます(Dock=Top))



Windowの外には描けません。
メッセンジャーでは一見外にあるようにみえますが、
最大化や最小化、閉じるボタンなど、
普通ウィンドウの右上に表示されるコントロールボックスの要素を
クライアント領域に独自に描いているだけです。

非クライアント領域はレイヤードウィンドウで隠しているようです。

Vistaを用いているなら、影のつき方を見てください。
メニューが表示されているときと、
メニューが表示されていないときとで、
ウィンドウの影のつき方が異なるのがわかりますよ。

影がついていない時はレイヤードウィンドウで周りを隠しています。
extream
ベテラン
会議室デビュー日: 2005/12/26
投稿数: 83
投稿日時: 2007-06-06 15:33
まどかさん、れいさん、回答ありがとうございます。


ちらつきについていろいろ試行錯誤中ですが、メニューバーの表示位置について疑問がでてきました。


MFCでは、メニューバー左下からフォームのLocationが(0,0)で始まっていたと思いますが、C#ではメニューバーの左上からフォームのLocationが(0,0)となっていました。
(menustripクラスです。)

C#でもメニューバーの左下をフォームのLocationが(0,0)とする設定がができるでしょうか?

れい
ぬし
会議室デビュー日: 2005/11/01
投稿数: 346
投稿日時: 2007-06-06 16:08
引用:

extreamさんの書き込み (2007-06-06 15:33) より:
C#でもメニューバーの左下をフォームのLocationが(0,0)とする設定がができるでしょうか?



設定の問題でなく、使うコントロールの問題です。
MainMenuクラスを使えば従来と同様、
メニューがクライアント領域に所属しないようにできます。

スキルアップ/キャリアアップ(JOB@IT)