Я пишу программу для блокнота, используя MS Visual C ++ 2010 Express с Win32. У меня есть базовый дизайн для этого, однако я хотел бы иметь возможность показывать номера строк рядом с текстовой областью, как вы видите в большинстве текстовых редакторов (например, 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 ) );
Элемент управления «РЕДАКТИРОВАНИЕ» не имеет встроенной поддержки номеров строк (или чего-либо еще) на полях. Создайте еще один элемент управления «РЕДАКТИРОВАТЬ» рядом с первым и поместите в него номера строк.
Хотя стандарт EDIT
многострочный контроль не изначально Поддержка отображения номеров строк, это довольно легко выполнить вручную с небольшой работой.
Ты можешь использовать EM_SETRECT
/EM_SETRECTNP
чтобы создать пространство для желоба вдоль одной стороны элемента управления, а затем вы можете создать подкласс для элемента управления, чтобы перехватить его WM_PAINT
сообщения, так что вы можете нарисовать свои собственные номера строк в желобе по мере необходимости.
Во время рисования вы можете использовать EM_CHARFROMPOS
, EM_LINEFROMCHAR
, а также EM_POSFROMCHAR
чтобы помочь вам перевести координаты клиентской области в номера строк и рассчитать высоту линий.