25.10.2007, 16:20 | #1 |
Участник
|
Копия экрана
Задача: нужно сохранить в графический файл изображение заданной формы.
Есть простой джобик: X++: static void tutorial_Capture(Args _args) { FormName name = FormStr(Address); Image image = new Image(); Args args = new Args(name); FormRun formRun = new FormRun(args); ; formRun.init(); formRun.run(); formRun.detach(); image.captureWindow(formRun.hWnd()); image.saveImage("C:\\" + name + ".jpg", ImageSaveType::JPG); formRun.close(); } |
|
25.10.2007, 16:32 | #2 |
Пенсионер
|
По моему это связано с моим вопросом по иконке. Я тут уперся, что здесь окна рисуются с использованием "Windows Forms" для которых WinAPI не работает....
__________________
Законы природы еще никто не отменял! А еще у меня растет 2 внучки!!! Кому интересно подробности тут: http://www.baby-shine.com/ |
|
25.10.2007, 16:38 | #3 |
Участник
|
Если вживить код, по снятию скриншота например перед методом close формы, и самому открыть и закрыть форму, то все нормально. В файле появляется копия экрана.
|
|
25.10.2007, 16:44 | #4 |
Участник
|
Решение: см. форму tutorial_Form_Capture
|
|
25.10.2007, 16:57 | #5 |
Banned
|
|
|
25.10.2007, 16:59 | #6 |
Участник
|
Правильно, ее больше нет! Пришлось ее перенести и подкрутить. Но все равно нормально не зажило. В результате на основе этой формы и был сделан этот джоб (выбор произвольной формы и прочий интерфейс отброшены)
|
|
25.10.2007, 17:02 | #7 |
Участник
|
о... я тормоз.
извините. |
|
25.10.2007, 18:00 | #8 |
Участник
|
Мне кажется, просто форма не успевает отрисоваться
|
|
25.10.2007, 18:07 | #9 |
Участник
|
Ожидание спёрто из табакса, оригинальный автор кода - самый одобряемый пользователь этого форума
X++: void captureForm(FormName name) { Image image = new Image(); Args args = new Args(name); FormRun formRun = new FormRun(args); int i; DLLFunction peekMessage; DLLFunction TranslateMessage; DLLFunction dispatchMessage; Binary msg = new Binary(30); DLL user32; ; user32 = new DLL('USER32'); peekMessage = new DLLFunction(user32, 'PeekMessageA'); TranslateMessage= new DLLFunction(user32, 'TranslateMessage'); dispatchMessage = new DLLFunction(user32, 'DispatchMessageA'); peekMessage.arg(ExtTypes::POINTER, ExtTypes::DWORD, ExtTypes::DWORD, ExtTypes::DWORD, ExtTypes::DWORD); peekMessage.returns(ExtTypes::DWord); TranslateMessage.arg(ExtTypes::Pointer); TranslateMessage.returns(ExtTypes::DWORD); dispatchMessage.arg(ExtTypes::Pointer); dispatchMessage.returns(ExtTypes::DWord); // Open and show the form formRun.init(); formRun.run(); for (i=1;i<=20;i++) if (peekMessage.call(msg, 0, 0, 0, 1)) { TranslateMessage.call(msg); dispatchMessage.call(msg); } // Take a screenshoot of the form image.captureWindow(formRun.hWnd()); image.saveType(ImageSaveType::JPG); // reduce the colors (bits/pixel) //image.reduceColorOctree(FALSE,256); //image.reduceColorOctree(256); // Save it as bitmap image.saveImage(element.getSaveName(name)); } |
|
25.10.2007, 18:17 | #10 |
Участник
|
Спасибо! Решение принимается!
|
|