首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> VC 教學

自繪標題列完整範例:WM_NCHITEST、WM_SYSCOMMAND 與 GDI 繪圖

     編輯:VC 教學

核心技術點

  • 覆寫 CreateParams 設定 WS_POPUP 移除標準框架。
  • 處理 WM_NCHITTEST 讓左側 20 像素區域回傳 HTCAPTION 以支援拖曳。
  • 處理 WM_SYSCOMMAND 攔截最大化/還原訊息觸發重繪。
  • 在 FormPaint 使用 GDI 函式繪製垂直文字標題。

完整程式碼架構

標頭檔 (wmnc.h)

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);
};

實作檔 (wmnc.cpp) 關鍵函式

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);
}

此範例展示了完全自繪標題列的核心邏輯,可作為自訂視窗框架的基礎。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved