消息映射表编译出错

Freeman奔跑吧 2013-10-27 05:56:32
我刚学习MFC,老师让写一个消息发送窗口,找着一个书上打代码,后一直出现错误。
这是书上的消息映射函数构成。谢谢大家帮忙,好人一生平安。本人还是个学生。
...全文
176 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
lm_whales 2013-10-31
  • 打赏
  • 举报
回复
直接在资源里,对话框上,添加按钮控件,ID设置为 IDC_CONNECT,IDC_SEND 双击按钮控件,让他自动生成。 ON_BN_CLICKED(IDC_CONNECT,OnConnect) ON_BN_CLICKED(IDC_SEND,OnSend) 和 OnConnect OnSend
qdtroy 2013-10-29
  • 打赏
  • 举报
回复
引用 10 楼 u012259623 的回复:
这是这段代码的错误。
函数的参数少了
Freeman奔跑吧 2013-10-29
  • 打赏
  • 举报
回复

这是这段代码的错误。
Freeman奔跑吧 2013-10-29
  • 打赏
  • 举报
回复
// syDlg.cpp : implementation file // #include "stdafx.h" #include "sy.h" #include "syDlg.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // caboutdlg对话框用于软件 #define WM_SOCKET WM_USER+100 class CAboutDlg : public CDialog //类声明 { public: CAboutDlg(CWnd * pParent=NULL); // Dialog Data //{{AFX_DATA(CAboutDlg) enum { IDD = IDD_ABOUTBOX }; //}}AFX_DATA // 生成虚拟函数覆盖 //{{AFX_VIRTUAL(CAboutDlg) protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //}}AFX_VIRTUAL // 工具 SOCKET s; //定义套接字对象 sockaddr_in addr; //定义套接字地址结构变量 protected: //{{AFX_MSG(CAboutDlg) //}}AFX_MSG afx_msg void OnSocket(WPARAM wParam,LPARAM lParam); //自定义消息响应函数 DECLARE_MESSAGE_MAP() }; CAboutDlg::CAboutDlg(CWnd *pParent) : CDialog(CAboutDlg::IDD) { //{{AFX_DATA_INIT(CAboutDlg) //}}AFX_DATA_INIT } void CAboutDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CAboutDlg) //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) //{{AFX_MSG_MAP(CAboutDlg) ON_BN_CLICKED(IDC_CONNECT,OnConnect) ON_BN_CLICKED(IDC_SEND,OnSend) ON_MESSAGE(WM_SOCKET,OnSocket) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CSyDlg对话框 CSyDlg::CSyDlg(CWnd* pParent /*=NULL*/) : CDialog(CSyDlg::IDD, pParent) { //{{AFX_DATA_INIT(CSyDlg) // NOTE: the ClassWizard will add member initialization here //}}AFX_DATA_INIT // Note that LoadIcon does not require a subsequent DestroyIcon in Win32 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } void CSyDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CSyDlg) // NOTE: the ClassWizard will add DDX and DDV calls here //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CSyDlg, CDialog) //{{AFX_MSG_MAP(CSyDlg) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_EN_CHANGE(IDC_PORT, OnChangePort) ON_EN_CHANGE(IDC_ADDR, OnChangeAddr) ON_BN_CLICKED(IDC_CONNECT, OnConnect) ON_BN_CLICKED(IDC_SEND, OnSend) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CSyDlg处理程序 BOOL CSyDlg::OnInitDialog() { SOCKET s; //定义套接字对象 CDialog::OnInitDialog(); //初始化对话框 s=::socket(AF_INET,SOCK_STREAM,0); //创建套接字并返回其句柄 ::WSAAsyncSelect(s,this->m_hWnd,WM_SOCKET,FD_READ); //将套接字设置为异步模式 //添加“about"菜单项到系统菜单. // IDM_ABOUTBOX必须在系统命令的范围. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != NULL) { CString strAboutMenu; strAboutMenu.LoadString(IDS_ABOUTBOX); if (!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); } } // 此对话框设置图标。该框架并自动 // 当应用程序的主窗口,是不是一个对话框 SetIcon(m_hIcon, TRUE); // Set big icon SetIcon(m_hIcon, FALSE); // Set small icon // TODO:在这里添加额外的初始化 GetDlgItem(IDC_TEXT)->EnableWindow(false); //禁用消息显示框 GetDlgItem(IDC_SENDTEXT)->EnableWindow(false); //禁用发送消息编辑框 GetDlgItem(IDC_SEND)->EnableWindow(false); //禁用发送消息按钮 s=::socket(AF_INET,SOCK_STREAM,0); //创建套接字并放回其句柄 ::WSAAsyncSelect(s,this->m_hWnd,WM_SOCKET,FD_READ); //将套接字设置为异步模式 return TRUE; //返回true,除非你将焦点设置到控制 } void CSyDlg::OnSysCommand(UINT nID, LPARAM lParam) { if ((nID & 0xFFF0) == IDM_ABOUTBOX) { CAboutDlg dlgAbout; dlgAbout.DoModal(); } else { CDialog::OnSysCommand(nID, lParam); } } // If you add a minimize button to your dialog, you will need the code below // to draw the icon. For MFC applications using the document/view model, // this is automatically done for you by the framework. void CSyDlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // device context for painting SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); // Center icon in client rectangle int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; // Draw the icon dc.DrawIcon(x, y, m_hIcon); } else { CDialog::OnPaint(); } } // The system calls this to obtain the cursor to display while the user drags // the minimized window. HCURSOR CSyDlg::OnQueryDragIcon() { return (HCURSOR) m_hIcon; } void CSyDlg::OnChangePort() { // TODO: If this is a RICHEDIT control, the control will not // send this notification unless you override the CDialog::OnInitDialog() // function and call CRichEditCtrl().SetEventMask() // with the ENM_CHANGE flag ORed into the mask. // TODO: Add your control notification handler code here } void CSyDlg::OnChangeAddr() { // TODO: If this is a RICHEDIT control, the control will not // send this notification unless you override the CDialog::OnInitDialog() // function and call CRichEditCtrl().SetEventMask() // with the ENM_CHANGE flag ORed into the mask. // TODO: Add your control notification handler code here } void CSyDlg::OnConnect() { // TODO: Add your control notification handler code here CString str,str1; SOCKET s; //定义套接字对象 sockaddr_in addr; //定义套接字地址结构变量 int port; GetDlgItem(IDC_ADDR)->GetWindowText(str); GetDlgItem(IDC_PORT)->GetWindowText(str1); if(str==""||str1=="") { MessageBox("服务器地址或端口不能为NULL"); } else { port=atoi(str.GetBuffer(1)); addr.sin_family=AF_INET; addr.sin_addr.S_un.S_addr=inet_addr(str.GetBuffer(1)); addr.sin_port=ntohs(port); GetDlgItem(IDC_TEXT)->SetWindowText("正在连接服务器..........\r\n"); if(::connect(s,(sockaddr*)&addr,sizeof(addr)) !=SOCKET_ERROR) { GetDlgItem(IDC_TEXT)->GetWindowText(str); str+="连接服务器成功!\r\n"; GetDlgItem(IDC_TEXT)->SetWindowText(str); GetDlgItem(IDC_SENDTEXT)->EnableWindow(true); GetDlgItem(IDC_SEND)->EnableWindow(false); GetDlgItem(IDC_ADDR)->EnableWindow(false); GetDlgItem(IDC_PORT)->EnableWindow(false); } else { GetDlgItem(IDC_TEXT)->GetWindowText(str); str+="连接服务器失败!请重试\r\n"; GetDlgItem(IDC_TEXT)->SetWindowText(str); } } } void CSyDlg::OnSend() { // TODO: Add your control notification handler code here SOCKET s; //定义套接字对象 CString str,str1; GetDlgItem(IDC_SENDTEXT)->GetWindowText(str); if(str=="") { GetDlgItem(IDC_TEXT)->GetWindowText(str1); str1+="\r\n"; str1+="消息不能为空\r\n"; GetDlgItem(IDC_TEXT)->SetWindowText(str1); } else { ::send(s,str.GetBuffer(1),sizeof(str),0); GetDlgItem(IDC_TEXT)->GetWindowText(str1); str1+="\r\n"; str1+=str; GetDlgItem(IDC_TEXT)->SetWindowText(str1); } } void CSyDlg::OnSocket(WPARAM wParam, LPARAM IParam) { SOCKET s; //定义套接字对象 char cs[100]={0}; if(IParam==FD_READ) { CString num=""; recv(s,cs,100,NULL); GetDlgItem(IDC_TEXT)->GetWindowText(num); num+="\r\n服务器说:"; num+=(LPTSTR)cs; GetDlgItem(IDC_TEXT)->SetWindowText(num); } } 没办法了,网上一直找不到解决办法,我就把代码贴出来,希望大家百忙之中看下,谢谢大家。跪谢。(这是我从书上敲的代码)
Freeman奔跑吧 2013-10-29
  • 打赏
  • 举报
回复
引用 7 楼 worldy 的回复:
LZ那个 OnConnect OnSend 函数没有定义!
可问题是我确实定义了,我现在悲剧了,老师也没回我邮件。
worldy 2013-10-29
  • 打赏
  • 举报
回复
LZ那个 OnConnect OnSend 函数没有定义!
Freeman奔跑吧 2013-10-29
  • 打赏
  • 举报
回复
引用 4 楼 mlqxj35674 的回复:
ON_BN_CLICKED(IDC_CONNECT, &CAboutDlg::OnBnClickedOk)写在 //}}AFX_MSG_MAP之后,END_MESSAGE_MAP()之前,保证资源中有IDC_CONNECT 不过我怀疑你的本意是要在CSyDlg中处理消息函数,但却把消息映射写到了CAboutDlg中,看清再弄。注意红色字体部分,另外,你的书中源代码可能是VC6.0,你现在用VS.net
首先谢谢你能回复我。 我这段是想消息映射的,想把消息关联。我现在的环境是VC++6.0。
Freeman奔跑吧 2013-10-29
  • 打赏
  • 举报
回复
引用 3 楼 duiplus 的回复:
[quote=引用 楼主 u012259623 的回复:]
我刚学习MFC,老师让写一个消息发送窗口,找着一个书上打代码,后一直出现错误。
这是书上的消息映射函数构成。谢谢大家帮忙,好人一生平安。本人还是个学生。


什么错误呢[/quote]
错误是:
yaozhiyong110 2013-10-28
  • 打赏
  • 举报
回复
系统的可以用向导直接生成 自定义的话:你可以直接参考那个OnSysCommand函数 先在h写申明 cpp写定义 然后begin和end map之间加上ON_MESSAGE(MsgCode,Fun) 前一个是消息码 后一个是函数名
mlqxj35674 2013-10-28
  • 打赏
  • 举报
回复
ON_BN_CLICKED(IDC_CONNECT, &CAboutDlg::OnBnClickedOk)写在 //}}AFX_MSG_MAP之后,END_MESSAGE_MAP()之前,保证资源中有IDC_CONNECT 不过我怀疑你的本意是要在CSyDlg中处理消息函数,但却把消息映射写到了CAboutDlg中,看清再弄。注意红色字体部分,另外,你的书中源代码可能是VC6.0,你现在用VS.net
qdtroy 2013-10-28
  • 打赏
  • 举报
回复
引用 楼主 u012259623 的回复:
我刚学习MFC,老师让写一个消息发送窗口,找着一个书上打代码,后一直出现错误。 这是书上的消息映射函数构成。谢谢大家帮忙,好人一生平安。本人还是个学生。
什么错误呢
Freeman奔跑吧 2013-10-27
  • 打赏
  • 举报
回复
麻烦大家帮个忙,知道的说下呗。

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧