第四十五讲-吉林大学网络教育学院课件_第1页
第四十五讲-吉林大学网络教育学院课件_第2页
第四十五讲-吉林大学网络教育学院课件_第3页
第四十五讲-吉林大学网络教育学院课件_第4页
第四十五讲-吉林大学网络教育学院课件_第5页
已阅读5页,还剩33页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

吉林大学远程教育课件WindowsAPI编程主讲人:翟慧杰学时:48(第四十五讲)吉林大学远程教育课件WindowsAPI编1函数BroadcastTransaction是一个自定义的函数,在例13-2中的具体定义如下:

函数BroadcastTransaction是一个自定义的2第四十五讲-吉林大学网络教育学院课件3在上述程序段中,函数DdeQueryNextServer用于获得连接列表中的下一个连接句柄。其函数原型定义如下:在上述程序段中,函数DdeQueryNextServer用于4

如果函数DdeQueryNextServer返回值不为空,则程序将进入一个while循环,在while循环体中定义了一个计数器,用于记录服务器的个数。同时循环体通过函数DdeClientTransaction来开始一个客户事务处理,DdeClientTransaction函数的原型定义如下:如果函数DdeQue5如果服务器不能对客户方的事务进行处理,程序中通过调用函数DdeAbandonTransaction放弃事务处理并回收所有的资源。函数DdeAbandonTransaction的原型定义如下:

在主窗口的消息处理函数MainwindProc中,处理WM_TIMER消息时还用到了一个DdePostAdvise函数,这个函数将使系统发送一条XTYP_ADVREQ消息给DDE回调函数,DdePostAdvise函数的原型定义如下:

如果服务器不能对客户方的事务进行处理,程序中通过调用6例13-2的核心是DDE回调函数,本例中定义的回调函数如下:例13-2的核心是DDE回调函数,本例中定义的回调函数如下7第四十五讲-吉林大学网络教育学院课件8第四十五讲-吉林大学网络教育学院课件9第四十五讲-吉林大学网络教育学院课件10第四十五讲-吉林大学网络教育学院课件11第四十五讲-吉林大学网络教育学院课件12回调函数参数表中的wType参数用于指定回调类型;hszTopic参数用于指定主题名:参数hszItem比m用于指定主题中的某一项的名称。不难看出,上面的回调函数和消息处理函数有几分相似。当服务器处理完XTYP_CONNECT事务并返回TRUE时,DDE会话也就开始了。服务器和客户之间的通信实际上都是借助上述的事务类型来实现的。当客户向服务器发送一个请求时,DDE管理库就会用相应的事务类型调用服务器的回调函数。回调函数接收的事务确定于应用程序在DdeInitialize中指定的回调过滤标志,以及应用程序是否是客户或服务器,还是二者兼是。DDE事务类型如表13-2所示。回调函数参数表中的wType参数用于指定回调类型;h13第四十五讲-吉林大学网络教育学院课件14例13-2的源程序#include<windows.h>#include<ddeml.h>#include<stdlib.h>#include<string.h>#ifdefUNICODE#defineSTRICMPwcsicmp#defineITOA(c,sz,b)(itoa(sizeof(szA),szA,b),mbstowcs(sz,szA,b),sz)#else #defineSTRICMPstricmp #defineITOAitoa#endif//函数声明HDDEDATACALLBACKDdeCallback(WORDwType,WORDwFmt,HCONVhConv,HSZhszTopic,HSZhszItem,HDDEDATAhData,DWORDlData1,DWORDlData2);例13-2的源程序15VOIDPaintDemo(HWNDhwnd);LONGAPIENTRYMainWndProc(HWNDhwnd,UINTmessage,WPARAMwParam,LONGlParam);VOIDBroadcastTransaction(PBYTEpSrc,DWORDcbData,UINTfmt,UINTxtyp);#defineBASE_TIMEOUT100BOOLfActive; //标识数据是否正在被改变DWORDidInst=0; //DDEML对象HANDLEhInst;//应用程序句柄HCONVLISThConvList=0;//连接列表HSZhszAppName=0;//应用程序名HWNDhwndMain;//主窗口句柄TCHARszT[20];//用于重绘的静态缓冲区句柄#ifdefUNICODECHARszA[20];//用于UNICODE转化缓冲区TCHARszTitle[]=TEXT("DDEmo(U)");#elseTCHARszTitle[]=TEXT("DDEmo");#endifVOIDPaintDemo(HWNDhwnd);16TCHARszApp[]=TEXT("DDEmo");//DDE服务名TCHARszPause[]=TEXT("PAUSE");//DDE可执行命令TCHARszResume[]=TEXT("RESUME");//DDE可执行命令UINT OurFormat;//定制的格式intInCount=0;//输入数据缓冲区intcConvs=0;//激活的conversations数intcount=0;//输出数据intcyText,cxText,cyTitle;//重绘区域//函数:WinMain//作用:程序入口intWINAPIWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,LPSTRlpCmdLine,INTnCmdShow){MSGmsg;WNDCLASSwc;TEXTMETRICmetrics;HDChdc;TCHARszApp[]=TEXT("DD17//窗口初始化wc.style=0;wc.lpfnWndProc=MainWndProc;wc.cbClsExtra=0;wc.cbWndExtra=0;wc.hInstance=hInstance;wc.hIcon=NULL;wc.hCursor=LoadCursor(NULL,IDC_ARROW);wc.hbrBackground=NULL;wc.lpszMenuName=NULL;wc.lpszClassName=szTitle;if(!RegisterClass(&wc))return(FALSE);//DDE初始化if(DdeInitialize(&idInst,(PFNCALLBACK)MakeProcInstance((FARPROC)DdeCallback,hInstance),APPCMD_FILTERINITS|CBF_SKIP_CONNECT_CONFIRMS|CBF_FAIL_SELFCONNECTIONS|CBF_FAIL_POKES,0))return(FALSE);

//窗口初始化18

hInst=hInstance; //创建窗口hwndMain=CreateWindow(szTitle,szTitle,WS_CAPTION|WS_BORDER|WS_SYSMENU,CW_USEDEFAULT,CW_USEDEFAULT,0,0,NULL,NULL,hInstance,NULL);if(!hwndMain) {DdeUninitialize(idInst);//结束DDEreturn(FALSE);}hdc=GetDC(hwndMain);GetTextMetrics(hdc,&metrics);//获取当前所用字体cyText=metrics.tmHeight+metrics.tmExternalLeading;cxText=metrics.tmMaxCharWidth*8;cyTitle=GetSystemMetrics(SM_CYCAPTION);ReleaseDC(hwndMain,hdc);hInst=hInstance;19//创建字符串句柄hszAppName=DdeCreateStringHandle(idInst,szApp,0);//注册自定义数据格式OurFormat=RegisterClipboardFormat(szApp);//注册服务器名DdeNameService(idInst,hszAppName,0,DNS_REGISTER);//建立DDE会话列表hConvList=DdeConnectList(idInst,hszAppName,hszAppName,hConvList,NULL);//向所有的服务器广播事务BroadcastTransaction(NULL,0,OurFormat,XTYP_ADVSTART);SetWindowPos(hwndMain,0,0,0,cxText,(cyText*(cConvs+1))+cyTitle,SWP_NOMOVE|SWP_NOZORDER);ShowWindow(hwndMain,nCmdShow);UpdateWindow(hwndMain); //消息循环

//创建字符串句柄20while(GetMessage(&msg,0,0,0)) {TranslateMessage(&msg);DispatchMessage(&msg);}DestroyWindow(hwndMain);UnregisterClass(szTitle,hInstance);return(FALSE);}//函数:BroadcastTransaction//作用:向所有服务器广播客户的事务请求VOIDBroadcastTransaction(PBYTEpSrc,DWORDcbData,UINTfmt,UINTxtyp){HCONVhConv;DWORDdwResult;intcConvsOrg;cConvsOrg=cConvs;cConvs=0; //初始化连接数为0if(hConvList) while(GetMessage(&msg,0,0,21{ //下一个会话句柄hConv=DdeQueryNextServer(hConvList,0);while(hConv){cConvs++;

//处理客户事务if(DdeClientTransaction(pSrc,cbData,hConv,hszAppName,fmt,xtyp,TIMEOUT_ASYNC,&dwResult)){//放弃客户事务DdeAbandonTransaction(idInst,hConv,dwResult); }hConv=DdeQueryNextServer(hConvList,hConv);} } if(cConvs!=cConvsOrg){ //下一个会话句柄22{//重绘窗口InvalidateRect(hwndMain,NULL,TRUE); }}//函数:MyProcessKey//作用:处理键盘消息VOIDMyProcessKey(TCHARtchCode,LONGlKeyData){ switch(tchCode){{//重绘窗口23caseTEXT('B'):caseTEXT('b'):*((PBYTE)(-1))=0;break;}}//函数:MainWndProc//作用:主窗口消息循环LONGAPIENTRYMainWndProc(HWNDhwnd,UINTmessage,WPARAMwParam,LONGlParam){RECTrc;switch(message) {

caseTEXT('B'):24caseWM_CREATE://创建窗口 fActive=FALSE; break;caseWM_RBUTTONDOWN://按下鼠标右键if(GetKeyState(VK_CONTROL)&0x8000)//判断控制键的状态 {caseWM_CREATE://创建窗口25//广播事务处理BroadcastTransaction((PBYTE)szPause,sizeof(szPause),0,XTYP_EXECUTE);MessageBeep(0);}KillTimer(hwndMain,1);//销毁定时器fActive=FALSE;InvalidateRect(hwnd,NULL,TRUE);//重绘窗口UpdateWindow(hwnd);break;caseWM_LBUTTONDOWN://按下鼠标左键if(GetKeyState(VK_CONTROL)&0x8000)//判断控制键状态{//广播事务处理 BroadcastTransaction((PBYTE)szResume,sizeof(szResume),0,XTYP_EXECUTE);MessageBeep(0);//发出蜂鸣声}//广播事务处理26//设置定时器SetTimer(hwndMain,1,BASE_TIMEOUT+(rand()&0xff),NULL);fActive=TRUE;InvalidateRect(hwnd,NULL,TRUE);//重绘窗口UpdateWindow(hwnd);break;caseWM_CHAR://键盘消息MyProcessKey((TCHAR)wParam,lParam);break;caseWM_TIMER://定时器消息count++;//发送XTYP_ADVREQ事务给服务器的回调函数DdePostAdvise(idInst,hszAppName,hszAppName);SetRect(&rc,0,0,cxText,cyText);InvalidateRect(hwndMain,&rc,TRUE);//重绘窗口UpdateWindow(hwndMain);break;//设置定时器27caseWM_PAINT://绘制窗口PaintDemo(hwnd);break;caseWM_CLOSE://结束应用程序KillTimer(hwnd,1);DdeDisconnectList(hConvList);//断开DDE会话//撤消已注册的服务器名DdeNameService(idInst,0,0,DNS_UNREGISTER);//销毁字符串句柄DdeFreeStringHandle(idInst,hszAppName);DdeUninitialize(idInst);//结束DDE会话PostQuitMessage(0);break;default://其他消息return(DefWindowProc(hwnd,message,wParam,lParam));}return(0);}

caseWM_PAINT://绘制窗口28//函数:PaintDemo//作用:绘制窗口VOIDPaintDemo(HWNDhwnd){ PAINTSTRUCTps; RECTrc; HCONVhConv; CONVINFOci; intcConvsOrg=cConvs; BeginPaint(hwnd,&ps);//开始绘制 SetRect(&rc,0,0,cxText,cyText);//设定矩形区域 SetBkMode(ps.hdc,TRANSPARENT);//设置背景模式 SetTextColor(ps.hdc,0x00FFFFFF);//文本颜色为白色//填充矩形区域FillRect(ps.hdc,&rc,(HBRUSH)GetStockObject(fActive?BLACK_BRUSH:GRAY_BRUSH));//函数:PaintDemo29//输出文本DrawText(ps.hdc,ITOA(count,szT,10),-1,&rc,DT_CENTER|DT_VCENTER);if(hConvList){OffsetRect(&rc,0,cyText);SetTextColor(ps.hdc,0);//设定文本颜色为黑色cConvs=0;//查询下一个服务器hConv=DdeQueryNextServer(hConvList,0);while(hConv){cConvs++;ci.cb=sizeof(CONVINFO);//获取DDE会话信息DdeQueryConvInfo(hConv,QID_SYNC,&ci);FillRect(ps.hdc,&rc,(HBRUSH)GetStockObject(WHITE_BRUSH));//例13-2的源程序色背景//输出文本30//输出文本DrawText(ps.hdc,ITOA(ci.hUser,szT,10),-1,&rc,DT_CENTER|DT_VCENTER);OffsetRect(&rc,0,cyText);hConv=DdeQueryNextServer(hConvList,hConv); } } EndPaint(hwnd,&ps);//结束绘制 if(cConvsOrg!=cConvs){SetWindowPos(hwndMain,0,0,0,cxText,(cyText*(cConvs+1))+cyTitle,SWP_NOMOVE|SWP_NOZORDER|SWP_NOACTIVATE); }}//函数:DdeCallback//作用:DDE回调函数//输出文本31HDDEDATACALLBACKDdeCallback(WORDwType,WORDwFmt,HCONVhConv,HSZhszTopic,HSZhszItem,HDDEDATAhData,DWORDlData1,DWORDlData2){LPTSTRpszExec; switch(wType) {caseXTYP_CONNECT://处理XTYP_CONNECT事务 return((HDDEDATA)TRUE); caseXTYP_ADVREQ: caseXTYP_REQUEST://创建数据句柄return(DdeCreateDataHandle(idInst,(PBYTE)&count,sizeof(count),0,hszAppName,OurFormat,0));caseXTYP_ADVSTART:return(HDDEDATA)((UINT)wFmt==OurFormat&&hszItem==hszAppName);caseXTYP_ADVDATA:if(DdeGetData(hData,(PBYTE)&InCount,sizeof(InCount),0)){HDDEDATACALLBACKDdeCallback(32//设置用户句柄DdeSetUserHandle(hConv,QID_SYNC,InCount);}InvalidateRect(hwndMain,NULL,TRUE);return((HDDEDATA)DDE_FACK);caseXTYP_EXECUTE://访问DDE数据pszExec=(LPTSTR)DdeAccessData(hData,NULL);if(pszExec){if(fActive&&!STRICMP(szPause,pszExec)){//消息定时器KillTimer(hwndMain,1);fActive=FALSE;InvalidateRect(hwndMain,NULL,TRUE);UpdateWindow(hwndMain);}//设置用户句柄33elseif(!fActive&&!STRICMP(szResume,pszExec)) {//设定定时器SetTimer(hwndMain,1,BASE_TIMEOUT+(rand()&0xff),NULL);fActive=TRUE;InvalidateRect(hwndMain,NULL,TRUE);UpdateWindow(hwndMain);}MessageBeep(0);}break;caseXTYP_DISCONNECT:InvalidateRect(hwndMain,NULL,TRUE);break;caseXTYP_REGISTER:else34//向服务器广播事务BroadcastTransaction(NULL,0,OurFormat,XTYP_ADVSTOP);hConvList=DdeConnectList(idInst,hszItem,hszAppName,hConvList,NULL);BroadcastTransaction(NULL

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论