eVC下自繪按鈕實現

2021-08-24 19:03:27 字數 4095 閱讀 7962

按鈕這個控制項在軟體中使用是非常廣泛的,特別是基於mfc開發,按鈕提供了很好的便捷。

但是在evc下的按鈕顯示效果是非常土的,且背景顏色不好改。如果裁系統的時候將xp風格裁進去的話,預設按鈕效果會好一些,但是背景顏色不好控制,在ce平台下,沒有滑鼠是很正常的,帶xp風格的ce系統按鈕提示不夠明顯,這個時候就需要自繪按鈕了。

首先,先建立乙個基於cwnd的類,如:cmybutton : public cwnd

1、新增成員變數:

cdc m_dcback;

cbitmap m_bmpback; //背景

colorref m_clnorback; //正常時背景顏色

colorref m_clfocback; //設上焦點時背景顏色

colorref m_clnortext;

colorref m_clfoctext;

bool m_blaststate; //最後一次狀態,true =焦點

cstring m_strtitleinfo; //按鈕上字元

2、新增成員函式:

void initmybutton(); //初始化按鈕

void drawbackfornor(); //預設

void drawbackforfoc(); //按下去

void drawbackformid(); //中間

bool createbtn(lpctstr lpszwindowname, dword dwstyle, const rect& rect,

cwnd* pparentwnd, uint nid,lpdealwithbtn lpdealwithbtn = null);//建立

void setwindowtext(lpctstr lpszstring);//過載函式

bool enablewindow(bool benable = true);//過載函式

3、在view裡新增訊息: 如果考慮到右鍵效果,可以參考lbuttondown()新增

on_wm_setfocus()

on_wm_killfocus()

on_wm_paint()

on_wm_lbuttondown()

on_wm_enable()

上面的工作已經將基本工作完成了。接下來就是完成相應的**了:

void cmybutton::onpaint()

...memdc.selectobject(oldbitmap) ;

//刪除記憶體點陣圖gdi物件

membitmap.deleteobject();

//刪除記憶體繪圖環境

memdc.deletedc();

// do not call cwnd::onpaint() for painting messages

}bool cmybutton::createbtn(lpctstr lpszwindowname, dword dwstyle, const rect& rect,

cwnd* pparentwnd, uint nid,lpdealwithbtn lpdealwithbtn/**//* = null*/)

...return true;

// return cwnd::create(lpszclassname, lpszwindowname, dwstyle, rect, pparentwnd, nid, pcontext);

}void cmybutton::initmybutton()

...m_dcback.setbkcolor (m_clnorback) ;

m_dcback.fillsolidrect(rect,m_clnorback);

}void cmybutton::drawbackforfoc()

...void cmybutton::drawbackformid()

...//normal

void cmybutton::drawbackfornor()

...void cmybutton::onsetfocus(cwnd* poldwnd)

...}

void cmybutton::onkillfocus(cwnd* pnewwnd)

...}

void cmybutton::onlbuttondown(uint nflags, cpoint point)

...setfocus();

cwnd::onlbuttondown(nflags, point);

}void cmybutton::setwindowtext(lpctstr lpszstring)

...else

...}

bool cmybutton::enablewindow(bool benable /**//* = true */)

...else

...return cwnd::enablewindow(benable);

}注意:所有**中exttextout 完全可以用drawtext來代替,更簡單一些。

為了實現主窗體跟按鈕之間的通訊,例如當按鈕按下時,按鈕要通知主窗體,我在這裡新增函式指標來實現,當然也可以通過訊息的方式來實現。宣告函式指標:typedef void (*lpdealwithbtn)();

lpdealwithbtn m_lpdealwithbtn;//函式指標

把所有**新增完畢就可以實現效果了。在主程式就可以新增相關的函式,如果要使用函式指標來實現通知的話,需先建立乙個static函式。例如static void ondealwithbtn01();

test:

cmybutton m_mybtn01;

m_mybtn01.createbtn(l"testbtn",ws_child|ws_visible,crect(260,110,335,130),this,0,ondealwithbtn01);

void ctestb***lg::ondealwithbtn01()

//畫透明

void cmybutton::drawtransparent(cbitmap &bmp,int const x,int const y,int const cx,int const cy,

int const srcx,int const srcy,cdc *pdc,colorref transparentcolor)

...cbitmap *pmaskbmp = maskdc.selectobject(&maskbmp);

//將源繪圖環境繪製到掩碼繪圖環境中

maskdc.bitblt(x,y,cx,cy,&srcdc,0,0,srccopy);

//將源位圖和透明位圖進行異或操作融合

transdc.bitblt(x,y,cx,cy,&srcdc,0,0,srcinvert);

//將透明點陣圖和掩碼位圖進行與操作

transdc.bitblt(x,y,cx,cy,&maskdc,0,0,srcand);

//再將源位圖和透明位圖進行異或操作

transdc.bitblt(x,y,cx,cy,&srcdc,0,0,srcinvert);

//此時將透明位圖繪製到目標裝置上

bool bret = pdc->bitblt(x,y,cx,cy,&transdc,srcx,srcy,srccopy);

//繪製繪圖物件,並釋放相應繪圖環境和點陣圖物件

srcdc.selectobject(psrcbmp);

srcdc.deletedc();

transdc.selectobject(ptransbmp);

transbmp.deleteobject();

transdc.deletedc();

maskdc.selectobject(pmaskbmp);

maskdc.deletedc();

maskbmp.deleteobject();

}呼叫時:

cbitmap bmp;

bmp.loadbitmap(idb_bitmap_mid);

bitmap bm;

bmp.getbitmap(&bm);

drawtransparent(bmp,0,0,bm.bmwidth,bm.bmheight,0,0,&m_dcback,null);

bmp.deleteobject();

MFC自繪按鈕的實現

自繪按鈕的實現過程 首先在vc6中新建工程,選擇mfc並且新建dialog工程 在dlg類的物件上新增wm drawitem屬性 新增繪圖函式 void cmy40 mybuttondlg ondrawitem int nidctl,lpdrawitemstruct lpdrawitemstruct...

MFC自繪按鈕的實現

自繪按鈕的實現過程 首先在vc6中新建工程,選擇mfc並且新建dialog工程 輸入工程名,然後將生成的按鈕等刪除,重新新增兩個按鈕。為按鈕設定屬性 選擇自繪,就是自己向上貼圖 在dlg類的物件上新增wm drawitem屬性 在生成的ondrawitem方法中新增如下 新增繪圖函式 void cm...

Wince下自繪文字控制項

最近,因為工作比較緊張乙個月都沒有寫文章了。由於工作的需要我自己封裝幾個基本控制項,有按鈕 進度條 列表框 靜態文字域 動態文字域 時鐘 對話方塊等基本控制項。下面我們來解釋一下文字域 靜態文字 的封裝實現,文字域包括以下幾個部分 1 字型的大小 2 字型顏色 3 字型顯示的區域 4 文字域的背景 ...