亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C > 正文

MFC實現漂亮界面之美化按鈕

2020-01-26 13:31:28
字體:
來源:轉載
供稿:網友

上次我們學習了如何美化對話框的界面,這次我們為上次的對話框添加兩個按鈕,一個是關閉按鈕,另一個是最小化按鈕,好,現在我們先看一下效果:

是不是很難看,因為我們的對話框美化了,所以我們的按鈕也要美化,因為采用貼圖的方式來美化,所以,我先給出這兩個按鈕的PNG格式的圖片,該圖片支持透明色,具體如下:

關閉按鈕效果圖:

最小化按鈕效果圖:

這兩張效果圖是我自己從網上找的,可能不是很合適,但是用來教學,完全沒有問題,它們的尺寸都是108*21,每張圖片都有四個小圖片,第一張和第四張小圖片都是透明的,所以看不見效果,我們使用這兩張圖片來完成按鈕的美化,每張圖片從左向右有四張小圖片,我們只用前三張,分別對應默認狀態,焦點狀態,按下狀態。

下面,我們來說一下如何美化按鈕?

第1步,我們先在對話框上放置兩個按鈕,一個是關閉按鈕,另一個是最小化按鈕,它們對應的ID分別是IDC_BUTTON_CLOSE和IDC_BUTTON_MIN,然后將我們的按鈕設置為自繪制模式,方法如下:

選擇按鈕,右鍵屬性,在屬性列表中找到Owner Draw選項,將其設置為True,效果圖如下:

再為它們添加兩個成員變量,具體如下:

CButton m_btnClose;CButton m_btnMin;

第2步,我們新建一個類,繼承自CButton,我們取名為CMyButton,為其添加3個成員變量,分別如下:

//按鈕背景圖像CImage m_imgButton;//按鈕png路徑,包括焦點,正常,按下3個狀態CString m_strImgPath;//父窗口背景圖片背景路徑,透明png需要使用CString m_strImgParentPath;

第3步,我們為CMyButton添加3個成員函數,分別如下:

//設置按鈕背景圖片路徑,父窗口背景圖片路徑void SetImagePath(CString strImgPath, CString strParentImgPath);//初始化按鈕,主要是調整按鈕的位置,處理透明色bool InitMyButton(int nX/*左上角X坐標*/, int nY/*左上角Y坐標*/,int nW/*圖像寬*/, int nH/*圖像高*/, bool bIsPng/*是否是PNG圖片*/);//自繪制函數void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);

CMyButton的聲明最終如下:

class CMyButton : public CButton{ DECLARE_DYNAMIC(CMyButton) public: CMyButton();  virtual ~CMyButton();  //按鈕背景圖像 CImage m_imgButton;  //按鈕png路徑,包括焦點,正常,按下3個狀態 CString m_strImgPath;  //父窗口背景圖片背景路徑,透明png需要使用 CString m_strImgParentPath;  //設置按鈕背景圖片路徑,父窗口背景圖片路徑 void SetImagePath(CString strImgPath, CString strParentImgPath);  //初始化按鈕,主要是調整按鈕的位置,處理透明色 bool InitMyButton(int nX/*左上角X坐標*/, int nY/*左上角Y坐標*/,int nW/*圖像寬*/, int nH/*圖像高*/, bool bIsPng/*是否是PNG圖片*/);  //自繪制函數 void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct); protected: DECLARE_MESSAGE_MAP()};

第4步,我們實現SetImagePath函數,它的功能是為按鈕背景圖片和父窗口背景圖片成員函數初始化,具體如下:

void CMyButton::SetImagePath(CString strImgPath, CString strParentImgPath){  m_strImgPath = strImgPath;  m_strImgParentPath = strParentImgPath;}

第5步,我們實現InitMyButton函數,它的功能是調整按鈕在對話框上的位置,其中的參數代表該按鈕在父窗口的左上角X坐標,Y坐標,寬度,高度,最后一個參數是為PNG格式圖片準備的,如果是PNG帶透明色的圖片,需要對它進行特殊處理,具體定義如下:

bool CMyButton::InitMyButton(int nX, int nY, int nW, int nH, bool bIsPng){ HRESULT hr = 0; if (m_strImgPath.IsEmpty()) return false; hr = m_imgButton.Load(m_strImgPath);  if (FAILED(hr)) return false;  if (bIsPng) { if (m_imgButton.GetBPP() == 32) {  int i = 0;  int j = 0;  for (i = 0; i < m_imgButton.GetWidth(); i++)  {  for (j = 0; j < m_imgButton.GetHeight(); j++)  {   byte * pbyte = (byte *)m_imgButton.GetPixelAddress(i, j);   pbyte[0] = pbyte[0] * pbyte[3] / 255;   pbyte[1] = pbyte[1] * pbyte[3] / 255;   pbyte[2] = pbyte[2] * pbyte[3] / 255;  }  } } }  MoveWindow(nX,nY,nW,nH);  return true;}

其中MoveWindow函數是用來調整按鈕位置的函數,其中的參數分別代表其在父窗口的左上角X坐標,左上角Y坐標,寬度,高度。

第6步,我們實現DrawItem函數,它是美化Button的核心函數,當我們將Button設置為自繪制后,每次按鈕需要刷新,重新繪制的時候,MFC框架會調用它的DrawItem函數,在這個函數中,我們可以根據按鈕當前的狀態為其貼上相應的背景圖。當我們按鈕按鈕的時候,為其貼上被按下的背景圖;當我們的按鈕獲取焦點的時候,為其貼上獲取焦點的背景圖;當我們的按鈕沒有焦點,我們為其貼上默認的背景圖片,它們對應的位置前面已經說過。為了避免閃爍,我們采用雙緩沖的方式,具體代碼如下:

void CMyButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct){ if (!lpDrawItemStruct) return; HDC hMemDC; HBITMAP bmpMem; HGDIOBJ hOldObj; bmpMem = CreateCompatibleBitmap(lpDrawItemStruct->hDC, lpDrawItemStruct->rcItem.right - lpDrawItemStruct->rcItem.left, lpDrawItemStruct->rcItem.bottom - lpDrawItemStruct->rcItem.top); if (!bmpMem) return; hMemDC = CreateCompatibleDC(lpDrawItemStruct->hDC); if (!hMemDC) { if (bmpMem) {  ::DeleteObject(bmpMem);  bmpMem = NULL; } return; }  hOldObj = ::SelectObject(hMemDC, bmpMem);  RECT rectTmp = { 0 };  rectTmp = lpDrawItemStruct->rcItem;  MapWindowPoints(GetParent(), &rectTmp);  int nW = lpDrawItemStruct->rcItem.right - lpDrawItemStruct->rcItem.left;  int nH = lpDrawItemStruct->rcItem.bottom - lpDrawItemStruct->rcItem.top;  if (lpDrawItemStruct->itemState & ODS_SELECTED) { //按鈕被選擇 m_imgButton.BitBlt(hMemDC, 0, 0, nW, nH, nW*2, 0, SRCCOPY); } else if (lpDrawItemStruct->itemState & ODS_FOCUS) {        //焦點狀態       m_imgButton.BitBlt(hMemDC, 0, 0, nW, nH, nW, 0, SRCCOPY);  } else { //默認狀態 CImage imgParent;  imgParent.Load(m_strImgParentPath);  imgParent.Draw(hMemDC, 0, 0, nW, nH, rectTmp.left, rectTmp.top, nW, nH);  m_imgButton.AlphaBlend(hMemDC, 0, 0, nW, nH, 0, 0, nW, nH);  imgParent.Destroy();  }  ::BitBlt(lpDrawItemStruct->hDC, 0, 0, nW, nH, hMemDC, 0, 0, SRCCOPY);  SelectObject(hMemDC, hOldObj);  if (bmpMem) { ::DeleteObject(bmpMem); bmpMem = NULL; }  if (hMemDC) { ::DeleteDC(hMemDC); hMemDC = NULL; } return;}

這里我們重點說一下默認狀態的背景圖,因為它是透明的,并且我們采用的是雙緩沖,所以,為了避免最終透明色變成黑色,我們先在內存DC上貼上按鈕在父窗口位置的背景圖,這樣可以解決透明色變成黑色的問題,如果你采用GDI+,就不用這么做,但是我們采用的是GDI。

第7步,用CMyButton替代對話框頭文件中的CButton。

第8步,在對話框的InitDialog中,對兩個按鈕進行初始化,具體如下:

m_btnMin.SetImagePath(_T("./res/btn_min.png"), _T("./res/Background.png"));m_btnMin.InitMyButton(516, 8, 27, 21, true);m_btnClose.SetImagePath(_T("./res/btn_close.png"),_T("./res/Background.png"));m_btnClose.InitMyButton(545,8,27,21,true);

第9步,編譯程序,最終效果圖如下:

今天,我們已經為它添加了最小化,關閉按鈕,下次,我們為其添加編輯框!

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
成人av电影天堂| 亚洲已满18点击进入在线看片| 欧洲精品久久久| 91精品国产91久久久久久不卡| 亚洲国产日韩欧美综合久久| 国产一区二中文字幕在线看| 夜夜嗨av色综合久久久综合网| 91免费欧美精品| 欧美第一淫aaasss性| 在线观看国产精品日韩av| 日本一区二三区好的精华液| 亚洲国产高潮在线观看| 亚洲一区美女视频在线观看免费| 精品国偷自产在线视频| 亚洲第一页中文字幕| 国产成人精品国内自产拍免费看| 午夜精品国产精品大乳美女| 亚洲性av网站| 懂色aⅴ精品一区二区三区蜜月| 91精品久久久久久久久中文字幕| 国产精品久久久久影院日本| 91亚洲精华国产精华| 国产精品高清免费在线观看| 久久久精品网站| 欧洲精品在线视频| 成人春色激情网| 国产精品亚洲精品| 欧美日韩一区二区三区在线免费观看| 国产精品日韩在线播放| 日韩动漫免费观看电视剧高清| 欧美乱大交xxxxx另类电影| 国产日韩欧美成人| 日韩网站免费观看高清| 欧美性做爰毛片| 高清欧美性猛交xxxx| 国产日韩精品在线播放| 成人性生交大片免费观看嘿嘿视频| 久久国产精品影片| 91精品国产91久久久久久久久| 51午夜精品视频| 亚洲美女精品成人在线视频| 国产精品一区二区久久| 亚洲国产精品va在看黑人| 欧美激情videoshd| 欧美孕妇与黑人孕交| 成人字幕网zmw| 亚洲欧美另类国产| 91中文在线视频| 在线观看久久av| 成人美女免费网站视频| 美女精品视频一区| 久久香蕉国产线看观看网| 久久精品久久久久| 久久影视电视剧免费网站| 欧美成人自拍视频| 国产香蕉精品视频一区二区三区| 国产日韩精品视频| 欧美日韩激情视频| 国产suv精品一区二区| 亚洲影院高清在线| 欧美性xxxxx| 视频一区视频二区国产精品| 91国内产香蕉| 26uuu另类亚洲欧美日本一| 91在线观看免费观看| 国产精品精品久久久久久| 国产精品综合不卡av| 精品国产户外野外| 亚洲视频在线免费看| 亚洲欧美一区二区三区四区| 成人久久久久久久| 欧美电影在线免费观看网站| 国产精品嫩草影院一区二区| 亚洲欧洲激情在线| 午夜精品视频网站| 国产综合色香蕉精品| 亚洲第一页中文字幕| 91精品久久久久久综合乱菊| 日韩欧美大尺度| 国产亚洲视频中文字幕视频| 中文字幕不卡av| 日韩免费观看网站| 人体精品一二三区| 国外日韩电影在线观看| 国产精品精品久久久久久| 亚洲欧美日韩国产中文| 性色av一区二区三区红粉影视| 亚洲人成网站777色婷婷| 欧美孕妇毛茸茸xxxx| 精品国产老师黑色丝袜高跟鞋| 中文字幕精品国产| 国产精品在线看| 精品久久在线播放| 亚洲自拍小视频| 亚洲人成自拍网站| 欧美电影免费观看大全| 国产精品999| 欧美性生交大片免费| 日韩美女在线观看| 中文字幕亚洲综合久久| www.日韩欧美| 欧美在线一区二区三区四| 日韩av成人在线观看| 国产精品稀缺呦系列在线| 欧美亚洲成人xxx| 欧美福利视频在线| 欧美成人精品三级在线观看| 欧美日韩加勒比精品一区| 成人乱人伦精品视频在线观看| 精品久久久在线观看| 51久久精品夜色国产麻豆| 亚洲精品福利免费在线观看| 久久人人97超碰精品888| 福利一区视频在线观看| 九九热精品视频在线播放| 久久精品中文字幕免费mv| 国内精品久久久久久久| 亚洲最大av网站| 国产精品普通话| 91精品国产免费久久久久久| 国产精品网红福利| 亚洲精选一区二区| 色综久久综合桃花网| 高清欧美性猛交| 成人精品一区二区三区电影黑人| 久久久久久成人| 国产91免费看片| 欧美激情综合色综合啪啪五月| 久久久99免费视频| 亚洲精品99999| 日韩精品久久久久久福利| 91精品国产高清久久久久久久久| 久久精品99久久香蕉国产色戒| 91免费精品视频| 亚洲乱码国产乱码精品精| 日韩美女视频在线观看| 亚洲人成网站色ww在线| 精品久久久久久久中文字幕| 日韩av片免费在线观看| 久久国产色av| 在线日韩日本国产亚洲| 精品人伦一区二区三区蜜桃网站| 久久国产精品影片| 久久大大胆人体| www国产亚洲精品久久网站| 国产a级全部精品| 在线视频精品一| 国产精品精品久久久久久| 日韩欧美精品在线观看| 日本道色综合久久影院| 欧美xxxx14xxxxx性爽| 亚洲欧美一区二区三区久久| 国产日韩专区在线| www.亚洲一二| 亚洲欧洲国产伦综合| 欧美色视频日本版| 久久福利网址导航| 亚洲成人999| 欧美日韩中国免费专区在线看| 久久影院中文字幕| 69视频在线免费观看| 亚洲男人的天堂网站| 亚洲国产美女久久久久| 亚洲淫片在线视频|