最大化したウインドウをタイトルバーでドラッグして移動させるのを禁止したいのですが、うまくいきません!どなたかご教授下さい。
現在
1.OnInitDialog()内
・ウインドウを最大化
this->ShowWindow(SW_SHOWMAXIMIZED);
・最大化,最小化ボタン消去、サイズ変更禁止
lStyle = GetWindowLong( this->m_hWnd, GWL_STYLE );
lStyle &= ~WS_MINIMIZEBOX;
lStyle &= ~WS_MAXIMIZEBOX;
lStyle &= ~WS_SIZEBOX;
SetWindowLong( this->m_hWnd, GWL_STYLE, lStyle );
2.WindowProc()内
・タイトルバーでのダブルクリックを無視
if( message == WM_NCLBUTTONDBLCLK ){
return TRUE;
}
しかし、ウインドウをタイトルバーでドラッグして移動を禁止する事が出来ません。
何か方法は無いのでしょうか?
環境
WindowsXP Pro SP3
VC++6.0 SP6
以上、よろしくお願いします。
No.2ベストアンサー
- 回答日時:
こんばんは。
御礼頂きました。すっかり見落としていました。VC6.0の場合、ClassWizardからOnMoving()等をオーバーライドする事が出来ないので、自前でクラスに追加していかないといけませんでした。
更に、WM_MOVINGのみで片付くものではありませんでした。
・オーバーライドが良く分からなかったので、物は試しだと思い、とりあえずClassWizardでWM_MOVEを追加し、MOVEをMOVING変えてみたところ、思い通りの動作をしてしまいました。
WM_MOVINGを自前で追加する事になります。
・この処理を外して、タイトルバーをダブルクリックすると、ほんの気持ちだけウインドウが動いてしまいます。
WM_NCLBUTTONDBLCLKを自前で追加する事になります。中身の処理をカラッポにします。
・ついでにもう一つ質問ですが、左上のアイコンクリックでメニューを表示し、最大化を選ぶと、タスクバーを隠してしまうのですが、これは仕様ですか?
移動抑止の処理が不完全である為に起こっている現象だと思います。
後、「最大化・最小化」ボタンの削除は、プログラム内からスタイルチェンジで行うのではなく、ダイアログエディタ上のプロパティ設定で行います。
この様にする事で、「最大化・最小化」ボタンが、元より表示されなくなります。
又、「最大化・最小化」ボタンが無くなると、左上のアイコンクリックでメニュー表示の中に、「最大化・最小化」のメニュー項目が表示されなくなります。
VC6.0にてもう一度やり直して見たので、以下を参考にして見て下さい。何れもClassWizardから追加出来ないので、自前で追加します。
// NoResizeDlg.h : ヘッダー ファイル
//
class CNoResizeDlg : public CDialog
{
// 構築
public:
CNoResizeDlg(CWnd* pParent = NULL);// 標準のコンストラクタ
// ダイアログ データ
//{{AFX_DATA(CNoResizeDlg)
enum { IDD = IDD_NORESIZE_DIALOG };
// メモ: この位置に ClassWizard によってデータ メンバが追加されます。
//}}AFX_DATA
// ClassWizard は仮想関数のオーバーライドを生成します。
//{{AFX_VIRTUAL(CNoResizeDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX);// DDX/DDV のサポート
//}}AFX_VIRTUAL
// インプリメンテーション
protected:
HICON m_hIcon;
// 生成されたメッセージ マップ関数
//{{AFX_MSG(CNoResizeDlg)
virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
afx_msg void OnMoving(UINT nSide, LPRECT lpRect);//追加
afx_msg void OnWindowPosChanging( WINDOWPOS* lpwndpos );//追加
afx_msg void OnNcLButtonDblClk(UINT nHitTest, CPoint point);//追加
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
// NoResizeDlg.cpp : ソース ファイル
//
BEGIN_MESSAGE_MAP(CNoResizeDlg, CDialog)
//{{AFX_MSG_MAP(CNoResizeDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_WM_MOVING()//追加
ON_WM_WINDOWPOSCHANGING()//追加
ON_WM_NCLBUTTONDBLCLK()//追加
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
void CNoResizeDlg::OnMoving(UINT nSide, LPRECT lpRect)
{
this->GetWindowRect(lpRect);
}
void CNoResizeDlg::OnWindowPosChanging(WINDOWPOS* lpwndpos)
{
//タスクバーを除いた領域を求める
RECT rc;
::SystemParametersInfo(SPI_GETWORKAREA, sizeof(RECT), &rc, 0);
::AdjustWindowRectEx(&rc, this->GetStyle(), this->GetMenu() != NULL, this->GetExStyle());
if(lpwndpos->cy > rc.bottom)
lpwndpos->cy = rc.bottom;
CDialog::OnWindowPosChanging(lpwndpos);
}
void CNoResizeDlg::OnNcLButtonDblClk(UINT nFlags, CPoint point)
{
//キャプションのダブルクリックを防ぐ為、何もしなくて良い
}
詳細な回答、ありがとうございます。
WM_MOVINGやWM_NCLBUTTONDBLCLKのメッセージは、参考にしている「新VisualC++6.0入門」で存在を確認していましたので、ClassWizardでWM_MOVEを追加して変更してみました。
「最大化・最小化」ボタンの削除は、最初はプロパティ設定で行っていましたが、タイトルバー上でのダブルクリックの対処を試行錯誤している途中で、プログラム内からのスタイルチェンジにしてました。
No.3の方の回答方法でClassWizardで追加出来るようですが、知識を身に付ける為、記述して貰った方法も試してみます。
ありがとうございました。
No.3
- 回答日時:
WM_NCLBUTTONDBLCLKなどの ウィンドウ用に区分されたメッセージマップは
クラスウィザードの『クラス情報』タブの『メッセージフィルタ』を『ウィンドウ』に変更すればクラスウィザードで表示されますよ
回答、ありがとうございます。
>クラスウィザードの『クラス情報』タブの『メッセージフィルタ』を『ウィンドウ』に変更すればクラスウィザードで表示されますよ
確認出来ました。いろんなサイトを調べている時、「これがVC++6.0でも使えたらなあ~」と思っていたものが多々ありました。
この方法を教えて頂いたお陰で、今後の作業がかなりスムーズになる予感がします。
ありがとうございました。
No.1
- 回答日時:
こんばんは。
WM_MOVINGをオーバーライドして、以下の様にすれば移動を抑止出来ると思います。
void CTestDlg::OnMoving(UINT fwSide, LPRECT pRect)
{
//CDialog::OnMoving(fwSide, pRect);
// TODO: ここにメッセージ ハンドラ コードを追加します。
this->GetWindowRect(pRect);
}
後、「2.WindowProc()内」の処理は不要ですので、削除した方が良いと思います。
早速の回答、ありがとうございます。
>WM_MOVINGをオーバーライドして、以下の様にすれば移動を抑止出来ると思います。
まだVC++を始めて1年弱で、オーバーライドが良く分からなかったので、物は試しだと思い、とりあえずClassWizardでWM_MOVEを追加し、
MOVEをMOVING変えてみたところ、思い通りの動作をしてしまいました。
>後、「2.WindowProc()内」の処理は不要ですので、削除した方が良いと思います。
この処理を外して、タイトルバーをダブルクリックすると、ほんの気持ちだけウインドウが動いてしまいます。
ついでにもう一つ質問ですが、左上のアイコンクリックでメニューを表示し、最大化を選ぶと、タスクバーを隠してしまうのですが、これは仕様ですか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
ロボットの住む世界で流行ってる罰ゲームとは?
-
フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
あなたが普段思っている「これまだ誰も言ってなかったけど共感されるだろうな」というあるあるを教えてください
-
映画のエンドロール観る派?観ない派?
映画が終わった後、すぐに席を立って帰る方もちらほら見かけます。皆さんはエンドロールの最後まで観ていきますか?
-
海外旅行から帰ってきたら、まず何を食べる?
帰国して1番食べたくなるもの、食べたくなるだろうなと思うもの、皆さんはありますか?
-
天使と悪魔選手権
悪魔がこんなささやきをしていたら、天使のあなたはなんと言って止めますか?
-
作成したウインドウのサイズを固定するには?
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VC++でGetKeyboardStateがうま...
-
C++にてtemplateで受け取った任...
-
【gcc・cygwin】multiple defin...
-
静的でないメンバ関数の呼び出...
-
C++ 静的クラスの役割が分からない
-
H8マイコンのシリアル通信につ...
-
二重定義の回避法
-
LNK2019:未解決の外部シンボル ...
-
メンバ関数(メソッド)をマル...
-
コンパイルエラー
-
pictureboxの画像を削除するには?
-
Arduinoでコンパイルエラーにつ...
-
クラス間でのクラスの共有?
-
4桁7セグでダイナミック点灯
-
CTabCtrl:TABインデックス単位...
-
C# Controls.Addで動的に配置し...
-
C#でトーンカーブの作成
-
関数で整数の受け渡しについて。
-
2÷3などの余りについて
-
C言語 エラーの原因がわからな...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
【gcc・cygwin】multiple defin...
-
C++にてtemplateで受け取った任...
-
戻り値を返す関数の前に(void)...
-
静的でないメンバ関数の呼び出...
-
多重定義が起きている?--lnk20...
-
既定のコンストラクタがありま...
-
C# Controls.Addで動的に配置し...
-
int main()、void main()、void...
-
void*型の配列について
-
(void)0 はどんな意味ですか
-
gcc: incompatible pointer type
-
C# KeyDownイベントでショート...
-
C言語 ① 5秒間 1秒間隔で点滅を...
-
Notepad++の関数リスト表示の変...
-
コールバックって・・・
-
マルチメディアタイマーの使用方法
-
_beginthreadにて発生するコン...
-
C#でラジオボタンを設定に記録...
-
VC++でGetKeyboardStateがうま...
-
typedef unsigned int UINT;が...
おすすめ情報