RichEditCtrl 怎样加行号?急,在线等!

txk1452 2008-07-20 05:22:31
网上看到一段代码,不过有点总是,滚动条滚动时行号和文本不能正确的同步
=========================================================================================
void ShowLineNum( HWND hEdit )
{
/*
功能:显示文本的总行数
参数:
hEdit:要显示行号的文本框,普通的Edit控件没有测试过,这里只用RichEdit

返回值:没有。
--------------------------------------------------------------------------------
*/
RECT ClientRect; //RichEdit的客户区大小
HDC hdcEdit; //RichEdit的Dc(设备环境)
HDC hdcCpb; //与RichEdit兼容的Dc
HBITMAP hdcBmp; //RichEdit兼容的位图dc
int CharHeight; //字符的高度
int chHeight; //字符的高度,常量
int FirstLine; //文本框中的第一个可见行的行号。
int ClientHeight; //RichEdit的客户区高度
int LineCount; //文本的总行数
char countBuf[10]; //显示行号的缓冲区
CHARFORMAT CharFmt; //RichEdit中的一个结构,用于获取字符的一系列信息,这里只用它来获取字符高度

//获取RichEdit的Dc
hdcEdit = GetDC( hEdit );
GetClientRect( hEdit, &ClientRect);
//获取RichEdit的客户区高度
ClientHeight = ClientRect.bottom - ClientRect.top;
//创建与RichEdit兼容的Dc
hdcCpb = CreateCompatibleDC( hdcEdit );
//创建与RichEdit兼容的位图Dc,我们用来显示行号用的。
hdcBmp = CreateCompatibleBitmap( hdcEdit, 40, ClientHeight );
//将位图dc选入RichEdit环境中
SelectObject( hdcCpb, hdcBmp );
//填充显示行号dc的背景颜色。大家可以试试其它颜色
FillRect( hdcCpb, &ClientRect, CreateSolidBrush(0x8080ff) );
SetBkMode( hdcCpb, TRANSPARENT );
//获取当前RichEdit文本中的总行数
LineCount = SendMessage( hEdit, EM_GETLINECOUNT, 0, 0 );

RtlZeroMemory( &CharFmt, sizeof(CharFmt) );
CharFmt.cbSize = sizeof( CharFmt );
SendMessage( hEdit, EM_GETCHARFORMAT, TRUE, (long)&CharFmt );
//获取字符高度,以英寸为单位,需转化为磅,只要除以20就得到磅尺寸。
CharHeight = CharFmt.yHeight / 20;
chHeight = CharHeight;
CharHeight = 1;
//设置显示行号的前景色
SetTextColor( hdcCpb, 0x000000 );
//获取文本框中第一个可见的行的行号,没有这个行号,显示不会跟着文本的滚动而滚动。
FirstLine = SendMessage( hEdit, EM_GETFIRSTVISIBLELINE, 0, 0 );
FirstLine++;
//在位图dc中循环输出行号
while( FirstLine <= LineCount )
{
TextOut( hdcCpb, 1, CharHeight, countBuf, wsprintf( countBuf, TEXT("%4u"), FirstLine++ ));
CharHeight += chHeight + 4;
if( CharHeight > ClientHeight ) break;
}
//将已"画好"的位图真正"贴"到RichEdit中
BitBlt( hdcEdit, 0, 0, 40, ClientHeight, hdcCpb, 0, 0, SRCCOPY );
DeleteDC( hdcCpb );
ReleaseDC( hEdit, hdcEdit );
DeleteObject( hdcBmp );
...全文
456 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
healer_kx 2008-07-24
  • 打赏
  • 举报
回复
自绘啊,Rich有个LeftMagin吧,也可以利用啊,或者统一Indent了。
菜牛 2008-07-24
  • 打赏
  • 举报
回复
这种方式不是很协调,可以这样:
用一个自定义窗口,把RichEdit创建为其子窗口,大小调整为左边留出一定空间,然后把行号绘制在左边。响应RichEdit控件的消息(滚动、变更等)刷新行号区域。
lmhcs 2008-07-24
  • 打赏
  • 举报
回复
我用vb实现找个功能了。不过,我还不能让行号字体跟着richtextbox 一起变大变小。不知道怎么选入richtextbox的字体啊。
jyh_baoding 2008-07-21
  • 打赏
  • 举报
回复
有相应的函数啊
BlueSky20080808 2008-07-21
  • 打赏
  • 举报
回复
新手来学习,帮顶!
aj3423 2008-07-20
  • 打赏
  • 举报
回复
呵呵 你看的是这篇文章吧 http://blog.programfan.com/article.asp?id=20893
他说到先要子类化,让RichEdit自己来响应并处理WM_PAINT 消息。
但好像接下来要做的 把文字右移来空出地方显示行号 这步比价困难 关注~

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧