zoukankan      html  css  js  c++  java
  • 在测试第一个动态链接库的时候遇到的GetTextExtentPoint()

    在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,通过这函数跟字符输出函数配合达到很好的自动换行显示效果

  • 相关阅读:
    mysql qps tps
    SQL RIGHT JOIN 关键字
    C#的多态性
    c# 与java之间的简单区别
    多少行转多少列
    SQL语句中&、单引号等特殊符号的处理
    sql 函数的理解
    c# 基础之数组(包含三维数组)
    泛型之Dictionary
    在十六进制字符串与数值类型之间转换
  • 原文地址:https://www.cnblogs.com/daoluanxiaozi/p/2216811.html
Copyright © 2011-2022 走看看