Народ подскажите пожалуйста в какую сторону копать чтобы сделать нумерацию строк в ричедите? Гуглил, но там все толкают компоненты Scintilla и SynEdit, и ни че толкового найти не смог, надеюсь на вас! ЗЫ методы типа кинь рядом с ричедитом простой едит и обновляй его как только обновится рич мне не нужны! Нужен какой нибуть хороший метод!
elestrago всмысле на чем текст? Текст исходный выводишь в ричедите, а номера строк сбоку от него методом TextOut() по координатам. Получаешь координаты ричедита, расчитываешь нужные тебе координаты для номера строки и выводишь... Правда придеться учитывать размер шрифта, но это чисто арифметика
дык че текст на тексте выводить чтоли? вот как сделать к примеру так как в notepad++ c боку панельку с нумерацией строк?
Помоему легче спросить как это сделать, нежели перерыть целый компонент чтобы узнать как же сделать панельку для цифарок
elestrago эге. вам легче спросить, а нам рыть для вас бо вы с запросами, да? ну тогда скажу вам, что в сцинтилле нет никаких ричедитов. там все полностью с 0. и выводится там все как вам уже писали mrcrown и onSide. и вобще, переставайте перебирать советами и начинайте пробовать сами, хоть это и невероятно тяжело
Зачем обязательно рыть и делать за меня, я этого не прошу! Я спрашиваю! МОЖЕТ быть кто нибуть уже подобное делал и знает как это делается! Единственное что мне надо это направление куда идти ( ввиде названий функций )
elestrago гля как грозно.. баюс баюс и другие функции вывода текста. выводить можете на контейнере вашего едита, на соседнем чайлде, в тултипе (тогда текст оут не нужен). это самые быстрые и простые методы. ээ, да, читаем Ч. Петзолд "Программирование для Windows® 95" что он пишет про создание окон и графику со шрифтами графика несколько подробнее описана у Фэнь Юаня
Субклась этот контрол, потом меняй размер клиентской части в WM_NCCALCSIZE, Получай ДЦ GetWindowDC, пиши номера строк, в место, которое сам под себя и отвёл. Читай про сообщения TextBox'ов там легко получить первую видимую строку и последнюю чуть посложнее.
При помощи EM_SETMARGINS отодвигаешь текст вправо, а на WM_PAINT дорисовываешь слева циферки одним вызовом ExtTextOut.
Еще вариант: получить количество строк invoke SendMessage,hwndRichEdit,EM_GETLINECOUNT,0,0 делаем еще один рич едит слева от контрола с текстом и заполоняем его номерами строк синхронизировать вертикальную прокрутку.
Sashasan, asm-файл Код (ASM): ; GUI # include win64a.inc IDC_EDIT equ 100 IDD_DLG1 equ 101 IDC_ICON1 equ 10 MARGIN_X equ 30 .code WinMain proc local dummy:qword mov ecx,offset LibFileName invoke LoadLibrary invoke LoadIcon,IMAGE_BASE,IDC_ICON1 mov hIcon,rax mov r9d,offset DlgProc invoke DialogBoxParam,IMAGE_BASE,IDD_DLG1,0,,rax invoke RtlExitUserProcess,NULL WinMain endp DlgProc proc hWnd:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM mov hWnd,rcx cmp edx, WM_INITDIALOG jz wmINITDIALOG cmp edx, WM_CLOSE jz wmCLOSE wmdefault:xor eax, eax jmp wmBYE wmINITDIALOG: invoke SendMessage,,WM_SETICON,0,hIcon invoke SendDlgItemMessage,hWnd,IDC_EDIT,EM_SETMARGINS,\ EC_LEFTMARGIN,MARGIN_X invoke GetDlgItem,hWnd,IDC_EDIT mov r8d,offset WndProc invoke SetWindowLongPtr,eax,GWL_WNDPROC mov g_pOrgWndProc,rax jmp wmdefault wmCLOSE:invoke EndDialog,,0 wmBYE: leave retn DlgProc endp WndProc proc hWnd:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM local pt:POINT local sz[6]:BYTE local lc:dword local rect:RECT local rgn:qword local old_rsi:qword mov hWnd,rcx mov uMsg,edx mov old_rsi,rsi mov [rsp+20h],r9;lParam mov r9,r8;wParam mov r8,rdx;uMsg mov edx,ecx;hWnd invoke CallWindowProc,g_pOrgWndProc cmp uMsg,WM_PAINT jnz wmBYE wmPAINT:invoke SendMessage,hWnd,EM_GETLINECOUNT,0,0 mov lc, eax or eax, eax jz wmBYE invoke GetDC,hWnd mov hDC,rax lea edx,rect invoke GetClientRect,hWnd invoke CreateRectRgn,rect.left,rect.top,rect.right,rect.bottom mov rgn,rax ;rgn invoke SelectClipRgn,hDC,eax invoke BitBlt,hDC,0,0,MARGIN_X,rect.bottom,hDC,0,0,PATCOPY invoke SendMessage,hWnd,EM_GETFIRSTVISIBLELINE,0,0 mov esi,eax;lineNo ;.while esi <= lc @@: invoke SendMessage,hWnd,EM_LINEINDEX,esi,0 inc eax;eax = -1? jz break lea r9d,[rax-1] lea r8d,pt invoke SendMessage,hWnd,EM_POSFROMCHAR mov eax,pt.y cmp eax,rect.bottom ja break;.break .if eax > rect.bottom inc esi;lineNo+ lea ecx,sz mov edx,offset aLu ; "%lu" invoke wsprintf,,,esi lea r9d,sz mov r8d,pt.y invoke TextOut,hDC,0,,,eax cmp esi,lc jbe @b;.endw break: invoke DeleteObject,rgn invoke SelectClipRgn,hDC,0 invoke ReleaseDC,hWnd,hDC wmBYE: mov rsi,old_rsi leave retn WndProc endp .data aLu db '%lu',0 LibFileName db 'msftedit.dll',0 g_pOrgWndProc dq ? hDC dq ? hIcon dq ? end rc-файл Код (C): #include "resource.h" #define IDC_EDIT 100 #define IDD_DLG1 101 #define IDC_ICON1 10 IDC_ICON1 ICON DISCARDABLE "br_Fox1.ico" IDD_DLG1 DIALOGEX 10,10,100,100 CAPTION "test" FONT 12,"MS Sans Serif",0,0,0 STYLE WS_POPUP|WS_VISIBLE|WS_CAPTION|WS_SYSMENU|DS_CENTER BEGIN CONTROL "",IDC_EDIT,"RichEdit50W",WS_CHILD|WS_VISIBLE|ES_MULTILINE|ES_WANTRETURN|ES_AUTOHSCROLL|ES_AUTOVSCROLL,0,0,90,50 END asm-/rc-/ico-/exe-файлы в аттаче