Вверх ↑
Этот топик читают: Гость
Ответов: 16884
Рейтинг: 1239
#16: 2008-04-03 19:29:26 ЛС | профиль | цитата
nesco писал(а):
Ну да, смена напрвления координаты Z
проявляется только тогда, когда у Label Transparent=True.
В Delphi "коловские" пректы меняют Z-координату сразу после компиляции, а в HiAsm наверное Dilma что-то где-то перевернул
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Разработчик
Ответов: 26303
Рейтинг: 2146
#17: 2008-04-04 00:25:38 ЛС | профиль | цитата
Все, я разобрался с координатой Z. Пришлось проинвертировать координату Z перерисовки дочерних окон, и все встало на место, и оказалось гораздо проще, чем я думал.
Теперь прекрасно работает и отрисовка прозрачности, и не меняется положение по оси Z. Исправления коснулись метода DoDrawChildrenDblBuffered


//[procedure DoDrawChildrenDblBuffered]
procedure DoDrawChildrenDblBuffered( DC: HDC; WndParent: HWnd; const RectParent: TRect; W: HWnd );
var R, CR: TRect;
Save: Integer;
P, P0: TPoint;
begin
W := GetWindow( W, GW_HWNDLAST ); // получаем дескриптор последнего окна (инверсия координаты Z)
while W <> 0 do begin
if IsWindowVisible( W ) then begin
Save := SaveDC( DC );
GetWindowRect( W, R );
GetWindowOrgEx( DC, P );
SetWindowOrgEx( DC, P.x - ( R.Left - RectParent.Left ), P.y - ( R.Top - RectParent.Top ), nil );
IntersectClipRect( DC, 0, 0, R.Right - R.Left, R.Bottom - R.Top );
SendMessage( W, WM_PRINT, DC, PRF_NONCLIENT );
GetClientRect( W, CR );
P0.x := 0; P0.y := 0;
ClientToScreen( W, P0 );
OffsetRect( CR, P0.x, P0.y );
SetWindowOrgEx( DC, P.x - (CR.Left - RectParent.Left), P.y - (CR.Top - RectParent.Top), nil );
IntersectClipRect( DC, 0, 0, CR.Right - CR.Left, CR.Bottom - CR.Top );
SendMessage( W, WM_ERASEBKGND, DC, 0 );
SendMessage( W, WM_PAINT, DC, 0 );
DoDrawChildrenDblBuffered( DC, W, CR, GetWindow( W, GW_CHILD ) );
RestoreDC( DC, Save );
end;
W := GetWindow( W, GW_HWNDPREV ); // получаем дескриптор предыдущего окна того же уровня
end;
end;


и немного измененный WndProcBufferedDraw (синхронизированный с перерисовкой дочерних окон при fDblBufPainting = true)


//[function WndProcBufferedDraw]
function WndProcBufferedDraw( Self_: PControl; var Msg: TMsg; var Rslt: Integer ): Boolean;
begin
Result := False;
if (Self_.DblBufTopParent = nil) or (Self_.DblBufTopParent.fDblBufPainting) then exit;
case Msg.message of
WM_PAINT:
begin
if (Self_.fCannotDoubleBuf) or not Self_.fDoubleBuffered or
Self_.CannotDoubleBuf or (Msg.wParam <> 0) then exit;
DoDrawDblBuffered( Self_ );
Rslt := 0;
Result := True;
end;
WM_NCPAINT:
begin
if (Self_.fCannotDoubleBuf) or not Self_.fDoubleBuffered or Self_.CannotDoubleBuf or
Self_.fIsForm then exit;
Rslt := 0;
Result := True;
end;
WM_SETTEXT:
begin
if not Self_.fIsStaticControl then exit;
ShowWindow( Self_.fHandle, SW_HIDE );
Rslt := DefWindowProc( Self_.fHandle, WM_SETTEXT, Msg.wParam, Msg.lParam );
ShowWindow( Self_.fHandle, SW_SHOWNA );
UpdateWindow( Self_.fHandle ); // necessary!!!
Result := True;
end;
WM_HSCROLL, WM_VSCROLL, WM_WINDOWPOSCHANGED: Self_.Invalidate;
WM_COMMAND:
case HiWord( Msg.wParam ) of
LBN_SELCHANGE: Self_.Invalidate;
end;
end;
end;

Galkov писал(а):
Разберись, предложи фиксинг - можно будет продолжить разговор


Galkov, я предложил фиксинги и жду от тебя ответа.
карма: 22

0
Ответов: 16884
Рейтинг: 1239
#18: 2008-04-04 10:47:05 ЛС | профиль | цитата
Кто там рисует медали ? Рисуй еще одну для nesco !
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Разработчик
Ответов: 26303
Рейтинг: 2146
#19: 2008-04-04 11:18:59 ЛС | профиль | цитата
Доступен соответствующий патч KOL'a (Update7.upd) в разделе
http://www.hiasm.1gb.ru/forum.html?q=3&p=48807#p48807
карма: 22

0
Ответов: 16884
Рейтинг: 1239
#20: 2008-04-04 13:41:07 ЛС | профиль | цитата
nesco, проверил твои исправления в "kol для FPC" - тоже все ок.
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Разработчик
Ответов: 26303
Рейтинг: 2146
#21: 2008-04-04 13:56:09 ЛС | профиль | цитата
Tad писал(а):
проверил твои исправления в "kol для FPC" - тоже все ок

Я на нем и отлаживал, а после портировал в Delphi
карма: 22

0
Ответов: 5227
Рейтинг: 587
#22: 2008-04-04 13:59:05 ЛС | профиль | цитата
Tad, а может звёздочку на пагоны пора уже
карма: 4
Мой форум - http://hiasm.bbtalk.me/ схемы, компоненты...
0
Ответов: 16884
Рейтинг: 1239
#23: 2008-04-04 13:59:18 ЛС | профиль | цитата
nesco, предупреждать надо - зря тестировал
andrestudio, ГЕРОЯ HIASM-a !
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Разработчик
Ответов: 26303
Рейтинг: 2146
#24: 2008-04-04 14:16:17 ЛС | профиль | цитата
Tad писал(а):
предупреждать надо - зря тестировал

Не понял... Это ты на вот это
nesco писал(а):
Я на нем и отлаживал, а после портировал в Delphi

Ну, батенька, извините...
карма: 22

0
Ответов: 16884
Рейтинг: 1239
#25: 2008-04-04 14:26:15 ЛС | профиль | цитата
Tad писал(а):
проверил твои исправления в "kol для FPC" - тоже все ок.
это я на это
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Ответов: 9906
Рейтинг: 351
#26: 2008-04-05 16:23:58 ЛС | профиль | цитата
nesco, вот чего я тебе скажу...

Пытаюсь сделать прозрачность в PaintBox, к примеру. Пишу:

#pas
procedure THIPaintBox._OnPaint;
begin
if _prop_ClearBeforeDraw then Clear;
_hi_OnEvent(_event_onBeforeDraw);
if Control.Transparent then begin
Bmp.DrawTransparent(DC,0,0,Bmp.Pixels[0,0])
end else Bmp.Draw(DC,0,0);
end;
Добавляю, естественно, св-во Transparent=true
Все типа работает.

НО
Если приклеить событие от таймера на PaintBox.doRefresh, то получим флики
Мне понятно, что DrawTransparent рисует на контексте дважды: по AND, и по XOR

Вопрос: а чем же тогда занимается DoubleBuffered
Не работает он не фига
карма: 9

0
Разработчик
Ответов: 26303
Рейтинг: 2146
#27: 2008-04-05 17:26:44 ЛС | профиль | цитата
Galkov писал(а):
PaintBox.doRefresh

doRefresh делает Control.Invalidate, а это -- еще та тема.



procedure TControl.Invalidate;
begin
if AppletTerminated then Exit;
if fHandle = 0 then Exit;
InvalidateRect( fHandle, nil, True );

Global_Invalidate( @Self );
end;
Ну и посмотри -- InvalidateRect стоит с параметром bErase = True, что значит очищать подложку, тут уже DoubleBuffered до фени
карма: 22

0
Ответов: 9906
Рейтинг: 351
#28: 2008-04-05 18:06:50 ЛС | профиль | цитата
Ты не отмастки лепи, а разбирайся давай

Ну посмотрел: при отсутствии прозрачности тот же самый InvalidateRect с тем же самым bErase = True
И фликов нет.
Они появляются если заменить Bmp.Draw на Bmp.DrawTransparent - и нет никаких других причин
Грубо говоря - сам посмотри
Потому-что DrawTransparent - это два (в отличие от просто Draw) рисования на целевом контексте

А DoubleBuffered нужен именно для того, чтобы можно было рисовать два раза по одному месту контекста без фликов
А вовсе не потому, что слово модное
карма: 9

0
Разработчик
Ответов: 26303
Рейтинг: 2146
#29: 2008-04-05 18:53:04 ЛС | профиль | цитата
Galkov писал(а):
разбирайся давай

Нет, ну кончено я постараюсь с эти разбираться, но схемку кидани, если не сложно, чтобы экспериментальная база была одинаковая.
И вопрос на засыпку -- а на кой черт ты DrawTransparent затолкал в PaintBox, интересно просто
карма: 22

0
Ответов: 9906
Рейтинг: 351
#30: 2008-04-05 19:08:30 ЛС | профиль | цитата
А просто так.
Чтобы глюки половить
Ну пусть так будет (там картинка)
code_8765.txt
В элементе, кроме указанного выше, включено св-во Transparent = True
карма: 9

0
файлы: 1code_8765.txt [6.8KB] [398]
Сообщение
...
Прикрепленные файлы
(файлы не залиты)