MFC VC ++ CStatic只接收WM_NCHITTEST

时间:2013-08-12 14:27:23

标签: visual-c++ mfc

我用C ++创建了一个小型MFC文档视图应用程序,但是在从CStatic继承的类中接收消息时遇到了一些麻烦。我已经设法创建CStatic衍生物,它在我的View上可见但是我的消息处理程序没有被触发。

使用Spy ++时,似乎该窗口仅接收WM_NCHITTEST,并且返回HTTRANSPARENT,根据MSDN表示:

“在同一个线程中另一个窗口当前覆盖的窗口中(该消息将被发送到同一线程中的基础窗口,直到其中一个窗口返回不是HTTRANSPARENT的代码)。”

以下是Spy ++的一篇文章:

<000001> 001D1350 S WM_NCHITTEST xPos:128 yPos:167
<000002> 001D1350 R WM_NCHITTEST nHittest:HTTRANSPARENT
<000003> 001D1350 S WM_NCHITTEST xPos:128 yPos:166
<000004> 001D1350 R WM_NCHITTEST nHittest:HTTRANSPARENT
<000005> 001D1350 S WM_NCHITTEST xPos:128 yPos:165
<000006> 001D1350 R WM_NCHITTEST nHittest:HTTRANSPARENT
<000007> 001D1350 S WM_NCHITTEST xPos:128 yPos:164
<000008> 001D1350 R WM_NCHITTEST nHittest:HTTRANSPARENT

这看起来很奇怪,因为CStatic衍生物是我观点中唯一的子窗口。我这样创建了它:

Create(pItem->Value->GetBuffer(), WS_CHILD | WS_VISIBLE | SS_CENTER, Rect, Parent);
ShowWindow(SW_SHOW);

其中Parent是指向CView的指针。

任何帮助都会非常感激。

编辑:

foo.h中

class Foo: public CStatic
{
    DECLARE_DYNAMIC(Foo)
public:
    Foo();
    virtual ~Foo();
    virtual void CreateCtrl(CWnd * Parent, POINT TopLeft, SIZE sz);

protected:
    DECLARE_MESSAGE_MAP()
public:
    afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
};

Foo.cpp中

void Foo::CreateCtrl(CWnd * Parent, POINT TopLeft, SIZE sz)
{
    CRect Rect(TopLeft, sz);
    Create(pItem->Value->GetBuffer(), WS_CHILD | WS_VISIBLE | SS_CENTER, Rect, Parent);
    ShowWindow(SW_SHOW);
}

BEGIN_MESSAGE_MAP(Foo, CStatic)     
    ON_WM_LBUTTONUP()
END_MESSAGE_MAP()

void Foo::OnLButtonUp(UINT nFlags, CPoint point)
{   
    AfxMessageBox("Hello World!");
    __super::OnLButtonUp(nFlags, point);
}

2 个答案:

答案 0 :(得分:8)

请参阅Microsoft的文章"About Static Controls",特别是此部分:

  

WM_NCHITTEST:如果控件样式为SS_NOTIFY,则返回HTCLIENT;否则,返回HTTRANSPARENT。

一旦窗口从WM_NCHITTEST返回HTTRANSPARENT,所有进一步的鼠标消息都会以Z顺序进入其下面的窗口;在您的情况下,父视图。就鼠标处理而言,窗口是“透明的”。

答案 1 :(得分:2)

经过一些实验,看起来设置SS_NOTIFY中的其他Foo::CreateCtrl()样式会让MFC调用Foo::OnLButtonUp()

我对这种风格设置有点困惑,特别是在阅读this SO post之后; SS_NOTIFY的{​​{3}}只是说“当用户点击或双击控件时,发送父窗口STN_CLICKED,STN_DBLCLK,STN_DISABLE和STN_ENABLE通知代码。”

也许没有SS_NOTIFY样式,它不必接收消息,因为它们没有转发给父母?

无论如何,添加SS_NOTIFY样式似乎使其有效!