Страница: 1 |
Страница: 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, и по образцу прорисовываю углы, центр и фон таким образом:
до этого момента всё было нормуль!
но вот далее мне потребовалось рисовать маленькую хрень в середке ползунка и стрелки на кнопках, отбрасывая их фон. Но функция TransparentBlt не работает с PictureClip (т.к. нет hDC).
вот таким образом я решил эту проблему...
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
и вызываю я её вот так!
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-сайт:
Профиль | | #9
Добавлено: 09.11.04 23:21
У меня была похожая проблема не в контроле, а в проге (standart exe) - нестабильно что-нибудь прорисовывалось. Я не стал долго ломать над этим голову (да прога простая оччень), а поставил в подозрительных местах метод Refresh. Может и в твоем случае это прокатит? Ктати, на фоне чего у меня глюки возникали: массив подгрудаемых/выгружаемых элементов управления типа command button - и никакой продвинутой графики night-roll, может это твой случай?
Номер ответа: 10
Автор ответа:
night-roll
Вопросов: 36
Ответов: 326
Профиль | | #10
Добавлено: 10.11.04 22:55
меня беспокоит вот эта строка
см. код в ответе №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!!!!!!
ну, если я всё правильно делаю, то вот этой строкой
я передаю следующее:
pc2(skin).GraphicCell(z) - рисунок из ячейки PictureClip
bx и by - координаты верхнего угла куска контрола
cx и cy - координаты смещения от угла
8 - ширину рисунка
8 - высоту рисунка
а вот по-поводу pic.CurDC я не знаю , что ты имеешь в виду?
у меня в том и вся фишка, что это некий виртуальный рисунок и я получаю именно таким образом (вот в этой самой строке)
может я не прав, поправь, пожалуйста!
Номер ответа: 14
Автор ответа:
cresta
Вопросов: 117
Ответов: 1538
Профиль | | #14
Добавлено: 11.11.04 14:37
Тут нашел кусок, почитай, а то я с английским не очень:
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