Форум: "WinAPI";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.03.28;
Скачать: [xml.tar.bz2];




Вниз

Использование функции GetDesktopWnd 


MrAngel   (2002-01-21 12:06) [0]

Ребята, короче такой вопрос. Юзаю эту функцию(вроде она так называется). Затем получаю её HDC. Начинаю рисовать но не ресуется. Как вы думаете Почему?
Если не знаете что за функция, то поясню. Эта функция возвращяет HWND окна десктопа. Я хочу использовать её для рисования.Короче для создания динамически меняющегося десктопа.



Fellomena   (2002-01-21 12:11) [1]

Пример:

var
dc : hdc;
begin
dc := GetDc(0); // получаешь контекст устройства (в нашем случае десктоп)
MoveToEx(Dc, 0, 0, nil); // устанавливаешь курсор
LineTo(Dc, 150, 150); // рисуешь, используя в качестве параметра полученный контекст
ReleaseDc(0, Dc); // освобождаешь контекст
end;

Писала по памяти - но вроде всё правильно - попробуй.



MrAngel   (2002-01-21 12:13) [2]

Felomena всё верно.Я так и делаю только использую HWND не всего экрана а только Десктопа. Да на экране всё работает безупречно. А вот на десктопе нет!!!



Ally   (2002-01-21 12:16) [3]

>MrAngel

Тот HWND, o котором ты говоришь и так известен, потому что он равен 0. Для таких целей можно воспользоваться следующей схемой:


var
DCanvas: TCanvas;

begin
DCanvas := TCanvas.Create;
try
DCanvas.Handle := GetDC(0);
with DCanvas do
begin
...
{код отрисовки}
...
end;
finally
if (DCanvas <> nil) then DCanvas.Free;
end;
end;



MrAngel   (2002-01-21 12:21) [4]

Хорошо! А как тогда обьяснить следующее?
Я выполнил следующий код:
...
var W:HWND;
...
w:=GetDesktopWnd;
...
Насколько я помню в переменной W небыло нулевое значение!!!
Вроде там было w=123;!!!
Вот так :-)
Так что ребята вопрос остаётся открытым.



Fellomena   (2002-01-21 12:42) [5]

Давай уточним твой вопрос: тебе надо, что бы рисование происходило только на Рабочем Столе, но не на открытых окнах, т.е. не поверх всех окон - так ?
Т.е. если у тебя открыт проводник , то рисование происходит в области, не занятой окном проводника - только на Раб. столе. - правильно я поняла ?



MrAngel   (2002-01-21 12:46) [6]

Так точно.



MrAngel   (2002-01-21 12:53) [7]

Т.е. мне надо именно рисование только десктопа. чтобы ни иконки ни чужие окна не перерисовывались. Рисование у меня должно происходить как можно быстрее.



Ally   (2002-01-21 13:33) [8]

Sorry, упал инет :(

В хелпе написано про эту функцию вот что:

The GetDesktopWindow function returns the handle of the Windows desktop window. The desktop window covers the entire screen. The desktop window is the area on top of which all icons and other windows are painted.

Обратите внимание - "окно десктопа есть область, лежащая поверх всех отображенных икон и окон". Так что ни GetDesktopWindow, ни 0 нам не помогут... Надо подумать.



MrAngel   (2002-01-21 13:52) [9]

Ну и ну. Кажется я не доглядел на счёт этой функции. Хорошо тогда как можно рисовать на десктопе т.е. на том что находится под всеми окнами?



Gendalf   (2002-01-21 16:56) [10]

Насколько я знаю win не хранит информацию о том что под окнами, попробуйте рисовать на GetDC(0), но вычтя перед этим области других окон, и перерисовывайте каждую ... как сможете.



Ally   (2002-01-21 17:19) [11]

>Gendalf

Есть функция GetDCEx(), а у ней параметр flags = DCX_CLIPSIBLINGS, как раз для того, чтобы вычесть видимые области всех окон, расположенных над тем, чей хэндл передан в функцию... Надо проверять.



VuDZ   (2002-01-22 00:38) [12]

2MrAngel


HWND h = FindWindow("SysListView32", NULL);
HDC dc = GetDC(FindWindow("SysListView32", "FolderView"));
TextOut(dc, 0, 0, L"Hello, world!", 13);
HPEN pen = CreatePen(PS_SOLID, 10, RGB(255, 0, 0));
SelectObject(dc, &pen);
MoveToEx(dc, 0, 0, NULL);
LineTo(dc, 1024, 768);
ReleaseDC(FindWindow("SysListView32", "FolderView"), dc);

уж прости за сишный код, но делфю не помнб почти...
есть только одно но: если ты хочешь, что бы твоя картинка на десктопе была нормальной - тебе надо перехватывать все мессаги WM_PAINT & WM_ERASEBCKGRND иначе, ничего из этого путного не выйдет



Raptor   (2002-01-22 23:16) [13]

2 Ally
У тебя небольшие проблеммы с переводом. ;-))
Эта строка переводится примерно так:
Desktop Window - это область поверх которой рисуются все иконки и другие окна.

2 MrAngel
Посему что бы увидеть то, что ты нарисовал на Desktop Window необходимо спрятать все окна которые покрывают оное. Тогда результат рисования можна наблюдать на экране. Вот например так:


procedure DrawOnTheDesktopWindow;
Var DC:HDC;
wnd,PMWnd:HWND;
Brush:HBrush;
begin
wnd:=GetDesktopWindow;
PMWnd:=FindWindow(nil,"Program Manager");
DC:=GetDC(wnd);
Brush:=CreateSolidBrush($00FFFFF);
SelectObject(DC,Brush);
SetWindowPos(PMWnd,0,0,0,0,0,SWP_HIDEWINDOW);
Rectangle(DC,0,0,400,400);
ReleaseDC(wnd,DC);
Sleep(5000);
SetWindowPos(PMWnd,0,0,0,0,0,SWP_SHOWWINDOW);
end;



MrAngel   (2002-01-24 16:44) [14]

Raptor при этом варианте все окна будут как сумашедшие моргать.
Хотя стоит попробовать.
Дело в том что мне надо выводить графику как можно быстрее.
Может мне shell другой использовать?



Raptor   (2002-01-25 12:32) [15]

2MrAngel
Raptor при этом варианте все окна будут как сумашедшие моргать.
Дык это не моя идея, рисовать по десктопу. :-))
Я привел только пример, что бы показать, что все рисуется, только этого не видно из-за других окон которые покрывают десктоп. А вообще, это не самая лучшая идея рисовать на десктопе. Лучше рисовать на своем окне с помощью DirectX или OpenGL (оно так быстрее будет).
Может мне shell другой использовать?
Попробуй.



NetBreaker666   (2002-01-25 13:06) [16]

Люди, тогда кто может объяснить как сделан DreamRender ???



serjant   (2002-01-25 14:45) [17]

Сходи на www.sources.ru там есть охренительный пример как это делать.



DMN   (2002-01-25 16:09) [18]

Таки GetDesktopWindow на самом деле рисует по десктопу... Под окнами... Но! Чтобы это увидеть - выключи ActiveDesktop :) Он - окно, занимающее всю клиентскую область виндового десктопа...



Raptor   (2002-01-25 22:36) [19]

2 DMN
Чтобы это увидеть - выключи ActiveDesktop
Это не поможет. Надо еще и "Program Manager" спрятать, как делается в моем примере.



MrAngel   (2002-01-28 16:54) [20]

Народ свем спасибо. Вчера всё таки как это работает. Спасибо особенно Raptor © (22.01.02 23:16) за пример.
Так как форум тут разросся задам ещё один вопрос во второй части =)




Форум: "WinAPI";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.03.28;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.75 MB
Время: 0.036 c
1-91005           Dimitriy              2002-03-15 18:17  2002.03.28  
Cursor


4-91132           Itspets               2002-01-27 20:41  2002.03.28  
API функция есть в NT, но нет в Win9x


1-90904           Sound                 2002-03-18 13:06  2002.03.28  
Срочно нужна помощь!!! Как встроить в Delphi приложение компилятор Pascal?


1-90961           Turalyon              2002-03-14 10:00  2002.03.28  
Динамические массивы как параметры


3-90793           Alex_R                2002-03-01 18:02  2002.03.28  
Как определить, что использовать ExecSQL или Open