1

我正在使用带有 Win32 的 MS Visual C++ 2010 Express 编写记事本程序。我有它的基本设计,但是我希望能够在文本区域旁边显示行号,就像你在大多数文本编辑器中看到的那样(即 notepad++、sublime 等)。我为 textarea 提供的代码是:

hEdit = CreateWindowEx( WS_EX_CLIENTEDGE, "EDIT", "", WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_HSCROLL | ES_MULTILINE | ES_AUTOVSCROLL | ES_AUTOHSCROLL, 0, 0, 100, 100, hwnd, ( HMENU )IDC_MAIN_EDIT, GetModuleHandle( NULL ), NULL );
            if( hEdit == NULL )
                MessageBox( hwnd, "Could not create edit box.", "Error", MB_OK | MB_ICONERROR );

            hfDefault = CreateFont( 0, 0, 0, 0, FW_NORMAL, FALSE, FALSE, 0, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH, TEXT( "Consolas" ) );
            SendMessage( hEdit, WM_SETFONT, ( WPARAM )hfDefault, MAKELPARAM( FALSE, 0 ) );
4

2 回答 2

1

“EDIT”控件在页边空白处没有对行号(或其他任何内容)的任何内置支持。在第一个旁边创建另一个“编辑”控件并将行号放入该控件中。

于 2013-10-06T19:27:50.237 回答
1

尽管标准的EDIT多行控件本身并不支持行号的显示,但手动完成这一点相当容易,只需少量工作即可。

您可以使用EM_SETRECT/EM_SETRECTNP在控件的一侧为装订线创建空间,然后您可以对控件进行子类化以拦截其WM_PAINT消息,以便您可以根据需要在装订线中绘制自己的行号。

绘图时,您可以使用EM_CHARFROMPOSEM_LINEFROMCHAREM_POSFROMCHAR帮助您将客户区坐标转换为行号,并计算行高。

于 2017-01-23T21:23:23.717 回答