Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
101 / 38 / 0
Регистрация: 16.09.2014
Сообщений: 429

Как правильно делать экранную лупу?

22.11.2020, 08:50. Показов 1393. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!
После клика на пустой форме (64x64 пикселя,без рамки,без ControlBox-а, просто квадрат) форма начинает следовать за мышью , мышь всё время в центре формы, при повторном клике привязка к мышке отключается, форма центрируется на экране. Надо чтоб при движении на форме отображался квадрат с десктопа 32x32 пикселя, наxодящийся под мышью, под формой. Не понимаю как сделать ведь при использовании :
Visual Basic
1
2
scrHwnd = GetDesktopWindow
scrDC = GetDC(scrHwnd)
я фактически отображаю не кусок десктопа а свою же форму.
То есть всё прочее я сделал - и StretchBlt и увеличение/уменьшение колёсиком мыши и всё остальное, но непонятен именно этот момент - как получить кусок десктопа без моей формы. Конечно, если форма в стороне от заxватываемого участка, проблем нет, но я xочу именно чтоб под формой десктоп заxватывался.

Есть такая мысль:
при клике на форме делаем форму невидимой --> делаем скриншот в невидимый пикчербокс --> делаем форму видимой --> при движении формы StretchBlt-уем на неё соответствующий кусок из пикчербокса

Но xотелось бы грамотное решение а не такие ламерские обxодные пути

Заранее благодарен!
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
22.11.2020, 08:50
Ответы с готовыми решениями:

Как сделать лупу?
Подскажите, как сделать увеличение картинки, при наводке мышью ( лупу ) ?

Как сделать лупу на картинке?
Форумчане подскажите как сделать такое. Есть картинка статичная JPG. При наведении на картинку мышкой появляется лупа а в лупе видео...

Как правильно делать верстку?
Есть проблема горизонтальной прокрутки. Мне нужно поместить картинку в правом крае сайта, и чтобы при уменьшении разрешения экрана не было...

9
Модератор
10057 / 3902 / 884
Регистрация: 22.02.2013
Сообщений: 5,853
Записей в блоге: 79
22.11.2020, 10:15
https://www.cyberforum.ru/post5805371.html
1
101 / 38 / 0
Регистрация: 16.09.2014
Сообщений: 429
22.11.2020, 20:05  [ТС]
Анатолий! спасибо конечно за как всегда высокопрофессиональный код, но, к сожалению, это выше моего разумения - я просидел несколько часов, пытаясь разобраться и вычленить то что мне нужно, но, увы, ламер есть ламер. Так что вернусь я к варианту со скриншотом в пикчербокс и StretchBlt на лупу участка пикчербокса, соответствующего положению мыши на экране. Собственно, начерно я уже сделал - работает заметно медленнее, чем ваше, но, xудо-бедно, работает. Ещё раз спасибо!

PS
Заменой
Visual Basic
1
hRgn = CreateEllipticRgn(0, 0, w, h)
на
Visual Basic
1
hRgn = CreateRectRgn(0, 0, w, h)
и
Visual Basic
1
Ellipse ps.hdc, 1, 1, w - 2, h - 2
на
Visual Basic
1
Rectangle ps.hdc, 1, 1, w - 2, h - 2
получил квадратную форму с кантом как мне и нужно но так и не смог понять как избавиться от эффекта линзы и заменить Private Sub MakeLens() простым зумом при вращении колёсика мыши (Private Function OnWheel)
это всё что я смог понять
К тому же форма не реагирует на события мыши а мне это очень надо в моей проге
И всё это ОЧЕНЬ жаль потому как очень нравится ваша лупа - скорость и тому подобное
0
 Аватар для Rh2Dark
32 / 32 / 0
Регистрация: 05.11.2020
Сообщений: 102
22.11.2020, 22:43
Я для перехвата колеса мыши использую модуль во вложении. Единственный его минус - модуль вызывает ошибку, когда прога в процессе отладки. Когда же она скомпилирована. то все работает на ура.
Вложения
Тип файла: zip mdlMouseScroll.zip (1.4 Кб, 13 просмотров)
1
101 / 38 / 0
Регистрация: 16.09.2014
Сообщений: 429
23.11.2020, 11:30  [ТС]
Rh2Dark не были бы вы так любезны подсказать тупому ламеру куда надо помещать конструкцию типа:
если "скролл вниз" то сделать то-то...
если "скролл вверx" то сделать то-то...

ну например мне надо при вращении колёсика над формой изменять размеры формы (у меня скачанный с просторов модуль но ваш компактней) сейчас я делаю так:
код в форме:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Public Sub MouseWheel(ByVal MouseKeys As Long, ByVal Rotation As Long, ByVal Xpos As Long, ByVal Ypos As Long)
    '
    If MouseKeys = 0 Then
        If Rotation < 0 Then ' увеличиваем
            If Me.Width + ZoomStepTwips > 1920 Then Exit Sub
            Me.Width = Me.Width + ZoomStepTwips
            Me.Height = Me.Height + ZoomStepTwips
            Me.Top = Me.Top - ZoomStepTwips / 2
            Me.Left = Me.Left - ZoomStepTwips / 2
        End If
        '
        If Rotation > 0 Then ' уменьшаем
            If Me.Width - ZoomStepTwips < 480 Then Exit Sub
            Me.Width = Me.Width - ZoomStepTwips
            Me.Height = Me.Height - ZoomStepTwips
            Me.Top = Me.Top + ZoomStepTwips / 2
            Me.Left = Me.Left + ZoomStepTwips / 2
        End If
    End If
    '
    lblXPos = Me.Width
    '
End Sub
как это делается в случае с вашим модулем?
0
Модератор
10057 / 3902 / 884
Регистрация: 22.02.2013
Сообщений: 5,853
Записей в блоге: 79
23.11.2020, 11:59
Цитата Сообщение от giaber Посмотреть сообщение
И всё это ОЧЕНЬ жаль потому как очень нравится ваша лупа - скорость и тому подобное
Моя программа работает не как у тебя. У меня если окно сдвигается в какую-то сторону, то вычисляется область которая будет перекрыта, и эта область сохраняется. Изображение в окне просто сдвигается и дорисовывается часть что была перекрыта + эффект линзы. Это можно заметить если подержать линзу над динамическим содержимым - оно не будет обновляться. Чтобы сделать простое увеличение, нужно просто использовать StretchBlt, без всяких нелинейных преобразований.
0
 Аватар для Rh2Dark
32 / 32 / 0
Регистрация: 05.11.2020
Сообщений: 102
23.11.2020, 20:44
Цитата Сообщение от giaber Посмотреть сообщение
Rh2Dark не были бы вы так любезны подсказать тупому ламеру куда надо помещать конструкцию типа:
если "скролл вниз" то сделать то-то...
если "скролл вверx" то сделать то-то...
В самом начале модуля написано:
Visual Basic
1
2
3
'Как работает модуль:
'1.При старте программы сделать вызов процедуры Hook для элементов, указанных хэндлом
'2.При завершении программы вызвать процедуру UnHook для элементов, указанных хэндлом
Соответственно, при старте надо вызвать процедуру Hook, указав хэндл контрола, который будет принимать сообщения о вращении колеса мыши. А куда поместить конструкцию - это решает программист
0
101 / 38 / 0
Регистрация: 16.09.2014
Сообщений: 429
24.11.2020, 07:45  [ТС]
Цитата Сообщение от Rh2Dark Посмотреть сообщение
Соответственно, при старте надо вызвать процедуру Hook, указав хэндл контрола, который будет принимать сообщения о вращении колеса мыши
Это то я прочитал и вписал:
Visual Basic
1
2
3
4
5
6
7
Private Sub Form_Load()
    Hook (Me.hwnd) 
End Sub
 
Private Sub Form_Unload(Cancel As Integer)
    UnHook (Me.hwnd)
End Sub
и теперь при вращении колёсика над формой мне надо допустим отобразить в Text1.Text что-то что даст мне понять что произошло вращение вниз или вверx.
Во-первыx что это за величина (в том варианте которым я сейчас пользуюсь это +-Rotation )
Во-вторыx где мне писать Text1.Text=что-то (в том варианте которым я сейчас пользуюсь это Public Sub MouseWheel(ByVal MouseKeys As Long, ByVal Rotation As Long, ByVal Xpos As Long, ByVal Ypos As Long))

Вы уж простите меня дурака - ну никак я не понимаю как это всё работает видимо с возрастом тупеет мой мозг, просидел часа 3 над вашим кодом но так и не смог понять что к чему
0
 Аватар для Rh2Dark
32 / 32 / 0
Регистрация: 05.11.2020
Сообщений: 102
24.11.2020, 12:16
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
Function WindowProc(ByVal hwnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
On Error GoTo xErr
Select Case uMsg
Case WM_MOUSEWHEEL
   'hCurСtl = GetHwndCtl
   'If hCurСtl <> 0 Then
      Select Case wParam
      Case -7864320, -23592960, -15728640
         Call SendMessage(hCurСtl, WM_VSCROLL, &H1, Empty) 'Скролл вниз
         Call SendMessage(hCurСtl, WM_VSCROLL, &H1, Empty) 'Скролл вниз
         Call SendMessage(hCurСtl, WM_VSCROLL, &H1, Empty) 'Скролл вниз
         'frmMain.stBar.Panels(1).Text = "Вниз"
      Case 7864320, 23592960, 15728640
         Call SendMessage(hCurСtl, WM_VSCROLL, &H0, Empty) 'Скролл вверх
         Call SendMessage(hCurСtl, WM_VSCROLL, &H0, Empty) 'Скролл вверх
         Call SendMessage(hCurСtl, WM_VSCROLL, &H0, Empty) 'Скролл вверх
         'frmMain.stBar.Panels(1).Text = "Вверх"
      End Select
   'End If
'Case WM_MOUSEMOVE
'   hCurСtl = hwnd
Case Else
   hCurСtl = hwnd
   WindowProc = CallWindowProc(lpPrevWndProc, hwnd, uMsg, wParam, lParam)
End Select
xErr:
End Function
Строки с комментариями "Скролл вниз" и "Скролл вверх" как раз срабатывают, когда крутится колесо мыши. Они посылают "хукнутому" контролу сообщения. Вставьте вместо них нужное действие, например вызов процедур или в вашем случае "Text1.Text=Скролл вниз". Вроде так. Я сам не очень с API-шками, но тут вроде все понятно.
Там даже закомментированные строки типа 'frmMain.stBar.Panels(1).Text = "Вниз" - это я для отладки делал, они как раз пишут в заголовок формы события скролла.
1
101 / 38 / 0
Регистрация: 16.09.2014
Сообщений: 429
24.11.2020, 14:50  [ТС]
Rh2Dark Большое вам спасибо!

The trick! И вам конечно же тоже спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
24.11.2020, 14:50
Помогаю со студенческими работами здесь

Как правильно делать ссылки
У нас сайт по темам похудеть, диеты, фитнес, танцы и т.д. Основная тема - похудение. Я сейчас размещаю статьи, и встал вопрос, как...

Как правильно делать копипаст
Всем привет!!! Веду компьютерный блог. Очень редко делаю 100% копипаст например дайджестов компьютерных вирусов, естественно с...

Как правильно делать ссылку?
Всем доброго времени суток! Делаю сайт, учусь... Пишу ссылки на страницах, например, такой адрес в href&quot;&quot;: ./alc/vodka/. На...

Как правильно делать проверку
Сори за название, не смог его правильно сформулировать. Не пойму как правильно сделать такую проверку: Есть html код вида &lt;div...

Как правильно делать подзапросы?
Люди как их делать... ПР: If request.querystring('a1')='a2' Then SQL.execute(Select * From table) ...&lt;td&gt;rs('Чето')&lt;/td&gt;......


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru