Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "KOL";
Текущий архив: 2015.02.22;
Скачать: [xml.tar.bz2];

Вниз

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

 
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 вся ветка

Форум: "KOL";
Текущий архив: 2015.02.22;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.002 c
3-1299227533
Junior
2011-03-04 11:32
2015.02.22
Поиск текста


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


15-1405758522
oldman
2014-07-19 12:28
2015.02.22
Юмор Шрёдингера


2-1390291002
AlexDn
2014-01-21 11:56
2015.02.22
Запуск странички


2-1390165661
Black777
2014-01-20 01:07
2015.02.22
Редактирование записи MsSQL





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский