中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

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

發布時間:2021-05-18 09:46:11 來源:億速云 閱讀:1087 作者:小新 欄目:編程語言

這篇文章將為大家詳細講解有關MFC如何實現漂亮界面之美化按鈕,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

效果:

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

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

關閉按鈕效果圖:

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

最小化按鈕效果圖:

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

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

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

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

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

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

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

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步,編譯程序,最終效果圖如下:

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

關于“MFC如何實現漂亮界面之美化按鈕”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

mfc
AI

谷城县| 德保县| 磐安县| 北流市| 澳门| 兴国县| 文水县| 江华| 拉萨市| 东光县| 宣武区| 黄冈市| 山西省| 托克托县| 翁源县| 湟中县| 浦县| 万山特区| 邓州市| 潢川县| 固镇县| 沙雅县| 丰镇市| 克拉玛依市| 怀集县| 合江县| 湘阴县| 建宁县| 邮箱| 上杭县| 额尔古纳市| 高密市| 芒康县| 福鼎市| 晋州市| 巫溪县| 沁阳市| 治多县| 内丘县| 乾安县| 金乡县|