Дело было так. Решил я улучшить контрол, находящийсяв RaCad.dll, чтобы при нажатии на среднюю кнопку мыши происходил "захват" изображения, а при отпускании соответственно ставился скроллбар и скроллировалось изображение. В дальнейшем я хочу сделать увеличение-уменьшение скроллированием. Но обнаружил такой баг. При уменьшении изображения и "захвате" его оно начинает "ненормально " двигаться и программа падает. дописывал в RaCad я вот что. .elseif eax==WM_MOUSEMOVE ;int 3 mov eax,wParam .if eax==MK_MBUTTON invoke GetCursor .if (eax == tempcursor) .elseif ;invoke LoadCursor,NULL,IDC_SIZEALL invoke SetCursor,tempcursor .endif m_m: invoke GetWindowLong,hWin,0 mov ebx,eax xor ecx,ecx xor edx,edx mov eax,cn.cur.x sub eax,oldpointdrag.x ;eax-разница иксов neg eax ; oldpointdrag.x-cn.cur.x add eax,counterx ;oldpointdrag.x-cn.cur.x+counter mov counterx,eax mov sinf.cbSize,sizeof sinf mov sinf.fMask,SIF_POS mov eax,counterx add [ebx].CADMEM.scroll.x,eax neg eax invoke ScrollWindow,hWin,eax,0,NULL,NULL xor edx,edx xor ecx,ecx mov eax,counterx mov eax,[ebx].CADMEM.scroll.x call ZoomDiv mov sinf.nPos,eax ;int 3 invoke SetScrollInfo,hWin,SB_HORZ,addr sinf,TRUE invoke UpdateWindow,hWin ;------------------------------------------------------------------ mov eax,cn.cur.y sub eax,oldpointdrag.y ;eax-разница иксов neg eax ; oldpointdrag.x-cn.cur.x push eax invoke GetWindowLong,hWin,0 mov ebx,eax pop eax add eax,countery ;oldpointdrag.x-cn.cur.x+counter mov countery,eax mov sinf.cbSize,sizeof sinf mov sinf.fMask,SIF_POS mov eax,countery add [ebx].CADMEM.scroll.y,eax ;int 3 neg eax invoke ScrollWindow,hWin,0,eax,NULL,NULL xor edx,edx xor ecx,ecx mov eax,countery mov eax,[ebx].CADMEM.scroll.y call ZoomDiv mov sinf.nPos,eax ;int 3 invoke SetScrollInfo,hWin,SB_VERT,addr sinf,TRUE invoke UpdateWindow,hWin ;------------------------------------------------------------------ mov eax,cn.cur.x mov oldpointdrag.x,eax mov eax,cn.cur.y mov oldpointdrag.y,eax ;------------------------------------------------------------------ .endif баг проявляется когда ставится масштаб 0,6 и программа падает когда ставится масштаб 0,4 и наже. Исходник переделанный приаттачил к сообщению.
God_Father > Решил я улучшить контрол, находящийсяв RaCad.dll ... программа падает Переполнение при делении. Где можно посмотреть на оригинальный, желательно код, RACad?
God_Father > Оригинальный код Посмотрел. Imho там (в оригинальной версии) кривой скроллинг. Поясню. Выставляю коэффициент zoom'а 21.20, перемещаю thumb'ы обоих scrollbar'ов, вправо вниз, курсор мышки веду к позиции (20000,20000), это максимум, и увожу за пределы cad-окна, затем , PgUp'ом уменьшаю zoom до 0.20, в результате координаты курсора становятся (25695,24140), что явно больше максимума и видна белая область за краем холста, аккуратно навожу курсор мышки на каждый из thumb'ов, click'аю по ним, в результате белая область пропадает, а нижний правый угол холста оказывается в нижнем правом углу cad-окна. + в SimCad не устанавливает фокус на cad-окно. Твое решение этой проблемой в обработчике WM_PAINT в корне не правильно. Необходимо, добавлять обработку WM_SETFOCUS в SimCad. > Решил я улучшить контрол ... сделать увеличение-уменьшение скроллированием. Достаточно в оригинальную версию добавить Код (Text): ... CadProc proc uses ebx,hWin:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM ... .elseif eax==WM_MOUSEWHEEL mov eax,wParam or eax,eax mov eax,CM_ZOOMOUT jns short @F mov eax,CM_ZOOMIN @@: invoke SendMessage, hWin, eax, 0, 0 ... разумеется перед этим решив вопрос с фокусом. Что касается прокрутки холста при нажатой средней кнопки мышки, то для начала необходимо сделать корректную обработку cad-окном WM_SIZE, WM_HSCROLL и WM_VSCROLL. edit(add) Пример правильной обработки WM_SIZE, WM_HSCROLL и WM_VSCROLL можно посмотреть у mspaint. Сделай холст побольше, меняй размеры окна, если холст полностью виден, то полосок прокрутки нет. Если холст не помещается в окне, и полоску прокрутки поместить в крайнее нижнее/правое положение и начать увеличивать размер окна, то холст прилипнет к нижней/правой границе до тех пор пока, не покажется весь, а потом полоска прокрутки пропадет.
А примеры программ, где это правильно отбражается с исходниками есть? А обработка WM_SETFOCUS здесь нужно выставлять фокус окну функой SetFocus Я правильно понял?
God_Father > А обработка WM_SETFOCUS здесь нужно выставлять фокус окну функой SetFocus Если я правильно тебя понял, то ты правильно меня понял. На всякий случай Код (Text): ;; SimCad.asm... WndProc proc uses ebx,hWin:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM ... mov eax,uMsg .if eax==WM_INITDIALOG ... .elseif eax==WM_SETFOCUS invoke IsWindow, hCad .if eax != 0 invoke SetFocus, hCad .endif ... > А примеры программ, где это правильно отбражается с исходниками есть? см. аттач.
q_q в твоем примере когда окно растянишь на весь экран то область где должен быть скролл становится серой. Как сделать так, чтобы он исчезал?
God_Father Например Код (Text): ... wndproc proc uses ebx edi esi, hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM ... .elseif uMsg == WM_SIZE ... invoke SetScrollInfo, hWnd, SB_HORZ, addr sci, TRUE ;;-- mov eax,ESB_ENABLE_BOTH mov eax,1 .else ;;-- mov eax,ESB_DISABLE_BOTH xor eax,eax .endif ;;-- invoke EnableScrollBar, hWnd, SB_HORZ, eax invoke ShowScrollBar, hWnd, SB_HORZ, eax ... invoke SetScrollInfo, hWnd, SB_VERT, addr sci, TRUE ;;-- mov eax,ESB_ENABLE_BOTH mov eax,1 .else ;;-- mov eax,ESB_DISABLE_BOTH xor eax,eax .endif ;;-- invoke EnableScrollBar, hWnd, SB_VERT, eax invoke ShowScrollBar, hWnd, SB_VERT, eax ...
А какое сообщение нужно обрабатывать, когда прокруиваешь колесиком мымши находящемся на полосе прокрутки скроллбара, чтобы изображение прокручивалось соответственно горизонтально, и вертикально. Такой механизм прокрутки работает в Operе. И какое сообщение ловить, чтоб перерисовать скроллбар как хочется?
God_Father WM_MOUSEWHEEL, только оно почему то приходит только в главное окно программы, но в твоём случае это как раз не принципиально - просто определяй по координатам (lparam) над чем крутится колёсико и посылай соответствующие команды соответствующим контролам. ты это про SetScrollInfo? или про возможность заменить скроллбар своей картинкой?