VBStreets конференция

Целият вкус на програмирането!

  • Списък на форумитеVisual basicVisual Basic 1-6
  • Променете размера на шрифта
  • ЧЗВ
  • вход

Щракнете върху формуляра

Щракнете върху формуляра

Но в края на краищата, като щракнете върху непразно пространство, съответно, не кликвате върху формуляр.

Искахте да разпознаете щракване в системата, което е направено някъде над вашия формуляр?

Сега изобщо нищо не разбрах.

Като щракнете върху обект, трябва да разберете координатите на мишката спрямо формата, спрямо екрана, в twips, в пиксели или като.

Точно това е важно. Има няколко начина:

1. Проверете натискането на всяка контрола.
2. Поставете кука върху кликванията и проверете къде е курсорът (или не къде е и прозорецът е родител на прозореца, върху който е щракнат - GetParent ще върне 0, ако родителят е работен плот)
3. SetCapture - но това е малко вероятно да работи.

Преди това самият аз мога да се досетя, но това води до трудно улавящи се грешки, ако се добави нов контрол и се забие съответната проверка. И контроли върху формуляра. много .

Твърде объркан, бих искал да бъда по-прост.

SetCapture улавя обработката на събитията на мишката в приложението си. И само ако бутонът на мишката е бил натиснат при настройка на SetCapture, заснемането се разпространява в цялата система.

Когато е инсталиран SetCapture, подсказките не изскачат, бутоните не се „изскачат“ - т.е. докато е инсталиран, няма нормална работа на приложението. Използвам го, за да може потребителят да избере желания прозорец с мишката.

Нафик-нафик. По-добре да живея на таймера както преди. Тогава ще преминем към модерен стил по някакъв начин

P.S.: Имам формуляр за настройки и бутон „Прилагане“, който трябва да бъде премахнат при промяна на настройките. Сега, срам ме е да кажа, чекът за промяна е на таймер. Определено няма да направя вмъкването във всички контроли. Ще видя останалото. Ако някой не съветва обикновена нишка.

Код: Изберете всички 'във формуляра
Частна подформа Form_Load ()
Dim c As Control
Затъмнете h1 толкова дълго
Приглушен h2 толкова дълго
При грешка Възобновяване нататък
За всеки c в мен. Контроли
h1 = c.hwnd
Ако Err.Number = 0 Тогава
h2 = SetWindowLong (h1, GWL_WNDPROC, AddressOf TargetProc)
PostMessage h1, WM_SETPREVPTR, h2, 0
Иначе
Грешка Изчисти
Край ако
Следващ c
Крайна под

Частен подформуляр_Отказване (Отказ като цяло)
Dim c As Control
Затъмнете h1 толкова дълго
При грешка Възобновяване нататък
За всеки c в мен. Контроли
h1 = c.hwnd
Ако Err.Number = 0 Тогава
PostMessage h1, WM_RESTOREFUNC, 0, 0
Иначе
Грешка Изчисти
Край ако
Следващ c
Крайна под

'в модул
Функция за публично деклариране SetWindowLong Lib "user32" Alias ​​"SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Функция за публично деклариране CallWindowProc Lib "user32" Alias ​​"CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Публична функция за деклариране PostMessage Lib "user32" Alias ​​"PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long

Публичен конкурс GWL_WNDPROC = -4
Публично състезание WM_USER = & H400
Публично състезание WM_LBUTTONUP = & H202
Публичен конкурс WM_SETPREVPTR = WM_USER + 1
Публично състезание WM_RESTOREFUNC = WM_USER + 2

Публична функция TargetProc (ByVal hwnd As Long, ByVal message As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Статичен PrevFuncPointer толкова дълго
Изберете Съобщение за дело
Дело WM_SETPREVPTR
PrevFuncPointer = wParam
Дело WM_RESTOREFUNC
SetWindowLong hwnd, GWL_WNDPROC, PrevFuncPointer
Дело WM_LBUTTONUP
Debug.Print "mouseup" тип щракнат
Случай друго
Ако PrevFuncPointer = 0 Тогава
TargetProc = 0
Функция за изход
Край ако
Край на избора
TargetProc = CallWindowProc (PrevFuncPointer, hwnd, съобщение, wParam, lParam)
Крайна функция