Chciałbym, aby poza ekranem zrenderować Kontrolę do niektórych bitmap, tak, że mam szybki dostęp do niego.Unieważnij do własnej mapy bitowej
Niestety, wydaje się, że Control.DrawToBitmap
narysuje całą kontrolkę, na której się ją nazywa, włącznie ze wszystkimi kontrolkami podrzędnymi. Wewnętrznie wysyła wiadomość WM_PRINT z dostarczonym przez siebie DC do bitmapy. Ta tymczasowa bitmapa jest następnie przesyłana do dostarczonej przez użytkownika mapy bitowej. Dla mnie nie do przyjęcia, wolałbym, aby ta bitmapa była aktualizowana w razie potrzeby, więc moja wydajność, gdy bitmapa jest potrzebna, została zminimalizowana.
W idealnym scenariuszu chciałbym, aby formularz zachowywał się tak, jakby był widoczny na ekranie (ale nie może być). Oznaczałoby to, że jeśli, na przykład, niektóre elementy sterowania mają zmienioną właściwość Text
, formularz zostanie częściowo unieważniony. Wychwycenie odpowiednich komunikatów/zdarzeń umożliwiłoby mi określenie własnego DC dla formularza, który ma być narysowany, lub po prostu BitBlt form DC do mojego własnego.
niektórych kierunkach Szukałem w:
- Parametr w
OnPaint
PaintEventArgs
wydaje się posiadać człon savedGraphicsState, być może mogłyby być wykorzystane, aby dowiedzieć się, co nie wymaga unieważnienia - mające postać widoczna ale poza obszarem ekranu. Kontrolki nie są malowane.
- Ręczne wywołanie RedrawWindow() w oknie, sama historia
Nie do końca wiadomo, dlaczego 'DrawToBitmap' (komunikat' WM_PRINT') jest niedopuszczalny do Twojego użytku. Martwisz się * wydajnością *? Jest bardzo mało prawdopodobne, że wciąganie do bitmapy będzie wolniejsze niż rysowanie na ekranie. –
Potrzebuję mechanizmu buforującego. DrawToBitmap maluje całą kontrolę od zera, podczas gdy system unieważniający używany w normalnych oknach aktualizowałby tylko te regiony, które uległy zmianie. –
@Frank, czy rozważałeś użycie Bitblt? http://www.codeproject.com/KB/GDI-plus/Bitblt_wrapper_class.aspx –