powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Рисование с помощью API
17 сообщений из 17, страница 1 из 1
Рисование с помощью API
    #32342960
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
как на форме(сабформе) нарисовать кружок, квадратик и к томуж разного цвета и в нужном месте.
желательно с примером пока в API не силён.
...
Рейтинг: 0 / 0
Рисование с помощью API
    #32343004
Фотография Северный_Бобер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Получится полная чухня!

Я думаю тебе этот ананизм не шибко нужен, возьми непечатаемые символы и вставь в форму как внедренный ОЛЕ объект...
...
Рейтинг: 0 / 0
Рисование с помощью API
    #32343039
Фотография SergeySV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
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.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
' В этой переменной хранится временный дескриптор контекста окна
Dim hDC As Long
Dim RectForm as Rect
Dim LineStyle As Long, LineWidth As Long, LineColor As Long
Dim PenHND as Long, OldPen as Long
Dim x as Long, y as Long

  ' Получаем дескриптор контекста холста
  hDC = GetDC(Me.hwnd)
  ' Создаем совместимый дескриптор
  MDC = CreateCompatibleDC (hDC)
  ' Создаем совместимую битовую карту с картой битов холста
  MBM = CreateCompatibleBitmap (hDC, RectForm.Right, RectForm.Bottom)
  ' Удаляем дескриптор
  ReleaseDC Me.hwnd, hDC
  ' Выбираем битовую карту во временный контекст
  SelectObject MDC, MBM
  
  ' рисуем на этом контексте
  LineStyle  = 1
  LineWidth = 1
  LineColor = 1
  PenHND = CreatePen(LineStyle, LineWidth, LineColor)
  ' Выбираем созданные дескрипторы пера и кисти в контекст
  OldPen = SelectObject(MDC, PenHND)
  
  x =  10 
  y =  10 
  ' Рисуем круг в коорд x и y, диам. 20
  Call Ellipse(MDC, x, y, x + 20, y + 20)
   
   ' Выбираем в контекст старую кисть
   ' ЭТО ОЧЕНЬ ВАЖНАЯ ОПЕРАЦИЯ
   SelectObject HDC, OldPen
  ' Удаляем новую кисть
  ' И ЭТО ОЧЕНЬ ВАЖНАЯ ОПЕРАЦИЯ
  DeleteObject (PenHND)
 
' Вывести виртуальное окно на форму
  BitBlt Me.HDC, RectForm.Left, RectForm.Top, 
RectForm.Right, RectForm.Bottom, MDC,  0 ,  0 , SRCCOPY
 
  
 ' Удалить битовую карту
 DeleteObject MBM
 ' Удалить дескриптор
 DeleteDC MDC


Пояснения:
1. RectForm - струтура с размерами формы, типа:
Public Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
естетсвенно можно заменить ее в функциях на Me.Right или вообще число подставить

2. Me - твоя форма, а Me.hwnd - декриптор ее окна (если такого свойства у твоей формы нет (например в VBA Excel,Word), то тебе надо самому искать hwnd своей формы - отд. разговор)

3. От совместимого дескриптора можно отказаться и рисовать сразу в hDC:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
    
    ' Получаем дескриптор контекста холста
    hDC = GetDC(Me.hwnd)
    ' создаем перо и рисуем как и в том примере, токо вместо MDC пишем hDC
    .....
    ' в конце соотв.
    ' Удаляем дескриптор
    ReleaseDC Me.hwnd, hDC

- совместимого дескриптора нужен для того, чтобы спокойно все нарисовать на копии витмап изображения твоей формы, а потом в конце сразу за оприсест все вывести. Это удобно при анимации, не будет видно мелькания при перерисовки, потому что мы просто наложим сверху новую картинку.
...
Рейтинг: 0 / 0
Рисование с помощью API
    #32343050
Фотография SergeySV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, объявления API функций:

Код: plaintext
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.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
' Работа с дескрипторами и контекстами устройства DC
Public Declare Function GetDesktopWindow Lib "user32" () As Long
Public Declare Function GetWindowDC Lib "user32" (ByVal hWnd As Long) As Long
Public Declare Function CreateCompatibleDC Lib "gdi32" (ByVal hdc As Long) As Long
Public Declare Function CreateCompatibleBitmap Lib "gdi32" (ByVal hdc As Long, _
ByVal nWidth As Long, ByVal nHeight As Long) As Long
Public Declare Function SelectObject Lib "gdi32" (ByVal hdc As Long, ByVal hObject As Long) As Long
Public Declare Function ReleaseDC Lib "user32" (ByVal hWnd As Long, ByVal hdc As Long) As Long
Public Declare Function DeleteDC Lib "gdi32" (ByVal hdc As Long) As Long
Public Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long

' Загрузка в память
Public Const BLACKNESS = &H885050
Public Const DSTINVERT = &H550009
Public Const MERGECOPY = &HC000CA
Public Const MERGEPAINT = &HBB0226
Public Const NOTSRCCOPY = &H330008
Public Const NOTSRCERASE = &H1100A6
Public Const PATCOPY = &HF00021
Public Const PATINVERT = &H5A0049
Public Const PATPAINT = &HFB0A09
Public Const SRCAND = &H8800C6
Public Const SRCCOPY = &HCC0020
Public Const SRCERASE = &H440328
Public Const SRCINVERT = &H660046
Public Const SRCPAINT = &HEE0086
Public Const WHITENESS = &HFF0062

Public Declare Function BitBlt Lib  "gdi32"  (ByVal hDestDC As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, _
ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long

' Рисование
Public Declare Function GetSystemMetrics Lib  "user32"  (ByVal nIndex As Long) As Long
Public Declare Function CreatePen Lib  "gdi32"  (ByVal nPenStyle As Long, ByVal nWidth As Long, ByVal crColor As Long) As Long
Public Declare Function MoveToEx Lib  "gdi32"  (ByVal hdc As Long, ByVal x As Long, _
ByVal y As Long, lpPoint As POINTAPI) As Long
Public Declare Function LineTo Lib  "gdi32"  (ByVal hdc As Long, ByVal x As Long, ByVal y As Long) As Long
Public Declare Function Ellipse Lib  "gdi32"  (ByVal hdc As Long, ByVal X1 As Long, ByVal Y1 As Long, _
ByVal X2 As Long, ByVal Y2 As Long) As Long
...
Рейтинг: 0 / 0
Рисование с помощью API
    #32343153
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Северный_Бобер

Я думаю тебе этот ананизм не шибко нужен, возьми непечатаемые символы и вставь в форму как внедренный ОЛЕ объект...


ежели получится(а я в этом уверен) тебе предется взять свои лова обратно...

2SergeySV
спасибо , буду пробовать

надо самому искать hwnd своей формы
а ежели это поле?
буду над этим думать...
...
Рейтинг: 0 / 0
Рисование с помощью API
    #32343234
Фотография SergeySV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>>а ежели это поле?
буду над этим думать...


тут эта тема неоднакратно поднималась уже на форуме. Контролы в Access рисованные и не имеют своего hWnd, они его получают только когда получают фокус, так сказать по быстрому, чтобы не занимал его все время, так что делать что-то с контролом через hWnd вряд ли получится, другое дело - форма.

Так что если ты хочешь рисовать на поле вне зависимости имеет ли оно фокус, надо брать hDc формы -> ее битмап и зная где на этом битмапе находится нарисованный контрол, рисовать что-нибудь сверху...
...
Рейтинг: 0 / 0
Рисование с помощью API
    #32343287
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Контролы в Access рисованные и не имеют своего hWnd, они его получают только когда получают фокус,

т.е. они его всётаки имеют. а как его получить (при получении фокуса)?
поле.hWdn?
...
Рейтинг: 0 / 0
Рисование с помощью API
    #32343319
IgorM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
http://www.mvps.org/access/api/api0027.htm
...
Рейтинг: 0 / 0
Рисование с помощью API
    #32343500
RVI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как вариант:
На поле, на кнопке или где хочешь устанавливаешь шрифт Webdings
или Wingdings и в значении по умолчанию для поля или в подпись - для
кнопки, вводишь какую-нить буковку - и будет тебе счастье! Комбинируя
буквами можно выбрать и кружок, и квадрат, и пароход, и самолет -
что угодно... Тока размер шрифта надо ставить поболее.
Ежели ты хочешь именно свой кружок нарисовать - тады ой...!!!
...
Рейтинг: 0 / 0
Рисование с помощью API
    #32343782
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чё получится покажу, тока не скора...
...
Рейтинг: 0 / 0
Рисование с помощью API
    #32344871
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2SergeySV
эта значит в модуле
а в форме vv вызывается по кнопке
но ругеатся - помечено
апликашин-дефинишен или объект дефенишен еррор
похоже там еще что-то дложно быть?

Код: plaintext
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.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
Option Compare Database
Option Explicit

' Работа с дескрипторами и контекстами устройства DC'
Public Declare Function GetDesktopWindow Lib  "user32"  () As Long
Public Declare Function GetWindowDC Lib  "user32"  (ByVal hwnd As Long) As Long
Public Declare Function CreateCompatibleDC Lib  "gdi32"  (ByVal hDC As Long) As Long
Public Declare Function CreateCompatibleBitmap Lib  "gdi32"  (ByVal hDC As Long, _
ByVal nWidth As Long, ByVal nHeight As Long) As Long
Public Declare Function SelectObject Lib  "gdi32"  (ByVal hDC As Long, ByVal hObject As Long) As Long
Public Declare Function ReleaseDC Lib  "user32"  (ByVal hwnd As Long, ByVal hDC As Long) As Long
Public Declare Function DeleteDC Lib  "gdi32"  (ByVal hDC As Long) As Long
Public Declare Function DeleteObject Lib  "gdi32"  (ByVal hObject As Long) As Long

' Загрузка в память'
Public Const BLACKNESS = &H885050
Public Const DSTINVERT = &H550009
Public Const MERGECOPY = &HC000CA
Public Const MERGEPAINT = &HBB0226
Public Const NOTSRCCOPY = &H330008
Public Const NOTSRCERASE = &H1100A6
Public Const PATCOPY = &HF00021
Public Const PATINVERT = &H5A0049
Public Const PATPAINT = &HFB0A09
Public Const SRCAND = &H8800C6
Public Const SRCCOPY = &HCC0020
Public Const SRCERASE = &H440328
Public Const SRCINVERT = &H660046
Public Const SRCPAINT = &HEE0086
Public Const WHITENESS = &HFF0062

Public Declare Function BitBlt Lib  "gdi32"  (ByVal hDestDC As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, _
ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long
Declare Function GetDC Lib  "user32"  (ByVal hwnd As Long) As Long
' Рисование'
Public Declare Function GetSystemMetrics Lib  "user32"  (ByVal nIndex As Long) As Long
Public Declare Function CreatePen Lib  "gdi32"  (ByVal nPenStyle As Long, ByVal nWidth As Long, ByVal crColor As Long) As Long
Public Declare Function MoveToEx Lib  "gdi32"  (ByVal hDC As Long, _
ByVal x As Long, ByVal y As Long, lpPoint As POINTAPI) As Long
Public Declare Function LineTo Lib  "gdi32"  (ByVal hDC As Long, ByVal x As Long, ByVal y As Long) As Long
Public Declare Function Ellipse Lib  "gdi32"  (ByVal hDC As Long, _
ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long
Type POINTAPI
        x As Long
        y As Long
End Type

Public Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type


Public Sub vv(ByVal dd As Form)

On Error GoTo s1
' В этой переменной хранится временный дескриптор контекста окна'
Dim hDC As Long
Dim RectForm As RECT
Dim LineStyle As Long, LineWidth As Long, LineColor As Long
Dim PenHND As Long, OldPen As Long
Dim x As Long, y As Long
Dim MBM As Long
Dim MDC As Long
  ' Получаем дескриптор контекста холста'
  hDC = GetDC(dd.hwnd)
  ' Создаем совместимый дескриптор'
  MDC = CreateCompatibleDC(hDC)
  ' Создаем совместимую битовую карту с картой битов холста'
  MBM = CreateCompatibleBitmap(hDC, RectForm.Right, RectForm.Bottom)
  ' Удаляем дескриптор'
  ReleaseDC dd.hwnd, hDC
  ' Выбираем битовую карту во временный контекст'
  SelectObject MDC, MBM
  
  ' рисуем на этом контексте'
  LineStyle =  1 
  LineWidth =  1 
  LineColor =  1 
  PenHND = CreatePen(LineStyle, LineWidth, LineColor)
  ' Выбираем созданные дескрипторы пера и кисти в контекст'
  OldPen = SelectObject(MDC, PenHND)
  
  x =  10 
  y =  10 
  ' Рисуем круг в коорд x и y, диам. 20'
  Call Ellipse(MDC, x, y, x +  20 , y +  20 )
   
   ' Выбираем в контекст старую кисть'
   ' ЭТО ОЧЕНЬ ВАЖНАЯ ОПЕРАЦИЯ'
   SelectObject hDC, OldPen
  ' Удаляем новую кисть'
  ' И ЭТО ОЧЕНЬ ВАЖНАЯ ОПЕРАЦИЯ'
  DeleteObject (PenHND)
 
' Вывести виртуальное окно на форму'
  BitBlt dd.hDC, RectForm.Left, RectForm.Top, RectForm.Right, RectForm.Bottom, MDC,  0 ,  0 , SRCCOPY
 [SIZE= 3 ][color=blue]здесь вот и ругается[/color][/SIZE]
  
 ' Удалить битовую карту'
 DeleteObject MBM
 ' Удалить дескриптор'
 DeleteDC MDC
Exit Sub
s1:
    MsgBox Err.Description

End Sub

...
Рейтинг: 0 / 0
Рисование с помощью API
    #32344915
CtrlAlt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще-то нарисованные с помощью API кружочки и прочее долго не живут. Стоит проскроллить туды-сюды или еще каким-то образом обновить форму и Access все потрет нафик.
Я так пытался разукрашивать поля в зависимости от условия (типа условное форматирование). Так стоит что-нибудь с формой сотворить и Access перекрашивает все взад (причем остаются некоторые ошметки)
...
Рейтинг: 0 / 0
Рисование с помощью API
    #32344934
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2CtrlAlt
это относится к данному методу или вообще к рисованию через API?

может можно создать какой-либо битмап, который будет связан с окном акса или полем, а не экраном?
...
Рейтинг: 0 / 0
Рисование с помощью API
    #32344947
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
на русьимпорте один показавал нечто подобное, правда выкладывал в мде...
...
Рейтинг: 0 / 0
Рисование с помощью API
    #32344989
CtrlAlt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Объясни подробнее где тебе нужон кружок твой?
Если в форме, то можно внедрить имидж, либо использовать свойство Picture.
Если в поле, то зачем? Ведь текст либо все затрет, либо наложится и бедет что-то нечетабельное.
...
Рейтинг: 0 / 0
Рисование с помощью API
    #32345265
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да всё чтоб выделить строку в ленточной форме.\r
применительно к адр\r
\r
есть решения , но тормознутые \r
в основном из-за того, что акс прорисовывает/производит вычисления по полям(функции в поле, sum..) через некоторое время после обновления данных у меня это ~0.3 сек хотся что-то быстрое...\r
ус.форм не катит!!!!\r
\r
один из вариантов\r
Выделение записи цветом - работающий вариант
...
Рейтинг: 0 / 0
Рисование с помощью API
    #32345291
Фотография SergeySV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если тебе для ленточных форм нужно рисовать, то это API тебе конечно врядли подойдет, потому как правильно уже заметили, все что ты нарисуешь Access перерисует как только будет обновление формы (в смысле необходимость в перерисовке: окно переместили, скрол сделали и т.д.), тут тогда надо ловить событие формы OnPaint и быстренько перерисовывать, токо вот у формы Access помойму такого события нет и вечный бой продолжается....

Не знаю какие варианты уже рассмотрел, но попробую тебе предложить свой вариант раскрасски в ленточных формах, работает достаточно быстро, писал я его сам и только потом в инете нашел, что такие же варианты решения проблемы:

суть в том, что в таблицу добавляется поле OLE куда в каждую запись программно внедряются маленькие bmp рисунки (в моем случае), а также программно удаляются если надо. В форме ставятся присоединенная рамка или ... и устанавливается связь с полем OLE (ставим растяжение рисунка). Его кладем на форму, внизу под элементы, а их фон делаем прозрачный, таким образом я спокойно выделял всю строку в лент. форме и по нажатиям кнопок цвет быстренька менялся...

вообщем, если тебя интересует могу выцепить пример из базы и переслать для пробы...
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Рисование с помощью API
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]