CMyView からメッセージをCMainFrameへ送り、ハンドラ関数を実行させたい。

[戻る]
ガラ 2005/04/28(木) 20:22:10
OS XP, VC++ 6.0 PRO.

***CMyView 側のコーデイング

int CMyView::OnViewChangeMsgPost(void)
{
 VERIFY(GetParent()->PostMessage(WM_COMMAND, MAKEWPARAM(ID_SO_NEW, 0),0));
    return(0) ;
}

"CMyViewは、SDIを選択すると自動生成されるView の派生クラスで、ここから
CMainFrame へメッセージを送り対応するハンドラ関数を起動させたいのですが、
ハンドラ関数が実行されません。どこか間違ってますでしょうか?"
ちなみにCMyView の親ウインドウは、CMainFrameになるのでは、ないのでしょうか?"


*** CMainFrame 側のコーデイング
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
    //{{AFX_MSG_MAP(CMainFrame)
    ON_COMMAND(ID_SO_NEW,OnNew)
    //}}AFX_MSG_MAP
END_MESSAGE_MAP()

OnNew()
}
  :
  :
}

みょーん 2005/04/28(木) 21:08:42
ビューかドキュメントにそのコマンドのメッセージハンドラがありませんか?
あると横取りされてしまいます。

ttp://www.microsoft.com/japan/msdn/library/default.asp?
url=/japan/msdn/library/ja/vccore/html/_core_Command_Routing.asp

WIZ [E-Mail] 2005/04/28(木) 21:15:21
VC6 のヘルプで、CWnd::OnCommand と MAKEWPARAM を調べた限り、提示のコードの
以下の部分の MAKEWPARAM の使い方が間違っているのではないかと思います。

>  VERIFY(GetParent()->PostMessage(WM_COMMAND, MAKEWPARAM(ID_SO_NEW, 0),0));

正しくは MAKEWPARAM(0, ID_SO_NEW) だと思います。
# 試した訳ではないので、はずしていたらごめんなさい。

ガラ 2005/04/28(木) 21:52:47
[[解決]]
みょーんさん、WIZ さんありがとうございます。
動作から見るとWIZさんのご指摘は、あやまりで順番は、正しいようです。

みよーんさんのご指摘どおりで、MyView 内このメッセージと同じハンドラ関数がありま
した。
(私は、親ウインドウに送っているので、このMyView内のハンドラは、動作しないと考
えていましたが、みよーんさんのご指摘どおり横取りされているようです。)

みなさん、ありがとうございました。
かなり、考えていましたので、やっとの思いです。

古いスレッドには追加発言できません。