|  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 | 
| Участник | 
			
			Спасибо! Решение принимается!
		 | 
|  |