Я однажды реализовал окно вывода текста с нуля - я хотел, чтобы оно работало подобно окну вывода в Visual Studio.Это оказалось сложнее, чем я ожидал, и это было без каких-либо возможностей ввода.
К сожалению, код на C ++ и принадлежит бывшему работодателю, поэтому я не могу поделиться им с вами.Но я могу дать вам представление о том, чего ожидать.
Вам нужен способ хранить строки вывода, которые вы можете быстро проиндексировать.Если вы собираетесь наложить ограничение на количество отображаемых строк, вам также необходимо будет легко удалить строки сверху.В C ++ deque<string>
был идеальным, я не знаю, каков эквивалент (если есть) в C #.
Вам понадобятся обработчики для следующих сообщений Windows, в произвольном порядке.
- WM_LBUTTONDOWN - начать выбор.Используйте SetCapture для отслеживания мыши, когда кнопка нажата.
- WM_LBUTTONUP - для завершения выбора.
- WM_RBUTTONUP - перевод в WM_CONTEXTMENU.
- WM_CONTEXTMENU - для отображения меню сКопировать / вырезать / вставить и все, что вы хотите.
- WM_KEYDOWN - чтобы ответить на 4 клавиши курсора, Home / End, PageUp / PageDown.Ctrl-A / Ctrl-C / Ctrl-X / Ctrl-V / Ctrl-D.
- WM_PAINT - рисовать содержимое окна.
- WM_SIZE - обновлять полосы прокрутки, когдаизменяется размер окна.
- WM_VSCROLL - для обновления видимой части окна при вертикальной прокрутке.
- WM_HSCROLL - для обновления видимой части окна при горизонтальной прокрутке.
- WM_CREATE - для инициализации при создании окна.
- WM_SETFOCUS - для создания системной каретки для отображения текущей позиции в окне.
- WM_KILLFOCUS - для уничтожения каретки, поскольку только в текущем окнедолжен показывать символ каретки.
- WM_MOUSEMOVE - отслеживать изменения выбора, когда левая кнопка мыши нажата.
- WM_CAPTURECHANGED - завершать выбор.
- WM_TIMER - для автоматического-croll, когда курсор покидает окно во время выделения.
- WM_GETDLGCODE - чтобы добавить DLGC_WANTARROWS, чтобы клавиши со стрелками проходили.
- WM_MOUSEWHEEL -чтобы прокрутить колесико мыши для прокрутки.
По мере добавления строк в текстовый буфер настройте диапазон полос прокрутки.Диапазон вертикальной полосы прокрутки будет общим числом строк, а диапазон горизонтальной полосы прокрутки будет шириной самой широкой строки.
Лучше всего иметь один шрифт, который является моноширинным - это значительно усложняет вычисления.Полегче.Технология специальных шрифтов не имеет большого значения.Вам просто нужно иметь возможность отслеживать положение символов.
Как прокрутка выполняется так эффективно?Вы отслеживаете верхнюю и нижнюю линии окна по мере его прокрутки, а когда появляется сообщение о рисовании, вы рисуете только те линии, которые в данный момент видны.Другие все еще в буфере, но они не трогают.Можно прокручивать содержимое окна, когда оно прокручивается, и рисовать только те части, которые входят сверху или снизу, но с современными процессорами это напрасная трата - окно выполнит полную перерисовку так быстро, что вы не заметите.
Редактировать: По совпадению я наткнулся на это руководство Microsoft по полосам прокрутки, которые должны быть важными для чтения этой задачи.http://msdn.microsoft.com/en-us/library/windows/desktop/bb787527.aspx