void CListCtrlPop::SetStrWindowText()
{
::PostMessage(m_wndStrEdited->GetSafeHwnd(),WM_KEYDOWN,13,0);
PostMessage(WM_SHOWWINDOW,0,0);
}
在这个函数里 执行到::PostMessage(m_wndStrEdited->GetSafeHwnd(),WM_KEYDOWN,13,0); 时 调试显示wndStrEdited为:0x00375618{CBaseEdit Hwnd=0x00020a58}。
而CBaseEdit代码如下:
class CBaseEdit : public CEdit
{
// Construction
public:
CBaseEdit();// Attributes
public:// Operations
public:// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CBaseEdit)
public:
virtual BOOL PreTranslateMessage(MSG* pMsg);
//}}AFX_VIRTUAL// Implementation
public:
CFont m_font;
BOOL m_breturn;
BOOL m_besc;
long m_dSetFocusValue;
long m_dKillFocusValue;
long kc_number;
BOOL m_bInputValid;
virtual ~CBaseEdit(); // Generated message map functions
protected:
virtual LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam);
//{{AFX_MSG(CBaseEdit)
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
afx_msg void OnKillFocus(CWnd* pNewWnd);
afx_msg void OnSetFocus(CWnd* pOldWnd);
afx_msg void OnChange();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
private:};那::PostMessage(m_wndStrEdited->GetSafeHwnd(),WM_KEYDOWN,13,0); 这条语句发送的消息是否是由CBaseEdit的对象来捕获的?那具体是执行哪个函数呢?
搞不懂郁闷了

解决方案 »

  1.   

    PostMessage是把消息放入指定窗口句柄所属线程的消息队列中,当线程从消息队列中取出该消息并处理时,会调用窗口句柄对应的WindowProc函数。
      

  2.   

    PostMessage 就我所知,是系统自动调用的.
      

  3.   

    PostMessage是把消息放入消息队列中,并不马上返回
    等到该消息被取出的时候 ,才调用相应的消息处理函数
    和SendMessage不一样
    后者是马上返回
      

  4.   

    PostMessage是把消息放入消息队列中,并且马上返回(所以在消息参数中如果传递指针就要注意指针指向内存的有效性) 
    SendMessage不一样,对于本进程是直接调用窗口消息函数,函数执行完才返回
      

  5.   

    执行当然是WindowProc,如果你的派生类每月特别处理,则由其父类处理,如果父类也没有处理,则再给上一级父类,直到DefWindowProc
      

  6.   

    PostMessage是把消息放入消息队列中,并且马上返回(所以在消息参数中如果传递指针就要注意指针指向内存的有效性)  
    SendMessage不一样,对于本进程是直接调用窗口消息函数,函数执行完才返回