Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Вопрос: Как обновить рабочий стол (Desktop)?


Huliganka ©   (2005-08-11 11:55:00) 

Есть процедура (пишет текст на Desktop):

procedure WriteDC(s: string);
var c: TCanvas;
begin
 c := TCanvas.Create;
 c.Brush.Color := clBlue;
 c.Font.color := clYellow;
 c.Font.name := 'Fixedsys';
 c.Handle := GetDC(GetWindow(GetDesktopWindow, GW_OWNER));
 c.TextOut(screen.Width - c.TextWidth(s) - 100, screen.Height - 200, s);
 c.free;
end;

Хочу чтобы этот текст мигал на Desktope по таймеру.


Eraser   (2005-08-13 21:22:00) [1]

wicked ©   (13.08.05 17:47) [6]

Твоя правда! Действительно надо было обратить внимание на  c.Handle := GetDC(GetWindow(GetDesktopWindow, GW_OWNER));


wicked   (2005-08-13 17:55:00) [2]

касательно мигания текста по таймеру - я бы посоветовал выводить его в path, затем преобразовывать в region и присваивать окну этот region через SetWindowRgn... окно, разумеется, должно быть always-on-top... например, так (на билдере):
 // sample settings
 int x=0, y=0;
 const char *text="Sample Text";
 // begin path recording - in this case, just one string of text
 BeginPath(Canvas->Handle);
 // prevent the text box's outline from being added to the path
 SetBkMode(Canvas->Handle,TRANSPARENT);
 Canvas->TextOut(x,y,text);
 EndPath(Canvas->Handle);
 // now the path can be manipulated - in this case, turn into window outline
 HRGN region=PathToRegion(Canvas->Handle);
 ::SetWindowRgn(Handle,region,true);

пример не мой, но я по нему учился... :)

тогда мигание - это просто прятание и показывание окна...

так, как есть, тоже будет работать, но тормозов будет немерянно - всем окнам периодически будет приходить полный WM_PAINT, что есть очень накладно...


wicked   (2005-08-13 17:47:00) [3]

> Eraser ©   (12.08.05 01:33) [4]
это - освобождение обьекта c, в деструкторе которого сам dc не освобождается...
прежде чем писать здесь свои замечания, я посмотрел в файле graphics.pas на деструктор класса TCanvas... и вам советую поступать так же...


Kazakh   (2005-08-13 17:24:00) [4]

Я пользуюсь этим:

procedure TForm1.Button1Click(Sender: TObject);
begin
 SendMessage(FindWindow('Progman', 'Program Manager'),
 WM_COMMAND, $A065, 0);
end;
Можно и так

winexec(Pchar('rundll32 user,repaintscreen'), sw_Show);

или так

procedure RefreshDesktop;
var
 hDesktop: HWND;
begin
 hDesktop := FindWindowEx(FindWindowEx(
   FindWindow('Progman', 'Program Manager'), 0,
   'SHELLDLL_DefView', ''), 0, 'SysListView32', '');
 PostMessage(hDesktop, WM_KEYDOWN, VK_F5, 0);
 PostMessage(hDesktop, WM_KEYUP, VK_F5, 1 shl 31);
end;

так тоже можно

uses
  ShlObj;

procedure RefreshDesktop1;
begin
  SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, nil, nil);
end;


Eraser   (2005-08-12 01:33:00) [5]

wicked ©   (11.08.05 22:55) [3]
c.free;


А это что тогда?


wicked   (2005-08-11 22:55:00) [6]

замечание - а кто DC освобождать будет?...


Eraser   (2005-08-11 18:13:00) [7]

Huliganka   (11.08.05 11:55)

Ещё как вариант: InvalidateRect(0, nil, false);


Kerk   (2005-08-11 11:56:00) [8]

 RedrawWindow(0, nil, 0, RDW_ERASE + RDW_INVALIDATE + RDW_UPDATENOW
   + RDW_ALLCHILDREN);


Наверх

Титульная страница Поиск, карта сайта Написать письмо