"Дышащее" окно
Я то сделал, но этот вариант никуда не годится - всё дёргано и ... некрасиво в общем.
Может кто-то предложит алгоритмик лучше этого:
void CDialogWait::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
// ...
SetTimer(ID_TIMER_CHANGE_RESPIRE, 300, NULL);
}
void CDialogWait::OnTimer(UINT nIDEvent)
{
switch (nIDEvent) {
case ID_TIMER_CHANGE_RESPIRE:
{
CRect rc; GetWindowRect(&rc);
static CSize sizeOrig = rc.Size();
static CSize sizeMax(sizeOrig.cx*130/100, sizeOrig.cy*130/100);
static BOOL bIncrement = TRUE;
if (bIncrement) {
rc.InflateRect(1,1);
if ((rc.Width() >= sizeMax.cx) || (rc.Height() >= sizeMax.cy)) bIncrement = FALSE;
} else {
rc.InflateRect(-1,-1);
if ((rc.Width() <= sizeOrig.cx) || (rc.Height() <= sizeOrig.cy)) bIncrement = TRUE;
}
::MoveWindow(m_hWnd, rc, TRUE);
}
break;
}
CDialog::OnTimer(nIDEvent);
}
... чтобы перерисовывалось не всё окно, а только изменённая часть
Не в моём случае....
У меня на диалоге размещена HTML страница с анимированной флешкой. И за её перерисовку я, естественно, никак не отвечаю.
Не в моём случае....
У меня на диалоге размещена HTML страница с анимированной флешкой. И за её перерисовку я, естественно, никак не отвечаю.
Боюсь ошибиться, но мне кажется, если Вы будете аккуратно перерисовывать своё окно, не трогая окно с html страницей, то страница будет спокойно жить своей жизнью, и всё будет лучше.
Хотя не уверен. Может быть, ваша MoveWindow выдаст Invalidate и на детей, включая и страницу с флешкой, — тогда не знаю, что делать. Прошу прощения.
Но всё равно попробуйте дать ValidateRect хотя бы на область, занимаемую окном html страницы. Это ведь не сложно. Может быть, будет лучше.
Можно поменять MoveWindow на
hdwp = DeferWindowPos(hdwp, this->m_hWnd, NULL, rc.left, rc.top,
rc.Width(), rc.Height(),
SWP_NOACTIVATE | SWP_NOZORDER);
EndDeferWindowPos(hdwp);
Хотя не уверен. Может быть, ваша MoveWindow выдаст Invalidate и на детей, включая и страницу с флешкой, — тогда не знаю, что делать. Прошу прощения
Именно так. HTML страничка занимает всю клиентскую область диалога... Поэтому я 'повесился' ещё на сообщение WM_SIZE, обработчик которого вызывается после MoveWindow; и в обработчике меняю координаты хтмлки, что и приводит к перерисовки всей её области...
Можно поменять MoveWindow на
DeferWindowPos(...);
EndDeferWindowPos(...);
Вот именно...
Лучшее что мне пока предложили - это:
void CDialogWait::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//...
::MoveWindow(m_hWnd, rectWin, TRUE);
}
void CDialogWait::OnTimer(UINT nIDEvent)
{
switch (nIDEvent) {
case ID_TIMER_CHANGE_RESPIRE:
{
CRect rc; GetWindowRect(&rc);
static CSize sizeOrig = rc.Size();
static double d = 2;
static double dd = 0.5;
d = rc.Width() > sizeOrig.cx ? d-dd : d+dd;
int intd = (int) d; //Короче округлили d, чтобы менять на целое число - возможно в C это делается иначе =)
rc.InflateRect(intd, intd);
::MoveWindow(m_hWnd, rc, TRUE);
}
break;
}
CDialog::OnTimer(nIDEvent);
}