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

Вниз

Получить иконку по 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 вся ветка

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

Наверх




Память: 0.5 MB
Время: 0.015 c
14-85165
Nikolay
2002-07-29 17:27
2002.08.26
Драйвер для CDRW


1-85105
npAKtuk
2002-08-14 13:43
2002.08.26
Как передать число после Formatfloat в Excel


6-85146
KPY
2002-06-14 15:50
2002.08.26
Как узнать под каким именем пользователь зашел в сеть?


1-85108
dimanew
2002-08-15 05:52
2002.08.26
Есть задача из ул.ленина сделать ул.Ленина, я использую


1-85084
Skfi
2002-08-14 08:06
2002.08.26
Текстовый файл