作者姓名戚高文章原始出處原創介紹近來一個人擔任貴州一個地方的水電站的開發任務,在實現界面監控系統模組中,我要用到許多表示當前設備運行狀態的運行情況的開關之類的東西,在網絡上面搜索了一下,發現沒有很好的這個方面的東西,由於沒有涉及到控制,我採用派生了CSTATIC類的方法映射WM_PAINT消息實現了功能,現將這個類和圖片貼上來,希望對做工業控制和正在研究這個方面的人有幫助作用.
正文控制採用背景貼圖的形式實現,即在不同的條件的時候進行不同的貼圖操作這樣達到動態表示設備運行狀態.由於這次表示的為開關的狀態,所以我用了兩種圖片進行替換顯示,如果有多種情況也可以進行擴充使用.圖片為我用WINDOWS畫板繪製的,如果各位有人繪製了更漂亮的開關樣式請告訴我.(^_^,本人水平有限)
程式很簡單,大致程式碼如下:
void CSwitchStatic::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: Add your message handler code here
CRect rect;
GetClientRect(&rect);
CDC *mdc=new CDC;
mdc->CreateCompatibleDC(&dc);
HBITMAP hbitmap;
switch(this->m_SystemMetric)
{
case STYLE_ONE:
if(!this->bSwitchOn)
hbitmap=::LoadBitmap(::AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_SWITCHOFF));
else
hbitmap=::LoadBitmap(::AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_SWITCHON));
break;
case STYLE_TWO:
if(!this->bSwitchOn)
hbitmap=::LoadBitmap(::AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_SWITCHOFF1));
else
hbitmap=::LoadBitmap(::AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_SWITCHON1));
break;
default:
if(!this->bSwitchOn)
hbitmap=::LoadBitmap(::AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_SWITCHOFF));
else
hbitmap=::LoadBitmap(::AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_SWITCHON));
break;
}
mdc->SelectObject(hbitmap);
dc.BitBlt(rect.left,rect.top,rect.Width(),rect.Height(),mdc,0,0,SRCCOPY);
ReleaseDC(mdc);
::DeleteObject(hbitmap);
// Do not call CStatic::OnPaint() for painting messages
}
呼叫方法如下:
我在程式裡面設定了兩種開關運作模式和兩種開關狀態風格.程式提供了動態設定方法:
預設為SwitchOff,如果要更換狀態可以使用下列程式碼:
SetSwitchState(TRUE);
如果要更換開關顯示風格,我們可以使用下列程式碼:
SetSwitchStyle(STYLE_TWO);//第二種風格
SetSwitchStyle(STYLE_ONE);//第一種風格
展開