BaluBig
Full Member | Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору recvezitor Есть такое оконное сообщение WM_PRINT. Оно заставляет окно отрисовать себя на переданном контексте устройства (передается как wParam сообщения). Т.е. порядок действий такой: 1. Создать тот объект, куда будет выводиться картинка. 2. Получить для созданного объекта объект Graphics. 3. Для объекта Graphics получить контекст устройства (HDC). 4. Послать нужному контролу сообщение WM_PRINT, передав контекст устройства и другие необходимые опции. 5. Освободить контекст устройства. Обязательно. GC не сделает этого за тебя => будет утечка. 6. Картинка получена, дальше делаем с ней что хотим. Вот похожий на правду кусок кода нагуглен (выводится некая c_panel в bmp-файл): Код: [DllImport("user32.dll")] public static extern int SendMessage( IntPtr hWnd, // handle to destination window int Msg, // message int wParam, // first message parameter int lParam // second message parameter ); const int WM_PRINT =0x317; [Flags] enum DrawingOptions { PRF_CHECKVISIBLE = 0x01, PRF_NONCLIENT = 0x02, PRF_CLIENT = 0x04, PRF_ERASEBKGND = 0x08, PRF_CHILDREN = 0x10, PRF_OWNED = 0x20 } private void command_Click(object sender, EventArgs e) { Bitmap l_bmpPanel =new Bitmap(c_panel.DisplayRectangle.Width, c_panel.DisplayRectangle.Height); Graphics l_grpSrc =Graphics.FromImage(l_bmpPanel); SendMessage(c_panel.Handle, WM_PRINT, (int)l_grpSrc.GetHdc(), (int)(DrawingOptions.PRF_OWNED | DrawingOptions.PRF_CHILDREN | DrawingOptions.PRF_CLIENT | DrawingOptions.PRF_NONCLIENT)); l_grpSrc.ReleaseHdc(); l_bmpPanel.Save(filename); } | Добавлено: При таком способе вывода не имеет значения как целевой контрол расположен относительно родительского контрола: виден, не виден, виден частично. Изображение будет выведено полностью. |