ONV,HSZ,HSZ, HDDEDATA,DWORD,DWORD);
(2) 在类的创建代码(OnCreate())中作如下说明:
pThis=this;
lpDdeCallback=MakeProcInstance((FARPROC)DdeCallback,hInstance);
if(DdeInitialize(&idInst,(PFNCALLBACK)lpDdeCallback,CBF_FAIL_EXECUTES
|CBF_SKIP_REGISTRATIONS|CBF_SKIP_UNREGISTRATIONS,0L))
{
AfxMessageBox("不能初始化DDE服务","错误");
DestroyWindow();
}
(3) 回调函数实现如下:
HDDEDATA FAR PASCAL _export CMainFrame::DdeCallback(UINT iType,UINT iFmt, HCONV hConv,HSZ hsz1,HSZ hsz2,HDDEDATA hData,DWORD dwData1,DWORD dwData2)
{
char szBuffer[16];
int i;
switch(iType)
{
case XTYP_CONNECT: //hsz1=topiv, hsz2=service
return (HDDEDATA)TRUE;//TRUE;
case XTYP_ADVSTART: //hsz1=topic, hsz2=item
case XTYP_REQUEST:
case XTYP_ADVREQ:
case XTYP_POKE: //hsz1=Topic, hsz2=item, hData=data
case XTYP_ADVSTOP:
return NULL;
}
}
3、避免变量类型冲突
如果在MFC应用直接使用DDEML服务,那么该MFC应用在编译时将会遇到变量类型HSZ 重复定义错误。经过追踪发现,错误在于在DDEML.H对HSZ作了如下定义:
DECLARE_HANDLE32(HSZ);
而在AFXEXT.H(通过stdafx.h引入)中对HSZ又作了如下说明:
typedef BPSTR FAR* HSZ; // Long handle to a string
两个定义一个为32位整数,一个为BASIC字符串指针,当然会发生编译器不能作变量 类型转换的错误。实际上,将HSZ声明为BASIC字符串指针主要用于在MFC应用中使用 VBX控制。要改正这一错误,就必须保证不要在同一个代码模块中使用DDEML和VBX支 持,通过将使用DDEML和VBX的代码分开,并在使用DDEML代码的模块中最开头定义如 下编译器宏就可以解决上述问题:
#define NO_VBX_SUPPORT
五、使用3D控制
毫无疑问,3D控制的使用可以显著提高Windows应用程序的界面友好性,目前,许多 流行的Windows
应用程序都使用了3D控制,典型的如Microsoft公司的Office系列软 件,而且,在Windows 95和Windows NT 4.0中,3D控制更是作为操作系统的一部分 直接提供,这意味着在其上运行的软件不需要作任何特殊处理,就具有3D界面效 果,但是,很遗憾的是,在Windows 3.x中,除了命令按钮控制使用3D控制以外,其
余所有的控制,如编辑框,列表框,检查框等都只使用2D控制,要想使用3D控制, 程序设计人员就必须在自己的程序中作一定的修改,考虑到目前3D效果的流行,这 点努力是值得的。 为了支持3D效果,Microsoft公司提供了一个专门用于3D控制的动态连接库,即
CTL3D.DLL,但是在其Visual C++中却没有如何使用3D控制的讨论,并且,Visual C++也不直接支持3D编码,因为它不包括使用3D控制所必须的头文件。但是,这并不 意味着在Visual C++中不能使用3D控制,只不过用户需要从其它地方获取技术支持 罢了。由于使用的是动态连接库机制,因此,任何其它语言提供的3D头文件和 CTL3D.DLL的输入库都是可用的。作者使用的就是Borland公司的Borland C++中提供 的CTL3D.H和CTL3D.LIB。在C/C++中使用3D控制的方法也有很多种,在这里,为节约 篇幅,只讨论与本文相关的主题,即使用MFC编程时如何使用3D控制。
在MFC的所有对话框中使用3D控制可以遵循如下步骤:
1. 在CWinApp::InitInstance函数中调用Ctl3dRegister和Ctl3dAutosubclass函
数:
Ctl3dRegister(AfxGetInstanceHandle());
Ctl3dAutoSubclass(AfxGetInstanceHandle());
值得一提的是,在AppWizard产生的应用框架的CWinApp::InitInstance中有一个函 数调用为SetDialogBkColor,此函数的作用是将所有对话框的背景颜色设置为灰 色,这个功能与3D界面实现相同的功能,可以移去此语句。
由于CTL3D在初始化时读入所有的系统颜色并自己维持,为了使应用程序能