Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 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) за пример.
Так как форум тут разросся задам ещё один вопрос во второй части =)



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

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

Наверх





Память: 0.49 MB
Время: 0.154 c
14-91053
dimich
2002-02-14 14:01
2002.03.28
Проблема с bootMagic


7-91094
BFG
2001-12-26 23:31
2002.03.28
Мышь


1-90921
SB
2002-03-13 21:56
2002.03.28
Случайное число


1-90946
Irina Lisova
2002-03-13 19:06
2002.03.28
TreeView как распечатать дерево ?


14-91076
Juct_me
2002-02-15 21:52
2002.03.28
Как мне изменить: Размер шрифта в свойствах экрана ?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский