在ATL中怎么加上消息映射

xinyu_78 2002-12-12 12:33:17
在ATL中怎么加上消息映射,我是个ATL新手,按以前MFC的都不好用,请高手帮忙,解决后一定放分!
...全文
96 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
ydfok 2002-12-12
  • 打赏
  • 举报
回复
gz,up@!
ysf1980 2002-12-12
  • 打赏
  • 举报
回复
ATL中,消息映射的格式:
MESSAGE_HANDLER(WM_TIMER, OnTimer)
你上面所写的消息映射格式不对
处理函数声明为:
LRESULT OnTimer(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
另外,在你的程序中没有窗口,你可以在New ATL Object时选Full Control
ATL会给你生成窗口,并且程序中会有下列语句:
BEGIN_MSG_MAP(CSockCtrl)
CHAIN_MSG_MAP(CComControl<CSockCtrl>)
DEFAULT_REFLECTION_HANDLER()
END_MSG_MAP()
这就是ATL的消息映射了
或者像我写的那个类那样,生成另一个辅助窗口类,使用它的句柄接收消息,在辅助类的消息处理函数中,调用主类的处理函数
xinyu_78 2002-12-12
  • 打赏
  • 举报
回复
class CserverComponent :
public IDispatchImpl<IserverComponent, &IID_IserverComponent, &LIBID_COMTOSERVERLib>,
public ISupportErrorInfo,
public CComObjectRoot,
public COleControl,
public CComCoClass<CserverComponent,&CLSID_serverComponent>
{
public:
CserverComponent(){
m_dataflag = 0;
m_iCount = 0;
m_datacontent = "";
m_dbfullname = "";
m_recvdatacontent = "";
m_strServerIP = "192.168.10.30";
m_sRecordCount = 0;
m_dwThread = 0;
m_iTime2OUT = 0;
m_pcSendData = NULL;//发送的数据
m_iSendDataLength = 0;//发送数据的长度
m_bIfFirstSend = TRUE; //是否为第一次发送数据,如果是第一次则建立计时器nID
m_iSendNum = 0;//初始化发送的次数(不超过2次)
m_iTotalFrame = 1;//初始化当前接收到的总帧数
m_usFrame_Sum = 0;//初始化总帧数
m_usCurrent_Frame = 0;//初始化当前帧数
m_cFrame_Flag = 0; //初始化帧标志
m_usTraction_ID = 0; //初始化业务ID
m_iRecvTotalLength = 0;
m_usFrame_SeqNum = 0;//帧的序列递增号
m_bFirstRecv = TRUE;
m_cFunction_Num = '0';
m_cJieguo_Status = '1';
m_usFrame_Size = 0;
m_sSendReturn = 1;
m_iRecvData = 0;
m_iTimeOut = 0;
m_iFullData = 0;
m_strFullDBName = "";
m_sIfFinishedRecv = 0;
m_hThread = NULL;
m_bCreateSocket = TRUE;
m_pcRecvData =(char *)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,BLOCK);
memset(m_pcRecvData,0,BLOCK);
}
BEGIN_COM_MAP(CserverComponent)
COM_INTERFACE_ENTRY(IDispatch)
COM_INTERFACE_ENTRY(IserverComponent)
COM_INTERFACE_ENTRY(ISupportErrorInfo)
END_COM_MAP()
DECLARE_NOT_AGGREGATABLE(CserverComponent)

DECLARE_REGISTRY_RESOURCEID(IDR_serverComponent)
// ISupportsErrorInfo
STDMETHOD(InterfaceSupportsErrorInfo)(REFIID riid);

// IserverComponent
public:
STDMETHOD(RecvData)(/*[out,retval]*/BSTR * strRecvData);
STDMETHOD(SendToServer)(/*[in]*/int dataflag,BSTR datacontent,/*[out,retval]*/int * isendsucc );
CString m_strdbfullname; //包括路径完整的数据库名称
SOCKET m_sRecv;
SOCKADDR_IN addrRecv;
SOCKET m_sSend;
SOCKADDR_IN addrSend;
WSADATA wsaData;
void ExamineQueue();
void CreateQueue();
void OnOpenRecvServer();
void CreateThread();
void UnPackageRecvData(char *icmpRecv_data, int senddatasize);
unsigned short m_usFrame_Sum;//总帧数
unsigned short m_usCurrent_Frame;//当前帧数
unsigned short m_usFrame_SeqNum;
char m_cFrame_Flag;//帧标志位
unsigned short m_usTraction_ID; //帧头的业务ID
BOOL m_bFirstRecv; //是否是第一次接收到真实的数据,即接收到的不是确认帧
PRecvDataQueue m_pRecvDataQueue;
PRecvDataQueue m_pRecvDataQueueTail;
PRecvDataQueue m_pRecvDataQueue2;
PRecvDataQueue m_pRecvDataQueueTail2;
char * m_pcSendData;
char * m_pcRecvData;
int m_iRecvData;
int m_iFullData;
int m_iSendDataLength;
int m_iSendNum;
int m_iRecvTotalLength;//接收到的总数据长度,只有接收多包数据时才有用
void PackageSendData(char *icmp_dataSend, int senddatasize);
int GetLocalIP(unsigned long *ip, int len);
BOOL Connect(BOOL b);
CString m_datacontent;
CString m_dbfullname;
short m_dataflag;
short m_sIfFinishedRecv;
CString m_recvdatacontent;
CString m_strFullDBName;
short m_sRecordCount;
DWORD m_dwThread;
short m_sSendReturn;//表示是否发送成功,1表示成功,0表示失败
void ReportWinsockErr(LPSTR lpszErrorMsg);
void OnOpenSendServer();
CString m_str1;
CString m_str2;
CString m_str3;
CString m_str4;
int m_iTotalFrame; //已经接收到的帧数
unsigned long m_RemoteIP;
int m_iTimeOut;
SOCKADDR_IN m_RemoteAddr;
CString m_strServerIP;
BOOL m_bIfFirstSend;
UINT nID,nID1;
UINT nID2;
int m_iCount;
CDaoDatabase m_Db;
CDaoRecordset m_set;
char m_cFunction_Num;
char m_cJieguo_Status;
HANDLE m_hThread;
unsigned short m_usFrame_Size;
BOOL m_bCreateSocket;
DWORD m_dwNotify;
int m_iTime2OUT;
STDMETHOD(get_dbfullname)(/*[out, retval]*/ BSTR *pVal);
STDMETHOD(put_dbfullname)(/*[in]*/ BSTR newVal);
protected:
// Message maps
//{{AFX_MSG(CComCoServerCtrl)
afx_msg void OnTimer(UINT nIDEvent);
afx_msg LRESULT OnReadReady(WPARAM wParam,LPARAM lParam);
afx_msg void OnDestroy();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
这个就是我的类
xinyu_78 2002-12-12
  • 打赏
  • 举报
回复
我也是要用计时器,只要把你的类里的代码加到我的类里就行了吗
ysf1980 2002-12-12
  • 打赏
  • 举报
回复
class CWinHidden:
public CWindowImpl<CWinHidden, CWindow, CNullTraits>
{
BEGIN_MSG_MAP(CWinHidden)
MESSAGE_HANDLER(WM_TIMECHANGE, OnTimeChange)
MESSAGE_HANDLER(WM_TIMER, OnTimer)
MESSAGE_HANDLER(WM_SOCK_EVENT,OnSockEvent)
END_MSG_MAP()
public:
CWinHidden(CSockCtrl* pMyCtl) : m_pMyCtl(pMyCtl){};
LRESULT OnTimeChange(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
// TODO : Add Code for message handler. Call DefWindowProc if necessary.
return 0;
}
public:
LRESULT OnTimer(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
LRESULT OnSockEvent(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL& bHandled);
private:
CSockCtrl* m_pMyCtl;
};
这是我的一小段程序,里面就有消息映射

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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