program Project3;
{$ifdef fpc}
{$mode objfpc}
{$endif}
uses
Windows,
Messages;
var
wins : array[0..3] of THandle;
function WndProc(Wnd : HWND; msg : Cardinal; wParam, lParam : Integer) : Integer; stdcall;
var
TargetWnd : HWND;
TargetRgn : HRGN;
Rgn : HRGN;
TargetRt : TRect;
rt : TRect;
pt : TPoint;
begin
case msg of
WM_DESTROY : PostQuitMessage(0);
WM_MOVE:
begin
if Wnd = wins[0] then TargetWnd := wins[3] else
if wnd = wins[3] then
begin
SendMessage(wins[0], WM_MOVE, 0, 0);
exit;
end else
exit;
//TargetWnd := GetWindowLong(Wnd, 0);
GetWindowRect(TargetWnd, TargetRt);
OffsetRect(TargetRt, -TargetRt.Left, -TargetRt.Top);
GetWindowRect(Wnd, rt);
pt := rt.TopLeft;
ScreenToClient(TargetWnd, pt);
OffsetRect(rt, -rt.Left + pt.X + GetSystemMetrics(SM_CXFIXEDFRAME) ,
-rt.Top + Pt.Y + GetSystemMetrics(SM_CYFIXEDFRAME) + GetSystemMetrics(SM_CYCAPTION));
with rt do
Rgn := CreateRectRgn(Left, top, Right, Bottom);
with TargetRt do
TargetRgn := CreateRectRgn(Left, top, Right, Bottom);
CombineRgn(TargetRgn, TargetRgn, Rgn, RGN_DIFF);
SetWindowRgn(TargetWnd, TargetRgn, true);
DeleteObject(TargetRgn);
DeleteObject(Rgn);
end;
else
Result := DefWindowProc(Wnd, msg, wParam, lParam);
end
end;
var
wc : TWndClass;
msg : TMsg;
begin
ZeroMemory(@wc, SizeOf(wc));
wc.style := CS_DBLCLKS or CS_OWNDC;
wc.lpfnWndProc := @WndProc;
wc.cbWndExtra := 4;
wc.hInstance := hInstance;
wc.hIcon := LoadIcon(0, IDI_APPLICATION);
wc.hCursor := LoadCursor(0, IDC_ARROW);
wc.hbrBackground := COLOR_BTNFACE + 1;
wc.lpszClassName := 'oO32WndClass';
if not Boolean(RegisterClass(wc)) then
begin
//MessageBox(0, PChar('Class <' + wc.lpszClassName + '> is not register'), nil, MB_ICONERROR or MB_SYSTEMMODAL);
ExitProcess(0)
end;
wins[0] := CreateWindow('oO32WndClass', 'oO', WS_VISIBLE or WS_SYSMENU, 150, 150, 180, 180, 0, 0, HInstance, nil);
wins[1] := CreateWindow('oO32WndClass', 'oO', WS_VISIBLE or WS_SYSMENU, 50, 250, 180, 180, wins[0], 0, HInstance, nil);
wins[2] := CreateWindow('oO32WndClass', 'oO', WS_VISIBLE or WS_SYSMENU, 150, 350, 180, 180, wins[1], 0, HInstance, nil);
wins[3] := CreateWindow('oO32WndClass', 'oO', WS_VISIBLE or WS_SYSMENU, 250, 250, 180, 180, wins[2], 0, HInstance, nil);
SendMessage(wins[0], WM_MOVE, 0, 0);
while GetMessage(msg, 0, 0, 0) do
begin
TranslateMessage(msg);
DispatchMessage(msg);
end;
end.
Интересная конфигурация окон
[ATTACH]4143[/ATTACH]
Цитата: LM(AL/M)
Кто догадается как заставить винду (вручную или программно) отрисовать окна как показано на картинке?
[ATTACH]4143[/ATTACH]
[ATTACH]4143[/ATTACH]
фотошоп!=))))
а вообще была статья как на винапи можно закрутить окно чуть было не в баранку, да и помниться впф тоже такое позволяет отжечь. как найду статью отпишу.
хм,вручную никак, могу предположить что нижнее окно отфотошоплено, больно оно уж чётко подставлено под квадратики..;)
Код:
Вот такой говнокод получился =) только с расчетом на классическое оформление.
[ATTACH]4144[/ATTACH]
Бинарник, если кто не боится [ATTACH]4145[/ATTACH]
А вообще у меня были такие приколы в виде, но только с Layer-окнами, они неправильно перекрывались после смены разрешения.