Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.04.2009, 14:31   #1
Darte
Новичок
Джуниор
 
Аватар для Darte
 
Регистрация: 24.04.2009
Сообщений: 2
По умолчанию Форма только на рабочем столе

Доброе время суток.
Начал делать проект к зачёту, столкнулся с некоторыми трудностями.
Подскажите, пожалуйста, как сделать так, чтобы форма отображалась только на рабочем столе.. Так сказать на фоне..
И ещё... Можно ли сделать так, чтобы форма была прозрачной, но компоненты, находящиеся на ней, оставались видимыми.
Пишу Delphi 7.
Спасибо.
Darte вне форума Ответить с цитированием
Старый 24.04.2009, 14:39   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Так сказать на фоне
Меняй для нее родителя:
Код:
windows.SetParent(form1.handle,0)
или создавай с указанием родителя - рабстола:
Код:
form1:=TForm1.CreateParented(GetDesktopWindow);
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 24.04.2009, 16:01   #3
qpokyc
Форумчанин
 
Аватар для qpokyc
 
Регистрация: 07.04.2009
Сообщений: 117
По умолчанию

К примеру выше надо исчо добавить чтоб работало:
Код:
  var
    WLS: Cardinal;
  begin
    WLS := GetWindowLong(Handle, GWL_STYLE);
    WLS := WLS OR WS_CHILD;
    SetWindowLong(Handle, GWL-STYLE, WLS);
  end;
Иначе всеравно будет наверху.

Однако, 0, DesktopWindow и то что нужно - не одно и тоже! 0 - хендл предка по умолчанию, а у DesktopWindow есть контрол, на который и нужно помещать окно в примере (у него есть название, но я не помню).

Вобщем, идеально работает только пример где ставил таймер на 3 сек и переводил курсор на рабочий стол. Обработчик таймера такой:
Код:
begin
  Windows.SetParent(Handle, Windows.WindowFromPoint(Mouse.CursorPos));
  Timer1.Enabled := False;
end;
В остальных случаях либо вообще не катит, либо работает, но криво (особенно Windows.SetParent(Handle, GetDesktopWindow))
Хэндлы были такими (но далеко не факт, что они везде такие):
Предок по умолчанию = 0
DesktopWindow = 65556;
То что нужно = 65664;

Конечно, кривым способом можно вычислить последний хэндл, но было бы интересно узнать - как это правильно сделать, если кто знает...
Copyright © qpokyc (qpy[the dog]bk.ru), 2008-2009 г.

Последний раз редактировалось qpokyc; 24.04.2009 в 16:09.
qpokyc вне форума Ответить с цитированием
Старый 24.04.2009, 16:27   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Согласен. Вот поправлю для ХР:
Код:
procedure TForm1.Timer1Timer(Sender: TObject);  var h:hwnd;
begin
   h:=FindWindow('Progman','Program Manager');
  h:=FindWindowEx(h,0,'SHELLDLL_DefView','');
  h:=FindWindowEx(h,0,'SysListView32','FolderView');
windows.SetParent(Handle,h);
end;
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 24.04.2009, 20:49   #5
DomiNick
Студент, не
Старожил
 
Аватар для DomiNick
 
Регистрация: 29.01.2009
Сообщений: 2,067
По умолчанию

Цитата:
Согласен. Вот поправлю для ХР:
Прекрасно работает, но для чего оно в таймере-то? Достаточно одного раза при создании формы...
И кстати что такое 'Progman'..?

Мне как-то нужно было получить рабочий стол и я смог раскопать такую функцию...
Код:
Function GetDesktopHandle: THandle;
Begin
Result:=FindWindow('ProgMan', Nil);
Result:=GetWindow(Result, GW_CHILD);
Result:=GetWindow(Result, GW_CHILD);
End;
И в ней такой же 'Progman'.....


Ну и ещё такой глупый вопрос не совсем в тему: в чём разица между "HDC" и "HWND"..?
I am the First of Cyber Evolution...
I am the First to Program your Future...

Последний раз редактировалось DomiNick; 24.04.2009 в 21:13. Причина: Дополнение
DomiNick вне форума Ответить с цитированием
Старый 25.04.2009, 10:05   #6
Darte
Новичок
Джуниор
 
Аватар для Darte
 
Регистрация: 24.04.2009
Сообщений: 2
По умолчанию

Спасибо, вроде разобрался..
А что насчёт прозрачной формы и непрозрачных компонентов?
Darte вне форума Ответить с цитированием
Старый 27.04.2009, 11:53   #7
qpokyc
Форумчанин
 
Аватар для qpokyc
 
Регистрация: 07.04.2009
Сообщений: 117
По умолчанию

Цитата:
Прекрасно работает, но для чего оно в таймере-то? Достаточно одного раза при создании формы...
Эээ.. это была индейская хитрость - я ловил хэндл по курсору, а для этого надо было успеть отвести его куда надо))
Stilet исправил этот деффект. Таймер там нипричем).

Экспериментировал с оконными стилями, но желаемого эффекта так и не получил (( вероятно здесь надо обращаться к GDI.
Copyright © qpokyc (qpy[the dog]bk.ru), 2008-2009 г.
qpokyc вне форума Ответить с цитированием
Старый 27.04.2009, 12:21   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
но для чего оно в таймере-то?
Упс... хы... Мусор.
Цитата:
Stilet исправил этот деффект. Таймер там нипричем).
Дык это бубен для шамана, дабы Ктулху не расслаблялся
Цитата:
в чём разица между "HDC" и "HWND"..?
HWND - Хендл на обьект окна (стили, размеры, параметры...)
HDC - хендл на контекст окна, т.е. на его пиксели чтоб рисовать - портал для отрисовки
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создать иконку на рабочем столе Михаил Юрьевич Win Api 6 15.04.2009 12:55
Вращение 5-угольника на рабочем столе Ratte Помощь студентам 7 21.04.2008 18:41
Значки на рабочем столе Xardas Свободное общение 4 01.03.2008 20:21
SpeedButton на рабочем столе ERASERROR Общие вопросы Delphi 10 22.01.2008 16:58
html на рабочем столе >AdepT< Win Api 4 28.02.2007 20:06