![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вопрос по SetWindowLong(FindWindow(nil,Pchar(ListBox1.Items[listb
^GENTLY^ © (2004-06-06 20:18:00)Здравствуйте!!
У меня в программе устанавливается по нажатию на 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;
wicked (2004-06-08 11:25:00) [1]> Можно узнать почему?
цитирую кусочек 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....
Kair (2004-06-08 06:07:00) [2]
> wicked © (07.06.04 21:29) [7]
>
> > Или ShowWindow(); :)
>
> не совсем... в msdn советуецца именно SetWindowPos...
Можно узнать почему?
wicked (2004-06-07 21:29:00) [3]
> Или ShowWindow(); :)
не совсем... в msdn советуецца именно SetWindowPos...
Kair (2004-06-07 17:58:00) [4]
> 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_Minimize Box:)
Не делай and not ws_SysMenu. Без крестика все-равно ведь две другие кнопки не покажутся...
^GENTLY^ (2004-06-07 13:14:00) [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 кнопочка либо свер либо зак ....
:(:(:(
wicked (2004-06-07 10:58:00) [6]добавлю также, что после изменения стиля окна желательно также делать ему SetWindowPos...
Kair (2004-06-07 06:23:00) [7]Остальные кнопки работают только вместе с ws_SysMenu.
Т.е. ws_Caption or ws_SysMenu or ws_Minimize...
А по другому, вроде, никак.
^GENTLY^ (2004-06-06 20:54:00) [8]Работает только с кнопкой закрыть.А на остальные нет реакции.
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-06 20:35:00) [9]Крестик: ws_SysMenu;
Свернуть: ws_Minimize;
Восстановить: ws_Minimize; :)
P.S.: Развернуть: ws_Maximize