Конференция "KOL" » минимизация окна [Delphi, Windows]
 
  • RusSun © (11.11.09 17:25) [0]
    Здравствуйте, мастера. Доброе время суток.

    В моём приложении: хотел сделать минимизацию окна
    по нажатию кнопку Esc. Получилось, но не очень складно.
    При минимизации у меня видно как сворачивается форма, а затем
    и апплет. Но хотелось бы чтобы избавится от этого дефекта.

    У моего соседа на более быстром компе совсем не видно.

    Вот код :
    program Project1;

    uses
     windows,
     messages,
     kol;
    type  TOnEvent = procedure( Sender: PObj )of object;
    {$R *.res}
    //{$DEFINE KEY_PREVIEW}
    var
    form,form2,Label1,Button1,
    Button2,EditBox1,EditBox2,
    Button3,Button4,ListBox1,
    Button5,Button6,Button7,
    Button8,Button9 :PControl;
    i:byte;f:textfile;s:string;
    //далее добавил сам
     TheWindow:HWND; {содержит дескриптор окна}
    //область для процедур
    function KeyPressed(VKey: Integer): LongBool;
    asm
      push eax
      call GetKeyState
      and eax, 0080h
      shr al, 7
    end;
    procedure Button1Click(dummy:pointer;Sender:PControl; var mouse:TMouseEventData);
    var Classname: String;
       h: hwnd;
    begin
    if (GetVersion< $80000000)
    then Classname:='Consolewindowclass'
    else Classname:='tty';
    h:=FindWindow(pchar(Classname),nil);
    EditBox1.Text:=Int2Str(integer(h));
    end;

    procedure Button2Click(dummy:pointer;Sender:PControl; var mouse:TMouseEventData);
    var
    WindowText: array[0..255] of char; {символьный массив для хранения
    текста, связанного с окном}


    ThePoint: TPoint; {переменная для хранения заданных координат}
    begin
    {задаем координаты точки экрана}
    ThePoint.X :=10; //strtoint(SpinEdit1.text);
    ThePoint.Y :=10; //strtoint(SpinEdit2.text); {вычисляем дескриптор окна формы, в область которого попадают координаты заданной точки экрана}
    TheWindow := WindowFromPoint(ThePoint);
    {получаем текст, связанный с окном}
    If (GetWindowText(TheWindow, WindowText, 255))<>0 then
    begin
    {...и показываем этот текст}
    EditBox1.Text :=Int2Str(TheWindow);
    EditBox2.Text:= WindowText;
    end
    Else
    EditBox2.Text := 'Данное окно не имеет описания';
    {устанавливаем курсор мыши в заданную точку экрана}
    //Mouse.CursorPos := ThePoint;
    end;
    procedure Button3Click(dummy:pointer;Sender:PControl; var mouse:TMouseEventData);
    begin //Загрузить
    if EditBox2.text = 'FolderView' then
    begin
    showmessage('Не тронь петуха:)');
    exit;
    end;
    //Очищаем
    ListBox1.Clear;
    //Загружаем
    if FileExists(FileFullPath('Exception List.txt')) then assign(f,'Exception List.txt');
       try
        reset(f);
        while not eof(f) do  begin
        readln(f,s);
        ListBox1.add(s);
         end;
         close(f);
        except
        //showmessage('Такого нет');
        end;s:='';//Сбрасываем переменную строки
        //form2.Show;
    for i:=0 to ListBox1.Count-1 do
    if editbox2.Text=ListBox1.Items[i] then
    begin {showmessage(' совпадение '+Editbox2.Text+'='+ListBox1.Items[i]);}exit;end;
    winexec(pchar(EditBox2.Text),SW_NORMAL);
    Setparent(TheWindow,applet.Handle);
    end;
    procedure Button4Click(dummy:pointer;Sender:PControl; var mouse:TMouseEventData);
    begin
    if not Assigned( Form2 ) then
       NewForm(  form ,'Form2');
    if editbox2.Text='' then
    begin
    showmessage('пустая строка');
    exit;
    end;
    //Очищаем
    ListBox1.Clear;
    //Загружаем
    if FileExists(FileFullPath('Exception List.txt')) then assign(f,'Exception List.txt');
       try
        reset(f);
        while not eof(f) do  begin
        readln(f,s);
        ListBox1.add(s);
         end;
         close(f);
        except
        end;s:='';//Сбрасываем переменную строки
     Form2.Show;
    end;
    procedure Button8Click(dummy:pointer;Sender:PControl; var mouse:TMouseEventData);
    begin//Добавить
    ListBox1.add(editbox2.Text);
    end;
    procedure Button5Click(dummy:pointer;Sender:PControl; var mouse:TMouseEventData);
    begin//Сохранeние
     for i:=0 to ListBox1.Count-1 do s:=s+ListBox1.Items[i]+#13#10;
    if FileExists(FileFullPath('Exception List.txt')) then assign(f,'Exception List.txt');
       try
       rewrite(f);
        write(f,s);
         close(f);
        except
        end;s:='';//Сбрасываем переменную строки
        form2.Hide;button1.Focused:=true;
    end;
    procedure Button6Click(dummy:pointer;Sender:PControl; var mouse:TMouseEventData);
    begin//Удалить
    ListBox1.Delete(ListBox1.curindex);
    end;
    procedure Button7Click(dummy:pointer;Sender:PControl; var mouse:TMouseEventData);
    begin//Очистить
    ListBox1.Clear;
    end;
    procedure Button9Click(dummy:pointer;Sender:PControl; var mouse:TMouseEventData);
    begin//Очистить
    form2.Hide;button1.Focused:=true;
    end;
    procedure Close_form2(DummySelf,Sender: PControl; var Accept: Boolean);
    begin
     if Assigned( Form2 ) then begin
     accept:=false;
     form2.Hide;button1.Focused:=true;
                       end else
                       accept:=true;
    end;

    function AB00(var Message;var Msg: tagMSG;var Rslt: Integer): Boolean;
    begin
         Result := False;
         if (Msg.message = WM_MOVE) or (Msg.message = WM_SIZE) then
       Applet.BoundsRect := Form.BoundsRect;
     if KeyPressed(VK_ESCAPE) then  
        //SendMessage(applet.Handle,SW_MINIMIZE, 0, 0);
        ShowWindow(form.Handle,SW_MINIMIZE);
    end;
    Begin
    {первая forma }
    form:=NewForm(Applet,'Мои документы' ).SetPosition( 192, 107 ).SetClientSize( 329, 98 );
    Label1 := NewLabel( form, 'дескриптор' ).SetPosition( 0, 40 ).SetSize( 81, 0 );
    Button1 := NewButton( form, 'FindwindowConsol' ).SetPosition( 8, 8 ).SetSize( 129, 0 );
    Button2 := NewButton( form, 'FindwindowWnD' ).SetPosition( 144, 8 ).SetSize( 113, 0 );
    Button3 := NewButton( form, 'Enum' ).SetPosition( 8,68 ).SetSize( 113, 0 );
    Button4 := NewButton( form, 'Except' ).SetPosition( 148,68 ).SetSize( 113, 0 );
    EditBox1 := NewEditBox( form, [  ] ).SetPosition( 80, 40 );
    EditBox1.Color := clWindow;
    EditBox2 := NewEditBox( form, [  ] ).SetPosition( 184, 40 );
    EditBox2.Color := clWindow;
    {вторая forma }
    Form2:= NewForm(form,'').SetPosition( 202, 192 ).SetClientSize( 320, 222 );
    form2.Hide;
    Form2.Style := Form.Style and not (WS_MINIMIZEBOX or WS_MAXIMIZEBOX);//отключаем кнопку раскрыть и минимизировать
    ListBox1 := NewListBox( form2, [ loNoIntegralHeight ] ).SetPosition( 6, 6 ).SetSize( 241, 169 );
    ListBox1.Color := clWindow;
    ListBox1.CurIndex := 0;
    Button5:= NewButton( form2, 'Сохранить' ).SetPosition( 156,192).SetSize( 74, 0 );
    Button6:= NewButton( form2, 'Удалить' ).SetPosition( 80,192).SetSize( 72, 0 );
    Button7:= NewButton( form2, 'Очистить' ).SetPosition( 250,148).SetSize( 68, 0 );
    Button8:= NewButton( form2, 'Добавить' ).SetPosition(8,192).SetSize( 68, 0 );
    Button9:= NewButton( form2, 'Отмена' ).SetPosition( 236,192).SetSize( 68, 0 );
    //область для работы
    Button1.OnClick:=TonEvent(MakeMethod(nil,@button1click));
    Button2.OnClick:=TonEvent(MakeMethod(nil,@button2click));
    Button3.OnClick:=TonEvent(MakeMethod(nil,@button3click));
    Button4.OnClick:=TonEvent(MakeMethod(nil,@button4click));

    Button5.OnClick:=TonEvent(MakeMethod(nil,@button5click));
    Button6.OnClick:=TonEvent(MakeMethod(nil,@button6click));
    Button7.OnClick:=TonEvent(MakeMethod(nil,@button7click));
    Button8.OnClick:=TonEvent(MakeMethod(nil,@button8click));
    Button9.OnClick:=TonEvent(MakeMethod(nil,@button9click));
    Form.OnMessage:=TOnMessage(MakeMethod(nil,@AB00));
    form2.OnClose:=TOnEventAccept(MakeMethod(nil,@Close_form2));
    Run(form);
    end.

  • mdw © (11.11.09 19:51) [1]
    Оно может и работает, но почему так?
    function AB00(var Message;var Msg: tagMSG;var Rslt: Integer): Boolean;

    замените
       ShowWindow(form.Handle,SW_MINIMIZE);
    на
    form.WindowState:= wsMinimized;

    Ну и еще пару замечаний.
    зачем Вы проверяете на  каждом  сообщении
    if KeyPressed(VK_ESCAPE) then ...


    ?
    будьте проще:
         if (Msg.message = WM_KEYDOWN) and ( Msg.wParam = VK_ESCAPE) then ..



    и второе.
    Создайте всеже Applet (Applet:= NewApplet('!!!!!!!');), оно не помешает... Соответственно минимизируйте не форму, а Applet (AppletMinimize)

    Еще, чисто "академический" интерес, что значит это?

       if (Msg.message = WM_MOVE) or (Msg.message = WM_SIZE) then
          Applet.BoundsRect := Form.BoundsRect;

  • RusSun © (15.11.09 13:41) [2]
    Здравстуйте, mdw ©  .
    Первое ,большое спасибо, что так быстро ответили.
    Отвечаю по порядку на каждый вопрос, задаю свои по ходу изложения.
    “Оно может и работает, но почему так?
    function AB00(var Message;var Msg: tagMSG;var Rslt: Integer): Boolean


    Зелен. Не хватает опыта программирования.
    Сделал так:
    function AB00(var Message;var Msg: tagMSG;var Rslt: Integer): Boolean;
    begin
         Result := False;
     if (Msg.message = WM_KEYDOWN) and ( Msg.wParam = VK_ESCAPE) then
        form.WindowState:= wsMinimized;
    end;


    Убрал функцию function KeyPressed.
    Здесь,
    где AB00(var Message;var Msg: tagMSG…);
    должно быть по-другому, но не знаю как.
    Чувствую, но не знаю, как делать надо. И наверно может других параметров не хватает.
    Дефект пропал.
    “Создайте всеже Applet (Applet:= NewApplet('!!!!!!!');), оно не помешает... Соответственно минимизируйте не форму, а Applet (AppletMinimize)”
    Создал так.
    …..
    Applet:= NewApplet('');
    {первая forma }
    form:=NewForm
    …..
    Run(form);
    applet.Free;
    end.
    сообщение тогда так:
    function AB00(var Message;var Msg: tagMSG;var Rslt: Integer): Boolean;
    begin
         Result := False;
        if (Msg.message = WM_KEYDOWN) and ( Msg.wParam = VK_ESCAPE) then
        Applet.Perform( WM_SYSCOMMAND, SC_MINIMIZE, 0 );
        //тогда минимизация происходит не как у обычной формы    
    end;


    В этом случае минимизация происходит в другую сторону, не как у обычной формы.
    Поэтому мне этот вариант не очень подходит. Скажите, а почему Вы так настаиваете на     Applet’е?
    “Еще, чисто "академический" интерес, что значит это?

     
    if (Msg.message = WM_MOVE) or (Msg.message = WM_SIZE) then
         Applet.BoundsRect := Form.BoundsRect;


    Всё просто, иногда начинаешь искать наобум всё, что мало-мальски годится, не особо вчитываясь в то, что делаешь ;)
    Выписка из FAQ по KOL&MCK:
    «Вопрос : Когда используется переменная Applet, анимация при минимизации происходит не с позиции главной формы, а от верхнего левого угла экрана. Как это поправить?
    Использовать событие Applet.OnMessage:
    function TSomeObject.KOLForm1Message(var Msg: tagMSG; var Rslt: Integer): Boolean;
    begin
     if (Msg.message = WM_MOVE) or (Msg.message = WM_SIZE) then
       Applet.BoundsRect := Form.BoundsRect;
     Result := False;
    end;


    Или, воспользоваться методом (в MCK - событием) MinimizeNormalAnimated.»
  • mdw © (16.11.09 12:16) [3]

    > Оно может и работает, но почему так
    >

    Собстаенно намекал на следующее. Почему:
    function AB00(var Message;var Msg: tagMSG;var Rslt: Integer): Boolean;
    а не
    function AB00(dummy:pointer;var Msg: tagMSG;var Rslt: Integer): Boolean;
    оно понятно, что скомпилится в тоже само (var~pointer), но все же....ладно, проехали.

    Про апплет, имеется ввиду, Run(Applet); ну и минимизировать AppletMinimize (процедура такая).


    > Скажите, а почему Вы так настаиваете на     Applet’е?

    Поищите по форуму, посмотрите KOL.pas, а если кратко, то если используется больше 2х форм, то используйте Applet, дабы потом долго и мучительно не отлавливать невразумительные баги...
  • RusSun © (19.11.09 18:23) [4]
    Большое Спасибо за Ответ!!!

    Замечания учту на будущее;)
    Тем более что нужно скоро писать приложение
    >больше 2х форм
 
Конференция "KOL" » минимизация окна [Delphi, Windows]
Есть новые Нет новых   [134431   +12][b:0][p:0.006]