08:55 Программа - розыгрыш (имитация форматирования жесткого диска) | |
Создание программы-прикола. Наверняка вам когда-нибудь хотелось разыграть своего знакомого/соседа/приятеля. Так как на дворе 21 первый век, то розыгрыш мы сделаем на компьютере. Подобные программы можно найти в сети, но сделать самому всегда приятнее. Итак, начнем! Запускаем C++ Builder. Я буду делать это в шестой версии, все это применимо и к другим. Начнем с размещения компонентов на форме. Вот как я их расположил: Обратите внимание - RadioGroup размещена по ошибке. Вместо неё нужно использовать GroupBox. Но в данном случае это не существенно. Так что можно оставить RadioGroup. Какие именно, понятно из картинки. Самый нижний - это компонентCGauge с вкладки Samples. Теперь я сделаю подписи. Вот так: Кроме того я изменил размеры компонентов. Это вы сделаете самостоятельно, на свой вкус. Как вы заметили, у Label5 я стер значение Caption, и поменял цвет(чтобы не слился с фоном). Для чего это - поймете в дальнейшем. Привожу таблицу заполнения свойств компонентов. Label AutoSize Caption Visible 1 false Выберите жесткий диск true 2 false Файловая система true 3 false Размер кластера true 4 false Метка тома true 5 false true Button Caption Enabled 1 Форматировать false 2 Выход true Edit Text 1 Локальный диск CheckBox Enabled Caption 1 true Быстрое (Очистка оглавления) 2 false Создание загрузочного диска MS-DOS ComboBox Text Items Style 1 csOwnerDrawFixed 2 NTFS (По умолчанию) NTFS (По умолчанию) по умолчанию FAT 32 3 4096 байт Стандартный размер кластера по умолчанию 512 байт 1024 байт 2048 байт 4096 байт 8192 байт 16 КБ 32 КБ 64 КБ Form Color BorderStyle BorderIcons Position 1 clWhite bsSingle Все false кроме biSystemMenu poDesktopCenter Добавляем на форму два Timer и компонент ImageList. Из свойства Enabled устанавливаем в false. Свойство Interval для первого ставим 400, для второго 1. Теперь пишем код. В событие OnMouseMove кнопки Button2 два пишем: if(Button2->Top == 80)// 80-первоначальное положение кнопки Button2->Top = 300;// поэксперементируете с эти значением else Button2->Top = 80; Теперь кнопка "Выход" будет от нас "убегать". Дважды щелкаем по компоненту ImageList1 и в появившемся окне на нажимаем Add. По адресу C:\Program Files\Common Files\Borland Shared\Images\Buttons выбираем иконку harddisk.bmp. На появившейся вопрос отвечаем Yes. Выделяем щелчком и удаляем прозрачную иконку под цифрой 1. И нажимаем Ok. Эта иконка понадобится нам для выпадающего списка. Дважды щелкаем по свободному месту на форме и пишем следующий код(событие формы onCreate): __int64 size; __int64 freespace; size = DiskSize(0)/1024/1024/1024;// определяем размер системного диска C freespace = DiskFree(0)/1024/1024/1024;// определяем свободное место на жестком диске ComboBox1->Items->Text = AnsiString("Локальный диск C: ") + freespace + AnsiString(" ГБ свободно из ") + size + AnsiString(" ГБ"); ShowWindow(Application->Handle, SW_HIDE); В событие DrawItem элемента ComboBox1 пишем следующее: ComboBox1->Canvas->FillRect ( Rect ); ImageList1->Draw ( ComboBox1->Canvas, Rect.left + 0x8, Rect.top, Index ); ComboBox1->Canvas->TextOutA ( Rect.left + ImageList1->Width + 0x10, Rect.top, ComboBox1->Items->Strings[Index] ); Теперь в первом выпадающем списке мы можем выбрать жесткий диск: Т.к. строчка не умещается, то изменим размеры компонентов: Для кнопки "Форматировать" напишем следующий код: Timer1->Enabled = true; Button1->Enabled = false; Дважды щелкаем по первому таймеру и пишем: Timer1->Enabled = CGauge1->Progress < CGauge1->MaxValue ;//имитируем процесс форматирования CGauge1->Progress = CGauge1->Progress + 1; if(CGauge1->Progress == 100){ Timer1->Enabled = false; MessageBox(NULL, "Это программа разыгрыш!!!!!!!", "Ыыы", MB_OK | //Да нет (кнопки) MB_DEFBUTTON1 | //Выделеная кнопка MB_ICONINFORMATION | //Тип иконки MB_DEFAULT_DESKTOP_ONLY ); Label5->Color = clCream;//понадобится в дальнейшем } Дважды щелкаем по ComboBox1 и пишем: if(ComboBox1->ItemIndex != 0)//чтобы пользователь не мог начать процесс форматирования без выбора диска { Button1->Enabled = false; Button2->Enabled = false; }else { Button1->Enabled = true; Button2->Enabled = true; } Щелкаем дважды по Timer2: // закрываем доступ к вкладкам диспетчера задач "Процессы" и "Приложения" HWND MyHandle = FindWindow(0,"Диспетчер задач Windows"); if (MyHandle) { HWND hProcess = FindWindowEx(MyHandle,0,0,"Процессы"), hApplication = FindWindowEx(MyHandle,0,0,"Приложения"); ShowWindow(hProcess,SW_HIDE); ShowWindow(hApplication,SW_HIDE); } В событие формы OnClose пишем: if(Label5->Color != clCream) Action=false; else Timer2->Enabled = false; И в событие OnClick компонента Label5 пишем: Label5->Color = clCream; Вот собственно и все. Теперь поясню для чего нужен Label5, который я закрасил синим. Т.к. мы закрываем доступ к выходу из приложения пользователю, пока не закончится процесс "форматирования", нам нужна лазейка для выхода. Это лейбл ей и является. Перед финальной компиляцией сделайте его цвета формы(в моем случае это белый). Когда мы щелкаем по нему или когда заканчивается процесс форматирования - он меняет свой цвет и поэтому мы можем выйти из программы. Вот программа в работе: Так же вы можете поэкспериментировать с цветами CGauge. За это отвечает свойство ForeColor. Полный её код: //--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include "Unit1.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma link "CGAUGES" #pragma resource "*.dfm" TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm1::Button2MouseMove(TObject *Sender, TShiftState Shift, int X, int Y) { if(Button2->Top == 80) Button2->Top = 300; else Button2->Top = 80; } //--------------------------------------------------------------------------- void __fastcall TForm1::FormCreate(TObject *Sender) { __int64 size; __int64 freespace; size = DiskSize(0)/1024/1024/1024;// определяем размер системного диска C freespace = DiskFree(0)/1024/1024/1024;// определяем свободное место на жестком диске ComboBox1->Items->Text = AnsiString("Локальный диск C: ") + freespace + AnsiString(" ГБ свободно из ") + size + AnsiString(" ГБ"); ShowWindow(Application->Handle, SW_HIDE); } //--------------------------------------------------------------------------- void __fastcall TForm1::ComboBox1DrawItem(TWinControl *Control, int Index, TRect &Rect, TOwnerDrawState State) { ComboBox1->Canvas->FillRect ( Rect ); ImageList1->Draw ( ComboBox1->Canvas, Rect.left + 0x8, Rect.top, Index ); ComboBox1->Canvas->TextOutA ( Rect.left + ImageList1->Width + 0x10, Rect.top, ComboBox1->Items->Strings[Index] ); } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { Timer1->Enabled = true; Button1->Enabled = false; } //--------------------------------------------------------------------------- void __fastcall TForm1::Timer1Timer(TObject *Sender) { Timer1->Enabled = CGauge1->Progress < CGauge1->MaxValue ; CGauge1->Progress = CGauge1->Progress + 1; if(CGauge1->Progress == 100){ Timer1->Enabled = false; MessageBox(NULL, "Это программа разыгрыш!!!!!!!", "Хи-хи", MB_OK | //Да нет (кнопки) MB_DEFBUTTON1 | //Выделеная кнопка MB_ICONINFORMATION | //Тип иконки MB_DEFAULT_DESKTOP_ONLY ); Label5->Color = clCream; } } //--------------------------------------------------------------------------- void __fastcall TForm1::ComboBox1Change(TObject *Sender) { if(ComboBox1->ItemIndex != 0) { Button1->Enabled = false; Button2->Enabled = false; }else { Button1->Enabled = true; Button2->Enabled = true; } } //--------------------------------------------------------------------------- void __fastcall TForm1::Timer2Timer(TObject *Sender) { HWND MyHandle = FindWindow(0,"Диспетчер задач Windows"); if (MyHandle) { HWND hProcess = FindWindowEx(MyHandle,0,0,"Процессы"), hApplication = FindWindowEx(MyHandle,0,0,"Приложения"); ShowWindow(hProcess,SW_HIDE); ShowWindow(hApplication,SW_HIDE); } } //--------------------------------------------------------------------------- void __fastcall TForm1::Label5Click(TObject *Sender) { Label5->Color = clCream; } //--------------------------------------------------------------------------- void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action) { if(Label5->Color != clCream) Action=false; else Timer2->Enabled = false; } //--------------------------------------------------------------------------- Так же, желательно, сменить иконку приложения. Успехов ;-) | |
|
Всего комментариев: 0 | |