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

Если уж используется API, можно отрисовывать на memory DC, а дальше так или иначе копировать содержимое (или часть) выбранного в нём битмапа в PictureBox.
...
Рейтинг: 0 / 0
03.08.2007, 14:42
    #34704235
timtim
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
чем рисовать чтоб не стиралось
картинка действительно большая
а нельзяли чуть поподробнее об:"можно отрисовывать на memory DC, а дальше так или иначе копировать"
...
Рейтинг: 0 / 0
03.08.2007, 15:50
    #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
03.08.2007, 15:57
    #34704510
timtim
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
чем рисовать чтоб не стиралось
2 Бенедикт
премного благодарен Вам
...
Рейтинг: 0 / 0
03.08.2007, 16:21
    #34704607
timtim
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
чем рисовать чтоб не стиралось
ещё вопросец
вот сдесь: hbmMem = CreateCompatibleBitmap(Picture1.hDC, 2000 , 2000 )
ограничения по ширине и высоте имеются?
...
Рейтинг: 0 / 0
03.08.2007, 16:45
    #34704689
Бенедикт
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
чем рисовать чтоб не стиралось
Имеются - на уровне ОС. Например, MSDN Library Windows 95/98/Me: The created bitmap cannot exceed 16MB in size.Так что, если битмап нужен очень большой, придётся думать о tiling.
...
Рейтинг: 0 / 0
07.08.2007, 09:16
    #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
07.08.2007, 10:59
    #34709786
Бенедикт
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
чем рисовать чтоб не стиралось
timtim,
не вижу постановки задачи. Что есть, что хочется получить? Потратив время на подробное описание, ты его в действительности сэкономишь (и мне тоже).
...
Рейтинг: 0 / 0
07.08.2007, 11:18
    #34709879
timtim
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
чем рисовать чтоб не стиралось
всё началось с этого http://]http://www.sql.ru/forum/actualthread.aspx?tid=389775
смысл задачи-хочу сделать типа карты, перевёл географические координаты в пикселы, наношу точки на контрол Picture, но его размеров нехватает вот и незнаю что использовать в качестве "подложки" для нанесения точек.
...
Рейтинг: 0 / 0
07.08.2007, 11:58
    #34710088
Бенедикт
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
чем рисовать чтоб не стиралось
timtim,
да, так понятнее (но сугубо технических параметров не хватает. Каков всё же размер карты? Как она хранится на диске? Сколько может быть объектов, какого типа? Могут быть слои?) Это ж какой-то мини-ГИС получается (класс задач достаточно серьёзный, есть литература, есть народ с опытом). Скорее всего, не имеет смысла держать реальный битмап огромного размера. Нужно уметь определять, какие через viewport (PictureBox) куски (тайлы) видны, и уметь кэшировать их, плюс несколько вокруг видимой части карты (запас на телодвижения пользователя). Нужно уметь видимые куски тайлов отображать в соответствующее место viewport-а. По объектам/слоям лучше спрашивать спецов, но я так понимаю, должен быть (в примитиве) список объектов, какие-то индексы, помогающие определить группу видимых объектов. Нужно уметь эти объекты создавать/удалять, позиционировать, накладывать. И т. д., и т. п.

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

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


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