![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вопрос: Как обновить рабочий стол (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);