2011-07-28 40 views
1

下面是代码:用户定义的消息

//h file 
class MyClass: public CView 
{ 
public: 
    afx_msg LRESULT OnMyMess(WPARAM, LPARAM); 
} 

//cpp file 
BEGIN_MESSAGE_MAP(MyClass, CView) 
    ON_MESSAGE(WM_USER+100, OnMyMess) 
END_MESSAGE_MAP() 

LRESULT OnMyMess(WPARAM, LPARAM) 
{return 0}; 


//Somewhere in the programm 
SendMessage(WM_USER+100, 0 ,0); 

为什么没有程序中调用的处理程序?

UPD:WinXP中,MS VS 2003

+0

由于答案似乎解决了您的问题,请接受其中一项。 – Jon

+1

请使用WM_APP而不是WM_USER - 某些Windows控件使用WM_USER范围内的消息,这是不幸的。 –

回答

2

首先,

LRESULT OnMyMess(WPARAM, LPARAM) 
{return 0;} 

LRESULT MyClass::OnMyMess(WPARAM, LPARAM) 
{return 0;} 

但我想这只是一个错字。

其次,SendMessage应该按照预期工作,只要它在你调用的MyClass中;否则,您应该指定您要发送消息的窗口。

+0

谢谢你的回答,你是对的。我调用了错误窗口的SendMessage。 – fogbit

0

尝试:

//h file 
#define CUSTOM_MESSAGE WM_USER + 100 

class MyClass: public CView 
{ 
public: 
    afx_msg LRESULT OnMyMess(WPARAM, LPARAM); 
} 

//cpp file 
BEGIN_MESSAGE_MAP(MyClass, CView) 
    ON_MESSAGE(CUSTOM_MESSAGE, OnMyMess) 
END_MESSAGE_MAP() 

LRESULT OnMyMess(WPARAM, LPARAM) 
{return 0}; 


//Somewhere in the programm 
SendMessage(CUSTOM_MESSAGE, 0 ,0); 
+1

谢谢你的回答,但这不起作用。我得到相同的结果,没有处理程序被调用。 – fogbit

+1

我不确定这将如何进行更改,尽管 –

+1

这不能解决问题,但对用户定义的消息*使用#define或const声明是一个好主意。 – crashmstr

3

也许你从没有为MyClass的方法调用SendMessage(),但MyMainFrame,例如,所以你要发送的消息到错误的窗口。 如果是这样的话,只需添加成员变量:

m_myView.SendMessage(WM_USER+100,0,0); 

而且你没有忘记MyClass的::从

LRESULT MyClass::OnMyMess(WPARAM, LPARAM) 
{return 0}; 
+0

看来你是对的,谢谢!但是它有什么意义呢?没有办法在程序的任何地方键入SendMessage(....)并调用所有处理程序?为什么我需要SendMessage,如果我可以直接调用具有指针或变量的类方法? – fogbit

+0

有*成员* SendMessage函数,并且还有一个全局的win32 API需要一个HWND参数。使用[:: SendMessage(hWnd,msg,wParam,lParam)](http://msdn.microsoft.com/zh-cn/library/ms644950%28v=VS.85%29.aspx)。 – crashmstr

+0

窗口消息不像其他语言的事件。它们被发送到一个窗口(或一个线程)。所以当你处理一条消息时,你可以在一个窗口中进行。如果你需要一个全局的SendMessage(),你可以在程序的任何地方尝试GetMainWnd() - > SendMessage(...)。 – rodrigo