【问题标题】:MFC VC++ CStatic only receiving WM_NCHITTESTMFC VC++ CStatic 只接收 WM_NCHITTEST
【发布时间】:2013-08-12 14:27:23
【问题描述】:

我在 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);
}

【问题讨论】:

  • 哪些消息处理程序没有被触发?您是否使用 CStatic 搜索过 SO?
  • 主要的是OnLButtonUp。我确实环顾了一下,尽管有些问题很相似,但我认为它们与我的不同。
  • 您能否发布一些代码,说明您如何声明 CStatic 派生类和 OnLButtonUp 处理程序?
  • 这就是你要找的吗?

标签: visual-c++ mfc


【解决方案1】:

参见微软的文章"About Static Controls",尤其是这部分:

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

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

【讨论】:

  • 感谢您的解释,伊戈尔——这很有道理!
【解决方案2】:

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

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

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

无论如何,添加SS_NOTIFY 样式似乎可以让它工作!

【讨论】:

    猜你喜欢
    • 2011-07-30
    • 1970-01-01
    • 2012-02-28
    • 2011-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-10
    • 2012-09-05
    相关资源
    最近更新 更多