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

Вниз

минимизация окна   Найти похожие ветки 

 
RusSun ©   (2009-11-11 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 ©   (2009-11-11 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 ©   (2009-11-15 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 ©   (2009-11-16 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 ©   (2009-11-19 18:23) [4]

Большое Спасибо за Ответ!!!

Замечания учту на будущее;)
Тем более что нужно скоро писать приложение
>больше 2х форм



Страницы: 1 вся ветка

Текущий архив: 2015.02.22;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.006 c
15-1405587956
ВладОшин
2014-07-17 13:05
2015.02.22
Вопрос про шахматы на сайте. Догадка о силе игры


15-1402987185
ВладОшин
2014-06-17 10:39
2015.02.22
Глючит роутер.


3-1299227533
Junior
2011-03-04 11:32
2015.02.22
Поиск текста


11-1257949541
RusSun
2009-11-11 17:25
2015.02.22
минимизация окна


2-1388413324
Signal
2013-12-30 18:22
2015.02.22
как на Bitmap наложить второй bitmap в заданные координаты?