Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 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.034 c
14-1081857543
WELLiON
2004-04-13 15:59
2004.05.02
файл-менеджер


14-1081104917
konstantinov
2004-04-04 22:55
2004.05.02
Вопрос о жилье и зарплате


3-1081082712
SergP
2004-04-04 16:45
2004.05.02
integer --> datetime. Как это сделать в запросе?


14-1081681121
uw
2004-04-11 14:58
2004.05.02
«Страсти Христовы»


3-1081144026
Xmen
2004-04-05 09:47
2004.05.02
Запрос





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский