代码改变世界

在测试第一个动态链接库的时候遇到的GetTextExtentPoint()

2011-10-18 19:08  捣乱小子  阅读(1081)  评论(0编辑  收藏  举报

在vs2008测试第一个动态链接库的项目,很久以前就对动态链接库感兴趣,因为他可以让可执行程序变的小一点,减轻程序的负担。

.h的代码

#ifdef __cplusplus
#define EXPORT extern "C" __declspec (dllexport)
#else
#define EXPORT __declspec(dllexport)
#endif

EXPORT BOOL CALLBACK EdrCenterTextA(HDC,PRECT,PCSTR);
EXPORT BOOL CALLBACK EdrCenterTextW(HDC,PRECT,PCWSTR);

#ifdef UNICODE
#define EdrCenterText EdrCenterTextW
#else
#define EdrCenterText EdrCenterTextA
#endif

 

DLL中供应的应用程序所用的函数必须先导出,须让主程序知道这些函数都来自DLL。

.c的代码

#include <windows.h>
#include "Edrlib.h"

BOOL WINAPI DllMain(
            HINSTANCE hinstDLL,
            DWORD fdwReason,
            LPVOID lpvReserved
)
{
	return TRUE;
}

EXPORT BOOL CALLBACK EdrCenterTextA(HDC hdc,PRECT prc,PCSTR pString)
{
	int iLength;
	SIZE size;

	iLength = lstrlenA(pString);

	::GetTextExtentPoint32A(hdc,
		pString,iLength,&size);

	return ::TextOutA(hdc,
		(prc->right - prc->left - size.cx)/2,
		(prc->bottom - prc->top - size.cy)/2,
		pString,iLength);
}


EXPORT BOOL CALLBACK EdrCenterTextW(HDC hdc,PRECT prc,PCWSTR pString)
{
	int iLength;
	SIZE size;

	iLength = lstrlenW(pString);

	::GetTextExtentPoint32W(hdc,
		pString,iLength,&size);

	return ::TextOutW(hdc,
		(prc->right - prc->left - size.cx)/2,
		(prc->bottom - prc->top - size.cy)/2,
		pString,iLength);
}

Petzold强烈建议dll中的函数都准备两个版本:ANSI和UNICODE版本,这也很有道理,但是我不是很清楚,ANSI版本的东西还是否还很实用?

这次又有新的收获,GetTextExtentPoint,通过这函数跟字符输出函数配合达到很好的自动换行显示效果