第四十五讲-吉林大学网络教育学院课件.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《第四十五讲-吉林大学网络教育学院课件.ppt》由用户(三亚风情)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第四 十五 吉林大学 网络教育学院 课件
- 资源描述:
-
1、吉林大学远程教育课件Windows A P I编 程主讲人主讲人 : 翟慧杰翟慧杰学学 时:时:48(第四十五讲第四十五讲)函数 BroadcastTransaction是一个自定义的函数,在例13-2中的具体定义如下: 在上述程序段中,函数DdeQueryNextServer用于获得连接列表中的下一个连接句柄。其函数原型定义如下: 如果函数 DdeQueryNextServer返回值不为空,则程序将进入一个 while循环,在 while循环体中定义了一个计数器,用于记录服务器的个数。同时循环体通过函数DdeClientTransaction来开始一个客户事务处理, DdeClientTra
2、nsaction函数的原型定义如下: 如果服务器不能对客户方的事务进行处理,程序中通过调用函数 DdeAbandonTransaction放弃事务处理并回收所有的资源。函数DdeAbandonTransaction的原型定义如下: 在主窗口的消息处理函数MainwindProc中,处理WM_TIMER消息时还用到了一个DdePostAdvise函数,这个函数将使系统发送一条XTYP_ADVREQ消息给DDE回调函数,DdePostAdvise函数的原型定义如下: 例132的核心是 DDE回调函数,本例中定义的回调函数如下: 回调函数参数表中的wType参数用于指定回调类型;hszTopic参数
3、用于指定主题名:参数hszItem比m用于指定主题中的某一项的名称。不难看出,上面的回调函数和消息处理函数有几分相似。 当服务器处理完XTYP_CONNECT事务并返回TRUE时,DDE会话也就开始了。服务器和客户之间的通信实际上都是借助上述的事务类型来实现的。当客户向服务器发送一个请求时,DDE管理库就会用相应的事务类型调用服务器的回调函数。 回调函数接收的事务确定于应用程序在DdeInitialize中指定的回调过滤标志,以及应用程序是否是客户或服务器,还是二者兼是。DDE事务类型如表 132所示。例13-2的源程序#include #include #include #include #
4、ifdef UNICODE#define STRICMP wcsicmp#define ITOA(c, sz, b) (itoa(sizeof(szA), szA, b), mbstowcs(sz, szA, b), sz)#else#define STRICMP stricmp#define ITOA itoa#endif /函数声明HDDEDATA CALLBACK DdeCallback(WORD wType, WORD wFmt, HCONV hConv, HSZ hszTopic,HSZ hszItem, HDDEDATA hData, DWORD lData1, DWORD lDa
5、ta2);VOID PaintDemo(HWND hwnd);LONG APIENTRY MainWndProc(HWND hwnd, UINT message, WPARAM wParam, LONG lParam);VOID BroadcastTransaction(PBYTE pSrc,DWORD cbData,UINT fmt,UINT xtyp);#define BASE_TIMEOUT 100BOOL fActive; /标识数据是否正在被改变DWORD idInst = 0; / DDEML对象HANDLE hInst; /应用程序句柄HCONVLIST hConvList =
6、0; /连接列表HSZ hszAppName = 0; /应用程序名HWND hwndMain; /主窗口句柄TCHAR szT20; /用于重绘的静态缓冲区句柄#ifdef UNICODECHAR szA20; /用于UNICODE 转化缓冲区TCHAR szTitle = TEXT(DDEmo (U);#elseTCHAR szTitle = TEXT(DDEmo);#endifTCHAR szApp = TEXT(DDEmo); / DDE服务名TCHAR szPause = TEXT(PAUSE); / DDE可执行命令TCHAR szResume = TEXT(RESUME);/ D
7、DE可执行命令UINT OurFormat; /定制的格式int InCount = 0; /输入数据缓冲区int cConvs = 0; / 激活的conversations数int count = 0; /输出数据int cyText, cxText, cyTitle; /重绘区域/函数:WinMain/作用:程序入口int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,INT nCmdShow) MSG msg; WNDCLASS wc; TEXTMETRIC metrics; HDC
8、 hdc;/窗口初始化 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初始
9、化 if (DdeInitialize(&idInst,(PFNCALLBACK)MakeProcInstance(FARPROC)DdeCallback, hInstance), APPCMD_FILTERINITS |CBF_SKIP_CONNECT_CONFIRMS |CBF_FAIL_SELFCONNECTIONS |CBF_FAIL_POKES,0) return(FALSE); hInst = hInstance;/创建窗口 hwndMain = CreateWindow( szTitle, szTitle, WS_CAPTION | WS_BORDER | WS_SYSMENU,
10、 CW_USEDEFAULT, CW_USEDEFAULT, 0, 0, NULL, NULL, hInstance, NULL); if (!hwndMain) DdeUninitialize(idInst);/结束DDE return(FALSE); hdc = GetDC(hwndMain); GetTextMetrics(hdc, &metrics);/获取当前所用字体 cyText = metrics.tmHeight + metrics.tmExternalLeading; cxText = metrics.tmMaxCharWidth * 8; cyTitle = GetSyst
11、emMetrics(SM_CYCAPTION); ReleaseDC(hwndMain, hdc);/创建字符串句柄 hszAppName = DdeCreateStringHandle(idInst, szApp, 0); /注册自定义数据格式OurFormat = RegisterClipboardFormat(szApp); /注册服务器名DdeNameService(idInst, hszAppName, 0, DNS_REGISTER);/建立DDE会话列表hConvList = DdeConnectList(idInst, hszAppName, hszAppName, hConv
12、List, 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);/消息循环 while (GetMessage(&msg, 0, 0, 0) TranslateMessage(&msg)
13、; DispatchMessage(&msg); DestroyWindow(hwndMain); UnregisterClass(szTitle, hInstance); return(FALSE);/函数:BroadcastTransaction/作用:向所有服务器广播客户的事务请求VOID BroadcastTransaction(PBYTE pSrc,DWORD cbData,UINT fmt,UINT xtyp) HCONV hConv; DWORD dwResult; int cConvsOrg; cConvsOrg = cConvs; cConvs = 0;/初始化连接数为0 i
14、f (hConvList) /下一个会话句柄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
15、 != cConvsOrg) /重绘窗口InvalidateRect(hwndMain, NULL, TRUE); /函数:MyProcessKey/作用:处理键盘消息VOID MyProcessKey(TCHAR tchCode,LONG lKeyData) switch (tchCode) case TEXT(B):case TEXT(b):*(PBYTE)(-1) = 0; break;/函数:MainWndProc/作用:主窗口消息循环LONG APIENTRY MainWndProc(HWND hwnd,UINT message,WPARAM wParam,LONG lParam)
展开阅读全文