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

Вниз

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

 
Huliganka   (2005-08-11 11:55) [0]

Есть процедура (пишет текст на 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 по таймеру.


 
Kerk ©   (2005-08-11 11:56) [1]

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


 
Eraser ©   (2005-08-11 18:13) [2]

Huliganka   (11.08.05 11:55)

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


 
wicked ©   (2005-08-11 22:55) [3]

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


 
Eraser ©   (2005-08-12 01:33) [4]

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


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


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

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

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;


 
wicked ©   (2005-08-13 17:47) [6]

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


 
wicked ©   (2005-08-13 17:55) [7]

касательно мигания текста по таймеру - я бы посоветовал выводить его в 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, что есть очень накладно...


 
Eraser ©   (2005-08-13 21:22) [8]

wicked ©   (13.08.05 17:47) [6]

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



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

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

Наверх




Память: 0.48 MB
Время: 0.113 c
14-1127240450
QuaziLamo
2005-09-20 22:20
2005.10.09
CSS


14-1126871669
Vlad Oshin
2005-09-16 15:54
2005.10.09
тоже Пятничная загадка


14-1126702152
Ega23
2005-09-14 16:49
2005.10.09
Полный улёт!!!!!


4-1123941644
TheGUEST
2005-08-13 18:00
2005.10.09
Создание патча


2-1125033635
syte_ser78
2005-08-26 09:20
2005.10.09
Как правильно рефрешить?