例如ON_COMMAND(id_DataAccess, OnDataAccess)
它会告诉系统消息的产生者是id_DataAccess,消息的类型是COMMAND,消息的回调函数是OnDataAccess
消息回调就是调用回调函数,MFC响应消息的机制都是以回调函数的形式进行的,这就要求你在定制消息时有几步必需做的步骤
1定义消息
2消息映射
3消息响应声明
4消息响应函数的实现
消息响应就是回调函数,这些在孙鑫老师的视频中都有提到
(1)当然是这样。函数声明能不带参数类型么?
(2)参数类型是32位长整型,所以可以用作表示任何类型的指针。一般情况下随便用任何一个都够了。
一般情况下是这样工作的:将需要传递的参数包装成一个结构体对象,在发出消息的时候把这个对象的地址作为参数。因此,在调用时处理函数就可以拿到这些数据了。微软怕一个地址不够用,所以给了两个作为备用。
/ 创建自定义消息程序步骤: 1:用ClassWard创建一个新project命名为:MessageTest 2:此project选单文档,取消Active X支持,取消打印支持,其它默认。finish 3:在菜单中添加一个菜单“测试”其子菜单为"test",并映射其执行方法:OnTest 4: 制造消息发送者:在资源中新增一个对话框,并用classward为其创建类名为 TestDialog然后在此对话框中加入一个Button,并用classward为其映射执行函数 OnButton1()。 5:在TestDialogh文件中加入一行#define WM_MY_MESSAGE (WM_USER+100) 用来定义自己的消息 6:在TestDialogcpp文件中加入一行:#include "MainFrmh" 7:为对话框的Button按钮加入发送消息代码如下: void TestDialog::OnButton1() { // TODO: Add your control notification handler code here //获取当前框架指针 CMainFrame pMainFrame=(CMainFrame )AfxGetApp()->m_pMainWnd; //获取当前view指针 CView pView=pMainFrame->GetActiveView(); if(pView!=NULL) { pView->PostMessage(WM_MY_MESSAGE,0,0); } } 以上是对于消息的发送者工作己完成 8:以下是对于消息接收者 在MessageTestViewh中也要定义:#define WM_MY_MESSAGE (WM_USER+100) 9:并在MessageTestViewh中定义消息映射函数如下: protected: //{{AFX_MSG(CMessageTestView) afx_msg void OnTest(); afx_msg LRESULT OnMyMessage(WPARAM wParam, LPARAM lParam); //此处为自定义消息映射函数 //}}AFX_MSG DECLARE_MESSAGE_MAP() 10:在MessageTestViewcpp文件中,声明消息响应函数如下: BEGIN_MESSAGE_MAP(CMessageTestView, CView) //{{AFX_MSG_MAP(CMessageTestView) ON_MESSAGE(WM_MY_MESSAGE,OnMyMessage) //自定义消息响应函数 ON_COMMAND(ID_TEST, OnTest) //}}AFX_MSG_MAP END_MESSAGE_MAP() 11:在MessageTestViewcpp文件中实现消息响应函数如下: LRESULT CMessageTestView::OnMyMessage(WPARAM wParam,LPARAM lParam) { MessageBox("OnMyMessage!Receiver"); return 0; } 12:将消息发送者与消息响应者联系起来。即:将对话框与菜单联系起来。 实现CMessageTestView的OnTest方法如下: void CMessageTestView::OnTest() { // TODO: Add your command handler code here TestDialog dlg; dlgDoModal(); } 13:以上完成了所有自定义消息过程 / //////////////////////////////////////////////////////////////// 2:如何编写一个程序在运行后马上删除自己。 / 以下代码在VCnet2002、BCB60、DevC++498环境下均编译通过,并正常运行 / / Creamdog保留所有权力 / #include int main( int argc, char argv[] ) { HMODULE module = GetModuleHandle(0); CHAR buf[MAX_PATH]; GetModuleFileName(module, buf, sizeof buf); CloseHandle(HANDLE(4)); __asm { lea eax, buf; push 0; push 0; push eax; push ExitProcess; push module; push DeleteFile; push UnmapViewOfFile; ret; } return 0; }
希望采纳
WM_COMM_RXCHAR 这个消息在那个文件里面定义的,把头文件#include进来
编译器说的是 WM_COMM_RXCHAR 没有定义!而不是函数!
你写的串口程序,我对串口不熟悉。
可以解决:
1、如果WM_COMM_RXCHAR 是你用第三方的库发出的消息,那么在第三方库的头文件里面肯定有个地方定义了WM_COMM_RXCHAR 消息;
2、如果WM_COMM_RXCHAR是你自定义的消息, 你需要在头文件SerialPortTestDlgh里面加如下一句话
#define WM_COMM_RXCHAR WM_USER+5
WINDOWS *** 作系统总是将HWND窗口句柄同创建它的线程进行关联。并且在很多文档中再三强调,窗口处理函数应该放在一个线程中进行调用,这个线程就是创建窗口的线程。
诸如一些训诫指出--最好把所有的窗口创建都放在主线程中,不要在多个线程中进行窗口创建和函数处理,响应用户界面的消息处理在主线程中进行,将和用户界面无关的工作放在其他线程中进行,这些其他线程又派生出工作线程和后台线程的概念。不管如何叫法,其中心思想还是如开始所说,不要在多线程中处理HWND。
MFC也有这样的原则,因此简单将窗口类指针,如CWnd,CEdit传给新线程,其调用可能会正常,可能就会断言失败。
楼主看下MSDN的说明,里面明确提出,在新线程中,可以将HWND传给新线程,而不是窗口类指针。基于这样的说明正常处理应该是:
1)分配全局缓存,用来存储ListCtrl的文本信息。
TCHAR GlobalBuffer[200];
2)定义自定义消息
#define WM_GETMYTEXT (WM_USER + 10)
3)映射自定义消息函数
BEGIN_MESSAGE_MAP(CMyWindow, CDialog)
ON_MESSAGE(WM_GETMYTEXT, OnGetText)
END_MESSAGE_MAP
4)定义自定义消息函数
HRESULT CMyWindow::OnGetText(WPARAM wParam, LPARAM lParam)
{
this->m_listGetItemText((int)wParam, (int)lParam, GlobalBuffer, 200);
return 0L;
}
5)将窗口句柄传给新线程
6)在新线程中获取文本
int row = 3;
int col = 4;
SendMessage(hwndList, WM_GETMYTEXT, (WPARAM)row, (LPARAM)col);
以上是个大概的思想可以灵活使用,譬如WPARAM和LPARAM可以充分利用,另外就是SendMessage是有返回值的,这个返回值也可以利用,返回值就是CMyWindow::OnGetText中return 的HRESULT值。
Windows消息分为系统消息和用户自定义消息。Windows系统消息有三种:
1标准Windows消息。除WM_COMMAND外以WM_开头的消息是标准消息。例如,WM_CREATE、WM_CLOSE。
2命令消息。消息名为WM_COMMAND,消息中附带了标识符ID来区分是来自哪个菜单、工具栏按钮或加速键的消息。
3通知消息。通知消息一般由列表框等子窗口发送给父窗口,消息名也是WM_COMMAND,其中附带了控件通知码来区分控件。
CWnd的派生类都可以接收到标准Windows消息、通知消息和命令消息。命令消息还可以由文档类等接收。
用户自定义消息实际上就是用户定义一个宏作为消息,此宏的值应该大于等于WM_USER,然后此宏就可以跟系统消息一样使用,窗口类中可以定义它的处理函数。
这两种方法完成的工作相同。都是给视图类增加一个消息句柄,如WM_INITDIALOG (一个32位整数),并添加消息映射函数。
多数情况使用第一个方法 5-11,即,在控件编辑窗口中,针对特定的控件(对话框或按钮)右键添加消息和映射函数,可用的消息都在右侧列表框中。
第二个方法应该是由主菜单打开的,属于一般的通用方法。须要指定新的消息类型(如WM_DESTROY),指定该消息作用的对象(如对话框或按钮控件),之后添加消息映射函数。
在消息映射函数中,你需要编写自己的代码以完成特定的功能。
第二个方法我基本不用,麻烦。
PS
从5-12可以推断,看着看着就睡着了~ 当年我也是一样。。。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)