您的位置:首页 > 编程语言

VC界面编程 按钮的美化

2009-12-03 23:08 369 查看
以前也是对windows有些研究的,只是近来搞C#把底层的东西忘了不少,现在连windows都有哪些消息都不知道了,以前能够娴熟的利用windows消息写出奇妙的东西,现在用mfc都不清楚mfc的消息路由有谁到谁了,这几天又做C++开发,原来的是wxWidgets用着不是很爽,基本都很多和mfc的一样,有点就是开源跨平台,缺点是资料太少,特别是中文的.所以就想把那些代码转成中文的.

现在也想预热下,温习下用mfc来开发东西,就把自己经过的点滴记下,一来自己日后忘了可以直接看,二来也可以为新手朋友们提供点有点用的东西吧.

按钮是比较常用的控件了,几乎每个windows桌面的窗口中都有,所以就先看看按钮怎么来美化下,其实美化下也就是添加点颜色、图片和效果。

当然了mfc中CBitmapButton已经可以做到好的效果,但是可能会不知道其中的实现的原理,为了能够为以后做点铺垫,所以自己动手来写个类似于CBitmapButton的类来

我这里命名CDynamicButton从CButton继承而来.记得好像以前美化是从DrawItem中来的,于是就重载了CButton的DrawItem方法,然后就如下来创建一个按钮:

为了测试先建一个基于对话框的工程,我在对话框的OnInitDialog中创建了pButton按钮

CDynamicButton.cpp

// DynamicButton.cpp : 实现文件
//

#include "stdafx.h"
#include "Button.h"
#include "DynamicButton.h"

// CDynamicButton

IMPLEMENT_DYNAMIC(CDynamicButton, CButton)

CDynamicButton::CDynamicButton()
{

}

CDynamicButton::CDynamicButton(UINT nNormalResourceId,UINT nOverResourceI,UINT nDownResourceId,UINT nDisalbeResourceId)
{
m_pNormalBmp = new CBitmap();
m_pNormalBmp->LoadBitmapW( nNormalResourceId);
m_pOverBmp = new CBitmap();
m_pOverBmp->LoadBitmapW( nOverResourceI);
m_pDownBmp = new CBitmap();
m_pDownBmp->LoadBitmapW( nDownResourceId);
m_pDisableBmp = new CBitmap();
m_pDisableBmp->LoadBitmapW( nDisalbeResourceId);
}

CDynamicButton::~CDynamicButton()
{
m_pNormalBmp->DeleteObject();
delete m_pNormalBmp;
}

BEGIN_MESSAGE_MAP(CDynamicButton, CButton)
ON_WM_DRAWITEM()
ON_WM_MBUTTONDOWN()
ON_CONTROL_REFLECT(BN_KILLFOCUS, &CDynamicButton::OnBnKillfocus)
END_MESSAGE_MAP()

// CDynamicButton 消息处理程序

void CDynamicButton::SetNormalBmp(UINT nNormalResourceId)
{
m_pNormalBmp = new CBitmap();
m_pNormalBmp->LoadBitmapW( nNormalResourceId);
}

void CDynamicButton::SetOverBmp(UINT nNormalResourceId)
{
m_pOverBmp = new CBitmap();
m_pOverBmp->LoadBitmapW( nNormalResourceId);
}

void CDynamicButton::SetDownBmp(UINT nNormalResourceId)
{
m_pDownBmp = new CBitmap();
m_pDownBmp->LoadBitmapW( nNormalResourceId);
}

void CDynamicButton::SetDisableBmp(UINT nNormalResourceId)
{
m_pDisableBmp = new CBitmap();
m_pDisableBmp->LoadBitmapW( nNormalResourceId);
}

void CDynamicButton::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
//HBITMAP bmp = (HBITMAP)LoadImage(NULL, strFileName.GetBuffer(), IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION | LR_LOADFROMFILE);
//ULONG_PTR btnState = lpDrawItemStruct->itemState;
//CString s;
//s.Format(_T("%d"),ODS_DEFAULT);
//MessageBox(s);
//if( btnState & ODS_DEFAULT )//默认的
//{
// CDC *pDC = new CDC();
// pDC->Attach(lpDrawItemStruct->hDC);
// CDC mDC;
// mDC.CreateCompatibleDC(pDC);
// BITMAP bmpInfo;
// m_pNormalBmp->GetBitmap(&bmpInfo);
// mDC.SelectObject(*m_pNormalBmp);
// CRect rect(lpDrawItemStruct->rcItem);

// pDC->StretchBlt(0,0,rect.Width(),rect.Height(),&mDC,0,0,bmpInfo.bmWidth,bmpInfo.bmHeight,SRCCOPY);

// mDC.Detach();
// mDC.DeleteDC();
//}
//

//CButton::OnDrawItem(nIDCtl, lpDrawItemStruct);
}

void CDynamicButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{

// TODO: 添加您的代码以绘制指定项
ULONG_PTR btnState = lpDrawItemStruct->itemState;
/*CString s;
s.Format(_T("%d"),btnState);
MessageBox(s);*/
CDC *pDC = new CDC();
CRect rect(lpDrawItemStruct->rcItem);
pDC->Attach(lpDrawItemStruct->hDC);
if( btnState ==0 )//默认的
{

DrawBitmap(pDC,rect,m_pNormalBmp);

}
//else if(btnState & ODS_FOCUS)
//{
// DrawBitmap(pDC,rect,m_pDownBmp);
//}
//else if(btnState & ODS_DEFAULT)
//{
// DrawBitmap(pDC,rect,m_pNormalBmp);
//}
//else if(btnState & ODS_SELECTED)
//{
// DrawBitmap(pDC,rect,m_pOverBmp);
//}

}

void CDynamicButton::DrawBitmap(CDC *pDC,CRect &rect,CBitmap *pBmp)
{
CDC mDC;
mDC.CreateCompatibleDC(pDC);
BITMAP bmpInfo;
pBmp->GetBitmap(&bmpInfo);
mDC.SelectObject(*pBmp);

pDC->StretchBlt(0,0,rect.Width(),rect.Height(),&mDC,0,0,bmpInfo.bmWidth,bmpInfo.bmHeight,SRCCOPY);

mDC.Detach();
mDC.DeleteDC();
}

void CDynamicButton::OnMButtonDown(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
CDC *pDC = GetWindowDC();
CRect rect;
GetClientRect(&rect);
DrawBitmap(pDC,rect,m_pDownBmp);
//MessageBox(_T("aaa"));
//CButton::OnMButtonDown(nFlags, point);
}

void CDynamicButton::OnBnKillfocus()
{
CDC *pDC = GetWindowDC();
CRect rect;
GetClientRect(&rect);
(pDC,rect,m_pNormalBmp);
// TODO: 在此添加控件通知处理程序代码

}

其中其实DrawBitmap的作用很大,每次都是它在画图,才是按钮显示不同的图片

我当初才接触的时候,就是对画图的这部门不够明白,现在其实想想,好看的界面都是画图画出来的,CDC这个设备上下文类,用几次就明白其中的东东了

由于好久没有弄这个mfc了,这个CDynamicButton并没有成功的,因为现在根本就不反应,只是能够简单的换下图片而已,背景效果还有待改进,明天还要上班,现在已经不早了,明晚有时间再搞吧

如果是新手看的,就看DrawBitmap就可以了,把这个搞懂,就可以画图,再个就是搞懂消息了,在哪个消息向应里画呢.这两样搞懂了,搞出好的界面就不难了

给我这个难看的东西截个图留念下,哈:



不早了睡觉觉了~~~~~~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: