none
C++ 设置字体间距问题 RRS feed

  • 问题

  • 请问用下面来创建字体,字体的高度与宽度都可以设置 ,但它的间距设置不了,为什么啊? lfPitchAndFamily不是可以设置字体间距的吗,怎么用啊
                    LOGFONT m_lf;
    memset(&m_lf, 0, sizeof(LOGFONT));
    m_lf.lfHeight = 12;
    m_lf.lfWidth = 0;
    m_lf.lfWeight = FW_NORMAL;
    m_lf.lfCharSet=DEFAULT_CHARSET;
    m_lf.lfQuality=ANTIALIASED_QUALITY; //输入质量
    m_lf.lfPitchAndFamily=VARIABLE_PITCH;
       m_lf.lfPitchAndFamily=VARIABLE_PITCH|FF_SCRIPT;

    _tcscpy(m_lf.lfFaceName,m_fontFaceName);

    m_font.CreateFontIndirect(&m_lf);
    SelectObject(cdc,m_font);
    2011年2月22日 3:41

答案

  • CDC::SetTextCharacterExtra()
    Visual C++ enthusiast, like network programming and driver development. At present is being engaged in the WinCE/Windows Mobile platform embedded development.
    2011年2月22日 5:46
    版主
  • Hi VS2005,

    像之前大家说的,可以用CDC类的成员函数SetTextCharacterExtra(int nCharExtra);来改变文本字符之间的间隔.

    一个简单的使用SetTextCharacterExtra改变间距的例子:

    1.       先建一个mfc的程序;

    2.       在您的…View.cpp文件中的OnDraw函数中加入如下代码:

    pDC->TextOut(20,20,L"原来间距");

    pDC->SetTextCharacterExtra(10);

    pDC->TextOut(20,120,L"改变后的间距");

    3.       运行程序;

    这时候我们就会发现字符间的间距发生了变化。

    (此过程我在vs2008中测试过)

     

    如果您的问题解决了,请把有用的回答标记为答案!

     

    谢谢,

    Lucy


    Lucy Liu [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2011年3月3日 10:23
    版主

全部回复

  • CDC::SetTextCharacterExtra()
    Visual C++ enthusiast, like network programming and driver development. At present is being engaged in the WinCE/Windows Mobile platform embedded development.
    2011年2月22日 5:46
    版主
  • 其实我刚开始也是用SetTextCharacterExtra()这个函数来设字距的啊,但用DrawText输出的时候,右边上的文字输出到区域外面去了(也就是右边上有的文字看不到的),我也不知道是什么原因啊
    2011年2月22日 6:12
  • 问题也太模糊了吧 DrawText()先用DT_CALCRECT 算好

    不能不算就画

     系统才不管你有没有位置可以画

    DT_END_ELLIPSIS可以写不下用"..." 代替

    DT_SINGLELINE 以只一行

    希望对你有帮助

    2011年2月22日 13:01
  • SetTextCharacterExtra(hdc,m_fontSpaceSize);

            SetTextColor(hDC, color);

    SetBkMode(hDC, TRANSPARENT);

    CSetFont cutFont(hDC, lHeight, lWidth, FW_NORMAL,lFaceName);

    ::DrawText(hDC, lpText, lstrlen(lpText),&rc, ,DT_EDITCONTROL|DT_WORDBREAK|DT_END_ELLIPSIS|DT_NOCLIP);

          以上是我输出文字的代码,如果加上 SetTextCharacterExtra(hdc,m_fontSpaceSize);--设字体间距,就把右边上的文字画到区域处面去了,如果不加,就不会出现这个问题。   要怎么写才对啊?

    楼上所说的DT_CALCRECT 是format的选项吗

    2011年2月23日 1:28
  • int DrawText(
     HDC hDC,     // handle to DC
     LPCTSTR lpString, // text to draw
     int nCount,    // text length
     LPRECT lpRect,  // formatting dimensions
     UINT uFormat   // text-drawing options
    );

    DrawText(hDC, lpText, lstrlen(lpText),&rc, ,DT_EDITCONTROL|DT_WORDBREAK|DT_END_ELLIPSIS|DT_NOCLIP|DT_CALCRECT);

     

    系统会抛出一个正确矩形给你 当然是放到rc中

    2011年2月23日 4:36
  • 我把代码改成你说的那样后(即加上DT_CALCRECT)DrawText(hDC, lpText, lstrlen(lpText),&rc, ,DT_EDITCONTROL|DT_WORDBREAK|DT_END_ELLIPSIS|DT_NOCLIP|DT_CALCRECT);  文字就输不出来了,也就是rc里没有就文字了啊,你可以试试看啊

    2011年2月23日 6:26
  • Hi VS2005,

    DT_CALCRECT选项使DrawText只是计算并返回一个可显示字符串的矩形,并不显示字符串

    返回的rect是扩展后的显示区域,DT_CALCRECT会扩展rect的宽度和长度,即rightbottom,返回的rect是以传入的(rect.left,rect.top)为原点扩展rightbottom后的一个区域,drawtext并不会改变rect.leftrect.top。返回的rect只是一个已经经过计算的需要显示大小的区域,需要你自己用offsetrect来把返回的rect移动到你想要显示的位置(比如居中的位置).

     

    谢谢,

    Lucy


    Lucy Liu [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2011年3月1日 3:13
    版主
  • 谢谢你的答复。我还是不太明白你所说的。还是说说我提出的间距是吧:对于设置字体间距的间距,是如何实现的
    2011年3月1日 7:39
  • Hi VS2005,

    像之前大家说的,可以用CDC类的成员函数SetTextCharacterExtra(int nCharExtra);来改变文本字符之间的间隔.

    一个简单的使用SetTextCharacterExtra改变间距的例子:

    1.       先建一个mfc的程序;

    2.       在您的…View.cpp文件中的OnDraw函数中加入如下代码:

    pDC->TextOut(20,20,L"原来间距");

    pDC->SetTextCharacterExtra(10);

    pDC->TextOut(20,120,L"改变后的间距");

    3.       运行程序;

    这时候我们就会发现字符间的间距发生了变化。

    (此过程我在vs2008中测试过)

     

    如果您的问题解决了,请把有用的回答标记为答案!

     

    谢谢,

    Lucy


    Lucy Liu [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2011年3月3日 10:23
    版主
  • Hi VS2005,

    我先暂时把一些我认为有用的回答标记为答案,如果您认为它们没用的话,您可以取消标记为答案!

    谢谢您的理解,

     

    Lucy


    Lucy Liu [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2011年3月4日 9:54
    版主
  • SetTextCharacterExtra(hdc,m_fontSpaceSize);

     

            SetTextColor(hDC, color);

    SetBkMode(hDC, TRANSPARENT);

    CSetFont cutFont(hDC, lHeight, lWidth, FW_NORMAL,lFaceName);

    ::DrawText(hDC, lpText, lstrlen(lpText),&rc, ,DT_EDITCONTROL|DT_WORDBREAK|DT_END_ELLIPSIS|DT_NOCLIP);

     

          以上是我输出文字的代码,如果加上  SetTextCharacterExtra(hdc,m_fontSpaceSize);--设字体间距,就把右边上的文字画到区域处面去了,如果不加,就不会出现这个问题。   要怎么写才对啊?

    2011年3月4日 13:36
  • Hi vs2005,

    请问您具体是想实现什么功能?

    如果是实现字体间距用SetTextCharacterExtra函数用以上的方法就可以了。

    如果您还涉及到其他方面,请您提供更详细的信息,如您是建一个什么样的工程?及提供您的详细代码,让我们可以重新您的问题给予解决。

    谢谢您的理解,

     

    Lucy


    Lucy Liu [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2011年3月7日 10:16
    版主
  • C++的WTL工程,就是把txt文件的字画在以图片为背景上,当我用 SetTextCharacterExtra(hdc,m_fontSpaceSize);--设字体间距,就把右边上的文字画到区域处面去了,如果不加,就不会出现这个问题。详细的读取txt,并且画在以图片为背景上的代码如下:


    HANDLE hSrcFile = CreateFile(lpFileName, GENERIC_READ, 0, NULL,OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);


    if(hSrcFile != INVALID_HANDLE_VALUE)

    {

    TCHAR *szBuffer = (TCHAR*)malloc(sizeof(TCHAR)*1024);

    DWORD dwNumOfBytesRead;

    memset(szBuffer,0,sizeof(TCHAR)*1024);


    BOOL bResult = ReadFile(hSrcFile, szBuffer, 1312, &dwNumOfBytesRead, NULL);//读取内容

    szBuffer++;//过滤前两个字节

    while(bResult && dwNumOfBytesRead>0)

    {

    SetTextCharacterExtra(hdc,m_fontSpaceSize);

    m_backGround.FromFontCopyDC(hdc,m_rcView,szBuffer,RGB(m_fontColorR,m_fontColorG,m_fontColorB),m_fontHeight,m_fontWidth,FW_NORMAL,m_fontFaceName,DT_EDITCONTROL|DT_WORDBREAK|DT_END_ELLIPSIS|DT_NOCLIP );

                    bResult=false;

    }

    free(szBuffer);

    }

    CloseHandle(hSrcFile);

    2011年3月11日 1:33