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

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

22.11.2020, 08:50. Показов 1245. Ответов 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
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
22.11.2020, 10:15
https://www.cyberforum.ru/post5805371.html
1
101 / 38 / 0
Регистрация: 16.09.2014
Сообщений: 426
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 Кб, 7 просмотров)
1
101 / 38 / 0
Регистрация: 16.09.2014
Сообщений: 426
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
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 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
Сообщений: 426
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
Сообщений: 426
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
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru