Форум: "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