Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Access
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.01.2013, 12:07   #51
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Цитата:
И Для работы с сообщениями WM_VSCROLL/WM_HSCROLL в качестве индентификатора исполльзую Me.hwnd
Угу.
И поэтому нужен сабклассинг двух окон.
И как я представляю, обработка WM_VSCROLL родительского окна будет заключаться просто в вызове InvalidateRect для дочернего.
А в дочернем при WM_PAINT надо выяснять текущую позицию скролла родителя через GetScrollBarInfo и в соответствии с этими данными перерисовывать содержимое.

Последний раз редактировалось EUGY; 24.01.2013 в 12:10.
EUGY вне форума Ответить с цитированием
Старый 25.01.2013, 08:19   #52
fyedor
Пользователь
 
Регистрация: 11.12.2012
Сообщений: 71
По умолчанию

Цитата:
Сообщение от EUGY Посмотреть сообщение
обработка WM_VSCROLL родительского окна будет заключаться просто в вызове InvalidateRect для дочернего.
А не могли бы точно описать функцию InvalidateRect, а то там есть параметр CONST RECT *lpRect. Я что-то не понимаю, как его в VBA можно объявить...

У меня есть:

1.

Код:
Dim SBI As SCROLLBARINFO

Case WM_PAINT

GetScrollBarInfo Form_Form1.hwnd, 1, SBI
где
Form_Form1.hwnd - идентификатор родительского окна.

2.

Код:
Dim RC As Long

Case WM_HSCROLL Or WM_VSCROLL

newhwnd = FindWindowExA(hwnd, FindWindowExA(hwnd, 0, "OFormSub", ""), "OFormSub", "")
InvalidateRect newhwnd, RC, False
где
hwnd - идентификатор родительского окна.
newhwnd - идентификатор дочернего окна

Последний раз редактировалось fyedor; 25.01.2013 в 08:37.
fyedor вне форума Ответить с цитированием
Старый 25.01.2013, 12:49   #53
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Часто InvalidateRect объявляется так:
Код:
Public Declare Function InvalidateRect Lib "user32" Alias "InvalidateRect" (ByVal hwnd As Long, lpRect As RECT, ByVal bErase As Long) As Long
Но в описании в msdn говорится, что второй параметр может быть нулем, если нужно перечертить всю зону окна. Поэтому я в тлб описал так:
Код:
Public Declare Function InvalidateRect Lib "user32" Alias "InvalidateRect" (ByVal hwnd As Long, ByVal lpRect As long, ByVal bErase As Long) As Long
И это позволит вызывать функцию двояко:
Код:
InvalidateRect hWnd, 0, False
Dim rc As RECT
rc.Right = 10
rc.bottom = 20
InvalidateRect hWnd, VarPtr(rc), False
EUGY вне форума Ответить с цитированием
Старый 25.01.2013, 13:25   #54
fyedor
Пользователь
 
Регистрация: 11.12.2012
Сообщений: 71
По умолчанию

Замечательно!

InvalidateRect отрабатывает почти на ура.

Я его использую пока без вызова GetScrollBarInfo в WM_PAINT, поэтому фигура перемещается по форме вместе с прокруткой. Но к сожалению в конце прокрутки она исчезает почему-то и появляется только когда начинаю прокручивать вверх.
fyedor вне форума Ответить с цитированием
Старый 25.01.2013, 13:33   #55
fyedor
Пользователь
 
Регистрация: 11.12.2012
Сообщений: 71
По умолчанию

Кстати,


метод GetScrollBarInfo hwnd As lond, idObject As Long, psbi As SCROLLBARINFO

Второй его параметр idObject - это id на рассматриваемый объект? Или что-то другое. Если да, то откуда его можно достать?
fyedor вне форума Ответить с цитированием
Старый 25.01.2013, 13:40   #56
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Я уверен, если дисциплинированно подойти к вопросу, то все получится.
Возможно надо сначала позволить начертиться фоновому изображению, а после делать наложение своего рисунка. Или вообще рисовать полностью все в буфере, и потом вывести за раз через BitBlt.
Ps.

GetScrollBarInfo- полнстью описан в мсдн. Второй параметр это одна из трех констант
OBJID_CLIENT OBJID_HSCROLL OBJID_VSCROLL
Если ставится первая константа OBJID_CLIENT, то хендл окна в первом параметре должен указывать на окно класса SCROLLBAR
Думаю вам надо не ее, а другие две. Хотя что мешает получить хендл непосредственно скролбара. Поставьте утилитку spy++,
с ней можно изучить структуру окон и отслеживать обмен сообщений.

Последний раз редактировалось EUGY; 25.01.2013 в 13:52.
EUGY вне форума Ответить с цитированием
Старый 25.01.2013, 13:59   #57
fyedor
Пользователь
 
Регистрация: 11.12.2012
Сообщений: 71
По умолчанию

Да, читал про это.

Пробовал константу OBJID_VSCROLL. Но она не объявлена в вашей библиотеке. И не понятно, какое ей присваивать значение. Написано 0xFFFFFFFB, но не понятно как присваивать такие значения...

Разобрался, вот так:

Код:
Private Const OBJID_VSCROLL = &HFFFFFFFB

Последний раз редактировалось fyedor; 25.01.2013 в 14:04.
fyedor вне форума Ответить с цитированием
Старый 25.01.2013, 14:04   #58
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Походу мне было влом..
Код:
Const OBJID_WINDOW = &H0
Const OBJID_SYSMENU = &HFFFFFFFF
Const OBJID_TITLEBAR = &HFFFFFFFE
Const OBJID_MENU = &HFFFFFFFD
Const OBJID_CLIENT = &HFFFFFFFC
Const OBJID_VSCROLL = &HFFFFFFFB
Const OBJID_HSCROLL = &HFFFFFFFA
Const OBJID_SIZEGRIP = &HFFFFFFF9
Const OBJID_CARET = &HFFFFFFF8
Const OBJID_CURSOR = &HFFFFFFF7
Const OBJID_ALERT = &HFFFFFFF6
Const OBJID_SOUND = &HFFFFFFF5
EUGY вне форума Ответить с цитированием
Старый 25.01.2013, 14:37   #59
fyedor
Пользователь
 
Регистрация: 11.12.2012
Сообщений: 71
По умолчанию

Прописал метод:

Код:
GetScrollBarInfo Form_Form1.hwnd, OBJID_VSCROLL, SBInfo
где

Код:
Dim SBInfo As SCROLLBARINFO
но структура не заполняется данными...
fyedor вне форума Ответить с цитированием
Старый 25.01.2013, 14:43   #60
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Функция хочет знать размер структуры.
SBInfo.cbSize = lenB(SBInfo)
EUGY вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
WinApi рисование в VBA Desha Помощь студентам 5 05.12.2012 12:32
Прозрачность в ie WennY HTML и CSS 1 26.08.2012 17:13
Различие кода mfc и WinApi(mfc ручками набили, а WinApi автоматически с генерировался!! нужно явное отличие, не могу найти) Артём1991 Помощь студентам 0 25.03.2012 17:13
Прозрачность digital-stream Общие вопросы Delphi 1 14.11.2011 21:03
Ошибка с SetLength применительно в PChar Celestia Общие вопросы Delphi 7 09.04.2011 06:42