アプリ版:「スタンプのみでお礼する」機能のリリースについて

最大化したウインドウをタイトルバーでドラッグして移動させるのを禁止したいのですが、うまくいきません!どなたかご教授下さい。

現在
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

以上、よろしくお願いします。

A 回答 (3件)

 こんばんは。

御礼頂きました。

 すっかり見落としていました。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)
{
//キャプションのダブルクリックを防ぐ為、何もしなくて良い
}
    • good
    • 0
この回答へのお礼

詳細な回答、ありがとうございます。

WM_MOVINGやWM_NCLBUTTONDBLCLKのメッセージは、参考にしている「新VisualC++6.0入門」で存在を確認していましたので、ClassWizardでWM_MOVEを追加して変更してみました。

「最大化・最小化」ボタンの削除は、最初はプロパティ設定で行っていましたが、タイトルバー上でのダブルクリックの対処を試行錯誤している途中で、プログラム内からのスタイルチェンジにしてました。

No.3の方の回答方法でClassWizardで追加出来るようですが、知識を身に付ける為、記述して貰った方法も試してみます。

ありがとうございました。

お礼日時:2009/10/09 09:42

WM_NCLBUTTONDBLCLKなどの ウィンドウ用に区分されたメッセージマップは


クラスウィザードの『クラス情報』タブの『メッセージフィルタ』を『ウィンドウ』に変更すればクラスウィザードで表示されますよ
    • good
    • 0
この回答へのお礼

回答、ありがとうございます。

>クラスウィザードの『クラス情報』タブの『メッセージフィルタ』を『ウィンドウ』に変更すればクラスウィザードで表示されますよ
確認出来ました。いろんなサイトを調べている時、「これがVC++6.0でも使えたらなあ~」と思っていたものが多々ありました。

この方法を教えて頂いたお陰で、今後の作業がかなりスムーズになる予感がします。

ありがとうございました。

お礼日時:2009/10/09 09:46

 こんばんは。



 WM_MOVINGをオーバーライドして、以下の様にすれば移動を抑止出来ると思います。

void CTestDlg::OnMoving(UINT fwSide, LPRECT pRect)
{
//CDialog::OnMoving(fwSide, pRect);
// TODO: ここにメッセージ ハンドラ コードを追加します。

this->GetWindowRect(pRect);
}

 後、「2.WindowProc()内」の処理は不要ですので、削除した方が良いと思います。
    • good
    • 0
この回答へのお礼

早速の回答、ありがとうございます。

>WM_MOVINGをオーバーライドして、以下の様にすれば移動を抑止出来ると思います。
まだVC++を始めて1年弱で、オーバーライドが良く分からなかったので、物は試しだと思い、とりあえずClassWizardでWM_MOVEを追加し、
MOVEをMOVING変えてみたところ、思い通りの動作をしてしまいました。

>後、「2.WindowProc()内」の処理は不要ですので、削除した方が良いと思います。
この処理を外して、タイトルバーをダブルクリックすると、ほんの気持ちだけウインドウが動いてしまいます。

ついでにもう一つ質問ですが、左上のアイコンクリックでメニューを表示し、最大化を選ぶと、タスクバーを隠してしまうのですが、これは仕様ですか?

お礼日時:2009/10/08 20:12

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!