覆寫 CreateParams 移除 WS_CAPTION 後,視窗失去標題列也就無法用滑鼠拖曳。需額外攔截 WM_NCHITTEST 訊息,滑鼠左鍵按下時回傳 HTCAPTION 讓系統以為點在標題列上。
private:
void __fastcall WMNChitTest(TMessage & Msg);
protected:
BEGIN_MESSAGE_MAP
VCL_MESSAGE_HANDLER(WM_NCHITTEST, TMessage, WMNChitTest)
END_MESSAGE_MAP(TForm)
virtual void __fastcall CreateParams(TCreateParams & Params);
void __fastcall TForm1::CreateParams(TCreateParams & Params)
{
Params.Style &= ~WS_CAPTION; // 移除標題列樣式
TForm::CreateParams(Params);
}
void __fastcall TForm1::WMNChitTest(TMessage & Msg)
{
if (GetAsyncKeyState(VK_LBUTTON) < 0)
Msg.Result = HTCAPTION; // 左鍵按下時視為點在標題列
else
Msg.Result = HTCLIENT;
}
Params.Style &= ~WS_CAPTION (位元 AND NOT) 比 XOR 更安全,確保只關閉該位元。