none
WM_NCLBUTTONDOWNはどこで処理すべきですか? RRS feed

  • 質問

  • タイトルバーをクリックした時に一度だけOnIdle()内の関数を処理するフラグを立てています。

    WM_NCLBUTTONDOWNメッセージはMainFrm.cppででも処理できるのですがどちらで行うのがよいのでしょうか?

    BOOL CXXXApp::PreTranslateMessage(MSG* pMsg)
    {
        if (pMsg->message == WM_NCLBUTTONDOWN) {
            m_Idle = true;
        }
        return CWinApp::PreTranslateMessage(pMsg);
    }

    BOOL CXXXApp::OnIdle(LONG lCount)
    {
        if (m_Idle) {

             処理・・・

    m_Idle = false;
       }

        return CWinApp::OnIdle(lCount);
    }

    2010年11月4日 6:14

回答

  • 原理上、対象となる全てのウインドウのWM_NC・・・を処理したいのならPre・・・()で
    メインフレームのみのWM_NC・・・を処理したいのなら、メインフレームの当該コールバック=OnMessage( WM_NC・・・で、処理するのが普通です。

    2010年11月4日 7:24
  • 個人的な意見ですが、WM_NCLBUTTONDOWN ハンドラで実行するべきかと。

    PreTranslateMessage はハンドラの前に実行されている ( はず ) ので。

    それと、タイトルバーをクリックした場合、であるなら、WM_NCLBUTTONDOWN ハンドラ内から WM_NCHITTEST ハンドラを呼び出し、クリック位置がタイトルバーの上か、確認する作業も必要かと思われますので・・・。

    2010年11月4日 7:44

すべての返信

  • 原理上、対象となる全てのウインドウのWM_NC・・・を処理したいのならPre・・・()で
    メインフレームのみのWM_NC・・・を処理したいのなら、メインフレームの当該コールバック=OnMessage( WM_NC・・・で、処理するのが普通です。

    2010年11月4日 7:24
  • 個人的な意見ですが、WM_NCLBUTTONDOWN ハンドラで実行するべきかと。

    PreTranslateMessage はハンドラの前に実行されている ( はず ) ので。

    それと、タイトルバーをクリックした場合、であるなら、WM_NCLBUTTONDOWN ハンドラ内から WM_NCHITTEST ハンドラを呼び出し、クリック位置がタイトルバーの上か、確認する作業も必要かと思われますので・・・。

    2010年11月4日 7:44
  • お世話になります。

    最初はメインフレームのWM_NCLBUTTONUPハンドラで試みたのですがうまくいかず、PreTranslateMessagに変えたのですが駄目でした。

    WM_NCLBUTTONDOWNなら拾える事が分かり解決しましたが、はて???で質問させて頂きました。

    お陰様でメインフレームのWM_NCLBUTTONDOWN ハンドラを使う事がベストと分かりましたのでそちらに変更しました。

    アドバイス有り難うございました。

    2010年11月4日 9:49