Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.05.02;
Скачать: CL | DM;

Вниз

Худое окно   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.024 c
1-1081806544
Troy
2004-04-13 01:49
2004.05.02
Обработка строки. Паскаль


1-1081943575
Алексей2
2004-04-14 15:52
2004.05.02
Как "превратить" строку в имя переменной?:


4-1078477390
Amirka
2004-03-05 12:03
2004.05.02
Запретить printscreen


4-1078752491
DoG
2004-03-08 16:28
2004.05.02
Как отловить нажатие мышки !


3-1081403294
Vilux
2004-04-08 09:48
2004.05.02
Не могу понять. почему не работает BETWEEN