Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2004.08.15;
Скачать: [xml.tar.bz2];

Вниз

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

 
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 вся ветка

Форум: "WinAPI";
Текущий архив: 2004.08.15;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.037 c
8-1086000556
Dr.Alex
2004-05-31 14:49
2004.08.15
12 - кадр


9-1083143091
xman
2004-04-28 13:04
2004.08.15
гравитация в космосе


6-1087301835
DNS
2004-06-15 16:17
2004.08.15
Работа с Socket


14-1091171821
ISP
2004-07-30 11:17
2004.08.15
Путин подписал закон, запрещающий электронные библиотеки


3-1090516073
Wolfram
2004-07-22 21:07
2004.08.15
Изменение свойств memo в FastReport в runtime





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский