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

  • 相关阅读:
    vue-router 滚动行为封装示例
    HTML5 History 模式 后端ngnix配置
    vue-router 嵌套命名视图
    npm 源管理 nrm
    windows系统git使用zip命令报错解决方法
    vue v-html 动态内容样式无效解决方法
    vue 项目打包 本地预览
    Vue 项目环境变量
    Oracle中的统计信息
    宽表和窄表的区别---字段
  • 原文地址:https://www.cnblogs.com/daoluanxiaozi/p/2216811.html
Copyright © 2011-2022 走看看