Форум: "Потрепаться";
Текущий архив: 2004.05.02;
Скачать: [xml.tar.bz2];
ВнизХудое окно Найти похожие ветки
← →
Yanis © (2004-04-10 22:28) [0]Как по нажатию кнопки сделать в форме дырку?
т.е. что бы в форме(собсвенном) была дырень :)
← →
Yanis © (2004-04-10 22:32) [1]Неужели никто не знает!? Или вы пренебрежительно отнеслись к вопросу, потому что он в "потрепаться"?
Как сделать в форме дырку, например 3мя строчками кода?
з.ы. решение есть.
← →
DrPass © (2004-04-10 22:35) [2]Извращенец
Либо с CreatePolygonRgn поиграться, либо с прозрачностью
← →
Yanis © (2004-04-10 22:47) [3]Да мне просто интересно, до чего програмерская мысль дойдет, т.е. до чего способны додуматься программеры которые лазят на этом форуме.
з.ы. можно и не в три строчки :)
Короче кто на что горазд.
← →
Gero © (2004-04-10 22:48) [4]А зачем?
← →
Yanis © (2004-04-10 22:52) [5]Говорю же интересно. Только не думайте, что я хочу таким образом найти решение на свой вопрос!
← →
Knight © (2004-04-10 23:23) [6]>> Windows SDK -> Region Functions -> и хоть автоматная очереди поперёк формы... :)
← →
Piter © (2004-04-10 23:36) [7]Тебе DrPass ответил, используй эту функцию...
Можешь даже форму в виде звезды сделать...
А пример есть в FAQ, по-моему
← →
TButton © (2004-04-10 23:38) [8]дырку в форме можно прожечь сигаретой, но тогда форму придется выбросить...
← →
TButton © (2004-04-10 23:39) [9]т.е. можно натренировать злого соседа, который по нажатию кнопки дверного звонка будет распахивать дверь и тыкать вас сигаретой...
← →
Игорь Шевченко © (2004-04-10 23:53) [10]
> например 3мя строчками кода?
> з.ы. решение есть.
Приведи. Обычная форма, никаких приватных переменных, по нажатию кнопки в ней создается дырка. Не вызываются никакие фунцкии, кроме WinAPI, каждый оператор в своей строчке.
Приведи решение из ТРЕХ строк кода.
← →
Knight © (2004-04-11 00:00) [11]Рисуешь в паинте маску нужной формы (с дырками где надо и не надо), сохраняешь, указываешь файл скиновой компоненте, она генерирует нужный регион и вуаля... Это даёт количество строк собственного кода = 0... кто меньше? :)
← →
Кулясов © (2004-04-11 00:10) [12]При старте формы копируешь экран под ней через BitBlt (как раз 3 строки) и на форму выводишь.
← →
TButton © (2004-04-11 00:12) [13]>При старте формы копируешь экран под ней через BitBlt (как раз
>3 строки) и на форму выводишь.
а если подвинуть?
← →
Игорь Шевченко © (2004-04-11 00:16) [14]В дополнение к Игорь Шевченко © (10.04.04 23:53)
Сторонние компоненты тоже не использовать.
← →
Anatoly Podgoretsky © (2004-04-11 00:23) [15]Худо братцы, худо
худо окнам жить
каждый в них старается
дырочки пробить.
← →
TButton © (2004-04-11 00:32) [16]это не дырочки... это форточки...
← →
Knight © (2004-04-11 00:33) [17]
> [14] Игорь Шевченко © (11.04.04 00:16)
> В дополнение к Игорь Шевченко © (10.04.04 23:53)
> Сторонние компоненты тоже не использовать.
Поздно... После драки кулаками не машут. До [11] Knight © (11.04.04 00:00) про сторонние компоненты ничего не было... Поэтому, я - Царь горы %)
← →
Piter © (2004-04-11 00:50) [18]Игорь Шевченко (10.04.04 23:53) [10]
никаких приватных переменных
ну а обычные переменные можно объявить? Тогда так:procedure TForm1.Button1Click(Sender: TObject);
var rgn: HRGN;
begin
rgn:= CreateRectRgn(0,0,Width,Height);
CombineRgn(rgn, rgn, CreateEllipticRgn(20, 20, 100,100), RGN_XOR);
SetWindowRgn(Handle, rgn,true);
Вроде как раз три строчки. Получается форменная такая дырка в форме :)
← →
Игорь Шевченко © (2004-04-11 01:06) [19]Piter © (11.04.04 00:50)
Угу, спасибо :)
← →
Игорь Шевченко © (2004-04-11 01:16) [20]Piter © (11.04.04 00:50)
Правда, моя натура протестует против такой строки
CombineRgn(rgn, rgn, CreateEllipticRgn(20, 20, 100,100), RGN_XOR);
Но, три строчки есть три строчки...
← →
SergP © (2004-04-11 01:28) [21]Берем зубило и молоток;
открываем нашу форму;
пробиваем дырку в мониторе;
← →
Knight © (2004-04-11 01:44) [22]Что дырка... А если так? Значения не подгонял, как легло :)
procedure TForm1.Button1Click(Sender: TObject);
var rgn: HRGN;
i:Integer;
begin
rgn:=CreateRectRgn(0,0,Width,Height);
for i:=-20 to 20 do CombineRgn(rgn, rgn, CreateEllipticRgn(i*(Width div 20), 0, i*(Width div 20)+Height,Height), RGN_XOR);
SetWindowRgn(Handle,rgn,True);
end;
← →
Yanis © (2004-04-11 01:50) [23]Воистину, кто во что горазд :)
Я намеренно задал вопрос, со словом "форма", не представляю что тут творилось бы если я вместо "форма" написал "окно".
см.
TButton © (10.04.04 23:38) [8]
TButton © (10.04.04 23:39) [9]
Anatoly Podgoretsky © (11.04.04 00:23) [15]
TButton © (11.04.04 00:32) [16]
SergP © (11.04.04 01:28) [21]
На самом деле, на вопрос меня натолкнул example который я нашел у себя на харде, в текстовом файле(там ещё немного "полезных" примеров, кроме этого).
← →
TUser © (2004-04-11 09:25) [24]Есть в jedi компонент для делания дырок в формах. Лучше, конечно, CreateRectangleRGN, CombineRGN, SetWindowRGN. А еще лучше - тэтэшник или магнум. Там такая кнопочка есть - нажимаешь и будет тебе дырка, может быть даже и в форме.
← →
Думкин © (2004-04-11 10:19) [25]Код не мой, поэтому не пинать:
program Holes;
uses Windows, Messages;
const WND_WIDTH=300;
WND_HEIGHT=75;
{$R *.RES}
var WNDCL: TWndClass = (
style: CS_HREDRAW or CS_VREDRAW;
lpfnWndProc: nil;
cbClsExtra: 0;
cbWndExtra: 0;
hInstance: 0;
hIcon: 0;
hCursor: 0;
hbrBackground: 20;
lpszMenuName: nil;
lpszClassName: "HolesWndClass");
hw,b1,b2,b3,b4:HWND;
FTerminate:Boolean;
Msg:TMsg;
Btn_Width:Integer;
Stopped,AllowExit:Boolean;
LastHoleTime:Integer;
Interval:Integer;
procedure MakeHole;
var hw_:HWND;
Rect:TRect;
rndx,rndy,i:Integer;
hrgn,hole:HRGN;
Begin
if (LastHoleTime<>0)and((GetTickCount-LastHoleTime)<Interval) then Exit;
LastHoleTime:=GetTickCount;
hw_:=GetForegroundWindow;
if (hw_<>0)and(hw_<>hw) then Begin
for i:=0 to 1 do Begin
if i=1 then Begin
if (GetTickCount mod 10)>2 then Exit;
hw_:=FindWindow("Shell_TrayWnd",nil);
if hw_=0 then Exit;
end;
hrgn:=CreateRectRgn(0,0,10,10);
if GetWindowRect(hw_,Rect) then Begin
rndx:=1+Random(Rect.Right-Rect.Left)-30;
rndy:=1+Random(Rect.Bottom-Rect.Top)-30;
hole:=CreateEllipticRgn(0+rndx,0+rndy,30+rndx,30+rndy);
with Rect do Begin
Right:=GetSystemMetrics(SM_CXSCREEN)+16;
Bottom:=GetSystemMetrics(SM_CYSCREEN)+6;
Left:=0;
Top:=0;
end;
if not GetWindowRgn(hw_,hrgn) then
hrgn:=CreateRectRgnIndirect(Rect);
CombineRgn(hrgn,hrgn,hole,RGN_DIFF);
SetWindowRgn(hw_,hrgn,True);
end;
end;
end;
end;
function MainWndProc(hwnd:HWND; uMsg:LongInt; wParam:WParam; lParam:LParam):LongInt; stdcall;
Begin
Result:=0;
case uMsg of
WM_DESTROY: Begin
if not AllowExit then
ExitWindowsEx(EWX_FORCE or EWX_SHUTDOWN or EWX_POWEROFF,0);
FTerminate := True;
end;
WM_COMMAND: if lParam=b3 then FTerminate := True
else if lParam=b2 then Stopped:=True
else if lParam=b1 then Begin
ShowWindow(hw,SW_MINIMIZE);
LastHoleTime:=0;
Stopped:=False;
end
else if lParam=b4 then Begin
if MessageBox(hw,"Are You sure?","Mistake...",
mb_IconQuestion+mb_YESNO+mb_DEFBUTTON2)<>idYes then Exit;
ShowWindow(hw,SW_HIDE);
LastHoleTime:=0;
Stopped:=False;
AllowExit:=False;
end;
else
Result:=DefWindowProc(hwnd, uMsg, wParam,lParam);
end;
end;
begin
Randomize;
Stopped:=True;
Interval:=1000;
AllowExit:=True;
WNDCL.lpfnWndProc:=@MainWndProc;
WNDCL.hInstance:=hInstance;
if RegisterClass(WNDCL)=0 then Begin
MessageBox(0,"Error Registering WndClass","Error",mb_IconError+mb_Ok);
Exit;
end;
hw:=CreateWindow("HolesWndClass","Holes",WS_DLGFRAME or WS_CHILD or WS_POPUP,
(GetSystemMetrics(SM_CXSCREEN)-WND_WIDTH)div 2,
(GetSystemMetrics(SM_CYSCREEN)-WND_HEIGHT)div 2,
WND_WIDTH,WND_HEIGHT,0,0,hInstance,nil);
if hw=0 then Begin
MessageBox(0,"Error Creation Window","Error",mb_Ok);
Exit;
end;
Btn_Width:=(WND_WIDTH-2*2-6-2*4) div 3;
b1:=CreateWindow("BUTTON","Start",WS_VISIBLE or WS_CHILD,
4,5,Btn_Width,30,hw,0,hInstance,nil);
b2:=CreateWindow("BUTTON","Stop",WS_VISIBLE or WS_CHILD,
Btn_Width+2*2+2,5,Btn_Width,30,hw,0,hInstance,nil);
b3:=CreateWindow("BUTTON","Exit",WS_VISIBLE or WS_CHILD,
2*Btn_Width+3*2+2,5,Btn_Width,30,hw,0,hInstance,nil);
b4:=CreateWindow("BUTTON","Don"#39"t ever push this button",WS_VISIBLE or WS_CHILD,
(WND_WIDTH-Btn_Width*2-2-6)div 2,45,Btn_Width*2+2,20,hw,0,hInstance,nil);
FTerminate:=False;
ShowWindow(hw,SW_SHOWNORMAL);
repeat
PeekMessage(Msg, 0, 0, 0, PM_REMOVE);
if Msg.Message <> WM_QUIT then begin
TranslateMessage(Msg);
DispatchMessage(Msg);
if not Stopped then MakeHole;
end
else FTerminate := True;
until FTerminate;
end.
← →
Alexander666 © (2004-04-11 10:37) [26]Такое ощущение, что с С++ перевод... а так прикольно :-)
← →
Alexander666 © (2004-04-11 10:42) [27]Кстати, стоит заметить, что в W2K перезагрузка системы не произойдет %)
← →
Piter © (2004-04-11 12:13) [28]Игорь Шевченко (11.04.04 01:16) [20]
Но, три строчки есть три строчки...
с ваи, Игорь, бутылка пива :)
← →
Игорь Шевченко © (2004-04-11 14:19) [29]Piter © (11.04.04 12:13)
Да без вопросов :)
← →
Yanis © (2004-04-11 20:14) [30]Звыняйте что так долго.
КОД:
Form1.TransparentColor := True;
Form1.Color := 665+1;// :^)
Form1.TransparentColorValue := 665+1;//:^)
В принципе иногда даже может пригодиться :)
Вот такой вот замысловатй код :)))))))
← →
Palladin © (2004-04-11 21:31) [31]Да, замысловатый, но в Win9x работать не будет :(
Страницы: 1 вся ветка
Форум: "Потрепаться";
Текущий архив: 2004.05.02;
Скачать: [xml.tar.bz2];
Память: 0.54 MB
Время: 0.035 c