最大化したウインドウをタイトルバーでドラッグして移動させるのを禁止したいのですが、うまくいきません!どなたかご教授下さい。
現在
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で質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) Vba LongPtrについて教えてください 2 2022/08/19 11:14
- その他(OS) MacのFinder操作について 2 2022/07/13 07:29
- Chrome(クローム) Google Chromeのブラウザ(PC)ウインドウの移動について 3 2022/07/19 15:14
- JavaScript ソースコードのいじる場所が分かりません。 1 2022/12/23 02:06
- PDF Just PDF 5 proでポップアップしたファイル名がつきまとう 2 2022/12/18 09:56
- その他(スマホアプリ・スマホゲーム) 【Androidアプリのスクリーンショットが禁止されているアプリのスクリーンショット 1 2023/02/18 09:04
- Google Maps googleストリートビューで大きい黒枠のウインドウが邪魔 2 2023/02/15 21:47
- ノートパソコン ノートパソコンに別のモニターをつないでいるのですが・・・。」 3 2022/12/08 07:34
- Visual Basic(VBA) QRコード作成マクロについて 3 2022/11/26 16:55
- Windows 10 Windows10環境にてWindowsUpdate後の再起動を完全に抑止する方法はございますか? 10 2023/06/16 09:57
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【gcc・cygwin】multiple defin...
-
VC++でGetKeyboardStateがうま...
-
Notepad++の関数リスト表示の変...
-
C# KeyDownイベントでショート...
-
多重定義が起きている?--lnk20...
-
静的でないメンバ関数の呼び出...
-
既定のコンストラクタがありま...
-
戻り値を返す関数の前に(void)...
-
gcc: incompatible pointer type
-
クラス間でのクラスの共有?
-
アドレスを指定して関数を呼び...
-
スレッドの作成について(pthre...
-
コンパイルエラー: LNK2001
-
void*型の配列について
-
AKI-h8 3069f C言語 HEW マイ...
-
const_castのつかいどころを教...
-
static constメンバ変数(配列)...
-
ソケット通信時のWSACleanup処...
-
C言語 プロトタイプ宣言
-
‘*’をツリー状に表示しろという...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
【gcc・cygwin】multiple defin...
-
int main()、void main()、void...
-
戻り値を返す関数の前に(void)...
-
既定のコンストラクタがありま...
-
Notepad++の関数リスト表示の変...
-
ArduinoでMouse関数を使用して...
-
多重定義が起きている?--lnk20...
-
C++にてtemplateで受け取った任...
-
静的でないメンバ関数の呼び出...
-
C# Controls.Addで動的に配置し...
-
const_castのつかいどころを教...
-
(void)0 はどんな意味ですか
-
C# KeyDownイベントでショート...
-
gcc: incompatible pointer type
-
C#でラジオボタンを設定に記録...
-
VC++でGetKeyboardStateがうま...
-
C言語 ① 5秒間 1秒間隔で点滅を...
-
void*型の配列について
-
GDI+の使用方法について
-
DirectInput でのエラー
おすすめ情報