|
14.05.2008, 15:18 | #1 |
Участник
|
Проблема с GDI графикой
Как сделать так что б GDI графика не пропадала, когда форма теряет фокус?
__________________
Axapta has seduced me deadly! |
|
14.05.2008, 15:25 | #2 |
Участник
|
А на чем графика у вас? На Window control?
__________________
AxAssist 2012 - Productivity Tool for Dynamics AX 2012/2009/4.0/3.0 |
|
14.05.2008, 15:25 | #3 |
Участник
|
Дась.
__________________
Axapta has seduced me deadly! |
|
14.05.2008, 15:27 | #4 |
Участник
|
попробуйте рисовать в paint() после супера (если он там есть).
__________________
AxAssist 2012 - Productivity Tool for Dynamics AX 2012/2009/4.0/3.0 |
|
14.05.2008, 15:37 | #5 |
Участник
|
Если рисовать в пэинте метод будет вызывать сам себя.
__________________
Axapta has seduced me deadly! |
|
14.05.2008, 16:25 | #6 |
Участник
|
Это смотря как и что рисовать.
См. рисунок - ничего не стирается.
__________________
AxAssist 2012 - Productivity Tool for Dynamics AX 2012/2009/4.0/3.0 |
|
14.05.2008, 16:48 | #7 |
Участник
|
Ну смотрите, в любом случае когда вы рисуете на контексе Window contol просходит срабатывает обработчик paint и в нём же вы снова рисуете, ну то есть замкнутый круг. Если не прав, поправте пожалуйста.
__________________
Axapta has seduced me deadly! |
|
14.05.2008, 16:52 | #8 |
Участник
|
Цитата:
Ну представьте вы рисуете график из 1000 точек с помошью MoveTo и LineTo. Вы же не думаете, что при этом винда 1000 раз обновит окно?
__________________
AxAssist 2012 - Productivity Tool for Dynamics AX 2012/2009/4.0/3.0 |
|
14.05.2008, 16:55 | #9 |
Участник
|
Уверен, что LineTo вызывает событие Paint только один раз, потому как скорее всего запонлняется буфер, а потом копируеццо на конечный контекст.
__________________
Axapta has seduced me deadly! |
|
14.05.2008, 15:44 | #10 |
MCTS
|
Посмотрите \Forms\tutorial_Tetris
должно быть познавательно
__________________
В глухомани, в лесу Несмотря на красу Дни проводит Лиса Патрикевна. Я никак не пойму Отчего, почему Не пускают куму На деревню |
|
14.05.2008, 15:53 | #11 |
Участник
|
Смотрел) между прочим, когда эта форма теряет фокус, то изображение следующего блока на NextPane тоже пропадает. Изображение на главном Pane не пропадает только потому, что зацикленно перерисовуется.
__________________
Axapta has seduced me deadly! |
|
14.05.2008, 16:20 | #12 |
Участник
|
я так и не поборол этот эффект, в итоге все рисовал с помощью ставщего убогим в 4.0 (спасибо MBS) класса Image. В 2.5 и 3.0 с Image можно было делать хорошие штуки.
А какая у тебя задача если не секрет, может что-нибудь подскажу. Какие фигуры рисуешь? |
|
14.05.2008, 16:33 | #13 |
Участник
|
а ты сделай Tab и две закладки, на одной размести Window, нарисуй, перейди на вторую закладку и потом обратно на первую где только что отрисовал. останется?
|
|
14.05.2008, 16:48 | #14 |
Участник
|
Цитата:
Paint() - реализует обработку виндового сообщения WM_PAINT (предпологаю). Вызывается когда надо перерисовать окно или часть его. Цитата:
The WM_PAINT message is sent when the system or another application makes a request to paint a portion of an application's window. The message is sent when the UpdateWindow or RedrawWindow function is called,
Как вариант отрисовки графики (и кстати правильный вариант) использовать промежуточный буфер. А в Paint копировать из него на HDC конечного окна. Как такое в Аксапте делать - не знаю. Используется это, чтобы избежать мерцания при перерисовки и задержек которые могут возникнуть при рисовании.
__________________
AxAssist 2012 - Productivity Tool for Dynamics AX 2012/2009/4.0/3.0 |
|
14.05.2008, 16:54 | #15 |
Участник
|
Ну вот, о чём и я собсна, а когда много графики перерисовка заметна, то есть постоянное мерцание. Да, кстати, ещё один неприятный эфект. Когда насыщеное графикой окно теряет фокус, пропадает не только графика но и очень часто контролы.
__________________
Axapta has seduced me deadly! |
|
14.05.2008, 17:14 | #16 |
Участник
|
Хм, проверил, действительно не вызывает. Интересно, почему же у меня постоянное мерцание...
__________________
Axapta has seduced me deadly! |
|
14.05.2008, 17:25 | #17 |
Участник
|
Давайте код. Определим)
__________________
AxAssist 2012 - Productivity Tool for Dynamics AX 2012/2009/4.0/3.0 |
|
14.05.2008, 17:27 | #18 |
Участник
|
Лучшей форму xpo"шником али же отдельные методы?
__________________
Axapta has seduced me deadly! |
|
14.05.2008, 17:31 | #19 |
Участник
|
форму
__________________
AxAssist 2012 - Productivity Tool for Dynamics AX 2012/2009/4.0/3.0 |
|
14.05.2008, 17:33 | #20 |
Участник
|
X++: public class FormRun extends ObjectRun { #define.numOfShapes(7) #define.index1(1) #define.index2(2) #define.index3(3) #define.index4(4) #define.index5(5) #define.index6(6) #define.index7(7) //Scale Macroses #define.hourLengthInPixels(50) #define.scalePos(3) #define.scaleWidth(5) #define.hourBreakWidth(3) #define.hourBreakHeight(10) #define.scalePosY(10) #define.rightScaleBorder(10) #define.leftScaleBorder(10) // int shapecolors[#numOfShapes]; int white; WinGdi gdi; boolean redraw; } X++: void drawScale() { int i; int _shapeBrush; int _scaleColor = shapeColors[#index7], _breakColor = shapeColors[#index7]; WinGDI _gdi; ; GPane.width(12*#hourLengthInPixels+2*#scalePos+#rightScaleBorder); this.clearPane(); GPane.lockDC(); _gdi = new WinGDI(GPane.hDC()); _shapeBrush = _gdi.createSolidBrush(_scaleColor); _gdi.fillRect(0,#scalePosY,Gpane.widthValue()-#scalePos-#rightScaleBorder,#scaleWidth+#scalePosY,_shapeBrush); _shapeBrush = _gdi.createSolidBrush(_breakColor); for(i=1;i<=13;i++) { this.drawHourBreakLine(_shapeBrush,i); } for(i=1;i<=12;i++) { this.drawHalfHourBreakLine(_shapeBrush,i); } } X++: protected void drawHourBreakLine(int _brush,int hourNumber) { WinGDI _gdi; int left_x; ; left_x=(hourNumber-1)*#hourLengthInPixels; _gdi = new WinGDI(GPane.hDC()); _gdi.fillRect(left_x,#scaleWidth+#ScalePosY,left_x+#hourBreakWidth, #scaleWidth+#ScalePosY+#hourBreakHeight,_brush); _gdi.textOut(left_x,0,int2str(hourNumber)); } X++: void clearPane() { WinGdi _gdi; int _brush; ; GPane.lockDC(); _gdi = new WinGDI(GPane.hDC()); _brush = _gdi.createSolidBrush(white); _gdi.fillRect(0,0,GPane.widthValue(),GPane.heightValue(),_brush); _gdi.deleteObject(_brush); } X++: void init() { super(); white = WinAPI::RGB2int(0xff,0xff,0xff); shapeColors[#index1] = WinAPI::RGB2int(0x40,0x00,0x0bf); shapeColors[#index2] = WinAPI::RGB2int(0x00,0x7f,0x00); shapeColors[#index3] = WinAPI::RGB2int(0x7f,0x00,0x7f); shapeColors[#index4] = WinAPI::RGB2int(0x7f,0x00,0x00); shapeColors[#index5] = WinAPI::RGB2int(0x00,0x7f,0x7f); shapeColors[#index6] = WinAPI::RGB2int(0x7f,0x7f,0x00); shapeColors[#index7] = WinAPI::RGB2int(0x00,0x00,0x7f); //dobavit 8oj } X++: public int paint() { int ret; ret = super(); element.drawLiftOnScale(3,5); return ret; }
__________________
Axapta has seduced me deadly! |
|