![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Canvas [D7, WinXP]
ISO © (2006-07-26 01:32:00)Как получить изображение находящееся под формой?
Например под Form1.
типа GetDC(0); только нужно без Form1 что-бы было
P/S т.е. мне нужна та картинка которая будет на месте Form1 если сделать Form1.Hide
PP.s Прятать временно Form1 не предлогать
ISO (2006-07-26 22:36:00) [1]Спасибо всем, вот так, вот с вашей помощью сделал то чего задумал.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, RXCtrls;
type
TForm1 = class(TForm)
Timer1: TTimer;
procedure FormCreate(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure FormMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
DC: HDC;
BMP, BMPBIG: TBitMap;
xU: Integer;
xX: Integer;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
var FRGN: HRGN;
begin
xU:=600; // Увеличение
xX:=-(xU div 2);
Form1.Height:=200;
Form1.Width:=200;
Form1.BorderStyle:=bsNone;
Form1.FormStyle:=fsStayOnTop;
FRGN:=CreateEllipticRgn(0, 0, Width, Height);
SetWindowRgn(Handle, FRGN, True);
Form1.AlphaBlend:=True; //Просто включено, а прозрачность(AlphaBlendValue)=255 т.е. форма не прозрачна
//Form1.DoubleBuffered:=True; //Без этого даже, помоему, лучше..
Timer1.Interval:=1;
Timer1.Enabled:=True;
BMP:=TBitMap.Create;
BMP.Height:=Screen.Height;
BMP.Width:=Screen.Width;
BMPBIG:=TBitmap.Create;
BMPBIG.Height:=Height+xU;
BMPBIG.Width:=Width+xU;
Canvas.Brush.Style:=bsClear;
DC:=GetDC(0);
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
BitBlt(BMP.Canvas.Handle, 0, 0, Width, Height, DC, ClientOrigin.X, ClientOrigin.Y, SRCCOPY);
BMPBIG.Canvas.CopyRect(Rect(0, 0, 200+xU, 200+xU), BMP.Canvas, Rect(0, 0, 200, 200));
Form1.Canvas.Draw(xX, xX, BMPBIG);
Form1.Canvas.Ellipse(1, 1, Width-2, Height-2);
end;
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
const DG=$F012;
begin
if Button=mbLeft then begin
ReleaseCapture; Form1.Perform(WM_SYSCOMMAND, DG, 0);
end;
end;
procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if Button=mbRight then Close;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
BMP.Free;
BMPBIG.Free;
ReleaseDC(0, DC);
end;
end.
Это было в познавательных целях....
> [16] GrayFace © (26.07.06 05:14)
> [19] @!!ex © (26.07.06 09:49)
Говорили не запоет.....:)
Нормально работает. Отдельное спасибо Handle.
Всем спасибо.
ТЕМА ЗАКРЫТА.
Handle (2006-07-26 13:48:00) [2]
> Rial © (26.07.06 13:42) [27]
Умри подлец.
Rial (2006-07-26 13:42:00) [3]Мда, что я тут понаписал ... ((
Теперь меня сгноят.
Убейте меня.
Amoeba (2006-07-26 13:25:00) [4]TabfMagnifier из ABF Visual Components Library.
TabfMagnifier allows the user to magnify the area of screen around the cursor. It is a ready solution for the magnifier program.
http://www.abf-dev.com/abf-vcl.shtml
TUser (2006-07-26 11:55:00) [5]Чем, кстати, не устраивает лупа, которая идет вместе с виндусом?
Desdechado (2006-07-26 11:36:00) [6]Может, я чего не знаю, но имхо в винде отрисовывается только то, что должно быть видимо. Если под окном что-то есть, то отрисовываетсятолько видимая часть, а другое - нет.
Как вариант - сделать окно прозрачным, а в OnPaint сделать свою прорисовку с увеличением. Но мало шансов, что прокатит.
TUser (2006-07-26 11:03:00) [7]Просмотреть все окна в системе (EnumWindows).
Для каждого окна (кроме своей формы) - если оно не свернуто и не скрыто (GetWindowPlacement) посмотреть положение и размеры (GetWindowRect).
Если размер подходит - копировать изображение (GetDC, BitBlt, ReleaseDC).
Только не приходит в голову, как Z-порядок окон узнать. Вроде бы в API такого нет. Но копать в этом направлении надо, имхо.
@!!ex (2006-07-26 10:07:00) [8]Handle
по коду не могу сказать, что это 100% рабочий вариант, а проверить сейчас не могу. поэтому ваш пост и не комментировал.
Handle (2006-07-26 10:00:00) [9]
> @!!ex © (26.07.06 09:55) [20]
> Но полюбому есть обходные варианты.
Например
> Handle (26.07.06 08:46) [18
]
@!!ex (2006-07-26 09:55:00) [10]Хм. Не понятно написал, :)
Я имел ввиду, что так как изображения под окном не существует, его не реально оттуда выдрать.
Но полюбому есть обходные варианты.
@!!ex (2006-07-26 09:49:00) [11]Это невозможно. По той просто причине, что изображения под окном НЕ СУЩЕСТВУЕТ.
Я предполагаю, что тут есть варианты.
Нереcующих отправлю к програмке под название TaskSwitchXP.
Rial © (26.07.06 03:41) [12]
Не потянет VCL такое.
Отрисовка, да еще с увеличением ...
Даже если и скопируешь, когда будешь перемещать форму
- будут страшные тормоза.
Извенит, товарищ, но это действительно бред.
1) VCL не имеет никакого отношения к сути задачи. поскольку VCL - всего лишь надстройка над WinAPI.
2) Тормозоа не будет. Нужно написать ОЧЕНЬ криво, чтобы это тормозило.
Handle (2006-07-26 08:46:00) [12]
procedure TForm1.FormCreate(Sender: TObject);
begin
Form1.AlphaBlend:= true;
Form1.DoubleBuffered:= true;
Timer1.Interval:= 1;
Timer1.Enabled:= true;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
var
DC: HDC;
ABitmap: TBitmap;
ARect: TRect;
begin
ABitmap:=TBitmap.Create;
ABitmap.Height:=Screen.Height;
ABitmap.Width:=Screen.Width;
DC:=GetDC(0);
BitBlt(ABitmap.Canvas.Handle, 0, 0, Screen.Width, Screen.Height,
DC, Form1.ClientOrigin.X, Form1.ClientOrigin.Y, SRCCOPY);
Form1.Canvas.Draw(0, 0, ABitmap);
ABitmap.Free;
ReleaseDC(0, DC);
end;
Лучше конечно всё это дело поставить на hook.
Могу пример подкинуть если хочешь.
tButton (2006-07-26 07:47:00) [13]если присмотреться к стандартному magnifier'у винХР.
то окажется что то что под его окошком он не увеличивает.
если бы то что ты хочешь было бы возможно
то мелкомягкие это реализовали бы
GrayFace (2006-07-26 05:14:00) [14]Никак.
Единственное, что приходит на ум - динамически создавать курсор в виде лупы.
KilkennyCat (2006-07-26 03:59:00) [15]Ну есть вариант:
В момент запуска программы делать снимок рабочего стола, работать с ним.
Джо (2006-07-26 03:47:00) [16]По сабжу. Я не сильно совру, если сформулирую так: нет никакого изображения "под формой" на том месте, где есть эта форма. Кстати, я, видимо, не один не понял смысла затеи. Каким образом на форме возможно поместить увеличенное изображение того, что под ней есть? Это все равно, что в мешок, в который помещается 50 кг. картошки поместить 100 кг.
Джо (2006-07-26 03:44:00) [17]> [12] Rial © (26.07.06 03:41)
Вы уж простите, но это бред.
Rial (2006-07-26 03:41:00) [18]Не потянет VCL такое.
Отрисовка, да еще с увеличением ...
Даже если и скопируешь, когда будешь перемещать форму
- будут страшные тормоза.
ISO (2006-07-26 03:02:00) [19]Скопировать изображение из под формы на форму. Вроде-бы по русски
ISO (2006-07-26 02:58:00) [20]> [3] ISO (26.07.06 01:47)
Че? неужели непонятно??????????