2009-06-12 2 views
0

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

Благодаря

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

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

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

ответ

1

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

1

DrawAnimatedRects функция, что делает это «J ump out "для панели задач - нет необходимости визуализировать анимацию окна самостоятельно.

Редактировать: Кроме того, что 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

спасибо - это выглядит многообещающе! – Mark

0

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

+0

см. Оригинальное сообщение для получения более подробной информации – Mark

Смежные вопросы