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.
Хорошая статья об использовании этого сообщения и о вещах, о которых следует помнить / о ловушках, в которые нельзя попасть.