Форум: "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