Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.007 c
3-84870
Oleon
2002-08-05 13:39
2002.08.26
Создание и вызов UDF


3-84908
Mars
2002-08-06 17:16
2002.08.26
Что за ошибка -


1-85083
Groove
2002-08-14 18:06
2002.08.26
Сортировка


14-85234
VEG
2002-07-30 23:50
2002.08.26
Какой нужен возраст, чтобы стать


6-85148
atmospheric
2002-06-15 00:01
2002.08.26
Как из своей программы послать SMS.





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский