Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Форма и её контролы... [D5, Win2k]


BillyJeans ©   (2004-07-01 18:16:00) 

Можно ли получить хендлы контролов, расположенных на форме, зная только хендл самой формы?


Digitman   (2004-07-02 10:17:00) [1]


> BillyJeans   (02.07.04 09:45) [4]
> 1й параметр как я понял это хендл родителя...
>
>    HWND hWndParent, // handle to parent window


это ты процитировал описание 1-го параметра ф-ции EnumChildWindows(), а не колбэк-ф-ции EnumChildProc() ! Ты же конкретно про EnumChildProc() спросил, кажется ..

вызывая EnumChildWindows( род_окно, адрес_колбэк_функции, произвольный_параметр) ты тем самым требуешь от системы, чтобы для каждого окна, дочернего по отношению род_окносистема вызвала указанную тобой колбэк_функцию и передала в нее 1-м параметром хэндл очередного перечисляемого доч_окна


Cobalt   (2004-07-02 10:14:00) [2]

2 BillyJeans
Очень рекмоендую справку переводить так - переписываешь (печатаешь, если удобнее) текст справочной статьи не русском.
Вот тогда таких вопросов не будет.


Игорь Шевченко   (2004-07-02 10:12:00) [3]


> Игорь, а нельзя поподробнее


Можно, вот пример использования:

type
 TfMain = class(TForm)
   WindowsTreeView: TTreeView;
  ...
 end;
..............
type
 TWindowTreeNode = record
   TreeView: TTreeView;
   Node: TTreeNode;
 end;
 PWindowTreeNode = ^TWindowTreeNode;

function HSGetWindowIcon (WindowHandle: HWND): THandle;
begin
 if SendMessageTimeOut(WindowHandle, WM_GETICON, ICON_SMALL, 0,
                              SMTO_NORMAL, 300, Result) = 0 then
   Result := 0;
 if Result = 0 then
   Result := GetClassLong(WindowHandle, GCL_HICONSM);
end;

function EnumChildWindowsProc (WindowHandle: HWND; Data: Pointer): BOOL; stdcall;
var
 WinText: array[0..MAX_PATH] of char;
 WinClassName: array[0..MAX_PATH] of char;
 Node: TTreeNode;
 AImageIndex: Integer;
 AIconHandle: THandle;
 AIcon: TIcon;
begin
 GetWindowText(WindowHandle, WinText, SizeOf(WinText));
 GetClassName(WindowHandle, WinClassName, SizeOf(WinClassName));
 Node := PWindowTreeNode(Data)^.TreeView.Items.AddChildObject(PWindowTreeNode(Data)^.Node,
          Format('%s - %s', [WinClassName, WinText]), Pointer(WindowHandle));
 AIconHandle := HSGetWindowIcon(WindowHandle);
 if AIconHandle <> 0 then begin
   AIcon := TIcon.Create;
   AIcon.Handle := CopyIcon(AIconHandle);
   AImageIndex := fMain.WindowIconsImageList.AddIcon (AIcon);
   if AImageIndex <> -1 then begin
     Node.ImageIndex := AImageIndex;
     Node.SelectedIndex := AImageIndex;
   end;
 end else begin
   Node.ImageIndex := -1;
   Node.SelectedIndex := -1;
 end;
 Result := true;
end;

function EnumWindowsProc (WindowHandle : HWND; Data : Pointer) : BOOL; stdcall;
var
 WinText: array[0..MAX_PATH] of char;
 WinClassName: array[0..MAX_PATH] of char;
 WindowNode: TWindowTreeNode;
 AImageIndex: Integer;
 AIconHandle: THandle;
 AIcon: TIcon;
begin
 GetWindowText(WindowHandle, WinText, SizeOf(WinText));
 GetClassName(WindowHandle, WinClassName, SizeOf(WinClassName));
 WindowNode.TreeView := TTreeView(Data);
 WindowNode.Node := TTreeView(Data).Items.AddObject(nil,
          Format('%s - %s', [WinClassName, WinText]), Pointer(WindowHandle));
 AIconHandle := HSGetWindowIcon(WindowHandle);
 if AIconHandle <> 0 then begin
   AIcon := TIcon.Create;
   AIcon.Handle := CopyIcon(AIconHandle);
   AImageIndex := fMain.WindowIconsImageList.AddIcon (AIcon);
   if AImageIndex <> -1 then begin
     WindowNode.Node.ImageIndex := AImageIndex;
     WindowNode.Node.SelectedIndex := AImageIndex;
   end;
 end else begin
   WindowNode.Node.ImageIndex := -1;
   WindowNode.Node.SelectedIndex := -1;
 end;
 EnumChildWindows(WindowHandle, @EnumChildWindowsProc, LPARAM(@WindowNode));
 Result := true;
end;

procedure TfMain.RefreshWindowsView;
begin
 WindowsTreeView.Items.Clear;
 EnumWindows(@EnumWindowsProc, LPARAM(WindowsTreeView));
end;


BillyJeans   (2004-07-02 09:45:00) [4]

1й параметр как я понял это хендл родителя...

   HWND hWndParent, // handle to parent window


Digitman   (2004-07-02 09:02:00) [5]


> BillyJeans


заметь, что, например, класс TLabel - это тоже контрол (т.е. непрямой наследник класса TControl), однако никакого хэндла у него нет, потому что этот объект не порождает самостоятельное окно

задача решаема лишь для объектов-наследников класса TWinControl


> Какой параметр вернет мне хендл дочерних окон?


в справке же сказано - 1-й параметр, hWND

lparam вернет то значение, которое было передано тобой же3-м параметром в вызове EnumChildWindows()


BillyJeans   (2004-07-02 08:36:00) [6]

Игорь, а нельзя поподробнее... Какой параметр вернет мне хендл дочерних окон? lParam функции EnumChildProc?


Игорь Шевченко   (2004-07-01 18:18:00) [7]

EnumChildWindows ?


Наверх

Титульная страница Поиск, карта сайта Написать письмо