![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Bitmap.Canvas.CopyRect(MyRect2, Form1.Canvas, MyRect1);
SMAC © (2006-11-13 13:08:00)Ув. господа!
Делаю скрин-шот
Bitmap.Canvas.CopyRect(MyRect2, Form1.Canvas, MyRect1);
Если над приложением есть какое-то любое виндовое окно, что оно тоже попадает в Bitmap. Я правда не совсем понимаю почему - ведь мной указан Form1.Canvas. Можно ли снять скрин-шот только с заданной мной формы?
Спасибо.
SMAC (2006-11-16 15:39:00) [1]Всем спасибо.
Eraser (2006-11-15 20:28:00) [2]> [16] SMAC (15.11.06 13:56)
ну а первое - с исп. любого компонента, для запуздыривания иконок трей можно, например того, что с BDS в составе.
RASkov (2006-11-15 19:51:00) [3]> и особенно второе
FlashWindow(Application.Handle, True);
SMAC (2006-11-15 13:56:00) [4]Спасибо всем.
Для Eraser(ну и не только):
Как реализовать первое и особенно второе? Заранее благодарен.
antonn (2006-11-14 19:00:00) [5]SMAC (14.11.06 13:57) [7]
Думаю, что есть некоторая разница. Bitmap.Canvas.CopyRect я делаю на Form1.Canvas, а в этом случае нужно кидать TImage.Picture.Bitmap на Bitmap. Мне это не понравилось в самом начале (согласен, что и из-за недостатка опыта), поскольку прежнее место рисунка необходимо закрашивать (рисунок на старом месте остается и к нему прибавляется новый (в новом месте)).
а закрасить битмап цветом формы сверхсложно?
Eraser (2006-11-14 17:14:00) [6]> [13] SMAC (14.11.06 16:54)
сделать чтобы начала мигать либо иконка в трее, либо на таск-баре.
SMAC (2006-11-14 16:54:00) [7]Да...
У меня до этого появились смутные сомнения, что программно располагать свою форму поверх других - не очень корректно по отношению к коллегам (;-) и в принципе не очень удобно по отношению к пользователям.
По ходу я только могу констатировать факт деактивации формы, приостанавливать выполнение внутренних процессов программы, выводить соответствующее сообщение и потом (после подтверждения со стороны пользователя) и закрытия сообщения фокус ввода автоматически возвращается к моей программе и в принципе возможно нормальное продолжение.
А остальное по ходу - дурной тон.
Вот только вопрос - как подать зрительный сигнал, что процессы в моей программе остановились? Опять - выводить модальное на все приложения окно (как это опять же сделать) или ещё как?
Спасибо за терпение.
Eraser (2006-11-14 16:43:00) [8]> [11] selenux © (14.11.06 16:41)
> Активировать окно - есть функция в RX в VCLUtils - ActivateWindow(h:
> HWND);
безполезно, даже если там используется какой-нибудь хак, какие имеются, то его или уже прикрыли или прикроют.
> Насчет скриншота пробуй просто прямым блитингом BitBlt(см
> MSDN)
CopyRect вызывает SretchBlt, что в данном случае, аналогично BitBlt.
selenux (2006-11-14 16:41:00) [9]Активировать окно - есть функция в RX в VCLUtils - ActivateWindow(h: HWND);
Насчет скриншота пробуй просто прямым блитингом BitBlt(см MSDN)
SMAC (2006-11-14 15:54:00) [10]Ха!
А если активно окно не моего приложения? Как я вызову то моё?
:-(
Eraser (2006-11-14 14:40:00) [11]> [8] SMAC (14.11.06 14:05)
> У меня вопрос: как сделать главную формой октивной (поверх
> любых других окон)?
нужно из другово окна, которое в данный момент активно, вызвать SetForegroundWindow. Это конечно не гарантирует на 100%, что это окно будет "поверх любых других окон", но поверх большенства будет точно.
SMAC (2006-11-14 14:05:00) [12]Узвиняюсь!
Нашел в
http://www.delphimaster.ru/cgi-bin/forum.pl?n=18&id=1163409817
if GetForegroundWindow = Handle then
else
begin
end;
У меня вопрос: как сделать главную формой октивной (поверх любых других окон)?
Спасибо
SMAC (2006-11-14 13:57:00) [13]Доброго времени суток!
Для antonn:
Думаю, что есть некоторая разница. Bitmap.Canvas.CopyRect я делаю на Form1.Canvas, а в этом случае нужно кидать TImage.Picture.Bitmap на Bitmap. Мне это не понравилось в самом начале (согласен, что и из-за недостатка опыта), поскольку прежнее место рисунка необходимо закрашивать (рисунок на старом месте остается и к нему прибавляется новый (в новом месте)).
Для Eraser:
Как реализовать SetForegroundWindow?
SetForegroundWindow(Form1.Handle);
не работает.
Eraser (2006-11-14 00:55:00) [14]> [0] SMAC (13.11.06 13:08)
перед тем, как делать скриншот, вызывай SetForegroundWindow для нужного окна.
antonn (2006-11-13 21:40:00) [15]продолжу мысль - создается один битмап, на него копируются изображения из TImage в нужном порядке, битмп сохраняется. Для контроля битмап иногда копируется на канву формы.
antonn (2006-11-13 21:37:00) [16]SMAC (13.11.06 13:40) [3]
2. Рисовать в TBitmap и сохранять непосредсвенно его (этот способ сложнее, требует зарисовки прежнего положения рисунков и контроля отображения на той же TForm.Canvas или TImage).
это самый простой способ... и единственно правильный, имхо
SMAC (2006-11-13 13:40:00) [17]У меня есть прямоугольные рисунки в TImage, они по определенной зависимости перемещаются по TForm. С заданной частотой я снимаю скрин-шоты и сохраняю в файл.
Думаю, что есть несколько вариантов решения этой задачи:
1. Делать как я делаю, только контролировать Application.OnDeActivate
2. Рисовать в TBitmap и сохранять непосредсвенно его (этот способ сложнее, требует зарисовки прежнего положения рисунков и контроля отображения на той же TForm.Canvas или TImage).
3. Делать как я делаю, но сохранять только то, что есть на форме, а не на экране (самый лучший вариант для меня, если конечно он возможен).
KilkennyCat (2006-11-13 13:16:00) [18]> Можно ли снять скрин-шот только с заданной мной формы?
можно. но очень сложно.
ЮЮ (2006-11-13 13:14:00) [19]может лучше использовать метод самой формы PaintTo для рисования на Bitmap-е, а не наоборот?