Orion9

|
Posted: Tue Jun 24, 2025 00:30 Post subject: |
|
|
Loopback wrote: | Не стал делать новую версию, заменил во вчерашней |
Теперь всё работает и в 64-битной версии, класс! А с вызовом функций по адресам теперь ещё и быстрее должно быть, хотя визуально это сложно отличить.
Loopback wrote: | подсказка Autorun не использует TToolTip, в основе лежит static |
Да, я видел. Ещё по этому поводу хотел спросить у вас, как вы расчет размеров окна делаете, но не стал лишний раз донимать ) Ведь текст static можно легко заменить через WinSetText, например:
Code: | Local hWnd = LAST_HINT_WINDOW
If hWnd > 0 Then
If WinGetState(1, hWnd) Then
WinSetText("Тест...." & auCRLF & "Загрузка"& auCRLF & "Загрузка....", hWnd)
WinSetPos("", "", "", 50, 2, hWnd)
WinRedraw(2, hWnd)
EndIf
Endif |
А вот изменить размер окна под новый текст уже сложнее. Здесь с метрикой шрифта надо заморачиваться, как пишут на сайте microsoft:
Но с вызовом SetClassLong я хотел добиться другого, если это, конечно, вообще возможно.
Я хотел как раз вот этого:
Loopback wrote: | SetClassLong... меняет параметры класса для окон, которые будут созданы после её использования |
Я хотел поменять оконную функцию у гислеровской подсказки, т.е. у всего класса подсказок, называющихся TToolTip. Как я понял, гислеровская подсказка - это обычное дочернее окно, в которое он рисует текст функцией TextOut, превращая его в растровое изображение. Извлечь из этого какую-то пользу вряд ли возможно при таком раскладе, но я просто хотел посмотреть, будет ли работать сабклассинг с функцией обратного вызова, установленной через SetClassLong, хотя это не так важно.
Зато проверил Callback на диалоге задач )
 Hidden text Code: | RegisterCommand 60027 "TaskDialogIndirect"
Global TASK_THREAD = 0
Global oTaskWinProc = Callback("TaskWinProc", "hwnd;uint;wparam;lparam;long_ptr")
Func TaskWinProc(hWnd, Msg, wParam, lParam, lpRefData)
If Msg = 0 Then
RunThread("ProgressMove", hWnd)
Return 1
EndIf
If Msg = 2 Then
If wParam = 4 Then
If TASK_THREAD > 0 Then
TASK_THREAD = 0
Return 1
EndIf
RunThread("ProgressMove", hWnd)
Return 1
Else
If TASK_THREAD > 0 Then TASK_THREAD = 0
Return 0
EndIf
EndIf
EndFunc
Func ProgressMove(hWnd)
TASK_THREAD = 1
Local sMsg = "Initializing...", buf = Buffer(64)
buf.SetStr(sMsg & Chr(0))
SendMessage(hWnd, 1127, 1, 0)
SendMessage(hWnd, 1131, 1, 0)
SendMessage(hWnd, 1138, 0, buf.ptr)
For i = 1 to 30
Sleep(100)
If i = 7 Then
sMsg = "Processing..."
ElseIf i = 20 Then
sMsg = "Finishing..."
EndIf
If i = 7 Or i = 20 Then
buf.SetStr(sMsg & Chr(0))
SendMessage(hWnd, 1138, 0, buf.ptr)
EndIf
If TASK_THREAD = 0 Then Break
Next
sMsg = "Content"
buf.SetStr(sMsg & Chr(0))
SendMessage(hWnd, 1138, 0, buf.ptr)
Free(buf)
SendMessage(hWnd, 1131, 0, 0)
SendMessage(hWnd, 1127, 0, 0)
SendMessage(hWnd, 1130, 0, 0)
If TASK_THREAD = 0 Then
MsgBox("Операция прервана", "", 48)
Else
MsgBox("Операция успешно завершена", "", 64)
EndIf
TASK_THREAD = 0
EndFunc
Func TaskDialogIndirect()
If auX64 Then
MsgBox("Unsupported version","",48)
Return
EndIf
Local hRes, bn
Local buf = Buffer(96)
Local sTitle = "Title"
Local sInstr = "Instruction"
Local sContn = "Content"
Local sExpand = "Expanded text"
Local sFooter = "Autorun " & FileGetVersion(AUTORUN_PATH & "\Autorun.wdx", "FileVersion")
Local ttl = Buffer(StrLen(sTitle)*2+2), _
ins = Buffer(StrLen(sInstr)*2+2), _
con = Buffer(StrLen(sContn)*2+2), _
exp = Buffer(StrLen(sExpand)*2+2), _
ftr = Buffer(StrLen(sFooter)*2+2)
ttl.SetStr(sTitle & Chr(0))
ins.SetStr(sInstr & Chr(0))
con.SetStr(sContn & Chr(0))
exp.SetStr(sExpand & Chr(0))
ftr.SetStr(sFooter & Chr(0))
buf.Zero()
buf.SetNum(0, "uint", buf.size, _
"hwnd", AUTORUN_TCHANDLE, _
"handle", 0, _
"dword", 0x0408, _
"dword", 21, _
"ptr", ttl.ptr, _
"ptr", 65535, _
"ptr", ins.ptr, _
"ptr", con.ptr, _
"uint", 0, _
"ptr", 0, _
"int", 0, _
"uint", 0, _
"ptr", 0, _
"int", 0, _
"ptr", 0, _
"ptr", exp.ptr, _
"ptr", 0, _
"ptr", 0, _
"ptr", 65533, _
"ptr", ftr.ptr, _
"ptr", oTaskWinProc.ptr, _
"long_ptr", 0, _
"uint", 0)
hRes = DllCall("TaskDialogIndirect", _
"ptr", buf.ptr, _
"int*", @bn, _
"int*", 0, _
"bool*", 0)
EndFunc
|
Поскольку под x64 нужно отдельно структуру высчитывать, я не стал с этим заморачиваться. Но на 32-битном ТС всё отлично работает. Прикольный муляж, кстати, получился )
Так что Callback нормально работает. Спасибо за багофикс. Это открывает теперь большие возможности. |
|