用到了一个结构体和一个函数:LOGFONT和SetTextCharacterEXtra,但是LOGFONT好像也可以不需要特别的进行使用来使SetTextCharacterExtra起作用。 SetTextCharacter函数: This function sets the intercharacter spacing. Intercharacter spacing is added to each character, including break characters, when the system writes a line of text. int SetTextCharacterExtra( HDC hdc, // handle to DC int nCharExtra // extra-space value ); Parameters hdc [in] Handle to the device context. nCharExtra [in] Specifies the amount of extra space, in logical units, to be added to each character. If the current mapping mode is not MM_TEXT, the nCharExtra parameter is transformed and rounded to the nearest pixel. Return Values If the function succeeds, the return value is the previous intercharacter spacing. If the function fails, the return value is 0x80000000. 需要提一下的是LOGFONT的一个成员:lfPitchAndFamily lfPitchAndFamily Specifies the pitch and family of the font. The two low-order bits specify the pitch of the font and can be one of the following values. DEFAULT_PITCH FIXED_PITCH VARIABLE_PITCH Bits 4 through 7 of the member specify the font family and can be one of the following values. FF_DECORATIVE FF_DONTCARE FF_MODERN FF_ROMAN FF_SCRIPT FF_SWISS The proper value can be obtained by using the Boolean OR operator to join one pitch constant with one family constant. 下面是代码段: // TestFontsDlg.h : header file // #if !defined(AFX_TESTFONTSDLG_H__1128C2BD_CCE9_4A5D_879B_6CEF9EED2824__INCLUDED_) #define AFX_TESTFONTSDLG_H__1128C2BD_CCE9_4A5D_879B_6CEF9EED2824__INCLUDED_ #if _MSC_VER >= 1000 #pragma once #endif // _MSC_VER >= 1000 / // CTestFontsDlg dialog class CTestFontsDlg : public CDialog { // Construction public: CTestFontsDlg(CWnd* pParent = NULL); // standard constructor // Dialog Data //{{AFX_DATA(CTestFontsDlg) enum { IDD = IDD_TESTFONTS_DIALOG }; // NOTE: the ClassWizard will add data members here //}}AFX_DATA // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CTestFontsDlg) protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //}}AFX_VIRTUAL // Implementation protected: HICON m_hIcon; CDC* pDC; HDC hDC; HFONT hFont; private: LOGFONT logFont; CFont m_Font; // Generated message map functions //{{AFX_MSG(CTestFontsDlg) virtual BOOL OnInitDialog(); afx_msg void OnPaint(); //}}AFX_MSG DECLARE_MESSAGE_MAP() }; //{{AFX_INSERT_LOCATION}} // Microsoft eMbedded Visual C++ will insert additional declarations immediately before the previous line. #endif // !defined(AFX_TESTFONTSDLG_H__1128C2BD_CCE9_4A5D_879B_6CEF9EED2824__INCLUDED_) // TestFontsDlg.cpp : implementation file // #include "stdafx.h" #include "TestFonts.h" #include "TestFontsDlg.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif / // CTestFontsDlg dialog CTestFontsDlg::CTestFontsDlg(CWnd* pParent /*=NULL*/) : CDialog(CTestFontsDlg::IDD, pParent) { //{{AFX_DATA_INIT(CTestFontsDlg) // NOTE: the ClassWizard will add member initialization here //}}AFX_DATA_INIT // Note that LoadIcon does not require a subsequent DestroyIcon in Win32 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } void CTestFontsDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CTestFontsDlg) // NOTE: the ClassWizard will add DDX and DDV calls here //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CTestFontsDlg, CDialog) //{{AFX_MSG_MAP(CTestFontsDlg) ON_WM_PAINT() //}}AFX_MSG_MAP END_MESSAGE_MAP() / // CTestFontsDlg message handlers BOOL CTestFontsDlg::OnInitDialog() { CDialog::OnInitDialog(); // Set the icon for this dialog. The framework does this automatically // when the application's main window is not a dialog SetIcon(m_hIcon, TRUE); // Set big icon SetIcon(m_hIcon, FALSE); // Set small icon CenterWindow(GetDesktopWindow()); // center to the hpc screen // TODO: Add extra initialization here logFont.lfHeight = 18; logFont.lfWidth = 10; logFont.lfEscapement = 0; logFont.lfOrientation = 0; logFont.lfWeight = FW_NORMAL; logFont.lfItalic = 0; logFont.lfUnderline = 0; logFont.lfStrikeOut = 0; logFont.lfCharSet = ANSI_CHARSET; logFont.lfOutPrecision = OUT_DEFAULT_PRECIS; logFont.lfClipPrecision = CLIP_DEFAULT_PRECIS; logFont.lfQuality = DEFAULT_QUALITY; logFont.lfPitchAndFamily=VARIABLE_PITCH | FF_SWISS; lstrcpy(logFont.lfFaceName, L"Times New Roman"); m_Font.CreateFontIndirect(&logFont); // hFont =CreateFontIndirect(&logFont); // hDC =::GetDC(this->m_hWnd); pDC =GetDC(); return TRUE; // return TRUE unless you set the focus to a control } void CTestFontsDlg::OnPaint() { CPaintDC dc(this); // device context for painting // TODO: Add your message handler code here pDC->SelectObject(&m_Font); SetTextCharacterExtra(pDC->m_hDC, 10); pDC->DrawText(_T("Hello"), CRect(20, 20, 200, 50), DT_LEFT); // Do not call CDialog::OnPaint() for painting messages }