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
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);
}
如此便可實現我們想要的效果