【发布时间】: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