Orion9

|
Posted: Mon Oct 20, 2025 14:09 Post subject: |
|
|
| Loopback wrote: | | Вроде по коду каких-то серьезных ошибок не видно. |
По вашему коду, или по моему?
Если по моему, то код должен работать. Например, если всё повесить на окно диалога выбора цвета, то он работает.
 Hidden text | Code: | # системный диалог выбора цвета
RegisterCommand 70053 "ColorSelect"
Func ColorSelect(lParam)
Local occ = Callback("CChooseProc", "hwnd;uint;wparam;lparam")
Local cls = Buffer(64), buf = Buffer(auX64 ? 72 : 36)
cls.Zero()
cls.SetNum(0, "dword", 0x000000FF, _
"dword", 0x0000FF00, _
"dword", 0x00FF0000)
buf.Zero()
If auX64 Then
buf.SetNum(0, "dword", buf.size)
buf.SetNum(8, "hwnd", AUTORUN_TCHANDLE)
buf.SetNum(16, "hwnd", 0, _
"uint", 0x00808080)
buf.SetNum(32, "ptr", cls.ptr, _
"dword", 0x00000113)
buf.SetNum(48, "lparam", 0, _
"ptr", occ.ptr)
Else
buf.SetNum(0, "dword", buf.size, _
"hwnd", AUTORUN_TCHANDLE, _
"hwnd", 0, _
"uint", 0x00808080, _
"ptr", cls.ptr, _
"dword", 0x00000113, _
"lparam", 0, _
"ptr", occ.ptr)
EndIf
DllCall("comdlg32.dll\ChooseColorW", "ptr", buf.ptr, "bool")
Free(buf, cls, occ)
EndFunc
Func CChooseProc(hWnd, uMsg, wParam, lParam)
Static IDOK = 1, IDCANCEL = 2, WM_GETICON = 0x7f, WM_SETICON = 0x80, _
WM_INITDIALOG = 0x0110, WM_COMMAND = 0x0111, WM_SYSCOMMAND = 0x0112
Static r, g, b
If uMsg = WM_INITDIALOG Then
Static hIco = SendMessage(AUTORUN_TCHANDLE, WM_GETICON, 2, 0)
SendMessage(hWnd, WM_SETICON, 0, hIco)
Local hMenu = DllCall("GetSystemMenu", "handle", hWnd, "bool", 0, "handle")
Local hBitMap = CreateColor()
If hMenu > 0 Then
DllCall("AppendMenuW", "handle", hMenu, "uint", 2048, "uint_ptr", 0, "ptr", 0)
DllCall("AppendMenuW", "handle", hMenu, "uint", 0, "uint_ptr", 1000, "wstr", "About")
DllCall("AppendMenuW", "handle", hMenu, "uint", 4, "uint_ptr", 1001, "ptr", hBitMap)
DllCall("AppendMenuW", "handle", hMenu, "uint", 0, "uint_ptr", 1002, "wstr", "Settings...")
EndIf
ElseIf uMsg = WM_SYSCOMMAND Then
If wParam = 1000 Then
MsgBox("About")
Return 1
ElseIf wParam = 1001 Then
MsgBox("Bitmap")
Return 1
ElseIf wParam = 1002 Then
MsgBox("Settings")
Return 1
EndIf
ElseIf uMsg = WM_COMMAND Then
If wParam = IDOK Or wParam = IDCANCEL Then
Return 0
EndIf
r = WinGetText(WinFind(hWnd, "Edit", 4))
g = WinGetText(WinFind(hWnd, "Edit", 5))
b = WinGetText(WinFind(hWnd, "Edit", 6))
WinSetText("RGB: " & r & ", " & g & ", " & b, hWnd)
EndIf
Return 0
EndFunc
Func CreateColor()
Local buf = Buffer(16) # RECT
buf.Zero()
buf.SetNum(0, "Int", 0, _
"Int", 0, _
"Int", 160, _
"Int", 160)
Local hdcScreen = DllCall("GetDC", "ptr", 0, "ptr")
Local hdcMem = DllCall("CreateCompatibleDC", "ptr", hdcScreen, "ptr")
Local hbmColor = DllCall("CreateCompatibleBitmap", "ptr", hdcScreen, "int", 160, "int", 160,"ptr")
Local hbmOld = DllCall("SelectObject", "ptr", hdcMem, "ptr", hbmColor, "ptr")
Local hBrush = DllCall("CreateSolidBrush", "UInt", 0xAF0000, "Ptr")
DllCall("FillRect", "Ptr", hdcMem, "Ptr", buf.ptr, "Ptr", hBrush)
DllCall("DeleteObject", "Ptr", hBrush)
DllCall("SelectObject", "ptr", hdcMem, "ptr", hbmOld, "ptr")
DllCall("DeleteDC", "Ptr", hdcMem)
DllCall("ReleaseDC", "Ptr", 0, "Ptr", hdcScreen)
Free(buf)
Return hbmColor
EndFunc |
Здесь правда вместо логотипа отображается синий квадрат малевича, но для тестов самое то.
Однако вижу, что с отображением графического элемента в ТС х64 есть проблема - элемент не всегда появляется. Кстати, заметил, что в ТС х64 поток заголовка тоже вылетает без ошибки и всё зависает. Мне кажется, раньше такого не было, хотя я не и не часто пользуюсь этой версией, чтобы судить.
| Loopback wrote: | | все-таки польза этого не столь велика |
Да нормальная польза. Своеобразное меню со специальными для этого пунктами. |
|