www.adept7.kiev.ua
| Форум| Гостевая| Ссылки| Программы| Исходные тексты| Наши партнеры|
   
| Главная| Рассылки| Услуги| Библиотека| Новости| Авторам| Программистам| Студентам|
delphi c++ assembler
 

Окна, формы, приложения...
Каким образом можно убрать приложение из Task Bar?
Каким образом можно убрать приложение из Task List? (Только для Win'9x)
Каким образом можно спрятать приложение от показа при нажатии Alt+Tab?
Как можно сделать форму прозрачной?
Как сделать произвольную (непрямоугольную) форму?
Как сделать невидимой главную форму?
В каком порядке происходят события при создании и показе окна?
Как сделать так, чтобы по Alt-F4 форма не закрывалась, а выдавала запрос на сохранение?
Как перетаскивать форму не только за Caption, но и за любое другое место?
Мне нужно сделать приложение модальным, для того чтобы обезопасить систему и в то же время позволить работать с программой.
Как запретить кнопку Close [x] в заголовке окна.
Каким образом можно изменить системное меню формы?
Как скрыть таскбар?
События нажатия на системные кнопки формы (минимизация, закрытие...)
Перетаскивание файла drag-drop на форму
Как создать свою кнопку в заголовке формы (на Caption Bar)
Как обратится из одной модальной формы к другой - не активной?
Использование обработчика OnHint при наличии нескольких форм.
Как программно спрятать/показать заголовок окна (caption)?
Как убрать заголовок(caption) из MDI child?

Как запретить окну быть активным
 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 


Каким образом можно убрать приложение из Task Bar?
Прислал Сергей  14.10.2001
ShowWindow(Application.Handle,SW_HIDE);

Назад к содержанию


Каким образом можно убрать приложение из Task List? (Только для Win'9x)
Прислал Сергей  14.10.2001

  Пример:
  unit hideprg;
  interface
  procedure TryToHide;
  implementation
  procedure RegisterServiceProcess; external 'kernel32.dll' name
                                            'RegisterServiceProcess';
  procedure TryToHide;assembler;
  asm
    push 1
    push 0
    call RegisterServiceProcess;
  end;

Назад к содержанию


Каким образом можно спрятать приложение от показа при нажатии Alt+Tab?
Пример (работает только в Win'95):Прислал Сергей  14.10.2001
var  WnHnd  : Integer;
  . . . .
  WnHnd :=GetWindowLong(Application.Handle, GWL_EXSTYLE);
  WnHnd :=WnHnd or WS_EX_TOOLWINDOW;
  SetWindowLong(Application.Handle, GWL_EXSTYLE, WnHnd);
  . . . .

Назад к содержанию


Как можно сделать форму прозрачной? Прислал Сергей  14.10.2001
Для этого необходимо пеpеопpеделить обpаботчик события OnCreate:

  procedure TForm1.FormCreate(Sender: TObject);
  begin
    Brush.Style:=bsClear;
  end;

Назад к содержанию


Как сделать произвольную (непрямоугольную) форму?Прислал Сергей  14.10.2001

Win32 (Windows'95 or Windows NT 4.0 or above).
Достаточно создать регион нужной формы и вызвать SetWindowRgn

  HRGN rgn :=CreateEllipticRgn( 10,10,100,100 );
  SetWindowRgn( hMyWnd,rgn );  // Вот и будет круглое окно

При этом регион этот теперь используется Windows и будет уничтожен при закрытии окна.

  Вот, например:
  ........................................................
  procedure TForm1.FormCreate(Sender: TObject);
  const W=36*pi/180;
  var  R,R1,R2: HRgn; X,Y,i:integer;
    function S(a:integer;R:integer):integer;
    begin
      Result:=round(R*sin(W*a));
    end;
    function C(a:integer;R:integer):integer;
    begin
      Result:=round(R*cos(W*a));
    end;
    function GetStarReg(X,Y,R:integer):HRGN;
    var  P : array [0..4] of TPoint;
    begin
        P[0] :=Point(X, Y-R);
        P[1] :=Point(X-S(4,R), Y-C(4,R));
        P[2] :=Point(X-S(8,R), Y-C(8,R));
        P[3] :=Point(X-S(2,R), Y-C(2,R));
        P[4] :=Point(X-S(6,R), Y-C(6,R));
        Result :=CreatePolygonRgn(P, 5, WINDING);
    end;
  begin
    X:=Width div 2;
    Y:=Height div 2;
    R:=GetStarReg(X,Y,100);
    i:=1;
    repeat
      R1:=GetStarReg(X-S(i,120),Y-C(i,110),40);
      CombineRgn(R,R,R1,RGN_OR);
      inc(i,2);
    until i>9;
    R1:=GetStarReg(X,Y,30);
    CombineRgn(R,R,R1,RGN_DIFF);
    R1:=CreateEllipticRgn(3,3,Width-6,Height-6);
    R2:=CreateEllipticRgn(20,10,Width-20,Height-10);
    CombineRgn(R1,R1,R2,RGN_DIFF);
    CombineRgn(R,R,R1,RGN_OR);
    SetWindowRgn(Handle, R, True);
  end;
  ........................................................

Назад к содержанию


Как сделать невидимой главную форму?
Прислал Сергей  14.10.2001

Hаписать Application.ShowMainForm :=False в файле пpоекта.

В каком порядке происходят события при создании и показе окна? OnCreate, OnShow, OnPaint, OnActivate, OnResize и снова OnPaint.

Назад к содержанию



Как сделать так, чтобы по Alt-F4 форма не закрывалась, а выдавала запрос на сохранение?
Прислал Сергей  14.10.2001

Обрабатывать событие OnCloseQuery

Назад к содержанию



Как перетаскивать форму не только за Caption, но и за любое другое место?

 Прислал Arial Archangel  28.10.2001

      TForm1=class(TForm)
      ...
      private
      ...
        procedure WMNCHitTest(var M: TWMNCHitTest); message wm_NCHitTest;
      ...
      end;

  ...
  procedure TForm1.WMNCHitTest(var M: TWMNCHitTest);
  begin
    inherited;                    { вызов унаследованного обpаботчика      }
    if  M.Result=htClient then  { Мышь сидит на окне?                    }
      M.Result :=htCaption;      { Если да - то пусть Windows думает, что }
                                  { мышь на caption bar                    }
  end;
  ........................................................


Мне нужно сделать приложение модальным, для того чтобы обезопасить систему и в то же время позволить работать с программой.

Прислал Arial Archangel  28.10.2001

a) Создайте форму со размером maximized и без системных кнопок.

b) В обработчике FormDeactivate для формы вызовите метод setFocus - это предотвратит
Ctrl + Esc: Form1.SetFocus;

c) В обработчике события FormActivate, нужно присвоить метод Deactivate для приложения :
Application.onDeactivate :=FormDeactivate;

d) Создайте всплывающее меню (popup) с единственным пунктом. В свойствах данного пункта нужно установить Visible=False. Создайте процедуру для этого пункта меню, делающую что-нибудь тривиальное типа x :=1 (для того, чтобы Delphi не удалил эту процедуру).

e) Присвойте созданное Popup меню форме (свойство Popupmenu).

f) Задайте горячую клавишу (shortcut) для Popup меню в методе FormActivate как показано ниже:
NullItem1.shortcut :=ShortCut(VK_Tab, [ssAlt]);

(!!!: NullItem1 нужно заменить на название созданного вами объекта - пункта меню)

Шаги d, e и f предотвращают Alt-Tab

Назад к содержанию


Можно ли создать форму, которая получает дополнительные параметры в методе Сreate? Анатолий 31.10.2001

Да, просто надо заменить конструктор Create класса Вашей формы.

Пример:

unit Unit2;

interface

uses  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;

type
        TForm2=class(TForm)
        private
                {Private declarations}
        public
                constructor CreateWithCaption(aOwner: TComponent; aCaption: string);
                {Public declarations}
end;

var
        Form2: TForm2;

implementation

{$R *.DFM}

constructor TForm2.CreateWithCaption(aOwner: TComponent; aCaption: string);
begin
        Create(aOwner);
        Caption :=aCaption;
end;

uses Unit2;
procedure TForm1.Button1Click(Sender: TObject);
begin
        Unit2.Form2 :=Unit2.TForm2.CreateWithCaption(Application, 'My Caption');
        Unit2.Form2.Show;
end;
 

Как запретить кнопку Close [x] в заголовке окна.Анатолий 31.10.2001

procedure TForm1.FormCreate(Sender: TObject);
i Style: Longint;
begin
  Style :=GetWindowLong(Handle, GWL_STYLE);
  SetWindowLong(Handle, GWL_STYLE, Style And Not WS_SYSMENU);
end;
procedure TForm1.FormKeyDown(Sender: TObject; i Key: Word; Shift: TShiftState);
begin
  if (Key=VK_F4) and (ssAlt in Shift) then begin
    MessageBeep(0); Key :=0;
  end;
end;

А следующий текст убирает команду закрыть из системного меню и одновременно делает серой кнопку закрыть в заголовке формы:

procedure TForm1.FormCreate(Sender: TObject); 
i hMenuHandle:HMENU; 
begin 
 hMenuHandle :=GetSystemMenu(Handle, FALSE); 
 IF (hMenuHandle <> 0) THEN 
  DeleteMenu(hMenuHandle, SC_CLOSE, MF_BYCOMMAND); 
end;

Наверх к содержанию


Каким образом можно изменить системное меню формы?

Прислал Aries 31.10.2001 Hе знаю как насчет акселераторов, надо поискать, а вот добавить Item - пожалуйста

type
  TMyForm=class(TForm)
  procedure wmSysCommand(var Message:TMessage); message WM_SYSCOMMAND;
  end;
const
ID_ABOUT =WM_USER+1;
ID_CALENDAR=WM_USER+2;
ID_EDIT =  WM_USER+3;
ID_ANALIS=WM_USER+4;
implementation
procedure TMyForm.wmSysCommand;
begin
 case Message.wParam of
  ID_CALENDAR:DatBitBtnClick(Self) ;
  ID_EDIT  :EditBitBtnClick(Self);
  ID_ANALIS:AnalisButtonClick(Self);
 end;
 inherited;
end;
procedure TMyForm.FormCreate(Sender: TObject);
i SysMenu:THandle;
begin
 SysMenu:=GetSystemMenu(Handle,False);
 InsertMenu(SysMenu,Word(-1),MF_SEPARATOR,ID_ABOUT,'');
 InsertMenu(SysMenu,Word(-1),MF_BYPOSITION,ID_Calendar, 'Calendar');
 InsertMenu(SysMenu,Word(-1),MF_BYPOSITION,ID_Analis, 'Analis');
 InsertMenu(SysMenu,Word(-1),MF_BYPOSITION,ID_Edit, 'Edit');
end;

Наверх к содержанию


Как скрыть таскбар?Прислал Aries 31.10.2001
procedure TForm1.Button1Click(Sender: TObject);
i
  hTaskBar : THandle;
begin
  hTaskbar :=FindWindow('Shell_TrayWnd', Nil);
  ShowWindow(hTaskBar, SW_HIDE);
end;
procedure TForm1.Button2Click(Sender: TObject);
i
  hTaskBar : THandle;
begin
  hTaskbar :=FindWindow('Shell_TrayWnd', Nil);
  ShowWindow(hTaskBar, SW_SHOWNORMAL);
end;

Наверх к содержанию


События нажатия на системные кнопки формы (минимизация, закрытие...)Прислал Aries 31.10.2001 Хотелось бы чтобы при нажатии на кнопку minimize программа исчезала из таскбара.
При нажатии на эти кнопки происходит сообщение WM_SYSCOMMAND, его то и надо перехватить.
При этом:
uCmdType=wParam; // type of system command requested
xPos=LOWORD(lParam); // horizontal postion, in screen coordinates
yPos=HIWORD(lParam); // vertical postion, in screen coordinates

Пример:
Type TMain=class(TForm)
 ....
 protected
  Procedure WMGetSysCommand(var Message :TMessage); message WM_SYSCOMMAND;
 end;
 .....
//------------------------------------------------------------------------
//  Обработка сообщения WM_SYSCOMMAND (перехват минимизации окна)
//------------------------------------------------------------------------
Procedure TForm1.WMGetSysCommand(var Message : TMessage) ;
Begin
 IF (Message.wParam=SC_MINIMIZE) Then Form1.Visible:=False
 Else Inherited;
End;

Наверх к содержанию


Перетаскивание файлаСкурихин А.М 2.11.2001
Ниже приведён пример формы на которую можно перетаскивать файлы. В данном случае они открываються.
unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Classes, Graphics,
  Controls, Forms, Dialogs,StdCtrls,
  ShellAPI {ПОДКЛЮЧИТЬ};
type
  TForm1=class(TForm)
    FileList: TMemo;
    FileNameLabel: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  protected
  {Наша процедура обработки необходимого сообщения}
    procedure WMDropFiles(var Msg: TMessage); message wm_DropFiles;
end;
i
  Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.WMDropFiles(var Msg: TMessage);
i
  Filename: array[0 .. 256] of Char;
  Count  : integer;
begin
  { Получаем количество перетащенных файлов ) }
  nCount :=DragQueryFile( msg.WParam, $FFFFFFFF,
    acFileName, cnMaxFileNameLen);
  { Получаем имя первого из них  }
  DragQueryFile( THandle(Msg.WParam),
    0, { номер файла }
    Filename,SizeOf(Filename) ) ;
  { И открываем его }
  with FileNameLabel do begin
  Caption :=LowerCase(StrPas(FileName));
  FileList.Lines.LoadfromFile(Caption);
  end;
  { Говорим windows что сообщение обработано }
  DragFinish(THandle(Msg.WParam));
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
 { Говорим Windows, что на нашу форму можно бросать файлы }
 DragAcceptFiles(Handle, True);
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin

 DragAcceptFiles(Handle, False);
end;
end.

Наверх к содержанию


Как создать свою кнопку в заголовке формы (на Caption Bar)

Прислал Aries 3.11.2001 Непосредственно такой функции вроде нет, но можно изловчиться. Нарисовать там кнопку вручную и обрабатывать команды нажатия мышки на Caption Bar.
Пример.

unit Main;
interface
uses
  Windows, Buttons, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;
type
  TForm1=class(TForm)
    procedure FormResize(Sender: TObject);
  private
    CaptionBtn : TRect;
    procedure DrawCaptButton;
    procedure WMNCPaint(var Msg : TWMNCPaint); message WM_NCPaint;
    procedure WMNCActivate(var Msg : TWMNCActivate); message WM_NCACTIVATE;
    procedure WMSetText(var Msg : TWMSetText); message WM_SETTEXT;
    procedure WMNCHitTest(var Msg : TWMNCHitTest); message WM_NCHITTEST;
    procedure WMNCLButtonDown(var Msg : TWMNCLButtonDown); message WM_NCLBUTTONDOWN;
  public
   { Public declarations }
  end;
i
  Form1: TForm1;
implementation
const
  htCaptionBtn=htSizeLast + 1;
{$R *.DFM}
procedure TForm1.DrawCaptButton;
i
  xFrame,  yFrame,  xSize,  ySize  : Integer;
  R : TRect;
begin
  //Dimensions of Sizeable Frame
  xFrame :=GetSystemMetrics(SM_CXFRAME);
  yFrame :=GetSystemMetrics(SM_CYFRAME);
  //Dimensions of Caption Buttons
  xSize  :=GetSystemMetrics(SM_CXSIZE);
  ySize  :=GetSystemMetrics(SM_CYSIZE);
  //Define the placement of the new caption button
  CaptionBtn :=Bounds(Width - xFrame - 4*xSize + 2,
                      yFrame + 2, xSize - 2, ySize - 4);
  //Get the handle to canvas using Form's device context
  Canvas.Handle :=GetWindowDC(Self.Handle);
  Canvas.Font.Name :='Symbol';
  Canvas.Font.Color :=clBlue;
  Canvas.Font.Style :=[fsBold];
  Canvas.Pen.Color :=clYellow;
  Canvas.Brush.Color :=clBtnFace;
  try
    DrawButtonFace(Canvas, CaptionBtn, 1, bsAutoDetect, False, False, False);
    //Define a smaller drawing rectangle within the button
    R :=Bounds(Width - xFrame - 4 * xSize + 2,
                      yFrame + 3, xSize - 6, ySize - 7);
    with CaptionBtn do
      Canvas.TextRect(R, R.Left + 2, R.Top - 1, 'W');
  finally
    ReleaseDC(Self.Handle, Canvas.Handle);
    Canvas.Handle :=0;
  end;
end;
procedure TForm1.WMNCPaint(var Msg : TWMNCPaint);
begin
  inherited;
  DrawCaptButton;
end;
procedure TForm1.WMNCActivate(var Msg : TWMNCActivate);
begin
  inherited;
  DrawCaptButton;
end;
procedure TForm1.WMSetText(var Msg : TWMSetText);
begin
  inherited;
  DrawCaptButton;
end;
procedure TForm1.WMNCHitTest(var Msg : TWMNCHitTest);
begin
  inherited;
  with Msg do
    if PtInRect(CaptionBtn, Point(XPos - Left, YPos - Top)) then
      Result :=htCaptionBtn;
end;
procedure TForm1.WMNCLButtonDown(var Msg : TWMNCLButtonDown);
begin
  inherited;
  if (Msg.HitTest=htCaptionBtn) then
    ShowMessage('You hit the button on the caption bar');
end;
procedure TForm1.FormResize(Sender: TObject);
begin
  //Force a redraw of caption bar if form is resized
  Perform(WM_NCACTIVATE, Word(Active), 0);
end;
end.

Наверх к содержанию


Как обратится из одной модальной формы к другой - не активной?

Serge Buzadzhy 6.11.2001

Предлагаю вот такой способ:
procedure ShowAlmostModal(FormModal : TForm);
begin
  NavigatorForm.Enabled :=False;
  FormModal.ShowModal
end;

    И вот это пpивесь на OnShow  почти модальной  фоpмы

procedure FormShow(Sender : Tobject);
begin
  NavigatorForm.Enabled :=True;
end;

Наверх к содержанию


Исползование обработчика OnHint при наличии нескольких форм.

 Online Help и в Visual Component Library Reference описан пример обработчика события OnHint объекта TApplication. Пример показывает, как можно использовать панель для отображения подсказок (hint), связанных с другими компонентами. В примере обработчик OnHint устанавливается во время обработки события OnCreate для формы; в программе, включающей более чем одну форму, будет трудно использовать эту технику. Перемещение присваивания обработчика OnHint из события OnCreate формы в событие OnActivate позволит различным формам данного приложения работать с подсказками, как им нужно. Ниже приведен измененный пример из OnLine Help и VCL Reference.

type
TForm1=class(TForm)
Button1 : TButton;
Panel1 : TPanel;
Edit1 : TEdit;
procedure FormActivate(Sender : TObject);
private
{ Private declarations }
public
procedure DisplayHint(Sender: TObject);
end;
implementation
{$R *.DFM}
procedure TForm1.DisplayHint(Sender : TObject);
begin
Panel1.Caption :=Application.Hint;
end;
procedure TForm1.FormActivate(Sender : TObject);
begin
Application.OnHint :=DisplayHint;

end; Наверх к содержанию

Как программно спрятать/показать заголовок окна (caption)?

Вы можете попробовать следующее:

procedure TForm1.HideTitlebar;
var
Save : Longint;
begin
if BorderStyle=bsNone then Exit;
Save :=GetWindowLong(Handle, GWL_STYLE);
if (Save and WS_CAPTION)=WS_CAPTION then
begin
case BorderStyle of
bsSingle, bsSizeable : SetWindowLong(Handle, GWL_STYLE, Save and(Not WS_CAPTION) orWS_BORDER);
bsDialog : SetWindowLong(Handle, GWL_STYLE, Save and (Not WS_CAPTION) or DS_MODALFRAME orWS_DLGFRAME);
end;
Height :=Height - GetSystemMetrics(SM_CYCAPTION);
Refresh;
end;
end;
procedure TForm1.ShowTitlebar;
var
Save : Longint;
begin
if BorderStyle=bsNone then Exit;
Save :=GetWindowLong(Handle, GWL_STYLE);
if (Save and WS_CAPTION) <> WS_CAPTION then
begin
case BorderStyle of
bsSingle, bsSizeable : SetWindowLong(Handle, GWL_STYLE, Save or WS_CAPTION or WS_BORDER);
bsDialog : SetWindowLong(Handle, GWL_STYLE, Save or WS_CAPTION or DS_MODALFRAME or WS_DLGFRAME);
end;
Height :=Height + getSystemMetrics(SM_CYCAPTION);
Refresh;
end;

end;

Наверх к содержанию


Как убрать заголовок(caption) из MDI child?

Для MDI child установка свойства BorderStyle=bsNone НЕ убирает заголовок. Это можно сделать так:

procedure TMDIChildForm.CreateParams(var Params : TCreateParams);
begin
inherited;
Params.Style :=Params.Style and (not WS_CAPTION);

end;

 


Наверх к содержанию


57

Используются технологии uCoz
Используются технологии uCoz

Rambler's Top100 Rambler's Top100
Используются технологии uCoz

Rambler's Top100 Rambler's Top100

©  Adept Design Studio

Используются технологии uCoz