Перерисовка окна в ActiveX
От: Naimit  
Дата: 04.12.03 15:03
Оценка:
ActiveX создан с помощью ATL.
В функции вызываемой по таймеру я хочу перерисовывать часть окна (код),

        RECT re;
        GetClientRect(&re);
        CRect rect(re); 
        HRESULT hr = InvalidateRect(NULL, TRUE);
        if ( hr != S_OK ) ....;
        else ....;

Получаю всегда только hr!=0, и перерисовывает он всё окно.
Если кто сталкивался или знает, отзовитесь.
Re: Перерисовка окна в ActiveX
От: uinet  
Дата: 04.12.03 17:10
Оценка:
Здравствуйте, Naimit, Вы писали:

N>ActiveX создан с помощью ATL.

N>В функции вызываемой по таймеру я хочу перерисовывать часть окна (код),

N>
N>        RECT re;
N>        GetClientRect(&re);
N>        CRect rect(re); 
N>        HRESULT hr = InvalidateRect(NULL, TRUE);
N>        if ( hr != S_OK ) ....;
N>        else ....;
N>

N>Получаю всегда только hr!=0, и перерисовывает он всё окно.
N>Если кто сталкивался или знает, отзовитесь.

В данном случае в InvalidateRect надо не NULL передавать, а указатель на re. А NULL говорит о том, что надо всю клиентскую область обновить.
И InvalidateRect не HRESULT возвращает, а BOOL.
Всё в MSDN написано.
Re[2]: Перерисовка окна в ActiveX
От: Naimit  
Дата: 04.12.03 17:50
Оценка:
Здравствуйте, uinet, Вы писали:

Извините вставил пробный кусок кода, но я пробовал и указатель на re. Эффект тот же, он перерисовывает всё окно, а это нежклательно, ибо хочеться избежать мигания. И нагрузку на ЦП, т.к. отрисовка происходит достаточно часто.
    BOOL hr = InvalidateRect(&re, TRUE); - Так вот тож пробовал...эффект нулевой.
Re[3]: Перерисовка окна в ActiveX
От: uinet  
Дата: 05.12.03 07:07
Оценка:
Здравствуйте, Naimit, Вы писали:

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


N>Извините вставил пробный кусок кода, но я пробовал и указатель на re. Эффект тот же, он перерисовывает всё окно, а это нежклательно, ибо хочеться избежать мигания. И нагрузку на ЦП, т.к. отрисовка происходит достаточно часто.

N>
N>    BOOL hr = InvalidateRect(&re, TRUE); - Так вот тож пробовал...эффект нулевой.
N>


В re должна быть область, которую надо перерисовать, а если она полнустью соответсвует области полученной через GetClientRect, то естественно будет отрисовываться все окно. А чтобы не мигало, можно попробовать не перерисовывать фон (FALSE вторым параметром в InvalidateRect), но тогда возможно придется повозиться, чтобы грязь всякая не вылезала.
Re[4]: Перерисовка окна в ActiveX
От: Naimit  
Дата: 05.12.03 07:44
Оценка:
U>В re должна быть область, которую надо перерисовать, а если она полнустью соответсвует области полученной через GetClientRect, то естественно будет отрисовываться все окно. А чтобы не мигало, можно попробовать не перерисовывать фон (FALSE вторым параметром в InvalidateRect), но тогда возможно придется повозиться, чтобы грязь всякая не вылезала.

В том то и вопрос что область я уже задавал всеми способами и возможностями.
И так
RECT re ={0,0,50,50};
CRect rect(re);

И вот так...
InvalidateRect(NULL, FALSE);

У меня тоже есть MSDN и я пытаюсь не задавать вопросов которые там можно найти.
Окно имеет следующее свойство — DECLARE_VIEW_STATUS(VIEWSTATUS_DVASPECTOPAQUE)

Просто желательно чтоб при новой отрисоке не заттиралось старое.
Вот так.
Re[5]: Перерисовка окна в ActiveX
От: uinet  
Дата: 05.12.03 11:02
Оценка:
Здравствуйте, Naimit, Вы писали:


N>В том то и вопрос что область я уже задавал всеми способами и возможностями.

N>И так
N>
N>RECT re ={0,0,50,50};
N>CRect rect(re); 
N>

N>И вот так...
N>
N>InvalidateRect(NULL, FALSE);
N>

N>У меня тоже есть MSDN и я пытаюсь не задавать вопросов которые там можно найти.
N>Окно имеет следующее свойство — DECLARE_VIEW_STATUS(VIEWSTATUS_DVASPECTOPAQUE)

N>Просто желательно чтоб при новой отрисоке не заттиралось старое.

N>Вот так.

Возможно UpdateWindow() сразу после InvalidateRect поможет.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.