1. 程式人生 > >1.6.2 簡單自繪控制元件——無邊框對話方塊最小化按鈕

1.6.2 簡單自繪控制元件——無邊框對話方塊最小化按鈕

1、準備PNG檔案:

2、插入Static Text 控制元件,並將其設定在視窗右上角

    CRect   rect;

    GetClientRect(rect);            //獲取對話方塊大小

    CWnd    *pWnd;

    pWnd = GetDlgItem(IDC_STATIC_MIN);

    pWnd -> SetWindowPos(NULL,rect.Width()-39-28,

        0,28,20,SWP_NOZORDER );

3、設定Static Text 控制元件背景透明

該步驟將實現以下目的:顯示透明PNG圖片

類嚮導新增ON_WM_CTLCOLOR()訊息處理函式,並在OnCtlColor()其中插入以下程式碼

    if (    pWnd-> GetDlgCtrlID() == IDC_STATIC_MIN)

    {

        pDC->SetBkMode(TRANSPARENT);   //設定背景透明

        pDC->SetTextColor(RGB(255,255,255));

        return   HBRUSH(GetStockObject(HOLLOW_BRUSH));

    }

4、圖示動態化

該步驟將實現以下目的:滑鼠移入Static_Close控制元件區域,更換較亮的圖示;不在該空間區域,更換普通圖示。

類嚮導新增ON_WM_MOUSEMOVE()訊息處理函式,並在OnMouseMove ()其中插入以下程式碼:

    CWnd * pWndParent = this->GetParent();

    /*****CLOSE*****/

    CRect rect;

    CClientDC *pDC = new CClientDC(GetDlgItem(IDC_STATIC_CLOSE));

    Graphics graphics(pDC->m_hDC); // Create a GDI+ graphics object

    GetDlgItem(IDC_STATIC_CLOSE)->GetWindowRect(&rect);

    ScreenToClient

(&rect);

    Image image(L"res\\BT_CLOSE.png",FALSE); // Construct animage

    static bool m_bcloseflag = 0;//限制同樣圖片重繪次數

    CRect mrect(380-39-28,0,380,20);//將要重新整理的區域放在一起

    if (point.x>rect.TopLeft().x && point.x<rect.BottomRight().x &&

        point.y>rect.TopLeft().y && point.y<rect.BottomRight().y)

    {

        if (m_bcloseflag)

        {

            this->InvalidateRect(mrect);//重新整理指定區域,放在繪圖前面

            UpdateWindow();//重新整理指定區域

            graphics.DrawImage(&image, -38, 0, 156, 20);

            m_bcloseflag = 0;

        }

    }

    else

    {

        if (!m_bcloseflag)

        {

            this->InvalidateRect(&mrect);//重新整理指定區域

            UpdateWindow();//重新整理指定區域

            graphics.DrawImage(&image, 0, 0, 156, 20);

            m_bcloseflag = 1;

        }

    }

    /*****MIN*****/

    pDC = new CClientDC(GetDlgItem(IDC_STATIC_MIN));

    Graphics graphics1(pDC->m_hDC); // Create a GDI+ graphics object

    GetDlgItem(IDC_STATIC_MIN)->GetWindowRect(&rect);

    ScreenToClient(&rect);

    Image image1(L"res\\BT_MIN.png",FALSE); // Construct animage

    static bool m_bminflag = 0;//限制同樣圖片重繪次數

    if (point.x>rect.TopLeft().x && point.x<rect.BottomRight().x &&

        point.y>rect.TopLeft().y && point.y<rect.BottomRight().y)

    {

        if (m_bminflag)

        {

            this->InvalidateRect(mrect);//重新整理指定區域

            UpdateWindow();//重新整理指定區域

            graphics1.DrawImage(&image1, -28, 0, 112, 20);

            m_bminflag = 0;

        }

    }

    else

    {

        if (!m_bminflag)

        {

            this->InvalidateRect(mrect);//重新整理指定區域

            UpdateWindow();//重新整理指定區域

            graphics1.DrawImage(&image1, 0, 0, 112, 20);

            m_bminflag = 1;

        }

    }

5、滑鼠左鍵訊息反應

該步驟將實現以下功能:在指定區域按下滑鼠左鍵,將關閉對話方塊

類嚮導新增ON_WM_LBUTTONDOWN ()訊息處理函式,並在OnLButtonDown ()其中插入以下代

    //最小化實現

    GetDlgItem(IDC_STATIC_MIN)->GetWindowRect(&rect);

    ScreenToClient(&rect);

    if (point.x>rect.TopLeft().x && point.x<rect.BottomRight().x &&

        point.y>rect.TopLeft().y && point.y<rect.BottomRight().y)

    {

        ShowWindow(SW_MINIMIZE);

    }

如此便可實現我們想要的效果