MFC控件消息

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MFC控件消息相关的知识,希望对你有一定的参考价值。

MFC控件消息是什么意思?是控件本身自带的消息,还是需要自己添加?如果添加呢

mfc控件消息,已经是封装好的东西了,消息类型分为多种,有WM开头的windows消息,还有自己通过添加的ON_COMMAND消息等等;添加消息,如果是WM消息,就实现相应的虚函数,若是ON_COMMAND消息就建立相应的消息映射,看几个例子,其实还是蛮简单的:

class CMyFrameWnd : public CFrameWnd

public:
afx_msg void OnPaint() //重绘窗口内部的图像

CPaintDC paintDC(this);
paintDC.TextOut(10,10,"请按下鼠标左键!");


afx_msg void OnLButtonDown(UINT nFlags, CPoint point)

::AfxMessageBox("响应了鼠标左键消息!");


DECLARE_MESSAGE_MAP()//声明消息映射表
;

//消息映射表
BEGIN_MESSAGE_MAP(CMyFrameWnd,CFrameWnd)
ON_WM_PAINT()//响应WM_PAINT消息,将会调用OnPaint()
ON_WM_LBUTTONDOWN() //响应鼠标左键按下消息,将会调用
//OnLButtonDown(UINT nFlags, CPoint point)
END_MESSAGE_MAP()

//应用程式类
class CMyApp : public CWinApp

public:

CMyApp()
:CWinApp("我的应用程式!")//设定应用程式名称



BOOL InitInstance()

CFrameWnd* MyFrame = new CMyFrameWnd; //产生主窗口对象
m_pMainWnd = MyFrame;
MyFrame->Create(NULL,"我的程式!");//建立主窗口
MyFrame->ShowWindow(SW_SHOW);//显示主窗口
MyFrame->UpdateWindow();
return TRUE;

;

CMyApp theApp; //应用程式对象
参考技术A 要弄明白这个问题 你首先要明白什么是windows消息机制。具体我不解释了。
控件消息就是发送给控件的消息,没有控件自带的消息的说法,控件其实也是一个窗口。

一般来说,控件主要是添加事件,比如按钮的点击事件等等,或者对话框的变形消息。怎么添加其实很简单但是说起来就比较复杂了。你找一个例子一看就明白了
参考技术B 1)控件也是一种窗口,因此控件消息就是窗口消息;
2)你首先需要搞清楚窗口消息的概念以及实现原理,可以到我的百度空间看这篇文章:
http://hi.baidu.com/%E5%9B%9E%E5%A4%B4%E7%9A%84%E4%B8%96%E7%95%8C/blog/item/fd83a13be7007ecd7d1e71d7.html
Win32编程入门基础(1)--基本WinAPI窗口消息应用程序分析

如何使用消息访问 mfc 控件?

【中文标题】如何使用消息访问 mfc 控件?【英文标题】:how to access mfc controls using messages? 【发布时间】:2014-11-25 06:31:02 【问题描述】:

我想从工作线程访问我的对话框的拖动滑块控件。我阅读了许多关于从工作线程访问主窗口控件的警告。因为它们很有可能导致死锁。在这种情况下,如何使用消息访问控件?我知道如何创建用户定义的消息 (WM_USER) 并编写我们自己的处理程序。它想知道的是每个控件是否有任何系统定义的消息,如果存在,如何发布这些消息以访问控件?

【问题讨论】:

【参考方案1】:

您可以使用 PostMessage 向控件发送消息,并且主 UI 线程实际上将消息发送到控件,即工作将发生在 UI 线程上(假设 UI 线程正在泵送消息)。查看 afxcmn.inl 你可以看到 SetPos 在做什么:

_AFXCMN_INLINE void CSliderCtrl::SetPos(_In_ int nPos)
 ASSERT(::IsWindow(m_hWnd)); ::SendMessage(m_hWnd, TBM_SETPOS, TRUE, nPos); 

为 PostMessage 更改它:

::PostMessage(hSlider, TBM_SETPOS, TRUE, nPos);

如果您想要更复杂的东西,将 WM_USER 消息发布到父窗口并在那里处理您的控件管理功能,因为 WM_USER 消息将由 UI 线程调度,因此您可以安全地使用控件。

【讨论】:

你能解释一下下面的例子吗?我有一个名为滑块的 CSliderCtrl。如果我想改变滑块控件的位置,不使用slider.setpos()怎么办?我怎么能只通过发布消息来做到这一点? 在您发布的 WM_USER 消息中,您可以直接调用 slider.setpos,因为您将在 UI 线程上。我也更新了答案。

以上是关于MFC控件消息的主要内容,如果未能解决你的问题,请参考以下文章

自定义 MFC 控件包含另一个控件 - 消息未通过

如何使用消息访问 mfc 控件?

(MFC) 如果控件是私有成员,父类如何接收控件的消息?

mfc中slider控件实例整个操作过程和讲解

MFC 响应控件消息

MFC 控件的使用