Граница вокруг формы с закругленным углом в C ++ Builder XE - PullRequest
5 голосов
/ 30 мая 2011

Я сделал форму C ++ Builder XE с закругленным углом с помощью следующего кода

BorderStyle = bsNone; 

void __fastcall TForm1::FormCreate(TObject *Sender)
{
     HRGN frmrgn;  

     frmrgn = CreateRoundRectRgn (0, 0, ClientWidth, ClientHeight,12,12);
     SetWindowRgn(Handle,frmrgn,true);
}

Это выглядит круто, но граница отсутствует, я много чего пробовал, но не получил хорошего результата поэтому, пожалуйста, помогите мне нарисовать границу цвета RGB (96,96,96)

И я хочу сделать всю форму перетаскиваемой.

1 Ответ

3 голосов
/ 31 мая 2011

1. Картина темно-серой каймой

Это легко, в зависимости от того, насколько сложным вы хотите, чтобы граница выглядела. Если вам просто нужен контур темно-серого цвета, либо нарисуйте его, используя комбинацию линий и дуг, либо используйте функцию FrameRgn, чтобы нарисовать контур вокруг вашей области с помощью специальной кисти. Это лучшее решение, так как у вас уже есть регион, который вы использовали для определения формы окна.

Однако в документации MSDN для SetWindowRgn написано: "После успешного вызова SetWindowRgn система владеет регионом, указанным дескриптором региона hRgn. не копировать регион. Таким образом, вы не должны выполнять какие-либо дополнительные вызовы функций с этим дескриптором региона. " Вам нужно будет снова создать свой регион для метода рисования.

Код для вашего метода рисования:

HRGN hRegion = ::CreateRoundRectRgn (0, 0, ClientWidth, ClientHeight,12,12);
Canvas->Brush->Style = bsSolid;
Canvas->Brush->Color = RGB(96, 96, 96);
::FrameRgn(Canvas->Handle, hRegion, Canvas->Brush->Handle, 2, 2);
::DeleteObject(hRegion); // Don't leak a GDI object

2. Делаем окно перетаскиваемым без строки заголовка

Краткий итог: вам нужно обработать сообщение WM_NCHITTEST. Windows отправляет это, чтобы увидеть, находится ли мышь над строкой заголовка («NC» означает «не-клиент»; на самом деле она проверяет, находится ли она где-нибудь в области, не являющейся клиентом, которая может быть любой границей окна, а не только верхний.) Вы можете сделать ваше окно перетаскиваемым, сказав «да, мышь в заголовке прямо сейчас», даже если это не так. Какой-то код:

// In the 'protected' section of your form's class declaration
virtual void __fastcall WndProc(Messages::TMessage &Message);

// The implementation of that method:
void __fastcall TForm1::WndProc(Messages::TMessage& Message) {
  TForm::WndProc(Message); // inherited implementation
  if (Message.Msg == WM_NCHITTEST && Msg.Result == htClient) {
    Msg.Result = htCaption;
  }
}

Вы можете выполнить некоторое собственное тестирование нажатия, чтобы ограничить то, какие части вашего окна выглядят как строка заголовка, чтобы создать собственную строку заголовка.

Пример кода Delphi.

Хорошая статья об использовании этого сообщения и о вещах, о которых следует помнить / о ловушках, в которые нельзя попасть.

...