![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Получить иконку по Handle у ;окна [D5, Win95/98, Win2k, WinXP]
Wizard_Ex © (2002-06-21 06:50:00)Есть Handle окна
как по Handle"у окна получить его иконку и передать ее спидбуттону
Игорь Шевченко (2002-06-21 16:16:00) [1]Вот способ вытягивания иконки всеми известными мне способами:
В OwnerDraw ListBox передается текст окна и Handle окна.
procedure TfMonitor.ListBoxDrawItem(Control: TWinControl; Index: Integer;
Rect: TRect; State: TOwnerDrawState);
var
AWindowHandle : HWND;
AIconSM : THandle;
Icon : TIcon;
I : Integer;
begin
with ListBox do begin
Canvas.FillRect(Rect);
AWindowHandle := HWND(Items.Objects[Index]);
if AWindowHandle = HWND(-2) then begin
Canvas.Font.Color := clRed;
Canvas.Brush.Color := Color;
end else begin
Inc(Rect.Left, 2);
AIconSm := GetClassLong(AWindowHandle, GCL_HICONSM);
if AIconSm = 0 then
if SendMessageTimeOut(AWindowHandle, WM_GETICON, ICON_SMALL, 0,
SMTO_NORMAL, 300, AIconSm) = 0 then
AIconSm := 0;
if AIconSm = 0 then
for I:=0 to Pred(Screen.FormCount) do
if Screen.Forms[I].Handle = AWindowHandle then begin
AIconSm := Screen.Forms[I].Icon.Handle;
if AIconSm = 0 then
AIconSm := GetClassLong(Application.Handle, GCL_HICONSM);
break;
end;
if AIconSm <> 0 then begin
Icon := TIcon.Create();
Icon.Handle := AIconSm;
try
Canvas.Draw(Rect.Left, Rect.Top+2,Icon);
Icon.ReleaseHandle();
finally
Icon.Free();
end;
end;
Inc (Rect.Left, GetSystemMetrics(SM_CXSMICON)+3);
end;
DrawText(Canvas.Handle, PChar(Items[Index]), -1, Rect, DT_SINGLELINE
OR DT_VCENTER);
end;
end;
Wizard_Ex (2002-06-21 15:57:00) [2]Значит
на WM_MDIACTIVATE тоже иконки еще нет получается
ити ее за ногу
Игорь Шевченко (2002-06-21 15:39:00) [3]Потому что она (иконка) не успевает еще установиться, в момент обработки сообщения WM_MDICREATE. Не уверен, правда, но полагаю, что поэтому.
Wizard_Ex (2002-06-21 15:29:00) [4]Почему же Handle иконки = 0 я не понимаю
Wizard_Ex (2002-06-21 15:26:00) [5]// Юрий Зотов © (21.06.02 12:38)
// Glyph.Assign ?
Что значит assign
он тут не проходит: TIcon и TBitmap
Игорь Шевченко © (21.06.02 14:18)
это вариант, НО
здесь нужно править код главной формы и код MDI окон
в моем случае этого делать не надо и главное для этого он и нужен
чтобы не модифицировать код - компонент все сделает сам
мне нужно получить эту чертову иконку в коде компонента и все,
потому как все что нужно он сам перехватывает,
создание, активизацию, закрытие, минимизацию и т.д. и т.п.
все остальное работает как надо
Best regards, Wizard_Ex
Игорь Шевченко (2002-06-21 14:18:00) [6]Я итоге сделал так:
Объявил свое сообщение
const
WM_MDICHILDCREATED = WM_USER + 666;
У каждого MDIChild создал процедуру в OnShow;
procedure TfChild.FormShow(Sender: TObject);
var
AIcon : HIcon;
begin
AIcon := Icon.Handle;
if AIcon = 0 then
AIcon := GetClassLong(Application.Handle, GCL_HICONSM);
PostMessage(Application.MainForm.Handle, WM_MDICHILDCREATED, WPARAM(AIcon), Handle);
end;
В главной форме создал обработчик этого сообщения:
procedure TfMain.WMMDIChildCreated(var Message: TMessage);
var
Icon : TIcon;
mdiButton : TSpeedButton;
AText : array[0..MAX_PATH] of char;
begin
with Message do begin
GetWindowText(LParam, AText, SizeOf(AText));
Icon := TIcon.Create();
try
Icon.Handle := WParam;
mdiButton := TSpeedButton.Create(Self);
with mdiButton do begin
Tag := LParam;
Parent := ButtonsPanel;
Width := 23;
Height := 22;
Left := ButtonsCount * 22 + 8;
Top := 8;
Glyph.Width := 16;
Glyph.Height := 16;
Glyph.TransparentColor := clCaptionText;
Hint := AText;
ShowHint := true;
Inc(ButtonsCount);
end;
DrawIconEx(mdiButton.Glyph.Canvas.Handle, 0, 0, Icon.Handle,
mdiButton.Glyph.Width, mdiButton.Glyph.Height, 0, 0, DI_NORMAL);
finally
Icon.ReleaseHandle();
Icon.Free();
end;
end;
end;
Где ButtonsCount - переменная главной формы.
Кнопки создаются на панели главной формы. Align этой панели alTop
Я не стал обрабатывать ситуации с закрытием MDI-окон, их активацией и т.д.
С уважением,
Юрий Зотов (2002-06-21 12:38:00) [7]Glyph.Assign ?
Wizard_Ex (2002-06-21 10:59:00) [8]Вместо иконки на кнопке белый квадрат
(Message.Result - хэндл MDIChild окна)
begin
case Message.Msg of
WM_MDICREATE:
begin
Icon := TIcon.Create;
Icon.Handle := GetClassLong(Message.Result,GCL_HICONSM);
mdiButton:=TMDIButton.Create(Message.Result, Self);
mdiButton.Parent:=Self;
mdiButton.Glyph.Width := 16;
mdiButton.Glyph.Height := 16;
mdiButton.Glyph.Canvas.Draw(0, 0, Icon);
Вопрос: почему
MBo (2002-06-21 08:53:00) [9]И в самом деле ;(
GetClassLong
GCL_HICON
GCL_HICONSM
Wizard_Ex (2002-06-21 08:47:00) [10]Как это нет
А рядом с Caption что находится?
Случайно не иконка?
MBo (2002-06-21 06:55:00) [11]у окна нет иконки. может, что-то другое имеется в виду?