Password
    
 К титульной странице  |  Форум  |  О проекте  |  Словарь  |  Товары  |  Сделать стартовой  |  В Закладки   
Авторизация
Забыли пароль?
Регистрация 
 
Программирование
Безопасность
Демосцена
Игры
WEB-мастерская
Программное обеспечение
Аппаратное обеспечение



Последние материалы
  The Chronicles of Riddick: Escape from Butcher bay

  Что такое хорошо и что такое плохо, или FAQ по LCD-мониторам

  Организация удаленного доступа

  Инсталляция программного обеспечения используя GPO

  Smarty в веб-разработке

  BioShock или кафе разбитых надежд...



Последние новости
  Латвия подписала АСТА

  Примечательная промо-акция игры STAR WARS: The Old Republic на Times Square в Нью Йорке

  На сайте выложены первые выпуски легендарной телепередачи о компьютерных играх "От винта!"

  На сайте опубликован энциклопедический словарь по информатике Э.Якубайтиса

  Конференция Разработчиков Видеоигр, 1979

  Более шустрый и динамичный Mail.lv



Charitable advertising
Њл ­г¦¤ Ґ¬бп ў ў иҐ© Ї®¬®йЁ!



Ziedot.lv

Penn State Child Life Program



Программирование --> Pascal/Delphi
Работа с окнами
  
Автор: Денис Обыденных
Источник:
Опубликовано: [2005-06-08 22:02]
Итак, в этой довольно не большой статье я хотел бы рассказать тебе про такую хорошую вещь как работа с окнами. При создании каждого нового окна в системе ему присваивается указатель - иначе говоря хэндл. Через этот указатель мы можем совершать много всяких интересных вещей, к примеру используя процедуру SendMessage(handle,message,wParam,lParam). В ней четыре параметра - хэндл объекта которому посылаем сообщение, само сообщение, параметры сообщения. Чтоб закрыть чужое окно, к примеру, мы должны сделать такой финт ушами...

SendMessage(handle,wm_close,0,0);

После такого окно которому мы это посылаем закроется, ежели конечно программа не имееет какой-то собственный обработчик этого сообщения. Но конечно возникает вопрос, а как нам узнать этот самый хэндл того окна над которым мы хотим жестоко надругаться? А для этого есть функции FindWindow и FindWindowEx. Описываются они так:

FindWindow(lpClassName:PAnsiChar,lpWindowName:PAnsiChar);

В этой функции - два параметра: первый - имя класса окна, второй - имя окна.

FindWindowEx(Parent:hwnd,child:hwnd,ClassName:PAnsiChar,WindowName:PAnsiChar);

Здесь четыре параметра - родительское окно на котором мы ищем элемент управления, с какого элемента начать поиск, класс элемента управления, имя. Если вместо имени указать nil, то будет идти поиск всех элементов подобного класса.
Примерчик:

var
Panel,Pusk:hwnd;
begin
Panel:=FindWindow('Shell_TrayWnd',nil);
Pusk:=FindWindowEx(Panel,0,'Button',nil);
end;

В этом примере мы сначала находим идентификатор панели задач, а затем находим на ней единственную кнопку - кнопку Пуск. А так как теперь есть их идентификаторы, то мы можем сделать некоторые интерестные вещи. К примеру ShowWindow (скрыть/показать), EnableWindow(активировать/дизактивировать) , SetWindowText(сменить текст) ну и еще пожалуй смену картинки на пуске. В общем хватит теории - пишем прогу.

Практика началась...

Сначала кидай на прогу 6 баттонов.Еще я добавил панель и image для того чтоб туда помещать пикчуресу ( picture ) которую мы собираемся запихнуть на Пуск. Ну и еще надо кинуть один edit, куда будем вводить текст который появится на пуске.

Ну а теперь непосредственно к кодингу. В разделе объявления переменных public - пиши

public
{ Public declarations }
Panel,Pusk:hwnd;
end;

Этим мы обьявляем две переменные в которые путем помещать нужные нам хэндлы. Дважды щелкни на форме - появится событие FormCreate - там пиши такой обработчик:

procedure TForm1.FormCreate(Sender: TObject);
begin
Panel:=FindWindow('Shell_TrayWnd',nil);
Pusk:=FindWindowEx(Panel,0,'Button',nil);
end;

Теперь при создании формы мы узнаем эти самые идентификаторы Панели задач и кнопки Пуск.

Прячем/показываем кнопку Пуск

В обработчике кнопки "Спрятать" пиши следующее:

procedure TForm1.Button1Click(Sender: TObject);
begin
ShowWindow(pusk,sw_hide);
end;

А в обработчике батона "Показать" пиши тоже самое , только замени sw_hide на sw_show. Зачем наверное понятно :) Для панели - аналогично, только замени Pusk на Panel

Включаем/отключаем кнопку Пуск

Для этого надо использовать EnableWindow, где параметры - хэндл и булева переменная показывающая что надо сделать.

Procedure TForm1.DisablePuskClick(Sender: TObject);
begin
EnableWindow(Pusk,false);
end;

Чтоб включить - замени false на true. Для панели - аналогично, только замени Pusk на Panel.

Смена картинки на пуске (только для 9*/Me)

Вот такую функцию я накатал для замены картинки на Пуске:

function ChangePicture(SeenByUser:TImage; paramstrZ:string;):boolean;
// ^^^^^^^^^^^^^^^^^В этот image будет грузится картинка
begin
if fileexists(paramstrZ) then // файл-картинка существует?
begin
SeenByUser.Picture.LoadFromFile(paramstrZ); //Грузим картинку из файла
SendMessage(Pusk,BM_SetImage,0,SeenByUser.picture.bitmap.handle); //Ставим картинку
end
else messagebox(hndl,PChar('Файл - '+paramstrZ+' к твоему сведенью не существует!'),PChar('Pusk'),mb_iconstop);
end;

Смена надписи на Пуске

А вот это делается и того легче:

SetWindowText(StartBtnBmp,PChar(edit1.text)); //Меняем надпись
InvalidateRect(StartBtnBmp,nil,true); //Перерисовываем Пуск

Вот и все... На пока хватит. В одной из следующих статей расскажу как задавать окну произвольную форму.

Хиппи енд.





Перейти к рубрике --> Pascal & Delphi

Наши друзья
Juridiskie pakalpojumi  
IT Works
  Codenet - всё для программиста
   
• Hi-tech NEWS • InCube e-mag
  Программисты, Вам сюда!
КомментарииВсего:0


Только зарегистрированные пользователи могут оставлять здесь комментарии. Зарегистрироваться можно здесь. Если вы уже зарегистировались ранее, то можете войти в систему здесь.


© Mihail Chernov (MiHack) Обмен ссылками