powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / чем рисовать чтоб не стиралось
18 сообщений из 18, страница 1 из 1
чем рисовать чтоб не стиралось
    #34704020
timtim
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
окрашиваю пикселы на Picture ф-ей SetPixel, но окрашивание пропадает при закрытии Picture другим окном или выводе за экран, подскажите пожалуйста чем можно закрашивать пикселы чтоб закраска непропадала?
...
Рейтинг: 0 / 0
чем рисовать чтоб не стиралось
    #34704095
Фотография Бенедикт
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
timtim,
Picture.AutoRedraw = True, и Picture.Refresh после отрисовки.
...
Рейтинг: 0 / 0
чем рисовать чтоб не стиралось
    #34704101
Фотография Бенедикт
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В смысле, Picture.AutoRedraw = True - до отрисовки (можно в конструкторе формы). Refresh - после.
...
Рейтинг: 0 / 0
чем рисовать чтоб не стиралось
    #34704150
timtim
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если AutoRedraw=True то тогда вываливается ошибка 480-"Can't create AutoRedraw image"
как её побороть?
...
Рейтинг: 0 / 0
чем рисовать чтоб не стиралось
    #34704223
Фотография Бенедикт
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
timtim,
никогда не встречал такую ошибку. Судя по обсуждениям, она возникает при недостатке ресурсов, например, очень большой картинке.
Почему, кстати, используется SetPixel?

Если уж используется API, можно отрисовывать на memory DC, а дальше так или иначе копировать содержимое (или часть) выбранного в нём битмапа в PictureBox.
...
Рейтинг: 0 / 0
чем рисовать чтоб не стиралось
    #34704235
timtim
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
картинка действительно большая
а нельзяли чуть поподробнее об:"можно отрисовывать на memory DC, а дальше так или иначе копировать"
...
Рейтинг: 0 / 0
чем рисовать чтоб не стиралось
    #34704489
Фотография Бенедикт
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
timtim,
попробую показать, в примитивном варианте.
Пусть есть вспомогательный модуль:
Код: 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.
Option Explicit

Private Enum PICTYPE
   PICTYPE_UNINITIALIZED = - 1 
   PICTYPE_NONE =  0 
   PICTYPE_BITMAP =  1 
   PICTYPE_METAFILE =  2 
   PICTYPE_ICON =  3 
   PICTYPE_ENHMETAFILE =  4 
End Enum

Private Type GUID
   Data1 As Long
   Data2 As Integer
   Data3 As Integer
   Data4( 0  To  7 ) As Byte
End Type

Private Type PicBmp
   Size As Long
   Type As PICTYPE
   hBmp As Long
   hPal As Long
   Reserved As Long
End Type

Private Declare Function OleCreatePictureIndirect Lib "olepro32" ( _
   PicDesc As PicBmp, RefIID As GUID, _
   ByVal fPictureOwnsHandle As Long, IPic As IPictureDisp) As Long

Public Function CreateIPictureDispFromHBITMAP( _
   ByVal hBitmap As Long, _
   Optional ByVal hPal As Long =  0 , _
   Optional ByVal fPictureOwnsHandle As Long =  1 ) As IPictureDisp
 Dim IID_IDispatch As GUID
 Dim Pic As PicBmp

 With Pic
    .Size = Len(Pic)
    .Type = PICTYPE_BITMAP
    .hBmp = hBitmap
    .hPal = hPal
 End With
 With IID_IDispatch
    .Data1 = &H20400
    .Data4( 0 ) = &HC0
    .Data4( 7 ) = &H46
 End With
 OleCreatePictureIndirect Pic, IID_IDispatch, fPictureOwnsHandle, _
                          CreateIPictureDispFromHBITMAP
End Function
Пусть есть новый Exe-проект, на форму кладём PictureBox и CommandButton. Модуль формы:
Код: 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.
Option Explicit

Private Declare Function CreateCompatibleDC Lib "gdi32" ( _
   ByVal hDC As Long) As Long
Private Declare Function CreateCompatibleBitmap Lib "gdi32" ( _
   ByVal hDC As Long, ByVal nWidth As Long, ByVal nHeight As Long) As Long
Private Declare Function DeleteDC Lib "gdi32" ( _
   ByVal hDC As Long) As Long

Private Declare Function SelectObject Lib "gdi32" ( _
   ByVal hDC As Long, ByVal hObject As Long) As Long
'Private Declare Function DeleteObject Lib "gdi32" ( _
'   ByVal hObject As Long) As Long

Private Declare Function SetPixel Lib "gdi32" ( _
   ByVal hDC As Long, ByVal x As Long, ByVal y As Long, _
   ByVal crColor As Long) As Long

Private Sub Command1_Click()
 Dim hbmMem As Long
 Dim hdcMem As Long
 Dim hbmOld As Long
 
 hbmMem = CreateCompatibleBitmap(Picture1.hDC,  2000 ,  2000 )
 If hbmMem =  0  Then Exit Sub
 hdcMem = CreateCompatibleDC(Picture1.hDC)
 hbmOld = SelectObject(hdcMem, hbmMem)
 
 'Под Win9x следует почистить битмап, нарисовав чёрный прямоугольник
 SetPixel hdcMem,  10 ,  20 , RGB( 255 ,  0 ,  0 )
 SetPixel hdcMem,  20 ,  40 , RGB( 0 ,  255 ,  0 )
 SetPixel hdcMem,  10 ,  40 , RGB( 0 ,  0 ,  255 )
 
 SelectObject hdcMem, hbmOld
 DeleteDC hdcMem
 
 Set Picture1.Picture = CreateIPictureDispFromHBITMAP(hbmMem)
End Sub
...
Рейтинг: 0 / 0
чем рисовать чтоб не стиралось
    #34704510
timtim
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Бенедикт
премного благодарен Вам
...
Рейтинг: 0 / 0
чем рисовать чтоб не стиралось
    #34704607
timtim
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ещё вопросец
вот сдесь: hbmMem = CreateCompatibleBitmap(Picture1.hDC, 2000 , 2000 )
ограничения по ширине и высоте имеются?
...
Рейтинг: 0 / 0
чем рисовать чтоб не стиралось
    #34704689
Фотография Бенедикт
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Имеются - на уровне ОС. Например, MSDN Library Windows 95/98/Me: The created bitmap cannot exceed 16MB in size.Так что, если битмап нужен очень большой, придётся думать о tiling.
...
Рейтинг: 0 / 0
чем рисовать чтоб не стиралось
    #34709412
timtim
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чето я не совсем врублюсь как мне этот tiling
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Dim HorizantalLimit As Integer
    Dim VerticalLimit As Integer
    Dim ii As Integer
    Dim jj As Integer
    
    HorizantalLimit = Width / Picture1.Width
    VerticalLimit = Height / Picture1.Height
    
    For ii =  0  To VerticalLimit -  1 
        For jj =  0  To HorizantalLimit -  1 
            PaintPicture Picture1, jj * Picture1.Width, ii * Picture1.Height, Picture1.Width, Picture1.Height
        Next
    Next
зафигарить
...
Рейтинг: 0 / 0
чем рисовать чтоб не стиралось
    #34709786
Фотография Бенедикт
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
timtim,
не вижу постановки задачи. Что есть, что хочется получить? Потратив время на подробное описание, ты его в действительности сэкономишь (и мне тоже).
...
Рейтинг: 0 / 0
чем рисовать чтоб не стиралось
    #34709879
timtim
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
всё началось с этого http://]http://www.sql.ru/forum/actualthread.aspx?tid=389775
смысл задачи-хочу сделать типа карты, перевёл географические координаты в пикселы, наношу точки на контрол Picture, но его размеров нехватает вот и незнаю что использовать в качестве "подложки" для нанесения точек.
...
Рейтинг: 0 / 0
чем рисовать чтоб не стиралось
    #34710088
Фотография Бенедикт
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
timtim,
да, так понятнее (но сугубо технических параметров не хватает. Каков всё же размер карты? Как она хранится на диске? Сколько может быть объектов, какого типа? Могут быть слои?) Это ж какой-то мини-ГИС получается (класс задач достаточно серьёзный, есть литература, есть народ с опытом). Скорее всего, не имеет смысла держать реальный битмап огромного размера. Нужно уметь определять, какие через viewport (PictureBox) куски (тайлы) видны, и уметь кэшировать их, плюс несколько вокруг видимой части карты (запас на телодвижения пользователя). Нужно уметь видимые куски тайлов отображать в соответствующее место viewport-а. По объектам/слоям лучше спрашивать спецов, но я так понимаю, должен быть (в примитиве) список объектов, какие-то индексы, помогающие определить группу видимых объектов. Нужно уметь эти объекты создавать/удалять, позиционировать, накладывать. И т. д., и т. п.

По реализации конкретных (чётко сформулированных ;) ) подзадач помогу, чем смогу. По методологии/структуре - лучше почитать-поспрашивать более компетентных товарищей.
...
Рейтинг: 0 / 0
чем рисовать чтоб не стиралось
    #34710747
timtim
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
спасибо за ответы, скинул на мыло что у меня имеется, за код непинать, сам знаю что так некодят
просто показать чего добился и имеет ли смысл продолжать
...
Рейтинг: 0 / 0
чем рисовать чтоб не стиралось
    #34710904
timur999
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если честно, в подробности вникать не стал. А может записать отрисовку в событие onPaint?
...
Рейтинг: 0 / 0
чем рисовать чтоб не стиралось
    #34711306
Фотография Бенедикт
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
timtim,
Брутально. Почувствовал себя, как в конце 80-х. :up
Раз работает, надо продолжать. Надо подумать, как (пока склоняюсь к предварительной отрисовке в метафайл). Операция масштабирования предусматривается?

P.S. Чукотка не отрисовывается из-за того, что к отрицательным долготам надо добавлять 360.
...
Рейтинг: 0 / 0
чем рисовать чтоб не стиралось
    #34712286
timtim
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
масштабирование обязательно будет(оно и щас есть, только оно мне не особо как то нравится, убогое короче)
в примере отрисовка общего контура, а так будет гораздо больше точек, типа границы областей и населённые пункты(не все конечно, а те которые нужны)
ну и отрисовываться будет радиус от заданной координаты километров 600-1000, хотя общий контур тоже должен присутствовать
С отбором, азимутом, удалением(расстоянием) точек друг от друга вроде проблем нет, с визуальной частью, т.е. нанести это всё на какой то полигон - проблема :((
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / чем рисовать чтоб не стиралось
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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