none
Здравствуйте. Как сохранить в память, а потом восстановить прямоуг. часть окна программы ? RRS feed

  • Вопрос

  • В окне GUI-программы создаю растровое изображение. Как, используя функции CreateCompatibleDC, CreateCompatibleBitmap, BitBlt, SelectObject, сохранить в память, а потом восстановить прямоуг. часть окна программы после минимизации ?
    22 марта 2019 г. 22:28

Ответы

  • Если содержимое окна никогда не меняется, то можно и так. Если же информация в окне динамическая, то, что Вы описали - не эффективно (двойное копирование туда-сюда).

    Окно само подскажет Вам, когда нужно обновить содержимое. Минимизировали Вы его, или просто перекрыли другим окном (частично или полностью) окно получит сообщение WM_PAINT в момент следующего открытия. Подпишитесь на это сообщение и восстанавливайте содержимое из буферного контекста.

    И еще. Непосредственное рисование на экране всегда выполняется медленнее, чем в памяти. Поэтому начальное формирование даже статической картины выгоднее делать в буфере. Вызовом Invalidate (или InvalidateRect, если речь о WinAPI) можно принудительно послать окну сообщение WM_PAINT.


    Если сообщение помогло Вам, пожалуйста, не забудьте отметить его как ответ данной темы. Удачи в программировании!

    29 марта 2019 г. 13:58

Все ответы

  • Подход к решению задачи изначально неверный. "Создавать растровое изображение" нужно не "в окне", а в памяти. А во время обработки сообщения WM_PAINT копировать это изображение в контекст окна. Тогда не будет проблем с "восстановлением частей окна". Контекст в памяти, действительно, создаётся с помощью CreateCompatibleDC и CreateCompatibleBitmap. SelectObject-ом выбираете Bitmap в контекст в памяти и рисуете все, что нужно. BitBlt копирует содержимое буферного контекста в контекст окна.

    Если сообщение помогло Вам, пожалуйста, не забудьте отметить его как ответ данной темы. Удачи в программировании!

    23 марта 2019 г. 20:19
  • Внимательней потом начал изучать примеры, и нашёл - сначала создать CompatibleBitmap нужного размера из контекста окна. Потом, или раньше, создать CompatibleDC в памяти. Созданный битмап выбрать SelectObject-ом в контекст памяти. Потом BitBlt-ом скопировать в контекст памяти нужный участок окна нужного размера. Он окажется в ранее созданном битмапе. После восстановления из минимизации BitBlt-ом скопировать в контекст окна контекст памяти. :)
    29 марта 2019 г. 13:18
  • Если содержимое окна никогда не меняется, то можно и так. Если же информация в окне динамическая, то, что Вы описали - не эффективно (двойное копирование туда-сюда).

    Окно само подскажет Вам, когда нужно обновить содержимое. Минимизировали Вы его, или просто перекрыли другим окном (частично или полностью) окно получит сообщение WM_PAINT в момент следующего открытия. Подпишитесь на это сообщение и восстанавливайте содержимое из буферного контекста.

    И еще. Непосредственное рисование на экране всегда выполняется медленнее, чем в памяти. Поэтому начальное формирование даже статической картины выгоднее делать в буфере. Вызовом Invalidate (или InvalidateRect, если речь о WinAPI) можно принудительно послать окну сообщение WM_PAINT.


    Если сообщение помогло Вам, пожалуйста, не забудьте отметить его как ответ данной темы. Удачи в программировании!

    29 марта 2019 г. 13:58