RichEditCtrl 怎样加行号?急,在线等!
网上看到一段代码,不过有点总是,滚动条滚动时行号和文本不能正确的同步
=========================================================================================
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 );