有关ATL的开发小结

来源:互联网 发布:淘宝买家不评价怎么办 编辑:程序博客网 时间:2024/06/15 14:27

1error LNK2005: _DllMain@12 already defined in AUDIO.obj 处理方法

原因:CRT 库对 newdelete  DllMain 函数使用弱外部链接。MFC 库也包含 newdelete  DllMain 函数。这些函数要求先链接 MFC 库,然后再链接 CRT 库。

解决:

A、选择VS菜单Project->Properties,选择Link选项,选择Input,再在Ignore libraries Edit栏中填入你需要忽略的库,如:Nafxcwd.lib;Libcmtd.lib。然后在Additional DependenciesEdit栏中填入正确的库的顺序,这里需要你能确定什么是正确的顺序。(一般自己测试验证)

B、选择VS菜单Project->Properties,选择General选项,然后在Show ProgressEdit栏中选择Displays Some Progress Messages (/VERBOSE:LIB),这样就可以在编译链接程序过程中在输出窗口看到链接的顺序了。(根据此顺序确认正确的lib顺序)

C、选择VS菜单Project->Properties,选择Code Generation后再在User Runtime libraray中选择MultiThread DLL等其他库,逐一尝试。

2error C3861: _GetSinkMap

原因:这是由于在类声明中添加基类: public IDispEventImpl<….>导致。

解决:在类的声明当中增加

BEGIN_SINK_MAP(CXXX)

END_SINK_MAP()

3、结构化异常设置

在编写接口的时候,要注意异常捕捉。一般使用try{}catch(…){}。在VS中要设置工程选项,打开VS菜单Project->Properties,选择C/C++Code Generation选项,在Enable C++ Exceptions中选择Yes With SEH Exceptions (/EHa)

4MFCOCX组件小结。

DoPropExchangeOnDrawOnCreate三个函数执行的顺序:DoPropEchangeOnCreateOnDraw

 

属性问题:当添加自定义属性时,添加的属性和属性方法都在类的调度映射中;调度映射是MFC提供的一种映射机制,主要是为了让外部应用程序可以方便地访问控件的属性和方法。

 

添加自定义事件:事件映射也是MFC提供的一种映射机制,让控件可以向包含它的容器发送事件通知。自定义的事件来说,必须在某个条件到来时,显式地调用某个函数发出该事件通知。

 

属性的持久性:为每一个具有持久性的自定义属性调用以"PX_"开关的函数.MFC为一些基本类型都提供了一个以"PX_"开头的函数,例如PX_Short,PX_Long等。在DoPropExchange中添加持久性属性。

 

将属性值的改变通知给容器: 可以调用COleControl类的成员函数:BoundPropertyChanged,该函数将通知容器绑定的属性值已经发生了改变,BoundPropertyChanged函数的原型声明如下:

void BoundPropertyChanged(DISPID dispid);

 

5MFC使用自定义资源

MFC,使用资源中的BMP是简单的,但是若是使用其他的图片资源,却是不容易的.

以下为解决办法.

首先,Resource.h里面定义ID:

#define IDB_BG                          131

然后在rc文件里面添加代码:

IDB_BG                  RCPNG                   "res//背景.png"

其中,RCPNG为自定义资源类型的名称,当然,至于你需要如何去命名就是你的事情了。自此完成了资源的自定义。

 

6MFC中如何使用动画

使用网上提供的CPictureEx库,具体文件取自FingerAPIOfUI工程。CPictureEx提供的接口如下:

接口函数说明:

BOOL Load(...) ——加载GIF 并准备绘画对象;

BOOL Draw() ——绘制图像或继续动画显示。

void Stop() ——停止动画;

void UnLoad() —— 停止动画并释放所有资源;

void SetBkColor(COLORREF) ——为透明区域设置填充颜色;

COLORREF GetBkColor() ——获取当前填充颜色;

BOOL IsGIF() —— 如果当前图像是 GIF 则返回 TRUE

BOOL IsAnimatedGIF() ——如果当前图像是动画 GIF,则返回TRUE

BOOL IsPlaying() ——如果当前图像是以动画方式显示则返回TRUE

SIZE GetSize() ——返回图像尺寸。

int GetFrameCount() ——返回当前图像的帧数量;

BOOL GetPaintRect(RECT *lpRect) ——返回当前绘制的矩形。

BOOL SetPaintRect(const RECT *lpRect) ——设置当前绘制的矩形;

 

CPictureEx[Wnd]::Load 函数有三个版本:

BOOL Load(LPCTSTR szFileName);

该版本的Load函数从一个文件加载。返回类型表示加载是否成功。

 

BOOL Load(HGLOBAL hGlobal, DWORD dwSize);

该版本的Load函数获取全局内存块句柄,用 GlobalAlloc GMEM_MOVEABLE 标志分配内存。该函数不会释放分配的内存,所以不要忘记调用 GlobalFree。返回值表示加载是否成功。

 

BOOL Load(LPCTSTR szResourceName,LPCTSTR szResourceType);

该函数获取图像资源名和资源类型,例如:

m_Picture.Load(MAKEINTRESOURCE(IDR_MYPIC),_T("GIFTYPE"));

获取资源名和类型后加载对应的图像,并用 CPictureEx[Wnd]::Draw() 显示图像,如果图像是动画 GIF,该函数会启动一个背景处理线程完成动画显示,对于非动画 GIF,则用 OleLoadPicture/IPicture。显示。

 

任何时候你都可以用 CPictureEx[Wnd]::Stop() 函数终止背景处理线程。如果你不仅想停止动画,还想释放所有资源,使用 CPictureEx[Wnd]::UnLoad() CPictureEx[Wnd]::Load() 自动调用UnLoad() )

缺省情况下,图像的背景是用 COLOR_3DFACE 填充的(对话框窗口的颜色),如果你需要改变图像背景,调用 CPictureEx[Wnd]::Load()之后调用 CPictureEx[Wnd]::SetBkColor(COLORREF) 即可。

使用 CPictureEx[Wnd]::SetPaintRect(const LPRECT) 函数可以设置一个剪贴矩形,LPRECT 参数告诉类它应该显示图像的哪一部分。如果不设置剪贴矩形,则显示整幅图像。

使用 Stop()/Draw() 可以停止动画GIF,调用Draw() 后可继续从停止的那一帧继续显示。借助 IsPlaying() 函数,你还可以知道当前是否在显示动画。

 

7、如何在MFC OCX中添加其他组件

选择VS菜单Project->Add Class,选择ATL中的Add ATL Support to MFC