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

Вниз

Transparent icons and Active Desktop   Найти похожие ветки 

 
YY   (2003-07-21 22:53) [0]

Уж и не знаю, куда податься....
Может, тут кто-нибудь сможет подсказать, как сделать прозрачным фон иконок на рабочем столе при включённом Active Desktop?
Точнее, проблема со своевременным обновлением этого фона под иконками.

Вот такой код

LVHandle:=FindWindowEx(FindWindowEx(FindWindow("Progman","Program Manager"),0,"SHELLDLL_DefView",""),0,"SysListView32","");
ListView_SetTextBkColor(LVHandle,$FFFFFFFF);
InvalidateRect(LVHandle,0,True);
UpdateWindow(LVHandle);

без AD работает прекрасно, но с включённым Active Desktop фон остаётся на месте и "стирается" только если провести оконом по иконкам.
Некоторые считают это глюком, но, и в правду, IMHO Active Desktop освещён в документации Microsoft крайне скупо и как он работает не понятно.


 
Klev   (2003-07-21 23:42) [1]

Вообщем я сам не использую Active desktop, и другим не советую.
Но если запустить что-нибудь похожее на Spy32 for windowz(утилитку для просмотра информации об окнах), то можно заметить, что при включенном AD появляется новое окно, с классом "Internet Explorer_Server". Его-то и надо перерисовать.
Вот кусочек кода(мой вариант):


uses windows,CommCtrl;
procedure Desktop_transparent;
var Window,ie: HWND;
begin
Window := FindWindow("Progman", "Program Manager");
Window := FindWindowEx(Window, HWND(nil), "SHELLDLL_DefView", "");
Window := FindWindowEx(Window, HWND(nil), "SysListView32", "");
ListView_SetTextBkColor(Window, $ffffffff);
ListView_SetTextColor(Window, 16777215);
ListView_RedrawItems(Window, 0, ListView_GetItemCount(Window) - 1);
UpdateWindow(Window);
ie:=findwindow("Internet Explorer_Server",nil);
InvalidateRect(ie,0,True);

( ie)
Вообщем я сам не использую Active desktop, и другим не советую.
Но если запустить что-нибудь похожее на Spy32 for windowz(утилитку для просмотра информации об окнах), то можно заметить, что при включенном AD появляется новое окно, с классом "Internet Explorer_Server". Его-то и надо перерисовать.
Вот кусочек кода(мой вариант):


uses windows,CommCtrl;
procedure Desktop_transparent;
var Window,ie: HWND;
begin
Window := FindWindow("Progman", "Program Manager");
Window := FindWindowEx(Window, HWND(nil), "SHELLDLL_DefView", "");
Window := FindWindowEx(Window, HWND(nil), "SysListView32", "");
ListView_SetTextBkColor(Window, $ffffffff);
ListView_SetTextColor(Window, 16777215);
ListView_RedrawItems(Window, 0, ListView_GetItemCount(Window) - 1);
UpdateWindow(Window);
ie:=findwindow("Internet Explorer_Server",nil);
InvalidateRect(ie,0,True);

updatewindow(ie);
end;


 
YY   (2003-07-25 00:15) [2]

Спасибо большое. Действительно, надо было просто обновить это окно. Однако тут есть одна неприятность: вместе с этим окном перерисовываются и все окна, его перекрывающие (грубо говоря, все развёрнутые окна). Поэтому вопрос несколько меняется: как бы мне обновить окно, не перерисовывая перекрывающих его окон?
Например, когда я нажимаю F5, перерисовывается только Desktop и все окна остаются в покое.



Страницы: 1 вся ветка

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

Наверх




Память: 0.47 MB
Время: 0.019 c
1-82176
Юрий Ж.
2003-09-12 22:23
2003.09.25
TrackBar?


6-82377
Flying Home
2003-07-29 14:15
2003.09.25
Серврное приложение


1-82228
DROZD
2003-09-11 09:03
2003.09.25
Морфология руского


4-82553
II
2003-07-22 14:15
2003.09.25
Я поставил hook на WH_CALLWNDPROC. Как мне узнать от кокого окна


3-82110
Vovan
2003-09-04 17:30
2003.09.25
Выполнение Query+кода в отдельном потоке