winapi — c ++ win32 textarea с номерами строк?

Я пишу программу для блокнота, используя 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 ) );

1

Решение

Элемент управления «РЕДАКТИРОВАНИЕ» не имеет встроенной поддержки номеров строк (или чего-либо еще) на полях. Создайте еще один элемент управления «РЕДАКТИРОВАТЬ» рядом с первым и поместите в него номера строк.

1

Другие решения

Хотя стандарт EDIT многострочный контроль не изначально Поддержка отображения номеров строк, это довольно легко выполнить вручную с небольшой работой.

Ты можешь использовать EM_SETRECT/EM_SETRECTNP чтобы создать пространство для желоба вдоль одной стороны элемента управления, а затем вы можете создать подкласс для элемента управления, чтобы перехватить его WM_PAINT сообщения, так что вы можете нарисовать свои собственные номера строк в желобе по мере необходимости.

Во время рисования вы можете использовать EM_CHARFROMPOS, EM_LINEFROMCHAR, а также EM_POSFROMCHAR чтобы помочь вам перевести координаты клиентской области в номера строк и рассчитать высоту линий.

1

По вопросам рекламы [email protected]