Нумерация строк в RichEdit

Тема в разделе "WASM.WIN32", создана пользователем elestrago, 9 май 2009.

  1. elestrago

    elestrago New Member

    Публикаций:
    0
    Регистрация:
    25 янв 2009
    Сообщения:
    56
    Народ подскажите пожалуйста в какую сторону копать чтобы сделать нумерацию строк в ричедите?

    Гуглил, но там все толкают компоненты Scintilla и SynEdit, и ни че толкового найти не смог, надеюсь на вас!

    ЗЫ методы типа кинь рядом с ричедитом простой едит и обновляй его как только обновится рич мне не нужны!

    Нужен какой нибуть хороший метод!
     
  2. mrcrown

    mrcrown Member

    Публикаций:
    0
    Регистрация:
    18 янв 2008
    Сообщения:
    227
    Метод TextOut(); :)
     
  3. elestrago

    elestrago New Member

    Публикаций:
    0
    Регистрация:
    25 янв 2009
    Сообщения:
    56
    а на чем выводить текст то?
     
  4. onSide

    onSide New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2008
    Сообщения:
    476
    elestrago всмысле на чем текст?
    Текст исходный выводишь в ричедите, а номера строк сбоку от него методом TextOut() по координатам. Получаешь координаты ричедита, расчитываешь нужные тебе координаты для номера строки и выводишь... Правда придеться учитывать размер шрифта, но это чисто арифметика :)
     
  5. elestrago

    elestrago New Member

    Публикаций:
    0
    Регистрация:
    25 янв 2009
    Сообщения:
    56
    дык че текст на тексте выводить чтоли? вот как сделать к примеру так как в notepad++ c боку панельку с нумерацией строк?
     
  6. _basmp_

    _basmp_ New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2005
    Сообщения:
    2.939
    elestrago
    в н++ сцинтилла. исходники доступны. читайте
     
  7. elestrago

    elestrago New Member

    Публикаций:
    0
    Регистрация:
    25 янв 2009
    Сообщения:
    56
    Помоему легче спросить как это сделать, нежели перерыть целый компонент чтобы узнать как же сделать панельку для цифарок :)
     
  8. _basmp_

    _basmp_ New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2005
    Сообщения:
    2.939
    elestrago
    эге. вам легче спросить, а нам рыть для вас бо вы с запросами, да? ну тогда скажу вам, что в сцинтилле нет никаких ричедитов. там все полностью с 0. и выводится там все как вам уже писали mrcrown и onSide.

    и вобще, переставайте перебирать советами и начинайте пробовать сами, хоть это и невероятно тяжело
     
  9. elestrago

    elestrago New Member

    Публикаций:
    0
    Регистрация:
    25 янв 2009
    Сообщения:
    56
    Зачем обязательно рыть и делать за меня, я этого не прошу!
    Я спрашиваю! МОЖЕТ быть кто нибуть уже подобное делал и знает как это делается!
    Единственное что мне надо это направление куда идти ( ввиде названий функций )
     
  10. _basmp_

    _basmp_ New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2005
    Сообщения:
    2.939
    elestrago
    гля как грозно.. баюс баюс

    и другие функции вывода текста. выводить можете на контейнере вашего едита, на соседнем чайлде, в тултипе (тогда текст оут не нужен). это самые быстрые и простые методы.

    ээ, да, читаем
    Ч. Петзолд "Программирование для Windows® 95"
    что он пишет про создание окон и графику со шрифтами
    графика несколько подробнее описана у Фэнь Юаня
     
  11. mrcrown

    mrcrown Member

    Публикаций:
    0
    Регистрация:
    18 янв 2008
    Сообщения:
    227
    Торжество разума заключается в том, чтобы жить в мире с теми, кто разума не имеет.
     
  12. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    Субклась этот контрол, потом меняй размер клиентской части в WM_NCCALCSIZE, Получай ДЦ GetWindowDC, пиши номера строк, в место, которое сам под себя и отвёл. Читай про сообщения TextBox'ов там легко получить первую видимую строку и последнюю чуть посложнее.
     
  13. murder

    murder Member

    Публикаций:
    0
    Регистрация:
    3 июн 2007
    Сообщения:
    628
    При помощи EM_SETMARGINS отодвигаешь текст вправо, а на WM_PAINT дорисовываешь слева циферки одним вызовом ExtTextOut.
     
  14. Sashasan

    Sashasan New Member

    Публикаций:
    0
    Регистрация:
    17 фев 2008
    Сообщения:
    23
    Адрес:
    Воронеж
    Еще вариант: получить количество строк invoke SendMessage,hwndRichEdit,EM_GETLINECOUNT,0,0
    делаем еще один рич едит слева от контрола с текстом и заполоняем его номерами строк
    синхронизировать вертикальную прокрутку.
     
  15. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.709
    Sashasan,
    asm-файл
    Код (ASM):
    1. ; GUI #
    2. include win64a.inc
    3. IDC_EDIT    equ 100
    4. IDD_DLG1    equ 101
    5. IDC_ICON1   equ 10
    6. MARGIN_X    equ 30
    7. .code
    8. WinMain proc
    9. local dummy:qword
    10.  
    11. mov ecx,offset LibFileName
    12.         invoke LoadLibrary
    13. invoke LoadIcon,IMAGE_BASE,IDC_ICON1
    14. mov hIcon,rax
    15. mov r9d,offset DlgProc
    16. invoke DialogBoxParam,IMAGE_BASE,IDD_DLG1,0,,rax
    17.     invoke RtlExitUserProcess,NULL
    18. WinMain endp
    19.  
    20. DlgProc proc hWnd:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM
    21.  
    22. mov hWnd,rcx
    23.  
    24.         cmp edx, WM_INITDIALOG
    25. jz wmINITDIALOG
    26.         cmp edx, WM_CLOSE
    27. jz wmCLOSE
    28. wmdefault:xor eax, eax
    29. jmp wmBYE
    30. wmINITDIALOG:
    31. invoke SendMessage,,WM_SETICON,0,hIcon
    32. invoke SendDlgItemMessage,hWnd,IDC_EDIT,EM_SETMARGINS,\
    33. EC_LEFTMARGIN,MARGIN_X
    34. invoke GetDlgItem,hWnd,IDC_EDIT
    35. mov r8d,offset WndProc
    36. invoke SetWindowLongPtr,eax,GWL_WNDPROC
    37. mov g_pOrgWndProc,rax
    38. jmp wmdefault
    39. wmCLOSE:invoke EndDialog,,0
    40. wmBYE: leave
    41. retn
    42. DlgProc endp
    43.  
    44. WndProc proc hWnd:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM
    45. local pt:POINT
    46. local sz[6]:BYTE
    47. local lc:dword
    48. local rect:RECT
    49. local rgn:qword
    50. local old_rsi:qword
    51.  
    52. mov hWnd,rcx
    53. mov uMsg,edx
    54. mov old_rsi,rsi
    55.  
    56. mov [rsp+20h],r9;lParam
    57. mov r9,r8;wParam
    58. mov r8,rdx;uMsg
    59. mov edx,ecx;hWnd
    60.         invoke CallWindowProc,g_pOrgWndProc
    61. cmp uMsg,WM_PAINT
    62. jnz wmBYE
    63. wmPAINT:invoke SendMessage,hWnd,EM_GETLINECOUNT,0,0
    64. mov lc, eax
    65. or eax, eax
    66. jz wmBYE
    67. invoke GetDC,hWnd
    68. mov hDC,rax
    69. lea edx,rect
    70. invoke GetClientRect,hWnd
    71. invoke CreateRectRgn,rect.left,rect.top,rect.right,rect.bottom
    72. mov rgn,rax ;rgn
    73. invoke SelectClipRgn,hDC,eax
    74. invoke BitBlt,hDC,0,0,MARGIN_X,rect.bottom,hDC,0,0,PATCOPY
    75. invoke SendMessage,hWnd,EM_GETFIRSTVISIBLELINE,0,0
    76. mov esi,eax;lineNo
    77. ;.while esi <= lc
    78. @@: invoke SendMessage,hWnd,EM_LINEINDEX,esi,0
    79. inc eax;eax = -1?
    80. jz break
    81. lea r9d,[rax-1]
    82. lea r8d,pt
    83. invoke SendMessage,hWnd,EM_POSFROMCHAR
    84. mov eax,pt.y
    85. cmp eax,rect.bottom
    86. ja break;.break .if eax > rect.bottom
    87. inc esi;lineNo+
    88. lea ecx,sz
    89. mov edx,offset aLu  ; "%lu"
    90. invoke wsprintf,,,esi
    91. lea r9d,sz
    92. mov r8d,pt.y
    93. invoke TextOut,hDC,0,,,eax
    94. cmp esi,lc
    95. jbe @b;.endw
    96. break: invoke DeleteObject,rgn
    97. invoke SelectClipRgn,hDC,0
    98. invoke ReleaseDC,hWnd,hDC
    99. wmBYE: mov rsi,old_rsi
    100. leave
    101. retn
    102. WndProc endp
    103. .data
    104. aLu db '%lu',0
    105. LibFileName db 'msftedit.dll',0
    106. g_pOrgWndProc dq ?
    107. hDC dq ?
    108. hIcon dq ?
    109. end
    rc-файл
    Код (C):
    1. #include "resource.h"
    2. #define IDC_EDIT 100
    3. #define IDD_DLG1 101
    4. #define IDC_ICON1 10
    5.  
    6. IDC_ICON1 ICON DISCARDABLE "br_Fox1.ico"
    7.  
    8. IDD_DLG1 DIALOGEX 10,10,100,100
    9. CAPTION "test"
    10. FONT 12,"MS Sans Serif",0,0,0
    11. STYLE WS_POPUP|WS_VISIBLE|WS_CAPTION|WS_SYSMENU|DS_CENTER
    12. BEGIN
    13.  CONTROL "",IDC_EDIT,"RichEdit50W",WS_CHILD|WS_VISIBLE|ES_MULTILINE|ES_WANTRETURN|ES_AUTOHSCROLL|ES_AUTOVSCROLL,0,0,90,50
    14. END
    [​IMG]
    asm-/rc-/ico-/exe-файлы в аттаче
     

    Вложения:

    • temp.zip
      Размер файла:
      5,8 КБ
      Просмотров:
      177
  16. Sashasan

    Sashasan New Member

    Публикаций:
    0
    Регистрация:
    17 фев 2008
    Сообщения:
    23
    Адрес:
    Воронеж
    Спасибо классный примерчик:good: