欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

让程序使用自带的字体2

程序员文章站 2024-02-16 10:50:04
...

转载请说明原出处,谢谢~~:http://blog.csdn.net/zhuhongshu/article/details/45362655


        之前写过一篇博客,说明关于加载自带字体的。http://blog.csdn.net/zhuhongshu/article/details/39396223,不过后来发现使用AddFontResource函数缺点不少。主要是创建的字体不是自己程序私有的,其他程序也可以使用到。而且函数调用后会在程序目录创建一个.FOT格式的文件。后来再次翻阅MSDN时发现了AddFontMemResourceEx函数,这个函数可以从内存缓冲中加载字体,并且创建的字体是私有的,也不会创建FOT文件。所以又封装了一个简单的类来为程序添加自带的字体。


  1. #pragma once  
  2. class CAddMemFont  
  3. {  
  4. public:  
  5.     CAddMemFont(void);  
  6.     ~CAddMemFont(void);   
  7.   
  8.    /* 
  9.     * @param filePath:字体文件相对本程序的路径,不需要加前缀\\,(example:Font\\微软雅黑.ttf) 
  10.     */  
  11.     bool AddFont(LPCTSTR szfilePath);  
  12.   
  13. private:  
  14.   
  15.     TCHAR       m_szFilePath[MAX_PATH];  
  16.     HANDLE      m_hFont;  
  17.   
  18. };  
#pragma once
class CAddMemFont
{
public:
    CAddMemFont(void);
    ~CAddMemFont(void);    

   /*
    * @param filePath:字体文件相对本程序的路径,不需要加前缀\\,(example:Font\\微软雅黑.ttf)
    */
    bool AddFont(LPCTSTR szfilePath);

private:

    TCHAR       m_szFilePath[MAX_PATH];
    HANDLE      m_hFont;

};



  1. #include “sdtafx.h”  
  2.   
  3. CAddMemFont::CAddMemFont(void)  
  4.     : m_hFont( NULL )  
  5. {  
  6.     ZeroMemory( m_szFilePath, MAX_PATH );  
  7.     GetCurrentDirectory(MAX_PATH, m_szFilePath);  
  8.     _tcscat_s(m_szFilePath, MAX_PATH, _T(”\\”));  
  9.   
  10. }  
  11.   
  12.   
  13. CAddMemFont::~CAddMemFont(void)  
  14. {  
  15.     RemoveFontMemResourceEx(m_hFont);  
  16. }  
  17.   
  18. bool CAddMemFont::AddFont(LPCTSTR szfilePath)  
  19. {  
  20.     _tcscat_s(m_szFilePath, MAX_PATH, szfilePath);  
  21.   
  22.     HANDLE hFile = CreateFile( m_szFilePath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);  
  23.     if (hFile == INVALID_HANDLE_VALUE)  
  24.     {  
  25.         return false;  
  26.     }  
  27.   
  28.     DWORD dwFileSize    = GetFileSize(hFile, NULL);  
  29.     BYTE* lpBuffer      = new BYTE[dwFileSize+1];  
  30.   
  31.     DWORD dwReadSize    = 0;  
  32.     if (!ReadFile( hFile, lpBuffer, dwFileSize, &dwReadSize, NULL))  
  33.     {  
  34.         delete[] lpBuffer;  
  35.         CloseHandle(hFile);  
  36.         return false;  
  37.     }  
  38.   
  39.     lpBuffer[dwReadSize] = ’\0’;  
  40.   
  41.     DWORD dwFontNumber  = 0;  
  42.     m_hFont = AddFontMemResourceEx(lpBuffer, dwReadSize, 0, &dwFontNumber);  
  43.     if ( m_hFont == NULL )  
  44.     {  
  45.         delete[] lpBuffer;  
  46.         CloseHandle(hFile);  
  47.         return false;  
  48.     }  
  49.   
  50.     return true;  
  51. }  
#include "sdtafx.h"

CAddMemFont::CAddMemFont(void)
    : m_hFont( NULL )
{
    ZeroMemory( m_szFilePath, MAX_PATH );
    GetCurrentDirectory(MAX_PATH, m_szFilePath);
    _tcscat_s(m_szFilePath, MAX_PATH, _T("\\"));

}


CAddMemFont::~CAddMemFont(void)
{
    RemoveFontMemResourceEx(m_hFont);
}

bool CAddMemFont::AddFont(LPCTSTR szfilePath)
{
    _tcscat_s(m_szFilePath, MAX_PATH, szfilePath);

    HANDLE hFile = CreateFile( m_szFilePath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
    if (hFile == INVALID_HANDLE_VALUE)
    {
        return false;
    }

    DWORD dwFileSize    = GetFileSize(hFile, NULL);
    BYTE* lpBuffer      = new BYTE[dwFileSize+1];

    DWORD dwReadSize    = 0;
    if (!ReadFile( hFile, lpBuffer, dwFileSize, &dwReadSize, NULL))
    {
        delete[] lpBuffer;
        CloseHandle(hFile);
        return false;
    }

    lpBuffer[dwReadSize] = '\0';

    DWORD dwFontNumber  = 0;
    m_hFont = AddFontMemResourceEx(lpBuffer, dwReadSize, 0, &dwFontNumber);
    if ( m_hFont == NULL )
    {
        delete[] lpBuffer;
        CloseHandle(hFile);
        return false;
    }

    return true;
}



        使用时,先把字体文件(这里是“DroidSansFallback.ttf“)放到自己指定的目录(这里是程序文件夹中的Font文件夹),然后_tWinMain函数中,声明一个CAddMemFont变量。然后调用AddFont方法就可以了(需要注意的就是,应该在窗体创建之前就调用这个方法,因为窗体的创建过程中就会去解析xml并且创建字体对象,如果在窗体创建之后再调用,就已经迟了)


  1. CAddMemFont font;  
  2. if (!font.AddFont(_T(“Font\\DroidSansFallback.ttf”)))  
  3. {  
  4.     MessageBox( NULL, _T(”加载内存字体错误”), _T(“”), MB_OK );  
  5. }  
    CAddMemFont font;
    if (!font.AddFont(_T("Font\\DroidSansFallback.ttf")))
    {
        MessageBox( NULL, _T("加载内存字体错误"), _T(""), MB_OK );
    }


       这时就可以直接在编写xml文件时使用这个字体了,效果如下:


让程序使用自带的字体2




Redrain  QQ:491646717  2015.4.29


                </div>

转载请说明原出处,谢谢~~:http://blog.csdn.net/zhuhongshu/article/details/45362655


        之前写过一篇博客,说明关于加载自带字体的。http://blog.csdn.net/zhuhongshu/article/details/39396223,不过后来发现使用AddFontResource函数缺点不少。主要是创建的字体不是自己程序私有的,其他程序也可以使用到。而且函数调用后会在程序目录创建一个.FOT格式的文件。后来再次翻阅MSDN时发现了AddFontMemResourceEx函数,这个函数可以从内存缓冲中加载字体,并且创建的字体是私有的,也不会创建FOT文件。所以又封装了一个简单的类来为程序添加自带的字体。


  1. #pragma once  
  2. class CAddMemFont  
  3. {  
  4. public:  
  5.     CAddMemFont(void);  
  6.     ~CAddMemFont(void);   
  7.   
  8.    /* 
  9.     * @param filePath:字体文件相对本程序的路径,不需要加前缀\\,(example:Font\\微软雅黑.ttf) 
  10.     */  
  11.     bool AddFont(LPCTSTR szfilePath);  
  12.   
  13. private:  
  14.   
  15.     TCHAR       m_szFilePath[MAX_PATH];  
  16.     HANDLE      m_hFont;  
  17.   
  18. };  
#pragma once
class CAddMemFont
{
public:
    CAddMemFont(void);
    ~CAddMemFont(void);    

   /*
    * @param filePath:字体文件相对本程序的路径,不需要加前缀\\,(example:Font\\微软雅黑.ttf)
    */
    bool AddFont(LPCTSTR szfilePath);

private:

    TCHAR       m_szFilePath[MAX_PATH];
    HANDLE      m_hFont;

};



  1. #include “sdtafx.h”  
  2.   
  3. CAddMemFont::CAddMemFont(void)  
  4.     : m_hFont( NULL )  
  5. {  
  6.     ZeroMemory( m_szFilePath, MAX_PATH );  
  7.     GetCurrentDirectory(MAX_PATH, m_szFilePath);  
  8.     _tcscat_s(m_szFilePath, MAX_PATH, _T(”\\”));  
  9.   
  10. }  
  11.   
  12.   
  13. CAddMemFont::~CAddMemFont(void)  
  14. {  
  15.     RemoveFontMemResourceEx(m_hFont);  
  16. }  
  17.   
  18. bool CAddMemFont::AddFont(LPCTSTR szfilePath)  
  19. {  
  20.     _tcscat_s(m_szFilePath, MAX_PATH, szfilePath);  
  21.   
  22.     HANDLE hFile = CreateFile( m_szFilePath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);  
  23.     if (hFile == INVALID_HANDLE_VALUE)  
  24.     {  
  25.         return false;  
  26.     }  
  27.   
  28.     DWORD dwFileSize    = GetFileSize(hFile, NULL);  
  29.     BYTE* lpBuffer      = new BYTE[dwFileSize+1];  
  30.   
  31.     DWORD dwReadSize    = 0;  
  32.     if (!ReadFile( hFile, lpBuffer, dwFileSize, &dwReadSize, NULL))  
  33.     {  
  34.         delete[] lpBuffer;  
  35.         CloseHandle(hFile);  
  36.         return false;  
  37.     }  
  38.   
  39.     lpBuffer[dwReadSize] = ’\0’;  
  40.   
  41.     DWORD dwFontNumber  = 0;  
  42.     m_hFont = AddFontMemResourceEx(lpBuffer, dwReadSize, 0, &dwFontNumber);  
  43.     if ( m_hFont == NULL )  
  44.     {  
  45.         delete[] lpBuffer;  
  46.         CloseHandle(hFile);  
  47.         return false;  
  48.     }  
  49.   
  50.     return true;  
  51. }  
#include "sdtafx.h"

CAddMemFont::CAddMemFont(void)
    : m_hFont( NULL )
{
    ZeroMemory( m_szFilePath, MAX_PATH );
    GetCurrentDirectory(MAX_PATH, m_szFilePath);
    _tcscat_s(m_szFilePath, MAX_PATH, _T("\\"));

}


CAddMemFont::~CAddMemFont(void)
{
    RemoveFontMemResourceEx(m_hFont);
}

bool CAddMemFont::AddFont(LPCTSTR szfilePath)
{
    _tcscat_s(m_szFilePath, MAX_PATH, szfilePath);

    HANDLE hFile = CreateFile( m_szFilePath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
    if (hFile == INVALID_HANDLE_VALUE)
    {
        return false;
    }

    DWORD dwFileSize    = GetFileSize(hFile, NULL);
    BYTE* lpBuffer      = new BYTE[dwFileSize+1];

    DWORD dwReadSize    = 0;
    if (!ReadFile( hFile, lpBuffer, dwFileSize, &dwReadSize, NULL))
    {
        delete[] lpBuffer;
        CloseHandle(hFile);
        return false;
    }

    lpBuffer[dwReadSize] = '\0';

    DWORD dwFontNumber  = 0;
    m_hFont = AddFontMemResourceEx(lpBuffer, dwReadSize, 0, &dwFontNumber);
    if ( m_hFont == NULL )
    {
        delete[] lpBuffer;
        CloseHandle(hFile);
        return false;
    }

    return true;
}



        使用时,先把字体文件(这里是“DroidSansFallback.ttf“)放到自己指定的目录(这里是程序文件夹中的Font文件夹),然后_tWinMain函数中,声明一个CAddMemFont变量。然后调用AddFont方法就可以了(需要注意的就是,应该在窗体创建之前就调用这个方法,因为窗体的创建过程中就会去解析xml并且创建字体对象,如果在窗体创建之后再调用,就已经迟了)


  1. CAddMemFont font;  
  2. if (!font.AddFont(_T(“Font\\DroidSansFallback.ttf”)))  
  3. {  
  4.     MessageBox( NULL, _T(”加载内存字体错误”), _T(“”), MB_OK );  
  5. }  
    CAddMemFont font;
    if (!font.AddFont(_T("Font\\DroidSansFallback.ttf")))
    {
        MessageBox( NULL, _T("加载内存字体错误"), _T(""), MB_OK );
    }


       这时就可以直接在编写xml文件时使用这个字体了,效果如下:


让程序使用自带的字体2




Redrain  QQ:491646717  2015.4.29


                </div>