· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.WIN32 —› Popupmemu + Edit

Посл.отвђт Сообщенiе


Дата: Дек 14, 2003 00:58:36 · Поправил: Valery

Очки пропали куда-то. Не туда нажал и нечаянно закрылась тема.

Это продолжение.


Дата: Дек 14, 2003 00:58:45 · Поправил: Valery

Toxic

А уменя хреново дела. Ну захучил я его

PMCLS db "#32768", 0

...

CBTProc proc uses ebx nCode:DWORD,wParam:DWORD,lParam:DWORD
LOCAL CLSNAME[16]:BYTE

.if nCode == HCBT_CREATEWND
invoke GetClassName, wParam, addr CLSNAME, 10
invoke lstrcmp, addr CLSNAME, offset PMCLS
.if (!eax)
invoke GetWindowLong,wParam,GWL_STYLE
or eax, WS_CLIPCHILDREN ; но этого мало
invoke SetWindowLong,wParam,GWL_STYLE,eax
invoke SetWindowLong,wParam,GWL_WNDPROC,addr NewWndProc
mov OldWndProc,eax
push wParam
pop hWndPopupMenu ;пригодится
.endif
.endif
xor eax,eax
ret
CBTProc endp



NewWndProc PROC hwnd:DWORD,uMsg:DWORD,wParam:DWORD,lParam:DWORD

.if uMsg==WM_CREATE
invoke CreateWindowEx,WS_EX_CLIENTEDGE, ADDR EditClassName,NULL,\
WS_CHILD or WS_BORDER or ES_LEFT \
or WS_VISIBLE,\
0,0,30,30,hwnd,IDC_EDIT,hInstance,NULL
mov hwndEdit,eax

.else
invoke CallWindowProc,OldWndProc,hwnd,uMsg,wParam,lParam
ret
.endif
xor eax,eax
ret
NewWndProc endp


Ни хрена. Единственный результат - пробный 30x30 эдит появился и не подсвечивается при выделении айтема, и то после того как добавил clipchildren. Но как я его ни апдейтю - его не видать.
Стили окна попапа: WS_POPUP+WS_BORDER+WS_CLIPCHILDREN, у класса
CS_SAVEBITS+CS_DBLCLICKS. Может надо еще чего добавить? Я явно во что-то не въезжаю. Если он не ownerdraw, то где я могу перехватить прорисовку? Может, все-таки сделать ownerdraw? что ж будет тогда: хук+сабклассинг(стили окна менять все равно надо) + суперклассинг (в проге могут быть другие меню, портить я могу только одну процедуру) + ownerdraw. Наверно попроще все можно.


Дата: Дек 14, 2003 01:16:58

Valery

Я сейчас кое-что я набил - коряво, зато быстро. У меня менюшное окно сабклассится, но uMsg при MOUSEMOVE выдает 1E5h, при LBUTTONDOWN - 1EDh, при LBUTTONUP - 1EFh.
Не могу разобраться - этих констант у меня нету - до сих пор стоит старенький VS98. Завтра-послезавтра докачаю PSDK и буду разбираться. Вот код:

SetHook proc hWndOwner:DWORD, lParam:DWORD
LOCAL hMenu:DWORD
LOCAL pt:POINT

.if gs_hHookCBT == 0 && gs_hHookWND == 0
invoke GetMenu, hWndOwner
.if eax != 0
invoke GetSubMenu, eax, 2
.if eax != 0
mov hMenu, eax
invoke SetWindowsHookEx, WH_CBT, ADDR HookProc_CBT, hInstance, NULL
.if eax != 0
mov gs_hHookCBT, eax

mov eax, lParam
and eax, 0FFFFh
mov pt.x, eax
mov eax, lParam
shr eax, 16
mov pt.y, eax
invoke ClientToScreen, hWndOwner, ADDR pt
invoke TrackPopupMenuEx, hMenu, TPM_RETURNCMD, pt.x, pt.y, hWndOwner, NULL
.endif
.endif
.endif
.endif
ret
SetHook endp

HookProc_CBT proc nCode:DWORD, wParam:DWORD, lParam:DWORD
LOCAL buf[10]:BYTE

.if nCode < 0
invoke CallNextHookEx, gs_hHookCBT, nCode, wParam, lParam
.else
.if nCode == HCBT_CREATEWND
invoke GetClassName, wParam, ADDR buf, 10
invoke lstrcmp, ADDR buf, ADDR strMenuClass
.if eax == 0
mov eax, wParam
mov gs_hWndMenu, eax

invoke UnhookWindowsHookEx, gs_hHookCBT
mov gs_hHookCBT, NULL

invoke SetWindowLong, gs_hWndMenu, GWL_WNDPROC, OFFSET WndProc_Menu
mov gs_OldWndProc, eax
.endif
.endif
xor eax, eax
.endif
ret
HookProc_CBT endp

WndProc_Menu proc hWnd:DWORD, uMsg:DWORD, wParam:DWORD, lParam:DWORD

PrintHex uMsg

.if uMsg == WM_MOUSEMOVE

.elseif uMsg == WM_DESTROY
invoke SetWindowLong, gs_hWndMenu, GWL_WNDPROC, gs_OldWndProc
.endif

invoke CallWindowProc, gs_OldWndProc, hWnd, uMsg, wParam, lParam
ret
WndProc_Menu endp


Дата: Дек 14, 2003 01:49:48

Toxic

У тебя как раз очень аккуратно все - хук снимается прямо в процедуре + старая процедура при удалении окна возвращается.
Дело в том что у меня сам-то хук работает, но не знаю как правильно показать эдит.


uMsg при MOUSEMOVE выдает 1E5h

Что-то странное... Разве они менялись?


Дата: Дек 14, 2003 02:01:45

Toxic
У меня менюшное окно сабклассится, но uMsg при MOUSEMOVE выдает 1E5h, при LBUTTONDOWN - 1EDh, при LBUTTONUP - 1EFh
В 1ED и 1EF в качестве wParam номер элемента меню присутствует только. Что является параметрами 1E5 я так и не понял. А нормальный WM_MOUSEMOVE посылается главному окну. Похоже что логика работы с меню скрыта в хук-функции в недрах винды. А внедренное в меню окно получает только WM_PAINT иногда. Поэтому придется хучить еще WH_MOUSE, WH_KEYBOARD и самому отправлять сообщения EDITBOX'у. И еще тщательно проверять вызывать стандартный хук или нет.


Дата: Дек 14, 2003 04:49:29

А что насчет GetCapture/SetCapture ?


Дата: Дек 14, 2003 11:43:17

Black_mirror



внедренное в меню окно получает только WM_PAINT иногда

У меня никогда


Дата: Дек 14, 2003 13:02:28

Toxic


У менянадежно ловятся WM_WINDOWPOSCHANGED, WM_NCDESTROY и еще непонятные 0x1E5,0x1ED,0x1EF. Похоже, придется делать ownerdraw и работать только в главном окне...
А все так хорошо начиналось :)


Дата: Дек 14, 2003 21:35:11

Valery
Сабклассить главное окно(точнее, владельца) в любом случае прийдется, т.к:
1) без OWNERDRAW красивого меню не сделать(вообще-то можно, но очень корявыми обходными сложными методами - это не нужно)
2) когда вызываешь TrackPopupMenuEx, ты указыаваешь hWnd(handle to the window that owns the shortcut menu), который получает ввод мыши во время показа меню - именно на это окно указывает GetCapture.

Получается, что на самом деле весь ввод идет на окно, но при этом он фильтруется и на меню посылются аналоги сообщений, но с другими номерами, т.е. на меню посылается эмуляция.

То, что я накропал за вчерашний вечер, в аттаче.

1277659317__MenuX.zip


Дата: Дек 14, 2003 23:09:59

Спасибо, щас кок раз и малюю ownerdraw. Для простоты предполагаю, что все будет без чеков, битмэпов, сепараторов и только энейблд


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.132