|
|
| Посл.отвђт | Сообщен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 |