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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.01.2013, 10:03   #1
fyedor
Пользователь
 
Регистрация: 11.12.2012
Сообщений: 71
Вопрос Прозрачность в WinApi, применительно к VBA

Возник вопрос: кто-нибудь работал с прозрачностью в WinApi применительно к VBA? Какие методы надо использовать?
fyedor вне форума Ответить с цитированием
Старый 16.01.2013, 12:00   #2
LittleFatCat
Пользователь
 
Регистрация: 14.09.2010
Сообщений: 68
По умолчанию

Доброго времени суток!

http://excelvba.ru/code/Transparency

Посмотрите вот здесь... Вообще весьма полезный ресурс
LittleFatCat вне форума Ответить с цитированием
Старый 17.01.2013, 08:20   #3
fyedor
Пользователь
 
Регистрация: 11.12.2012
Сообщений: 71
По умолчанию

Цитата:
Сообщение от LittleFatCat Посмотреть сообщение
Доброго времени суток!

http://excelvba.ru/code/Transparency

Посмотрите вот здесь... Вообще весьма полезный ресурс
Да, полезный, но там речь идем о прозрачности форм и WinApi в Excel. У меня же Access и прорачность нужно выставить у объектов, созданных с помощью того же WinApi (например, круг).

В принципе, даже построение удалось сделать:

определяю дескриптор окна:

Код:

hWnd = FindWindowEx(Me.hWnd, FindWindowEx(Me.hWnd, 0, "OFormSub", ""), "OFormSub", "")
Устанавливаю кисть и заливку:

Код:

MyPen = apigetPen(5, 2, RGB(255, 0, 0))
Call apiSelectObject(hdc, MyPen)

MyBrash = ApiGetBrush(4, RGB(255, 0, 0))
Call apiSelectObject(hdc, MyBrash)
Применяемые функции определены с использованием библиотек user32.dll и gdi32.dll.

Ну и в конце произвожу построение сектора, по установленным координатам:

Код:

Call apiPie(hdc, X1, Y1, X2, Y2, 4500, 250, 130, 150)
Проблемы:

1. Плохое определение координат сектора. Что я имею в виду? Я имею в виду то, что если прокрутить форму Access вниз и вновь нарисовать сектор его координаты примут значения другие...а хотелось бы, чтобы координаты были жестко привязаны к форме и не изменялись при ее прокрутке.

2. При выходе сектора за область окна экрана происходит его обрезание. Тут видимо нужно как-то реагировать на изменение размеров окна приложения и вызывать обновление (refresh).

3. Хотелось бы реализовать прозрачность сектора. Есть метод AlphaBlend...но его применяют для прозрачности рисунков на форме, а у меня объект, созданный с помощью WinApi.
fyedor вне форума Ответить с цитированием
Старый 17.01.2013, 08:57   #4
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Цитата:
3. Хотелось бы реализовать прозрачность сектора. Есть метод AlphaBlend...но его применяют для прозрачности рисунков на форме, а у меня объект, созданный с помощью WinApi.
А Вы создайте контекст в памяти / CreateCompatibleDC / нарисуйте на нем нужный элемент, сектор или что у Вас там, а потом сделайте наложение на hdc формы через AlphaBlend.
EUGY вне форума Ответить с цитированием
Старый 17.01.2013, 09:38   #5
fyedor
Пользователь
 
Регистрация: 11.12.2012
Сообщений: 71
По умолчанию

Цитата:
Сообщение от EUGY Посмотреть сообщение
А Вы создайте контекст в памяти / CreateCompatibleDC / нарисуйте на нем нужный элемент, сектор или что у Вас там, а потом сделайте наложение на hdc формы через AlphaBlend.
Если я Вас правильно понял, должно получиться что-то наподобии этого:

Код:

hMemDC = apiCreateCompatibleDC(hdc)
    
With bfn
  .BlendOp = AC_SRC_OVER
  .BlendFlags = 0
  .SourceConstantAlpha = 128
  .AlphaFormat = 0
End With
    
RtlMoveMemory LBF, BF, 4
Call apiAlphaBlend(hdc, 0, 0, 10000, 10000, hMemDC, 0, 0, 10000, 10000, LBF)
Call apiPie(hdc, X1, Y1, X2, Y2, 4500, 250, 130, 150)
Где bfn - переменная, созданного мною типа данных для хранения требуемой структуры:

Код:

Private Type BLENDFUNCTION
  BlendOp As Byte
  BlendFlags As Byte
  SourceConstantAlpha As Byte
  AlphaFormat As Byte
End Type

Dim bfn As BLENDFUNCTION
Но такая реализация не делает мой объект прозрачным...
fyedor вне форума Ответить с цитированием
Старый 17.01.2013, 10:02   #6
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Не так быстро
Я воздержусь приводить код, но за свои слова отвечаю.
Вам надо создать совместимый контекст /CreateCompatibleDС/, создать битмэп нужного размера /CreateCompatibleBitmap/, выбрать его в контексте /SelectObject/
нарисовать Pie на этом новом контексте, а не на контексте формы, как пытались сделать Вы. И вот только после этого /AlphaBlend/. И кроме того, еще должен быть рисунок/маска. Вообщем принцип, как у /DrawIcon/.
И еще бы посоветовал не делать синонимы alias Api-функций типа
CreateCompatibleDC >> apiCreateCompatibleDC.
Конечно это дело хозяйское, но я бы все апи-декларации забил бы в TLB c помощью midl, и подключал бы через References в VB/VBA.
EUGY вне форума Ответить с цитированием
Старый 17.01.2013, 10:59   #7
fyedor
Пользователь
 
Регистрация: 11.12.2012
Сообщений: 71
По умолчанию

Цитата:
Сообщение от EUGY Посмотреть сообщение
Не так быстро
Ну давайте по порядку

Код:

' Создал совместимый контекст
hMemDC = apiCreateCompatibleDC(hdc)

' Создал битмэп нужного размера. Вопрос: 1. Контекст совместимый применять?
CompatibleBitmap = CreateCompatibleBitmap(hMemDC, 1000, 1000)

'  Выбираю битмэп. Опять же, 2. какой применять контекст?
Call apiSelectObject(hMemDC, CompatibleBitmap)

' Кисть и заливка. 3. Применять совместимый контекст?
MyPen = apigetPen(5, 2, RGB(255, 0, 0))
Call apiSelectObject(hMemDC, MyPen)
MyBrash = ApiGetBrush(4, RGB(255, 0, 0))
Call apiSelectObject(hMemDC, MyBrash)
    
RtlMoveMemory LBF, BF, 4

' Рисую сектор. Опять же, 4. какой контекст?    
Call apiPie(hMemDC, X1, Y1, X2, Y2, 4500, 250, 130, 150)

' Ну и здесь 5. какой контекст?
Call apiAlphaBlend(hMemDC, 0, 0, 10000, 10000, hMemDC, 0, 0, 10000, 10000, LBF)

' 6. Что значит должен быть рисунок/маска?
fyedor вне форума Ответить с цитированием
Старый 17.01.2013, 11:28   #8
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Код:
deskDC = GetDC(0) // Не забыть потом ReleaseDC
hMemDC = apiCreateCompatibleDC(deskDC)

' Создал битмэп нужного размера.
CompatibleBitmap = CreateCompatibleBitmap(deskDC, 1000, 1000)
......
......
Call apiAlphaBlend(hdc,.........., hMemDC,...........
Наложение прозрачное ?
EUGY вне форума Ответить с цитированием
Старый 18.01.2013, 08:02   #9
fyedor
Пользователь
 
Регистрация: 11.12.2012
Сообщений: 71
По умолчанию

Цитата:
Сообщение от EUGY Посмотреть сообщение
Наложение прозрачное ?
Есть форма Access, на ней рисунок (некая карта местности), на карту наносится фигура (например, сектор). Вот эта фигура должна быть полупрозрачной, чтобы можно было видеть саму карту.
fyedor вне форума Ответить с цитированием
Старый 18.01.2013, 08:21   #10
fyedor
Пользователь
 
Регистрация: 11.12.2012
Сообщений: 71
По умолчанию

Сделал вот так:

Код:

 deskDC = apiGetDC(0) 
 hMemDC = apiCreateCompatibleDC(deskDC)

CompatibleBitmap = CreateCompatibleBitmap(deskDC, 1000, 1000)
Call apiSelectObject(deskDC, CompatibleBitmap)
    
 MyPen = apigetPen(5, 2, RGB(255, 0, 0))
 Call apiSelectObject(hdc, MyPen)

 MyBrash = ApiGetBrush(4, RGB(255, 0, 0))
 Call apiSelectObject(hdc, MyBrash)

 With bfn
    .BlendOp = AC_SRC_OVER
    .BlendFlags = 0
    .SourceConstantAlpha = 128
    .AlphaFormat = 0
 End With

 RtlMoveMemory LBF, BF, 4

 Call apiPie(hdc, X1, Y1, X2, Y2, 4500, 250, 130, 150)
 Call apiAlphaBlend(hdc, 0, 0, 100, 100, hMemDC, 0, 0, 100, 100, LBF)
Он выводит сектор, но не прозрачный, хотя в поле SourceConstantAlpha указано 128. Что не так?

Последний раз редактировалось fyedor; 18.01.2013 в 08:23.
fyedor вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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