Пытаюсь переделать функцию BmpButton (masm32) так, чтобы при наведении курсора на кнопку менялась картинка и наоборот, также как в оригинале при WM_LBUTTONDOWN - WM_LBUTTONUP (см. 1.rar). Пробовал через WM_MOUSEMOVE - WM_MOUSELEAVE, но ничего не выходит. С другими сообщениями также ничего не получается. Может, кто знает как правильно?
поиграйся с SetCapture и ReleaseCapture при обработке WM_MOUSEMOVE например: Код (Text): //x,y - координаты курсора //Width, Height - ширина и высота кнопки int fIns; If (x < 0) || (x > Width) || (y < 0) || (y > Height){ fIns=0; ReleaseCapture(); //здесь: перерисовать кнопку в исходном положении } Else{ If (fIns == 0){ fIns=1; SetCapture (hButton); //здесь:перерисовать кнопку в положении "под курсором" } }
неужели так сложно перевести приведённый мной код на masm? показывай, что натворил. тут телепатов, кажется, нет
Поиск по сайту рулит: http://www.wasm.ru/src/1/buttonspgm.zip Если хочешь с WM_MOUSEMOVE и WM_MOUSELEAVE, то поищи XXButton.asm из XXControls by Chib, amdtm
Можно через сабклассинг окна Делай раз: Код (Text): invoke GetDlgItem,[hWnd],IDC_BUTTON invoke SetWindowLong,eax,GWL_WNDPROC,ADDR NewButtonProc mov [OldButtonProc], eax Делай два: (Тут был косячок. Убрал, чтобы не моргало, текст выводится только один раз при навидении на кнопку и уходе) Код (Text): NewButtonProc proc hCtl :DWORD, uMsg :DWORD, wParam :DWORD, lParam :DWORD LOCAL Rect :RECT LOCAL PCapt :DWORD .if [uMsg]==WM_MOUSEMOVE invoke GetCapture .if eax!=[hCtl] invoke SetCapture,[hCtl] mov [PCapt],eax invoke SetWindowText,[hCtl],$TA0('xxx') .endif mov eax, [lParam] mov ebx, eax and eax, 0FFFFh ;X shr ebx, 16 ;Y push eax invoke GetWindowRect,[hCtl],ADDR Rect mov eax, [Rect].left sub [Rect].right, eax mov eax, [Rect].top sub [Rect].bottom, eax pop eax .if (ebx>Rect.bottom)||(eax>Rect.right) invoke SetWindowText,[hCtl],$TA0('...') invoke ReleaseCapture .endif .else invoke CallWindowProc,[OldButtonProc],[hCtl],[uMsg],[wParam],[lParam] ret .endif xor eax,eax ret NewButtonProc endp Ну, а на картинки, ..., сам уж как-нибудь.
Ребят доброй ночи всем! Помогите не в падLу... Пытаюсь, аналогично, переписать функцию с MASM32 на С++ так, чтобы при наведении курсора на кнопку менялась картинка и наоборот. Никак отладить не могу а надо срочно на С++, а не на WASM32... http://www.wasm.ru/src/1/buttonspgm.zip - очень хороший пример, но не мог кто-нибудь аналогичное на С++ скинуть. PLEASE!!!
Добавил к коду сообщение WM_MOUSEMOVE в процедуре BmpButnProc Код (Text): .elseif uMsg == WM_MOUSEMOVE invoke GetCapture .if eax!=hWin invoke SetCapture,hWin .endif invoke GetWindowLong,hWin,4 mov hBmpD, eax invoke GetWindowLong,hWin,8 mov hImage, eax invoke SendMessage,hImage,STM_SETIMAGE,IMAGE_BITMAP,hBmpD mov eax, lParam cwde mov ptX, eax mov eax, lParam rol eax, 16 cwde mov ptY, eax invoke GetWindowRect,hWin,ADDR Rct mov eax, Rct.right mov edx, Rct.left sub eax, edx mov bWid, eax mov eax, Rct.bottom mov edx, Rct.top sub eax, edx mov bHgt, eax cmp ptX, 0 jle @F cmp ptY, 0 jle @F mov eax, bWid cmp ptX, eax jge @F mov eax, bHgt cmp ptY, eax jge @F invoke GetWindowLong,hWin,0 mov hBmpU,eax invoke GetWindowLong,hWin,8 mov hImage,eax invoke SendMessage,hImage,STM_SETIMAGE,IMAGE_BITMAP,hBmpU invoke ReleaseCapture @@: Теперь при наведении курсора картинка меняется, но постоянно моргает. Кто-нибудь знает как исправить?
Забить на WM_MOUSEMOVE и сравнивать координаты курсора с границами кнопки по таймеру. Если курсор попадает в границы кнопки, то выставлять себе какой-нибудь флаг и не менять картинку назад, пока этот флаг установлен. Когда курсор выходит за границу сбрасывать флаг.
Что ж так сложно-то? Обычное и достаточно корректное решение: по WM_MOUSEMOVE перерисовать с подсветкой (highlight) и зарегистрировать WM_MOUSELEAVE с помощью TrackMouseEvent. По WM_MOUSELEAVE подсветку кнопки убрать.
l_inc Понятно, но в данном случае это скорее из пушки по воробьям vg codeproject.com - море примеров. Да и поиск по rsdn.ru в помощь.
Всем спасибо за ответы. Кнопку сделал, но появилась другая проблема. К процедуре кнопки добавил Код (Text): .elseif uMsg == WM_MOUSEMOVE mov eax,lParam cwdemov ptX,eax mov eax,lParam rol eax,16 cwde mov ptY,eax invoke GetWindowRect,hWin,ADDR Rct mov eax, Rct.right mov edx, Rct.left sub eax, edx mov bWid, eax mov eax, Rct.bottom mov edx, Rct.top sub eax, edx mov edx,bWid .if ptX<0 || ptX>edx || ptY<0 || ptY>eax ; <-- Warning mov btnflag,0 invoke ReleaseCapture invoke GetWindowLong,hWin,0 mov hBmpU, eax invoke GetWindowLong,hWin,8 mov hImage, eax invoke SendMessage,hImage,STM_SETIMAGE,IMAGE_BITMAP,hBmpU .elseif btnflag!=1 mov btnflag,1 invoke SetCapture,hWin invoke GetWindowLong,hWin,4 mov hBmpD, eax invoke GetWindowLong,hWin,8 mov hImage, eax invoke SendMessage,hImage,STM_SETIMAGE,IMAGE_BITMAP,hBmpD .endif На одном из окон проги имеется SysListView32 c CHECKBOXES Код (Text): invoke CreateWindowEx, WS_EX_CLIENTEDGE,addr ListViewClass, NULL, WS_CHILD or WS_VISIBLE or LVS_REPORT or LVS_SHAREIMAGELISTS, 75,40,350,250, hWnd, NULL, hInstance, NULL mov hList, eax invoke SendMessage,hList,LVM_SETEXTENDEDLISTVIEWSTYLE,0,LVS_EX_CHECKBOXES mov lvc.imask,LVCF_TEXT+LVCF_WIDTH mov lvc.pszText,offset Heading1 mov lvc.lx,300 invoke SendMessage,hList,LVM_INSERTCOLUMN,0,addr lvc mov lvs.imask,LVIF_TEXT or LVIF_STATE mov lvs.state,8192 mov lvs.stateMask,LVIS_STATEIMAGEMASK mov lvs.pszText,OFFSET CHECKBOXE1 mov lvs.iItem,0 invoke SendMessage,hList,LVM_INSERTITEM,0,ADDR lvs . . . mov lvs.pszText,OFFSET CHECKBOXEN mov lvs.iItem,1 invoke SendMessage,hList,LVM_INSERTITEM,0,ADDR lvs и моя кнопка. Без кнопки всё нормально. При добавлении кнопки исчезают итемы в SysListView32. Других проблем с кнопкой нет. Опыты показали, что проблема в строке .if ptX<0 || ptX>edx || ptY<0 || ptY>eax ; <-- Warning Если, например, написать .if ptX<0 || ptX>eax || ptY<0 || ptY>eax то итемы появляются. Что за хрень! Есть идеи?
Попробуй взять БУБЕН и совершить старый ритуал по заклинанию оконной процеДУРЫ. А по-конкретней нетрож EDX. Бывает, что некоторые API не очень любят когда его меняют. Иеще ECX тоже не очень часто празнуют. Сам не раз латался. Попробуй, но БУБЕН - это объязательно. Удачи. Вот еще вспомнил. Такая конструкция в MASM не работает. Ну по крайней мере у меня. Дело в том, что компилятор вставляет код бесзнакового сравнения а -1 в таком случае больше 0. Может где нужно указать что-бы было сравнение с знаком, кокой-то директивой или параметром. Но я не знаю как. Кто знает? Подскажите.