Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Прыгающие контрольчики

21K
07 октября 2009 года
TITAMIN
58 / / 24.07.2008
:) Ну в общем написал свой класс для кнопок, избавился от фликера - все чудненько... Но вот засада при перерисовке я рисую фон диалока (ну тоесть какой нить объект, рисуночек , не просто заливка) и тут то и стало видно, как они сходят с ума ... на рисайз кнопки не четко позиционируются - видно не большое дерганье - я понимаю что задавать данный вопрос может не очень нормально (учитывая что в виндузячих окнах этот же баг), но все же, можно как-то устранить это оооочень не приятное явление ?
397
07 октября 2009 года
SergPas
527 / / 03.02.2007
Цитата: TITAMIN
:) Ну в общем написал свой класс для кнопок, избавился от фликера - все чудненько... Но вот засада при перерисовке я рисую фон диалока (ну тоесть какой нить объект, рисуночек , не просто заливка) и тут то и стало видно, как они сходят с ума ... на рисайз кнопки не четко позиционируются - видно не большое дерганье - я понимаю что задавать данный вопрос может не очень нормально (учитывая что в виндузячих окнах этот же баг), но все же, можно как-то устранить это оооочень не приятное явление ?


Эх... А после перерисовки случайно не забываете вызвать функцию ValidateRect()?

21K
07 октября 2009 года
TITAMIN
58 / / 24.07.2008
Зачем ? Я так понимаю Validate отменяет область перерисовки - я же делаю на ресайзе Invalidate() - перерисовать все !!!(единственное в свойствах диалога потомков не перерисовывать...). и UpdateWindow()
Контролы же методом SetWindowPos() в OnPaint() перемещаю...
Фон рисую на EraseBkGnd(). все ...
397
07 октября 2009 года
SergPas
527 / / 03.02.2007
Цитата: TITAMIN
Зачем ? Я так понимаю Validate отменяет область перерисовки - я же делаю на ресайзе Invalidate() - перерисовать все !!!(единственное в свойствах диалога потомков не перерисовывать...). и UpdateWindow()
Контролы же методом SetWindowPos() в OnPaint() перемещаю...
Фон рисую на EraseBkGnd(). все ...


ValidateRect делает действительной область рисования, в результате чего будет остановлена бесконечная перерисовка окна, которая возникает по не совсем понятным причинам (отсюда и возникает так называемое «дергание» компонентов). Попробуйте в конец метода OnPaint() прописать ValidateRect(). Должно помочь, особенно если GUI написан на WinAPI, т.к. если забудете в конце OnPaint() вызвать выше упомянутую функцию, то получите массу проблем с прорисовкой контролов дочерних и диалоговых окон.
И вот это действие не совсем понятно:

Цитата:
Контролы же методом SetWindowPos() в OnPaint() перемещаю...


P.S. Иногда бывает полезно выложить проблематичный код.

21K
07 октября 2009 года
TITAMIN
58 / / 24.07.2008
ValidateRect() с аргументом ноль ?
Дк в том то и дело что не знаю где проблемный код ... или в свойстве диалога (Clip Children)... или при рисовании бэкграунда ... или в последовательности действий ...
397
07 октября 2009 года
SergPas
527 / / 03.02.2007
 
Код:
BOOL ValidateRect(
  HWND hWnd,          // хэндл окна
 CONST RECT *lpRect   // lpRect = NULL чтобы всю область окна сделать действительной
);
21K
07 октября 2009 года
TITAMIN
58 / / 24.07.2008
:( Безрезультатно
397
07 октября 2009 года
SergPas
527 / / 03.02.2007
Так сказать трудно. Выкладывайте код.
21K
07 октября 2009 года
TITAMIN
58 / / 24.07.2008
void CAVPlayerDlg::OnPaint() {
CRect r;
this->GetClientRect(&r);
::SetWindowPos(m_objOpen.GetSafeHwnd(),0,30,r.bottom-76,52,52,0);
::SetWindowPos(m_objPrev.GetSafeHwnd(),0, 82,r.bottom-76,52,52,0);
::SetWindowPos(m_objPlay.GetSafeHwnd(),0, 134,r.bottom-76,52,52,0);
::SetWindowPos(m_objPause.GetSafeHwnd(),0,134,r.bottom-76,52,52,0);
::SetWindowPos(m_objSpeed.GetSafeHwnd(),0,186,r.bottom-76,52,52,0);
::SetWindowPos(m_objStop.GetSafeHwnd(),0, 238,r.bottom-76, 52, 52,0);
::SetWindowPos(m_objNext.GetSafeHwnd(),0, 290,r.bottom-76, 52, 52,0);
::ValidateRect(this->GetSafeHwnd(),NULL);
CDialog::OnPaint();
}



BOOL CAVPlayerDlg::OnEraseBkgnd(CDC* pDC) {
GetClientRect(rect);
CRect r;
GetClientRect(&r);
pDC->BitBlt(r.left, r.bottom-bmpInfo.bmHeight, bmpInfo.bmWidth, bmpInfo.bmHeight, &dcMemory, 0, 0, SRCCOPY);
pDC->ExcludeClipRect(rect.left, rect.bottom-bmpInfo.bmHeight,rect.left+bmpInfo.bmWidth, rect.bottom);
return CDialog::OnEraseBkgnd(pDC);
}


HBRUSH CAVPlayerDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) {
CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
return Hbr;
}

void CAVPlayerDlg::OnSize(UINT nType, int cx, int cy) {
Invalidate(1);
this->UpdateWindow();
}

BOOL CAVPlayerDlg::OnInitDialog() {
CDialog::OnInitDialog();

dcMemory.CreateCompatibleDC(this->GetDC());
CBitmap* pOldBitmap = dcMemory.SelectObject(&m_hBitmap);

Hbr = ::CreateSolidBrush(RGB(209, 208, 208));

return TRUE;
}
353
15 октября 2009 года
Nixus
840 / / 04.01.2007
Зачем в OnPaint перемещать окна? :confused:
21K
16 октября 2009 года
TITAMIN
58 / / 24.07.2008
Дело не в этом !!! Если вы предполагаете, что прыгание кнопок происходит из-за перемещения контролов в Онпэинте …
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог