CreateParams 設定 WS_POPUP 移除標準框架。WM_NCHITTEST 讓左側 20 像素區域回傳 HTCAPTION 以支援拖曳。WM_SYSCOMMAND 攔截最大化/還原訊息觸發重繪。FormPaint 使用 GDI 函式繪製垂直文字標題。class TForm1 : public TForm
{
__published:
TBitBtn *BitBtn1;
void __fastcall FormPaint(TObject *Sender);
void __fastcall FormResize(TObject *Sender);
void __fastcall BitBtn1Click(TObject *Sender);
private:
void __fastcall OnNcHitTest(TMessage &Message);
public:
__fastcall TForm1(TComponent* Owner);
BEGIN_MESSAGE_MAP
VCL_MESSAGE_HANDLER(WM_NCHITTEST, TMessage, OnNcHitTest)
END_MESSAGE_MAP(TForm)
protected:
virtual void __fastcall WndProc(TMessage &Message);
virtual void __fastcall CreateParams(TCreateParams &Params);
};
void __fastcall TForm1::CreateParams(TCreateParams &Params)
{
TForm::CreateParams(Params);
Params.Style |= WS_POPUP;
Params.Style ^= WS_DLGFRAME;
}
void __fastcall TForm1::OnNcHitTest(TMessage &Message)
{
TPoint PT;
PT.x = LOWORD(Message.LParam);
PT.y = HIWORD(Message.LParam);
PT = ScreenToClient(PT);
RECT rect; ::SetRect(&rect, 0, 0, 20, ClientHeight);
if (PtInRect(&rect, PT)) Message.Result = HTCAPTION;
else DefaultHandler(&Message);
}
void __fastcall TForm1::FormPaint(TObject *Sender)
{
RECT rect; ::SetRect(&rect, 0, 0, ClientWidth, ClientHeight);
Canvas->Pen->Color = clBlue; Canvas->Brush->Color = clBlue;
Canvas->Rectangle(0, 0, 20, ClientHeight);
char *msg = "My Fellow Citizens!";
LOGFONT fontRect; memset(&fontRect, 0, sizeof(LOGFONT));
fontRect.lfHeight = -13; fontRect.lfWeight = FW_NORMAL;
fontRect.lfEscapement = 900; lstrcpy(fontRect.lfFaceName, "宋體");
HFONT hFont = CreateFontIndirect(&fontRect);
HFONT hOld = (HFONT)::SelectObject(Canvas->Handle, hFont);
::SetTextColor(Canvas->Handle, RGB(255,255,255));
::SetBkColor(Canvas->Handle, RGB(255,0,0));
::TextOut(Canvas->Handle, 3, ClientHeight-3, msg, lstrlen(msg));
::SelectObject(Canvas->Handle, hOld); ::DeleteObject(hFont);
}
void __fastcall TForm1::WndProc(TMessage &Message)
{
if (Message.Msg == WM_SYSCOMMAND) {
if (Message.WParam == SC_MAXIMIZE || Message.WParam == 61490)
Invalidate(); // 最大化/還原時重繪
}
TForm::WndProc(Message);
}
此範例展示了完全自繪標題列的核心邏輯,可作為自訂視窗框架的基礎。