2

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

使用 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);
}
4

2 回答 2

8

请参阅 Microsoft 的文章“关于静态控件”,尤其是这部分:

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

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

于 2013-08-12T16:31:28.453 回答
2

经过一番试验,看起来像设置和附加SS_NOTIFY样式Foo::CreateCtrl()让 MFC 调用Foo::OnLButtonUp().

我对这种风格设置有点困惑,特别是在阅读了这篇 SO 帖子之后MSDN 页面仅显示SS_NOTIFY“当用户单击或双击控件时发送父窗口 STN_CLICKED、STN_DBLCLK、STN_DISABLE 和 STN_ENABLE 通知代码。”

也许没有SS_NOTIFY样式,它不必接收消息,因为它们没有中继给父级?

无论如何,添加SS_NOTIFY样式似乎使它起作用!

于 2013-08-12T16:30:34.360 回答