Регион отсечения
От: Sharpeye Россия  
Дата: 27.10.10 11:33
Оценка:
Есть бихавиор, который рисует на элементе.
Пытаюсь рисовать только в той области элемента, которой был сделан InvalidateRect.
Если обновляемый регион состоит из двух прямоугольников, например левый верхний и нижний правый:

void invalidate( dom::element e )
{
    HWND hwnd = e.get_element_hwnd( false );

    RECT const bbox = e.get_location( VIEW_RELATIVE | CONTENT_BOX );

    int const w = width ( bbox ) / 3;
    int const h = height( bbox ) / 3;

    // левый верхний угол
    RECT const a = { bbox.left, bbox.top, bbox.left + w, bbox.top + h  };

    InvalidateRect( hwnd, &a, FALSE );

    // правый нижний угол
    RECT const b = { bbox.right - w, bbox.bottom - h, bbox.right, bbox.bottom  };

    InvalidateRect( hwnd, &b, FALSE );
}

то при выполнении вот этого:
    HRGN clip = CreateRectRgn( 0, 0, 0, 0 );

    GetRandomRgn( params.hdc, clip, SYSRGN );

    RECT rc = {};

    int type = GetRgnBox( clip, &rc );

type всегда равен SIMPLEREGION. И нет возможности выцепить по отдельности каждый из прямоугольников.
Как бы это сделать?
Re: Регион отсечения
От: c-smile Канада http://terrainformatica.com
Дата: 28.10.10 16:20
Оценка:
Здравствуйте, Sharpeye, Вы писали:

S>Есть бихавиор, который рисует на элементе.

S>Пытаюсь рисовать только в той области элемента, которой был сделан InvalidateRect.

S>Если обновляемый регион состоит из двух прямоугольников, например левый верхний и нижний правый:


S>type всегда равен SIMPLEREGION. И нет возможности выцепить по отдельности каждый из прямоугольников.


Думатель у Windows внутри решает что лучше объеденить regions в данном случае.
Причин по которым он может это делать — тысячи.

S>Как бы это сделать?


"Как бы сделать" что конкретно? Что-то мне говорит что ты не с того конца проблему решаешь...
Re[2]: Регион отсечения
От: Sharpeye Россия  
Дата: 29.10.10 07:02
Оценка:
Здравствуйте, c-smile, Вы писали:

CS>Здравствуйте, Sharpeye, Вы писали:


S>>Есть бихавиор, который рисует на элементе.

S>>Пытаюсь рисовать только в той области элемента, которой был сделан InvalidateRect.

S>>Если обновляемый регион состоит из двух прямоугольников, например левый верхний и нижний правый:


S>>type всегда равен SIMPLEREGION. И нет возможности выцепить по отдельности каждый из прямоугольников.


CS>Думатель у Windows внутри решает что лучше объеденить regions в данном случае.

CS>Причин по которым он может это делать — тысячи.
Я пробовал в чистом win32 делать invalidate для двух прямоугольников — получал в WM_PAINT тип региона COMPLEXREGION.
Видимо при htmlayout там путь длиннее и регионы объединяются.

S>>Как бы это сделать?


CS>"Как бы сделать" что конкретно? Что-то мне говорит что ты не с того конца проблему решаешь...

Да я уже забил, переделал.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.