Форум: "WinAPI";
Текущий архив: 2005.10.09;
Скачать: [xml.tar.bz2];
ВнизВопрос: Как обновить рабочий стол (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 вся ветка
Форум: "WinAPI";
Текущий архив: 2005.10.09;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.023 c