C#で作ったアプリケーションのウィンドウが必ずスクリーンの中に収まるようにしたいのですが、何かセオリーのようなものはありますでしょうか。(ウィンドウズのプログラムであればVC++やVBでも同じかもしれませんが)


ウィンドウの"Move"イベントのコールバック関数を作り、位置がスクリーン外にはみ出しているようならスクリーン内に収まるように移動させる処理を作ったのですが、あくまで移動した後にスクリーン内に飛ぶ動きになるため、チラチラして見苦しいのです。

よろしくお願いします。

回答の条件
  • 1人10回まで
  • 登録:2006/12/04 18:17:05
  • 終了:2006/12/05 22:08:53

回答(2件)

id:llusall No.1

llusall回答回数505ベストアンサー獲得回数612006/12/04 22:38:09

ポイント50pt

他言語ですが、このへんのWIN32APIを利用すれば、移動を抑止できるかもです。

試してないので、すみませんが・・・

はずしていたら、すみません。


Delphiのサンプル

ウインドウを移動できないようにする

* GetSystemMenu(システムメニューのハンドルを取得する)

* DeleteMenu(メニューの項目を削除する)


C++のサンプル

SDK サンプルプログラム ウィンドウを移動させない

DeleteMenu(GetSystemMenu(hWnd,false),SC_MOVE,MF_BYCOMMAND);

id:llusall No.2

llusall回答回数505ベストアンサー獲得回数612006/12/05 01:16:39

ポイント50pt

再回答ですみません。


WIN32APIの呼出ですが、こんな感じでいかがでしょうか?

当方、「.NET」に詳しくないのですが、

参考・ヒントになるかと思いまして回答してみました。

見当はずれでしたら、ポイントは不要です。


// Win32 APIのインポート

[ DllImport("USER32.DLL") ]

private static extern IntPtr GetSystemMenu(IntPtr hWnd, UInt32 bRevert);

[ DllImport("USER32.DLL") ]

private static extern UInt32 RemoveMenu(IntPtr hMenu, UInt32 nPosition, UInt32 wFlags);


// [移動]のメニューを削除するための値

private const UInt32 SC_MOVE = 0x0000F010;

private const UInt32 MF_BYCOMMAND = 0x00000000;


//システムメニューのハンドルを取得する

IntPtr hMenu = GetSystemMenu(this.Handle, 0);

//「移動」のメニューを削除

RemoveMenu(hMenu, SC_MOVE, MF_BYCOMMAND);


※APIのコールは、ここを参考にしました。

id:nori_0000

llusallさんいつもご回答ありがとうございます!

説明不足ですみません。

ウィンドウのドラッグはしたいのです。

ただし、必ず画面内に収まることが条件になります。

要件を箇条書きにしますと、

・ウィンドウをドラッグで移動させられること。

・ウィンドウサイズは固定とする。

・ウィンドウを画面の外に行かせず、

 必ずウィンドウ全体がプライマリスクリーンに

 表示されていること。

となります、この条件のなかで良い方法をご存知でしょうか。

2006/12/05 12:53:12
  • id:nori_0000
    画面外にウィンドウをドラッグしようとしても端で止まっているイメージでしたが、結局ボタンを離して移動を終えたときに画面外であれば画面内に移動させる処理で対応しました。
  • id:nori_0000
    ||usa||さん、今回もありがとうございました。
    プログラム関連で時々質問する事があると思いますので、またお力貸して下さい。
  • id:llusall
    すみませんでした。
    はずさないように気をつけます。^^;

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません