前些天進行一個項目,在進行界面設計的時候進行了一些換膚操作。但是由於界面采用圖形界面開發,菜單欄和工具欄都進行了圖形化處理,狀態欄相比就顯得單調了許多,所以替換了windows程序生成的狀態欄,用了網絡上面的Scroll.ocx控件。但是由於程序屬於小程序如果加載較多控件可能不太方便,加上在使用這個控件的過程中發現如果輸入顯示字體長度比較長的時候在顯示刷新的時候會出現問題,所以自己仿造那個顯示方法進行了這個控件的編寫。
程序繼承靜態控件類,在程序創建的時候可以代替一些控件用來進行一些信息的顯示。在這裡我用來代替狀態欄顯示一些歡迎登錄,以及登錄名稱等。程序采用雙緩沖的方式進行不同位置的Rect輸出。程序采用文字從右至左的方式運行。由於在CDC類的DrawText調用中要制定輸出文字的區域,我們可以在這裡做文章,動態改變這個區域。從右至左的方法就是所有程序由該控件的右邊為起點作為輸出文字的left邊界,采用定時器對這個left進行逐步遞減操作。那麼我們的輸出文字的區域就會由該控件的最右邊區域往左邊區域遞增。配合上我們的DT_LEFT方式繪制文字,經過不停的控件刷新就會出現文字從右往左的運行詭計了。
控件的一些主要繪制方法:(都是一些簡單的調用繪制,^_^)
繪制控件背景:
void CScrollCtrl::DrawCtrlBackground(CDC *pDC, CRect &rect)
{
CBrush pNewBrush, *pOldBrush;
pNewBrush.CreateSolidBrush(m_clBkColor);
pOldBrush = (CBrush *)pDC->SelectObject(pNewBrush);
pDC->FillRect(&rect, &pNewBrush);
pDC->SelectObject(&pOldBrush);
pNewBrush.DeleteObject();
//重新設置文字位置,默認為最右邊
CSize sSize;
pDC->GetTextExtent(m_strText);
m_nXPos = sSize.cx;
}
繪制文字
void CScrollCtrl::DrawCtrlText(CDC *pDC, CRect rect)
{
CRect rectText;
CFont *pOldFont;
pDC->SetBkMode(TRANSPARENT);
pDC->SetTextColor(m_clTextColor);
pOldFont = (CFont *)pDC->SelectObject(m_pFnt);
//選擇了字體要重新獲得字體寬度
CSize sSize;
sSize = pDC->GetTextExtent(m_strText);
m_nTextWidth = sSize.cx;
rectText.left = m_nXPos;
rectText.top = rect.top;
rectText.bottom = rect.bottom;
rectText.right = rect.right;
pDC->DrawText(m_strText, rectText, DT_LEFT | DT_VCENTER | DT_SINGLELINE);
pDC->SelectObject(&pOldFont);
}
調用方法:
新建一個工程,基於對話框的直接調用,基於SDI等的需要動態創建。拷貝ScrollCtrl.h和ScrollCtrl.cpp到程序目錄,通過“工程”-》“添加工程”-》“Files”加載到工程中間。通過定義控件對象和設置顯示背景顏色,字體顏色和顯示字體就可以了。
程序演示情況見下:
由於時間匆忙控件的封裝和功能都不是很完善,各位有興趣的可以進行功能的擴充,如果有好的修改請把代碼發給我!比如背景漸變或者提供更多的接口等。如有什麼問題請和我聯系:[email protected]