DevProg: Блог для программистов

Секреты программирования. Примеры разработки. Обзоры программёрского софта, блогов и форумов и просто полезные советы!

Borland C++ Builder. Советы работы с формами.

Posted by devprog на Январь 29, 2009

Ещё один очень интересный FAQ! Все примеры можно легко перевести на Delphi. Но если вы испытываете трудности – милости просим, пишите – поможем.

Запрещение кнопки закрытия [X] формы

// Чтобы запретить кнопку закрытия формы, напишите следующий
// код (Form1- ваша форма, Button1 — кнопка на ней):
void __fastcall TForm1::Button1Click(TObject *Sender)
{
HMENU MenuHandle = GetSystemMenu(Handle, false);
if(MenuHandle)
  DeleteMenu(MenuHandle, SC_CLOSE, MF_BYCOMMAND);
}

Запрещение кнопки максимизации [[]] формы

// Чтобы запретить кнопку максимизации формы, напишите
// следующий код (Form1- ваша форма, Button1 — кнопка на ней):
void __fastcall TForm1::Button1Click(TObject *Sender)
{
HMENU MenuHandle = GetSystemMenu(Handle, false);
if(MenuHandle)
  DeleteMenu(MenuHandle, SC_MAXIMIZE, MF_BYCOMMAND);
}
// ПРИМЕЧАНИЕ: максимизация формы двойным щелчком мыши
// по заголовку также будет невозможна

Запрещение кнопки минимизации [_] формы

// Чтобы запретить кнопку минимизации формы, напишите
// следующий код (Form1- ваша форма, Button1 — кнопка на ней):
void __fastcall TForm1::Button1Click(TObject *Sender)
{
HMENU MenuHandle = GetSystemMenu(Handle, false);
if(MenuHandle)
  DeleteMenu(MenuHandle, SC_MINIMIZE, MF_BYCOMMAND);
}

Отмена закрытия формы при нажатии Alt+F4

// Чтобы форма не закрывалась при нажатии комбинации клавиш
// Alt+F4, разместите на форме компонент TActionList(ActionList1),
// создайте новый TAction(Action1), и в свойстве ShortCut у Action1
// пропишите комбинацию клавиш Alt+F4, а обработчик события
// OnExecute должен выглядеть следующим образом
// (Form1- ваша форма):
void __fastcall TForm1::Action1Execute(TObject *Sender)
{
// чтобы при сохранении C++Builder не уничтожил обработчик
}

Отмена закрытия формы при нажатии Alt+F4 (Вариант 2)

//В обpаботчике FormKeyDown пишешь:
if (Shift.Contains(ssAlt)&&Key==VK_F4) Tag=1;

//В обpаботчике FormCloseQuery:
if(Tag)
{
CanClose=false;
Tag=0;
}

Перемещение формы мышью не за заголовок

// Напишите следующий обработчик события OnMouseDown формы
void __fastcall TForm1::FormMouseDown(TObject *Sender, TMouseButton Button,
TShiftState Shift, int X, int Y)
{
 long SC_DRAGMOVE = 0xF012;
 if(Button == mbLeft)
  {
  ReleaseCapture();
  SendMessage(Handle, WM_SYSCOMMAND, SC_DRAGMOVE, 0);
 }
}

Изменение размеров формы (развернуть и т.д.)

// Напишите следующий код:
Form1->WindowState = wsMaximized; // развернуть
Form1->WindowState = wsMinimized; // минимизировать
Form1->WindowState = wsNormal; // первоначальный размер

Как сделать кусок окна прозрачным

// Для того чтобы сделать кусок формы прозрачным,
// напишите следующий код:

//Прямоугольный кусок
HRGN R1=CreateRectRgn(0, 0, Width, Height);
HRGN R2=CreateRectRgn(4, 24, Width-4, Height-4);
CombineRgn(R1, R1,R2, RGN_DIFF);
SetWindowRgn(Handle, R1, TRUE);

//Кусок в виде элипса
HRGN hRgn1 = CreateRectRgn(0, 0, Width, Height);
HRGN hRgn2 = CreateEllipticRgn(0, 0, Width, Height);
HRGN hRgn3 = CreateRectRgn(0, 0, Width, Height);
CombineRgn(hRgn3, hRgn1, hRgn2, RGN_DIFF);
SetWindowRgn(Handle, hRgn3, TRUE);
//можно заменить hRgn3 на hRgn2

//Кусок в виде пятиугольника
HRGN Reg1, Reg2;
HRGN Region;
POINT p[5];
p[0] = Point(100, 0);
p[1] = Point(Width-100, 0);
p[2] = Point(Width, Height/2);
p[3] = Point(Width/2, Height);
p[4] = Point(0, Height/2);
Region = CreatePolygonRgn(p, 5, ALTERNATE);
SetWindowRgn(Handle, Region, true);

Создание новой формы во время работы программы

// Для того чтобы создать новую форму напишите:
// следующих код:

TForm * Formik= new TForm(this);
TButton* button=new TButton(Application);
button->Parent=Formik;
button->Caption=»New Button»;
button->Left=10;
button->Top=15;
button->Show();
Formik->Caption=123;
Formik->ShowModal();
delete Formik;

Как сделать прозрачную форму в W2K/XP

// Для того чтобы сделать прозрачную форму напишите:
int Transparency = 75;//насколько прозрачным будет окно (0-100%)
long ExtStyle = GetWindowLong(Handle, GWL_EXSTYLE);
SetWindowLong(Handle, GWL_EXSTYLE, ExtStyle | WS_EX_LAYERED);
SetLayeredWindowAttributes(Handle, 0 , (255 * Transparency) / 100,
LWA_ALPHA);

Прозрачное окно с реакцией на нажатия кнопок, панелей

// Для того чтобы создать форму напишите:
void __fastcall TForm1::Photo()
{
int X0,Y0;
bool Flag;
TRect ScreenRect;
TCanvas* ScreenCanvas=new TCanvas;
try
{
  Top=0;
  Left=Screen->Width;
  Width=Screen->Width;
  Height=Screen->Height;
  ScreenRect=Rect(0,0,Width,Height);
  ScreenCanvas->Handle=GetDC(0);
  Image1->Canvas->CopyRect(ScreenRect, ScreenCanvas,ScreenRect);
  ReleaseDC(Handle,ScreenCanvas->Handle);
  Left=Top;
} __finally
{
  delete ScreenCanvas;
}
}

Новая форма как отдельное окно

// Для того чтобы создать новую форму напишите:
void __fastcall TForm1::CreateParams(TCreateParams& Params)
{
TForm::CreateParams(Params);
Params.WndParent = 0;
}

Приложение без формы

Создайте новый проект. Дальше: Project->Remove from project

Определения класса окна определённого приложения

Для того чтобы определить класс определённого приложения напишите следующий код:

HWND hWnd=FindWindow(NULL,»Калькулятор»);//для русскоязычной Windows
if (hWnd)
{
char buff[100];
GetClassName(hWnd,buff,100);
ShowMessage(buff);
}
Автор: Srpj Сайт: http://srpj.narod.ru/

Как заполнить канву формы, фоном рабочего стола

// Напишите следующий код:
PaintDesktop(Form1->Canvas->Handle);

Реклама

комментариев 10 to “Borland C++ Builder. Советы работы с формами.”

  1. jakomokazanova said

    спасибо,
    хорошо что есть люди, которым не лень делиться своими знаниями :)

  2. devprog said

    Собственно это не мои знания, этот FAQ я откопал в интернете, скопировал себе на хард и в блог

  3. Victor said

    Много мук я терпел и страдать был бы рад
    Лишь бы Друг бы поспел …
    и по форме дал вклад …

  4. Victor said

    … а как для случая «Создание новой формы во время работы программы … »
    сделать так (как корректно прописать), чтобы командная кнопка «button» ещё и работала по клику? Был бы премного благодарен …
    С уважением
    Victor

  5. Victor said

    Помогите кто может!

    При “Создании новой формы во время работы программы … ” на ней отображается командная кнопка “button”, но не запускается код, когда командная кнопка “button” нажата (хотя нажатие иммитируется на форме) …

    Не знаю как всё это корректно прописать …

  6. DevProg said

    Viktor, вам нужно зарание определить процедуру, которая будет срабатывать по нажатии на кнопку, и при создании родительской формы (или как нить ещё…) присваивать к создаваимой кнопке к событию OnClick адрес этой процедуры… Чёт вроде того…

  7. TopCore said

    Очень хороший блог. Спасибо Вам огромное. Благодаря таким программистам появляются хорошие новые программисты.

  8. maijor3 said

    как сравнить 2 файла по символьно и вывести результаты в 3 файл ??

  9. bot said

    как в вижуале с++ сделать текст(например) надписи(label) жирным?

  10. Rustem said

    помогите разобраться и перевести код с делфи на с++
    программа нужна для того чтобы грамотно переходить из одного окна в другое
    1ое окно- окно авторизации (логин пароль и БД)
    2ое окно- непосредственная работа программы
    спасибо за внимание

    program Project1;
    uses
    Forms,
    Controls,
    Unit1 in ‘Unit1.pas’ {Form1},
    Unit2 in ‘Unit2.pas’ {Form2};

    {$R *.RES}

    begin
    Application.Initialize;
    with TForm2.Create(Application) do
    try

    if ShowModal = mrOK then
    // делаем полезную работу, например
    begin
    Application.CreateForm(TForm1, Form1);
    Application.Run;
    end

    else
    // делаем работу при других ModalResult, например
    Application.Terminate
    finally
    Free
    end;
    end.

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s

 
%d такие блоггеры, как: