Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.08.15;
Скачать: CL | DM;

Вниз

Форма и её контролы...   Найти похожие ветки 

 
BillyJeans   (2004-07-01 18:16) [0]

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


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

EnumChildWindows ?


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

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


 
Digitman ©   (2004-07-02 09:02) [3]


> BillyJeans


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

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


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


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

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


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

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

   HWND hWndParent, // handle to parent window


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


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


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

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;



 
Cobalt ©   (2004-07-02 10:14) [6]

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


 
Digitman ©   (2004-07-02 10:17) [7]


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


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

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



Страницы: 1 вся ветка

Текущий архив: 2004.08.15;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.027 c
1-1091210357
Alexander /Brut/
2004-07-30 21:59
2004.08.15
использование буфера обмена по средствам SendMessage...


3-1090304703
pashtet
2004-07-20 10:25
2004.08.15
как сделать что бы в базе в 18-00 происходило событие?


3-1090427430
Top100
2004-07-21 20:30
2004.08.15
выборка


3-1090388090
ksa2002
2004-07-21 09:34
2004.08.15
Проблема с IBquery1.RecordCount


14-1090867870
VID
2004-07-26 22:51
2004.08.15
Каким же Вы представляете себе это "будущее" ?