是这样的 我要实现在view视图里用CDC输出一篇文章 得实现自动换行 而且不用CEdit之类的控件输出 但我还要实现自动换行的同时要求每行的间距不是默认的那样挤 要求设置一定的间距 用到什么函数呢?我看了drawtext只能实现自动换行 但实现不了设置行间距 用textout的话 只能实现设置行间距(即:每次计算每行的输出位置)但设置不了自动换行 有别的函数能够实现自动换行的同时还能够设置行间距吗?我看到GDI+了 好像也不知道能否设置 有明白的高手指教一下 最好说的详细一点 函数 以及怎么用 不会的就别留言了
你可以通过控制坐标来实现
const int Y_SPACE = 25; // 行距
char s[4096]; // 文章内容
char *p = s;
int x = 0, y = 0;
for (int i=0; i<strlen(s)/LINE_COUNT; i++)
{
::TextOut(x, y, p, LINE_COUNT);
p += LINE_COUNT;
y += Y_SPACE;
}
每行能装多少字是可以计算出来的, GetTextExtent就可以.
你再获取一下显示区域的大小,我想觉得完全可以控制啊,而且很灵活.
谢谢你 我实现了间距 可是没有自动换行啊 嘿 如果想限定在给定的那个区域里的话 我该怎样实现换行呢 给定的区域是我用CDC画的四条线 这四条线组成一个矩形 就像上面那个代码那样 在这个矩形里 我实现了间距变宽了 但是输出的文字却跑到了矩形区域的外面 您能给个解决办法吗
{
const int LINE_COUNT = 5; // 每行字数
const int Y_SPACE = 25; // 行距
char *p = pString;
int x = 0, y = 0;
for (int i=0; i<strlen(pString)/LINE_COUNT; i++)
{
pDC->TextOut(x, y, p, LINE_COUNT);
p += LINE_COUNT;
y += Y_SPACE;
}
}
{
TEXTMETRIC tm;
GetTextMetrics(pDC->GetSafeHdc(), &tm); //CSize size = pDC->GetTextExtent(pString, strlen(pString));
const int LINE_COUNT = rc.Width()/tm.tmAveCharWidth; // 每行字数
const int Y_SPACE = 25; // 行距 char *p = pString;
int x = rc.left, y = rc.top;
for (int i=0; i<strlen(pString)/LINE_COUNT; i++)
{
pDC->TextOut(x, y, p, LINE_COUNT);
p += LINE_COUNT;
y += Y_SPACE;
}
}
很感谢你的耐心 一会送分 我现在还是解决不了那个文字跑出矩形外面的问题 肯定是我的每行字数那里错了
在VS2005里的演示代码
TEXTMETRIC tm;
pDC.GetTextMetricsW(&tm);
const int LINE_COUNT = (myrect.Width()*6/8)/tm.tmAveCharWidth; // 每行字 (我的矩形区域的宽度是画了两条线 横坐标分别是 myrect.width()/8,myrect.width()*7/8)
CSize sz = pDC.GetTextExtent(str4); const int Y_SPACE = 35;// 行距
int x = myrect.Width()/8+10; //在这个位置输出文本内容 因为文本上面还有标题的位置呢
int y = myrect.Height()/25+115;
for (int i = 0; i < lstrlenW(str4)/LINE_COUNT; i++)
{
pDC.TextOutW(x,y, str4, LINE_COUNT);
str4 += LINE_COUNT;
y += Y_SPACE;
}
如果你用两条线的坐标来算矩形宽,那也应该是:
右边line的x坐标 - 左边line的x坐标啊.
(myrect.Width()*6/8)这是什么意思呢..
int x = myrect.Width()/8+10;你既然将字放在左边界后的10个像素,那么字体很可能出界啊。将这一句
const int LINE_COUNT = (myrect.Width()*6/8)/tm.tmAveCharWidth;
改成
const int LINE_COUNT = (myrect.Width()*6/8 - 20)/tm.tmAveCharWidth;
myrect是我定义的一个 CRect矩形区域 然后
CClientDC pDC(this);
this->GetClientRect(&myrect);
pDC.MoveTo(myrect.Width()/8,myrect.Height()/25);
pDC.LineTo(myrect.Width()/8,myrect.Height()*24/25);
pDC.MoveTo(myrect.Width()*7/8,myrect.Height()/25);
pDC.LineTo(myrect.Width()*7/8,myrect.Height()*24/25); pDC.MoveTo(myrect.Width()/8,myrect.Height()/25);
pDC.LineTo(myrect.Width()*7/8,myrect.Height()/25); pDC.MoveTo(myrect.Width()/8,myrect.Height()*24/25);
pDC.LineTo(myrect.Width()*7/8,myrect.Height()*24/25);这是画出来的矩形 就当做是一页纸张 里面输出文字 然后myrect.Width()*6/8是这个矩形页面的宽度啊 我到底哪里错了呢 帮忙指教一下 我快下班了 回家很难上网 网速不好 我希望马上就做出来了 小女子拜托您了
这个也出界 那个+10是当时用drawtext自动换行输出的时候 为了好看 因为如果不+10右边就空白出来好多地方 左边就特别挤
急什么,才周一嘛.
你试下一行能放多少个字,然后把LINE_COUNT设置成那个数值就行了,嘿嘿~~
如果你那个矩形大小是固定的话.