Как нарисовать окно в контексте устройства памяти? - PullRequest
0 голосов
/ 13 июня 2009

В моем приложении пользователь дважды щелкает строку таблицы, чтобы открыть диалоговое окно. Проблема в том, что окно отображается мгновенно - я хочу, чтобы окно «выпрыгивало» из строки таблицы (так же, как окна «выпрыгивали» из панели задач). Для этого мне нужно нарисовать диалоговое окно в контексте устройства памяти - как я могу сделать это, не перетаскивая его на экран?

Спасибо

------------------ Редактировать ----------------------

@ bubbafat: Спасибо - да, мне нужно будет использовать CreateCompatibleDC, а затем установить размер DC памяти равным размеру диалогового окна. Но тогда мне нужно нарисовать «картинку» окна в пикселях устройства памяти. Это позволит мне рисовать каждый кадр анимации «всплывающего окна», т.е.:

  • Кадр 1: скопируйте изображение из буфер на экран на 10% нормальный размер и 10% непрозрачность
  • Кадр 2: Копировать изображение из буфера в экран на 20% нормального размера и 20% непрозрачность
  • и т.д.

Ответы [ 3 ]

1 голос
/ 16 июня 2009

Если вы пытаетесь нарисовать окно в DC памяти, рассмотрите возможность отправки ему сообщения WM_PRINT. Предполагая, что в обычном случае ваша оконная процедура не делает ничего особенно странного, она должна отображать все в вашем DC. Анимацию можно взять оттуда.

1 голос
/ 13 июня 2009

Функция DrawAnimatedRects - это то, что «выпрыгивает» за панель задач - нет необходимости визуализировать анимацию окна самостоятельно.

Редактировать : За исключением того, что не работает в Vista. Вот некоторый эквивалентный код:

// DrawAnimatedRects(wnd->GetSafeHwnd(), IDANI_CAPTION, animateFrom, &rect);
const DWORD MILLIs = 500;
DWORD startTime = GetTickCount();
DWORD now = startTime;
CRect offset(rect.left - animateFrom->left, rect.top - animateFrom->top,
             rect.right - animateFrom->right, rect.bottom - animateFrom->bottom);
wnd->Invalidate();
while (now - MILLIs < startTime)
{
    int fraction100 = (int) (((now - startTime) * 100) / MILLIs);
    CRect step(animateFrom->left + (fraction100 * offset.left) / 100,
               animateFrom->top + (fraction100 * offset.top) / 100,
               animateFrom->right + (fraction100 * offset.right) / 100,
               animateFrom->bottom + (fraction100 * offset.bottom) / 100);
    wnd->SetWindowPos(0, step.left, step.top,
                      step.right - step.left, step.bottom - step.top,
                      SWP_NOZORDER);
    wnd->ShowWindow(SW_SHOWNORMAL);
    Sleep(5);
    now = GetTickCount();
}
0 голосов
/ 13 июня 2009

Похоже, ваш вопрос: "Как создать контекст устройства памяти, совместимый с моим экраном, чтобы я мог рисовать на нем?" В этом случае ответ заключается в использовании CreateCompatibleDC. Если это не ваш вопрос, пожалуйста, предоставьте дополнительную информацию, чтобы было яснее, где именно у вас возникают проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...