Форум: "WinAPI";
Текущий архив: 2004.07.18;
Скачать: [xml.tar.bz2];
ВнизВопрос по SetWindowLong(FindWindow(nil,Pchar(ListBox1.Items[listb Найти похожие ветки
← →
^GENTLY^ (2004-06-06 20:18) [0]Здравствуйте!!
У меня в программе устанавливается по нажатию на Button4 форма принимает опр вид,т.е. появляются сразу 3 кнопки свернуть восстановить закрыть.Подскажите пожулуйста как сделать чтоб было 3 buttona и по нажатию на какой- либо появлялось соответсвующая кнопка свернуть или закрыть илил восст. Т.е. button-свернуть нажали появился квадратик кнопка свернуть. и.т.д.
Это код программы, на всякий случай.
var
pos: TRect;
w : array[0..255] of char;
id: dword;
x,y,e,h: integer;
region: thandle;
{$R *.dfm}
procedure TForm1.ListBox1DblClick(Sender: TObject);
begin
Edit1.Text:=ListBox1.Items[listbox1.ItemIndex];
GetWindowRect(FindWindow(nil,Pchar(ListBox1.Items[listbox1.ItemIndex])),pos);
Edit2.Text:=IntToStr(pos.Left);
Edit3.Text:=IntToStr(pos.Top);
Edit4.Text:=IntToStr(pos.Right);
Edit5.Text:=IntToStr(pos.Bottom);
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
SetWindowText(FindWindow(nil,Pchar(ListBox1.Items[listbox1.ItemIndex])),Pchar(Edit1.text));
ListBox1.Items[listbox1.ItemIndex]:=Edit1.Text;
x:=StrToInt(Edit2.Text);
y:=StrToInt(Edit3.Text);
e:=StrToInt(Edit4.Text);
h:=StrToInt(Edit5.Text);
SetWindowPos(FindWindow(nil,Pchar(ListBox1.Items[listbox1.ItemIndex])),0,x,y,(e-x),(h-y),0);
if RadioButton1.Checked=true then ShowWindow(FindWindow(nil,Pchar(ListBox1.Items[listbox1.ItemIndex])),SW_MINIMIZE);
if RadioButton2.Checked=true then ShowWindow(FindWindow(nil,Pchar(ListBox1.Items[listbox1.ItemIndex])),SW_Maximize);
if RadioButton3.Checked=true then begin end;
if CheckBox1.Checked=true then showwindow(FindWindow(nil,Pchar(ListBox1.Items[listbox1.ItemIndex])),sw_hide);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Listbox1.Clear;
id := FindWindowEx(0, 0, nil, nil);
while (id <> 0) do
begin
if (GetWindowText(id, w, 255) > 1)
and (IsWindowVisible(id))
then
Form1.ListBox1.Items.Add(w);
id := FindWindowEx(0, id, nil, nil)
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Listbox1.Clear;
id := FindWindowEx(0, 0, nil, nil);
while (id <> 0) do
begin
if (GetWindowText(id, w, 255) > 1)
and (IsWindowVisible(id))
then
Form1.ListBox1.Items.Add(w);
id := FindWindowEx(0, id, nil, nil)
end;
end;
procedure TForm1.Button4Click(Sender: TObject);
begin
SetWindowLong(FindWindow(nil,Pchar(ListBox1.Items[listbox1.ItemIndex])),GWL_STYLE,
WS_OVERLAPPEDWINDOW or WS_CAPTION);
form1.Hide;
form1.Show;
end;
← →
Kair © (2004-06-06 20:35) [1]Крестик: ws_SysMenu;
Свернуть: ws_Minimize;
Восстановить: ws_Minimize; :)
P.S.: Развернуть: ws_Maximize
← →
^GENTLY^ (2004-06-06 20:54) [2]Работает только с кнопкой закрыть.А на остальные нет реакции.
begin
SetWindowLong(FindWindow(nil,Pchar(ListBox1.Items[listbox1.ItemIndex])),GWL_STYLE,
WS_CAPTION or ws_SysMenu);
form1.Hide;
form1.Show;
end;
procedure TForm1.Button6Click(Sender: TObject);
begin
SetWindowLong(FindWindow(nil,Pchar(ListBox1.Items[listbox1.ItemIndex])),GWL_STYLE,
WS_CAPTION or ws_Minimize);
form1.Hide;
form1.Show;
end;
procedure TForm1.Button7Click(Sender: TObject);
begin
SetWindowLong(FindWindow(nil,Pchar(ListBox1.Items[listbox1.ItemIndex])),GWL_STYLE,
WS_CAPTION or ws_Maximize);
form1.Hide;
form1.Show;
end;
← →
Kair © (2004-06-07 06:23) [3]Остальные кнопки работают только вместе с ws_SysMenu.
Т.е. ws_Caption or ws_SysMenu or ws_Minimize...
А по другому, вроде, никак.
← →
wicked © (2004-06-07 10:58) [4]добавлю также, что после изменения стиля окна желательно также делать ему SetWindowPos...
← →
^GENTLY^ (2004-06-07 13:14) [5]Ну вот делаю так,да
SetWindowLong(FindWindow(nil,Pchar(ListBox1.Items[listbox1.ItemIndex])),GWL_STYLE,
WS_CAPTION or ws_Minimize and not ws_SysMenu and not ws_Maximize);
Но кнопочка свернуть всеравно не получается,а если еще и нажата закрыть то она пропадает.
Вообще во-первых и так почему-то не работает, а во-вторых получается ,если делать так, что может быть только 1 кнопочка либо свер либо зак ....
:(:(:(
← →
Kair © (2004-06-07 17:58) [6]
> wicked © (07.06.04 10:58) [4]
> добавлю также, что после изменения стиля окна желательно
> также делать ему SetWindowPos...
Или ShowWindow(); :)
> ^GENTLY^ (07.06.04 13:14) [5]
> Ну вот делаю так,да
> SetWindowLong(FindWindow(nil,Pchar(ListBox1.Items[listbox1.ItemIndex])),GWL_STYLE,
> WS_CAPTION or ws_Minimize and not ws_SysMenu and not ws_Maximize);
> Но кнопочка свернуть всеравно не получается,а если еще и нажата закрыть то она пропадает.
Извиняюсь, забыл, не ws_Minimize, а ws_MinimizeBox :)
Не делай and not ws_SysMenu. Без крестика все-равно ведь две другие кнопки не покажутся...
← →
wicked © (2004-06-07 21:29) [7]
> Или ShowWindow(); :)
не совсем... в msdn советуецца именно SetWindowPos...
← →
Kair © (2004-06-08 06:07) [8]
> wicked © (07.06.04 21:29) [7]
>
> > Или ShowWindow(); :)
>
> не совсем... в msdn советуецца именно SetWindowPos...
Можно узнать почему?
← →
wicked © (2004-06-08 11:25) [9]> Можно узнать почему?
цитирую кусочек remarks-секции от SetWindowLong:
Certain window data is cached, so changes you make using SetWindowLong will not take effect until you call the SetWindowPos function. Specifically, if you change any of the frame styles, you must call SetWindowPos with the SWP_FRAMECHANGED flag for the cache to be updated properly.
а зачем именно?...
а затем, что SetWindowPos функция запускает механизм пересчета клиентской части окна, исполняя своего рода часть кода по созданию нового окна с определенными стилями...
например, см справку по WM_NCCALCSIZE....
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2004.07.18;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.036 c