David писал(а):Ну у меня проблема, если я прокручиваю медленно, ни каких ошибок, но стоит мне ускорить «скроллинг» и программа зависает
Set fFrm = GetForm(Lwnd)
If fFrm Is Nothing Then
GetForm(GetParent(Lwnd)).MouseWheel MouseKeys, Rotation, Xpos, Ypos
WindowProc = CallWindowProc(GetProp(Lwnd, "PrevWndProc"), Lwnd, Lmsg, wParam, lParam)
Для форума я написал маленький фрагмент и как на зло никаких ошибок. Не знаю как найти ошибку
David писал(а):Я понимаю, что ответить мне не просто, ну если у кого-то уже было что-то подобное. Но если надо я могу и всю программу послать, правда она читает данные с SQL сервера
Очень грязный код, особенно ...
WindowProc нужно писать или так, чтобы там гарантированно не возникало никаких ошибок, или так, чтобы возникновение ошибок внутри WindowProc не вызывало катастрофы. То есть хотя бы отлавливать ошибки.
Значит нужно демонстрационный пример делать из реального проекта, полностью заменив получение данных от SQL-сервера на получение данных из фиктивного/фальшивого/загрушечного источника данных. Остальное оставить как есть.
David писал(а):Хаккер, может подскажешь где могу подсмотреть "чистый код" ? Спасибо
Ну если сможешь помочь, спасибо а нет, не ломай голову без колесика программа и так работает
Так проект выложен не полный. Половина модулей в архив не включена:
Его можно и не подсматривать, чтобы писать, а просто чувствовать и думать, что делаешь.
If (frmCadreLigne(1).Top = 0 And Naprav = 1) Or (Not butGestGrup(4).Enabled And Naprav = -1) Then Exit Sub
frmCadreGauche.Refresh
DoEvents
David писал(а):Прочитал твои комментарии к теме Kак ограничить область действия MouseWheel? от 07/05/2020, ну что сказать, чтобы всё понять надо было не архитектурный заканчивать а математический
Хакер писал(а):Могу к своему приемеру ещё прокрутку колесом прикрутить, и показать наглядно, почему твой код работает неадекватно, сэмулировав ошибки, допущенные в твоём коде.
RNG21 писал(а):Принципиально прокрутка колесиком к твоему фрейму прикручивается примерно так:
If wParam < 0 Then Wheel = -250 'скорость прокрутки вниз (отрицательное значение - колесико на себя)
If wParam > 0 Then Wheel = 250 'скорость прокрутки вверх
RNG21 писал(а):Код в моих правках исходников kibernetics конечно, не лучший, но я к этому и не стремился, просто хотел на коротком примере показать, как это сделать. Во всяком случае, я не заметил в проекте признаков того, что форма frmPriceExporter1 может быть запущена в нескольких экземплярах (правда, в это сильно не вникал), а действия при обработке ошибок человек сам напишет, какие ему нужно. Вот то, что для хранения адреса WindowProc используется единая глобальная переменная модуля - да, грубая ошибка, даже для короткого примера, просмотрел.
Я надеюсь добиться такого эффекта, как вот если посмотреть на работу всех других контролов, где находится курсор - там работает скролинг именного того контрола над которым этот самый курсор находится.
ListView, Listbox, TreeView. И вот бы сделать и для Frame аналогичное поведение.
Sent to the focus window when the mouse wheel is rotated. The DefWindowProc function propagates the message to the window's parent. There should be no internal forwarding of the message, since DefWindowProc propagates it up the parent chain until it finds a window that processes it.
...
It is up to the application to forward MSH_MOUSEWHEEL to any embedded objects or controls. The application is required to send the message to an active embedded OLE application. It is optional that the application sends it to a wheel-enabled control with focus. If the application does send the message to a control, it can check the return value to see if the message was processed. Controls are required to return a value of TRUE if they process the message.
Хакер писал(а):Так это экселевский диалог, а ты покажи общесистемный, коммондиалоговский, например из Блокнота, если там до сих пор используют CommonDialog-овский диалог выбора шрифта.
Хакер писал(а):Ну тогда и в VB-шных программмах это должно работать так же, если это общесистемное поведение?
Сделай форму с 3 листбоксами, заполненными айтемами и посмотри, как оно работает для VB-шных программ. Если не так, как надо, вызови из VB-шной программы фонтовый коммондиалог, и посмотри, что там.
По результатам будет ясно, откуда ноги растут у нового поведения, но в любом случае, то, что это никак не отражено в документации (и то, что поведение, на которое рассчитывали программы, сломали), говорит о печальном положении дел.
kibernetics писал(а):RNG21 писал(а):А сделать так, чтобы скрол срабатывал по событиюmouseoverнад зоной фрейма?
CASE WM_SETCURSOR
SetFocus(wParam) ' wParam = hWnd
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 49