带有行号的c ++ win32 textarea?

时间:2013-10-06 18:25:14

标签: c++ winapi textarea line-numbers

我正在使用带有Win32的MS Visual C ++ 2010 Express编写记事本程序。我有它的基本设计,但是我希望能够在textarea旁边显示行号,就像你在大多数文本编辑器中看到的那样(即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 ) );

2 个答案:

答案 0 :(得分:1)

“编辑”控件对边距中的行号(或其他任何内容)没有任何内置支持。在第一个旁边创建另一个“编辑”控件,并将行号放在那个控件中。

答案 1 :(得分:1)

虽然标准的EDIT多行控件不支持显示行号支持行号的显示,但只需稍加工作就可以轻松完成。

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

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