Занимаюсь одним проектом, поэтому понадобилось несколько задач для обычного многострочного текстового окна. Вечером сидел за кодом, получилось простое решение:
If OpenWindow(0,0,0,640,480,"myEditor 0.9",#PB_Window_SystemMenu|#PB_Window_ScreenCentered|#PB_Window_MinimizeGadget)
t$="This"+Chr(13)+Chr(10)
For r=1 To 30 : t$+Str(r)+Chr(13)+Chr(10) : Next
StringGadget(0,0,0,640,480,t$,#ES_MULTILINE|#ES_AUTOVSCROLL|#WS_VSCROLL|#WS_HSCROLL)
;https://docs.microsoft.com/en-us/windows/win32/controls/edit-controls-text-operations#setting-and-retrieving-text
#EM_GETCARETINDEX=#ECM_FIRST + 18
Repeat
ev= WaitWindowEvent()
y=SendMessage_(GadgetID(0),#EM_LINEFROMCHAR,-1,0)
x=SendMessage_(GadgetID(0),#EM_GETCARETINDEX,0,0)
o=SendMessage_(GadgetID(0),#EM_LINEINDEX,y,0)
m=SendMessage_(GadgetID(0),#EM_GETFIRSTVISIBLELINE,0,0)
If y<>m
x=x-o
EndIf
SetWindowTitle(0,"x:"+Str(x)+",y:"+Str(y));+",o:"+Str(o))
Until ev = #PB_Event_CloseWindow
EndIf
t$="This"+Chr(13)+Chr(10)
For r=1 To 30 : t$+Str(r)+Chr(13)+Chr(10) : Next
StringGadget(0,0,0,640,480,t$,#ES_MULTILINE|#ES_AUTOVSCROLL|#WS_VSCROLL|#WS_HSCROLL)
;https://docs.microsoft.com/en-us/windows/win32/controls/edit-controls-text-operations#setting-and-retrieving-text
#EM_GETCARETINDEX=#ECM_FIRST + 18
Repeat
ev= WaitWindowEvent()
y=SendMessage_(GadgetID(0),#EM_LINEFROMCHAR,-1,0)
x=SendMessage_(GadgetID(0),#EM_GETCARETINDEX,0,0)
o=SendMessage_(GadgetID(0),#EM_LINEINDEX,y,0)
m=SendMessage_(GadgetID(0),#EM_GETFIRSTVISIBLELINE,0,0)
If y<>m
x=x-o
EndIf
SetWindowTitle(0,"x:"+Str(x)+",y:"+Str(y));+",o:"+Str(o))
Until ev = #PB_Event_CloseWindow
EndIf
Вот только работает это на Win10, позже вычитал в MSDN. Сегодня чтение манов привело к другому решению на Win 7:
If OpenWindow(0,0,0,640,480,"myEditor 0.9",#PB_Window_SystemMenu|#PB_Window_ScreenCentered|#PB_Window_MinimizeGadget)
t$="This"+Chr(13)+Chr(10)
For r=1 To 30
t$+Str(r);+Chr(13)+Chr(10)
Next
StringGadget(0,0,0,640,480,t$,#ES_MULTILINE|#ES_AUTOVSCROLL|#WS_VSCROLL|#WS_HSCROLL)
;https://docs.microsoft.com/en-us/windows/win32/controls/edit-controls-text-operations#setting-and-retrieving-text
Repeat
ev= WaitWindowEvent()
y=SendMessage_(GadgetID(0),#EM_LINEFROMCHAR,-1,0)
x=SendMessage_(GadgetID(0),#EM_GETSEL,0,0)
o=SendMessage_(GadgetID(0),#EM_LINEINDEX,y,0)
m=SendMessage_(GadgetID(0),#EM_GETFIRSTVISIBLELINE,0,0)
If y<>m
;x=x-o
EndIf
SetWindowTitle(0,"x:"+Str(x&$FFFF - o)+",y:"+Str(y));+",o:"+Str(o))
Until ev = #PB_Event_CloseWindow
EndIf
t$="This"+Chr(13)+Chr(10)
For r=1 To 30
t$+Str(r);+Chr(13)+Chr(10)
Next
StringGadget(0,0,0,640,480,t$,#ES_MULTILINE|#ES_AUTOVSCROLL|#WS_VSCROLL|#WS_HSCROLL)
;https://docs.microsoft.com/en-us/windows/win32/controls/edit-controls-text-operations#setting-and-retrieving-text
Repeat
ev= WaitWindowEvent()
y=SendMessage_(GadgetID(0),#EM_LINEFROMCHAR,-1,0)
x=SendMessage_(GadgetID(0),#EM_GETSEL,0,0)
o=SendMessage_(GadgetID(0),#EM_LINEINDEX,y,0)
m=SendMessage_(GadgetID(0),#EM_GETFIRSTVISIBLELINE,0,0)
If y<>m
;x=x-o
EndIf
SetWindowTitle(0,"x:"+Str(x&$FFFF - o)+",y:"+Str(y));+",o:"+Str(o))
Until ev = #PB_Event_CloseWindow
EndIf
Но это все фигня по сравнению с мировой революцией. Выйдет ли что-то внятное из задумки, я не знаю.
Комментарии
Отправить комментарий