Форум: "WinAPI";
Текущий архив: 2002.08.26;
Скачать: [xml.tar.bz2];
ВнизПолучить иконку по Handle у окна Найти похожие ветки
← →
Wizard_Ex (2002-06-21 06:50) [0]Есть Handle окна
как по Handle"у окна получить его иконку и передать ее спидбуттону
← →
MBo (2002-06-21 06:55) [1]у окна нет иконки. может, что-то другое имеется в виду?
← →
Wizard_Ex (2002-06-21 08:47) [2]Как это нет
А рядом с Caption что находится?
Случайно не иконка?
← →
MBo (2002-06-21 08:53) [3]И в самом деле ;(
GetClassLong
GCL_HICON
GCL_HICONSM
← →
Wizard_Ex (2002-06-21 10:59) [4]Вместо иконки на кнопке белый квадрат
(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);
Вопрос: почему
← →
Юрий Зотов (2002-06-21 12:38) [5]Glyph.Assign ?
← →
Игорь Шевченко (2002-06-21 14:18) [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-окон, их активацией и т.д.
С уважением,
← →
Wizard_Ex (2002-06-21 15:26) [7]// Юрий Зотов © (21.06.02 12:38)
// Glyph.Assign ?
Что значит assign
он тут не проходит: TIcon и TBitmap
Игорь Шевченко © (21.06.02 14:18)
это вариант, НО
здесь нужно править код главной формы и код MDI окон
в моем случае этого делать не надо и главное для этого он и нужен
чтобы не модифицировать код - компонент все сделает сам
мне нужно получить эту чертову иконку в коде компонента и все,
потому как все что нужно он сам перехватывает,
создание, активизацию, закрытие, минимизацию и т.д. и т.п.
все остальное работает как надо
Best regards, Wizard_Ex
← →
Wizard_Ex (2002-06-21 15:29) [8]Почему же Handle иконки = 0 я не понимаю
← →
Игорь Шевченко (2002-06-21 15:39) [9]Потому что она (иконка) не успевает еще установиться, в момент обработки сообщения WM_MDICREATE. Не уверен, правда, но полагаю, что поэтому.
← →
Wizard_Ex (2002-06-21 15:57) [10]Значит
на WM_MDIACTIVATE тоже иконки еще нет получается
ити ее за ногу
← →
Игорь Шевченко (2002-06-21 16:16) [11]Вот способ вытягивания иконки всеми известными мне способами:
В 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;
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2002.08.26;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.006 c