在狀態列中加入BitMap (轉)
- 在一個AppWizard應用的狀態條中加入一個新的方塊,在Mainfrm.cpp中加入下列語句
//Mainfrm.cpp
static UINT indicators[] =
{
ID_SEPARATOR, // status line indicator
ID_INDICATOR_BITMAP, // BITMAP狀態條
ID_INDICATOR_CAPS,
ID_INDICATOR_NUM,
ID_INDICATOR_SCRL,
};
- 從CStatar派生一個新類(例如CBitmapStatusBar),並且用這個新類取代CMainFrame中的CStatusBar(Mainfrm.h)
//Mainfrm.h
//CStatusBar m_wndStatusBar;
CBitmapStatusBar m_wndStatusBar;
- 在新類的.h和.cpp中加入下面兩個的宣告和定義
//BitmapStatusBar.h
class CMyStatusBar : public CStatusBar {...
#if _MFC_VER < 0x400
virtual void DoPaint(CDC* pDC);
#else
virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);
#endif
...}
//BitmapStatusBar.cpp
#if _MFC_VER < 0x400
void CBitmapStatusBar::DoPaint(CDC* pDC)
{
CRect rect;
GetItemRect(1, &rect); //得到pane的大小
pDC->ExcludeClipRect(&rect); //建立新的裁剪區域
CStatusBar::DoPaint(pDC); //描繪狀態條(status bar)的其餘部分
CRgn paneRgn;
paneRgn.CreateRectRgnIndirect(rect);
pDC->ClipRgn(&paneRgn); //選擇裁剪區域
CBitmap pBitmap;
//載入點陣圖,使用Import從載入資源,可以不受調色盤限制
pBitmap.Loaitmap(IDB_BITMAP1);
//將當前點陣圖放入相容CDC
CDC DC;
SourceDC.CreateCompatibleDC(NULL);//生成相容的CDC
CBitmap* pOldBitmap = SourceDC.Select(&pBitmap);//選擇點陣圖
pDC->BitBlt(rect.left, rect.top, rect.Width(), rect.Height(),
&SourceDC, 0, 0, SRCCOPY);//BitBlt
SourceDC.SelectObject(pOldBitmap);//刪除CDC中所選擇的點陣圖
pBitmap.DeleteObject();//刪除點陣圖
}
#else
void CBitmapStatusBar::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
switch(lpDrawItemStruct->itemID)
{
case 1:
//從資源中選擇點陣圖
CBitmap pBitmap;
//載入點陣圖,使用Import從檔案載入資源,可以不受調色盤限制
pBitmap.LoadBitmap(IDB_BITMAP1);
//將狀態條(StatusBar)附加到一個CDC
CDC dc,SourceDC;
dc.Attach(lpDrawItemStruct->hDC);
//得到pane的大小和座標
CRect rect(&lpDrawItemStruct->rcItem);
//將當前點陣圖放入相容CDC
SourceDC.CreateCompatibleDC(NULL);//生成相容的CDC
CBitmap* pOldBitmap = SourceDC.SelectObject(&pBitmap);//選擇點陣圖
dc.BitBlt(rect.left, rect.top, rect.Width(), rect.Height(),
&SourceDC, 0, 0, SRCCOPY);//BitBlt
SourceDC.SelectObject(pOldBitmap);//刪除CDC中所選擇的點陣圖
pBitmap.DeleteObject();//刪除點陣圖
//將狀態條(StatusBar)與CDC物件分離,否則hDC將會在CDC廢棄時被刪除
dc.Detach();
return;
}
CStatusBar::DrawItem(lpDrawItemStruct);
}
#endif
- 在Mainfrm.cpp的CMainFrame::OnCreate()中加入下面的程式碼
//Mainfrm.cpp
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct){...
if (!m_wndStatusBar.Create(this) || !m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT))){
TRACE0("Failed to create status barn");
return -1; // fail to create
}
//加入下列程式碼
#if _MFC_VER >= 0x400
UINT nID, nStyle;
int cxWidth;
m_wndStatusBar.GetPaneInfo(1, nID, nStyle, cxWidth);
m_wndStatusBar.SetPaneInfo(1, nID, nStyle | SBT_OWNERDRAW, cxWidth);
#endif
...}
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-987406/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- JS特效之狀態列冒泡 (轉)JS特效
- React Native 中的狀態列React Native
- 在BCB中陣列的妙用和紀錄和改變控制元件的狀態 (轉)陣列控制元件
- android狀態列一體化(沉浸式狀態列)Android
- 利用Session紀錄datagrid模板列中CheckBox的狀態 (轉)Session
- redis 使用GETRANGE 來獲取一組bitmap狀態Redis
- 在Linux中,程序狀態有哪些?Linux
- [快速搞定]android 狀態列一體化 沉浸式狀態列Android
- 在狀態列中插入類似進度條的可視控制元件控制元件
- 【架構設計】無狀態狀態機在程式碼中的實踐架構
- 沉浸式狀態列解析
- Android 狀態列透明Android
- iOS隱藏狀態列iOS
- 如何直觀的在JavaScript中管理狀態JavaScript
- 【Android】狀態列通知Notification、NotificationManager詳解(轉載)Android
- android狀態列一體化(改變狀態列的背景顏色)Android
- Android 沉浸式狀態列攻略 讓你的狀態列變色吧Android
- [譯] 5 分鐘讓 Drawer 在狀態列下可見
- MFC在狀態列中使用進度條控制元件控制元件
- c# svg轉Bitmap Bitmap轉ImageSourceC#SVG
- PyQt5 之狀態列QT
- HTTP狀態碼列舉(PHP)HTTPPHP
- iOS 狀態列的圖示iOS
- 1、[ swift ] 狀態列設定Swift
- iOS狀態列相關操作iOS
- 設定沉浸式狀態列
- android之狀態列提示Android
- Flutter改變狀態列字型、狀態列背景顏色、Appbar背景顏色的方式FlutterAPP
- win10怎麼把狀態列變透明_win10狀態列變透明方法Win10
- 「譯」有限狀態機在 CSS 動畫中的應用CSS動畫
- Zustand:狀態持久化在專案中的應用持久化
- Qt圖元,場景,檢視,狀態機,狀態轉移,動畫設定等的示列(備忘)QT動畫
- Android全屏與透明狀態列Android
- MUI——設定沉浸式狀態列UI
- Android獲取狀態列高度Android
- Android通知之狀態列通知Android
- 讓Android支援透明狀態列Android
- Qt 狀態列消除白色豎線QT