Invalidate в собственный битмап

Я хочу вне экрана перерисовать элемент управления в некоторую битовую карту, чтобы иметь к нему быстрый доступ.

К сожалению, Control.DrawToBitmap, похоже, рисует весь элемент управления, на котором он вызван, включая все его дочерние элементы управления. Внутри он выдает сообщение WM_PRINT с самоподготовленным DC на битовую карту. Затем этот временный битмап перерисовывается на битмап, предоставленный пользователем. Для меня это неприемлемо, я бы предпочел, чтобы этот битмап обновлялся по мере необходимости, чтобы снижение производительности, когда битмап необходим, было минимальным.

В идеальном сценарии я бы хотел, чтобы форма вела себя так, как если бы она была видна на экране (но это не так). Это будет означать, что если, скажем, у какого-нибудь Control'а изменится свойство Text, то форма будет частично недействительна. Перехват соответствующих сообщений/событий позволит мне либо указать свой собственный DC для формы, на котором она будет рисоваться, либо просто BitBlt DC формы на свой собственный.

Некоторые направления, в которых я искал:

  • Параметр PaintEventArgs в OnPaint, кажется, содержит член savedGraphicsState, возможно, его можно использовать, чтобы выяснить, что не требует аннулирования
  • Имея форму видимой, но вне области экрана. Однако в этом случае элементы управления не закрашиваются.
  • Ручной вызов RedrawWindow() на окне, та же история
11
задан Frank Razenberg 14 December 2011 в 22:54
поделиться