Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 |

 

  Вопрос: пользовательский контрол Добавлено: 07.11.04 05:10  

Автор вопроса:  night-roll
скажите, пожалйста, в чём может быть причина ?
обрисовываю контрол - всё нормально, тестирую - вроде тоже нормально, но тестирую дальше, 100 раз гоняю его (обращая внимание на прорисовку) или чуть больше и... в разный момент времени в тестах он начинает глючить:
   - прорисовываются не все части
   - вообще не прорисовывается
   - то прорисовывается, а то нет

чё-то всё мне это порядком надоело!!!!
поведение этого контрола примерно одинакого как для режима отладки в VB 6.0, так и в exe-файле!
помогите, пожалйста!!!

Ответить

  Ответы Всего ответов: 14  

Номер ответа: 1
Автор ответа:
 AASoft



Вопросов: 86
Ответов: 920
 Профиль | | #1 Добавлено: 07.11.04 05:29
mozhet byt` ty slishkom bystro naprimer myshej mo nemyu vodish(esli knopka u tebya control), i on nachinaet risovat`, stiraet, risuet ostal`noe, i poluchaetsa tol`ko eto samoe "ostal`noe" otrisovyvaetsya....ya ne uveren, no ty prover`.....

Ответить

Номер ответа: 2
Автор ответа:
 Comanche



Вопросов: 87
Ответов: 459
 Профиль | | #2 Добавлено: 07.11.04 18:38
2 night-roll:
очень больная тема... у меня было такое неоднократно... по барабану - OCX или CTL, в VB IDE или в run-time... пока не свёл к минимуму использование GDI-объектов - так и мучался. Не забывай также про ReleaseDC, DeleteDC, DeleteObject, и т.д. и т.п. Аккуратнее с RedrawWindow, если её используешь.

А вообще - подобная фигня и в других случаях может наблюдаться: если интересно - глянь на мою проблему в другом форуме: http://www.relib.com/forums/topic.asp?id=843226

Ответить

Номер ответа: 3
Автор ответа:
 Black Dragon



ICQ: 321186096 

Вопросов: 30
Ответов: 347
 Web-сайт: в разработке
 Профиль | | #3
Добавлено: 07.11.04 19:04
Кстати, night-roll, ты можешь скинуть его мне на mike_ogrel@mail.ru? Я, может, посмотрю, как он у меня себя ведет, а?

Ответить

Номер ответа: 4
Автор ответа:
 night-roll



Вопросов: 36
Ответов: 326
 Профиль | | #4 Добавлено: 09.11.04 08:49
to Comanche:
по-моему это самая верная мысль! спасибо, я в этом направлении и думаю, но пока по-прежнему глючит.

p.s. ребята, пока это не будет полностью рабочая версия, я никому скидывать не буду, а потом хоть авторские права нарушайте - это будет на вашей совести. но пока - нет!

Ответить

Номер ответа: 5
Автор ответа:
 night-roll



Вопросов: 36
Ответов: 326
 Профиль | | #5 Добавлено: 09.11.04 11:44
>Не забывай также про ReleaseDC, DeleteDC

не понимаю почему, но с ними ещё хуже - контрол не прорисовывается уже с самого начала! :(

Ответить

Номер ответа: 6
Автор ответа:
 Comanche



Вопросов: 87
Ответов: 459
 Профиль | | #6 Добавлено: 09.11.04 12:39
2night-roll:
ты можешь хотя бы словами описАть, в какой последовательности идёт отрисовка контрола? Ну вроде следующего: "Создаю вот этими ..... АПИ-шками вирт. контекст, переношу в него через BitBlt картинку оттуда-то, делаю то-то и то-то, освобождаю контекст, рисую бордюр через DrawEdge и т.д. Всё это запихано в процедуру RenderUsercontrol и вызывается из: .....".

Чтоб хоть стало ясно, насколько интенсивно ты используешь GDI-объекты...

Ответить

Номер ответа: 7
Автор ответа:
 night-roll



Вопросов: 36
Ответов: 326
 Профиль | | #7 Добавлено: 09.11.04 12:59
на самом деле всё гораздо бональнее:
на ЮзверьКонтроле расположено около 6 PictureClip, и по образцу прорисовываю углы, центр и фон таким образом:

UserControl.PaintPicture pc(skin).GraphicCell(z), bx, by, 3, 3, 0, 0, 3, 3   ' левый-верхний угол


до этого момента всё было нормуль!
но вот далее мне потребовалось рисовать маленькую хрень в середке ползунка и стрелки на кнопках, отбрасывая их фон. Но функция TransparentBlt не работает с PictureClip (т.к. нет hDC).
вот таким образом я решил эту проблему...

Sub Pic1(pic As IPicture, bx As Long, cx As Long, by As Long, cy As Long, CellW As Long, CellH As Long)
    memDC = CreateCompatibleDC(DeskTopDc)
    pic.SelectPicture memDC, pic.CurDC, pic.Handle
    TransparentBlt UserControl.hdc, bx + cx, by + cy, CellW, CellH, _
                                                        pic.CurDC, 0, 0, CellW, CellH, RGB(255, 0, 255)
   'ReleaseDC pic.Handle, pic.CurDC
   'DeleteDC memDC
End Sub


и вызываю я её вот так!
Pic1 pc2(skin).GraphicCell(z), bx, cx, by, cy, 8, 8 ' вызываем функцию виртуального рисунка


p.s. только не надо предлагать рисовать стрелки самостоятельно или так < >
всем ответившим спасибо!!!

Ответить

Номер ответа: 8
Автор ответа:
 Black Dragon



ICQ: 321186096 

Вопросов: 30
Ответов: 347
 Web-сайт: в разработке
 Профиль | | #8
Добавлено: 09.11.04 22:48
Ладно, ладно, молчу...

Ответить

Номер ответа: 9
Автор ответа:
 mc-black



ICQ: 308-534-060 

Вопросов: 20
Ответов: 1860
 Web-сайт: mc-black.narod.ru/dzp.htm
 Профиль | | #9
Добавлено: 09.11.04 23:21
У меня была похожая проблема не в контроле, а в проге (standart exe) - нестабильно что-нибудь прорисовывалось. Я не стал долго ломать над этим голову (да прога простая оччень), а поставил в подозрительных местах метод Refresh. Может и в твоем случае это прокатит? Ктати, на фоне чего у меня глюки возникали: массив подгрудаемых/выгружаемых элементов управления типа command button - и никакой продвинутой графики :) night-roll, может это твой случай?

Ответить

Номер ответа: 10
Автор ответа:
 night-roll



Вопросов: 36
Ответов: 326
 Профиль | | #10 Добавлено: 10.11.04 22:55
меня беспокоит вот эта строка
'ReleaseDC pic.Handle, pic.CurDC

см. код в ответе №7
посмотрите, пожалуйста, верна ли она?

Ответить

Номер ответа: 11
Автор ответа:
 night-roll



Вопросов: 36
Ответов: 326
 Профиль | | #11 Добавлено: 11.11.04 00:42
>в подозрительных местах метод Refresh
лишний раз его употребление вызывает мигание при отрисовке!

Ответить

Номер ответа: 12
Автор ответа:
 cresta



Вопросов: 117
Ответов: 1538
 Профиль | | #12 Добавлено: 11.11.04 04:17
 night-roll
меня беспокоит вот эта строка
'ReleaseDC pic.Handle, pic.CurDC


А чего она тебя беспокоит? Ты бы привёл место, где получаешь pic.CurDC. Каким способом? В какой процедуре. Если получал этот hDC через GetWindowDC, то делай ReleaseDC, если через BeginPaint, то делай EndPaint hWnd, Ps. Если pic.Handle это hWnd объекта, а pic.CurDC - его hDC, (чего к сожалению не видно по куску кода), то всё правильно.

И ещё непонятно, зачем ты memDC перегружаешь в pic, а затем из pic в UserControlDC? Сразу нельзя что-ли BitBlt (TransparentBlt) memDC в UserControlDC? Лишняя операция к чему?

И в любом случае надо раскомментировать
'ReleaseDC pic.Handle, pic.CurDC
'DeleteDC memDC
особенно memDC.
Если при этом не рисуется контрол, надо искать, почему не рисуется, а не комментировать. Он должен рисоваться с этими Release\Delete DC.

Ответить

Номер ответа: 13
Автор ответа:
 night-roll



Вопросов: 36
Ответов: 326
 Профиль | | #13 Добавлено: 11.11.04 06:27
см. ответ №7!!!!!!
ну, если я всё правильно делаю, то вот этой строкой
Pic1 pc2(skin).GraphicCell(z), bx, cx, by, cy, 8, 8 ' вызываем функцию виртуального рисунка

я передаю следующее:
  pc2(skin).GraphicCell(z) - рисунок из ячейки PictureClip
  bx и by - координаты верхнего угла куска контрола
  cx и cy - координаты смещения от угла
   8 - ширину рисунка
   8 - высоту рисунка

а вот по-поводу pic.CurDC я не знаю :(, что ты имеешь в виду?
у меня в том и вся фишка, что это некий виртуальный рисунок и я получаю именно таким образом (вот в этой самой строке)
pic.SelectPicture memDC, pic.CurDC, pic.Handle

может я не прав, поправь, пожалуйста!

Ответить

Номер ответа: 14
Автор ответа:
 cresta



Вопросов: 117
Ответов: 1538
 Профиль | | #14 Добавлено: 11.11.04 14:37
Тут нашел кусок, почитай, а то я с английским не очень:
Remarks
The CurDC property and the IPicture::SelectPicture method exist to circumvent restrictions in Windows; specifically, that an object can only be selected into exactly one device context at a time. In some cases, a picture object may be permanently selected into a particular device context (for example, a control may use a certain picture for a background). To use this picture property elsewhere, it must be temporarily deselected from its old device context, selected into the new device context for the operation, then reselected back into the old device context. The IPicture::get_CurDC method returns the device context handle into which the picture is currently selected. The IPicture::SelectPicture method selects the picture into a new device context, returning the old device context and the picture's GDI handle. The caller should select the picture back into the old device context when the caller is done with it, as is normal for Windows code.

Notes to Callers
The caller always owns any device contexts passed between it and the picture object. Since the picture object maintains a copy of the HDC, the caller should use a memory device context (created with the Win32 function CreateCompatibleDC) and not a screen device context (from GetDC, CreateDC, or BeginPaint), because the screen device contexts are a limited system resource.


Т.е. (если правильно понял) картинку нужно deselect из старого device context, select в memDC, а после использования снова select в старый device context

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам