关于GDI+按钮的问题

xjw_njust 2012-07-10 07:28:06
我用GDI+创建了一个按钮。我想在按钮没按时背景显示背景图片1,按下后显示背景图片2,请问该怎么实现啊?谢了
...全文
179 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
xjw_njust 2012-07-11
  • 打赏
  • 举报
回复
我的button类是从网上下载的。谢谢你,我仔细研究下[Quote=引用 4 楼 的回复:]
定义:

C/C++ code

PngButton m_PngBT;


C/C++ code

m_PngBT.SetButtonImage( L"res\\R.PNG");


R.png可以使用透明图片,图片根据你的情况自己选择这样的图片:
如果你的按钮为100* 40;那你就制作一个400*40的图片;
这个图片分为四个部分,第一个部分100*40为正……
[/Quote]
niujian2358 2012-07-11
  • 打赏
  • 举报
回复
假如第二张图片有部分是透明的,那么贴上后,透明的部分会显示出第一张图的,
这时怎么擦掉原先贴的第一张图?
Tinary3v0 2012-07-10
  • 打赏
  • 举报
回复
定义:
PngButton	m_PngBT; 

m_PngBT.SetButtonImage( L"res\\R.PNG");


R.png可以使用透明图片,图片根据你的情况自己选择这样的图片:
如果你的按钮为100* 40;那你就制作一个400*40的图片;
这个图片分为四个部分,第一个部分100*40为正常状态、第二个部分就是鼠标悬停状态,第三个为按下并保持状态,第四个好像是disable状态。
使用方法不用再多说了吧。你自己不是建立了自己的Button类么。
Tinary3v0 2012-07-10
  • 打赏
  • 举报
回复
.cpp文件:
#include "PngButton.h"

IMPLEMENT_DYNAMIC(PngButton, CButton)
PngButton::PngButton()
{
m_bDisable = FALSE;
m_bCursorOnButton = FALSE;
m_bPress = FALSE;
}

PngButton::~PngButton()
{

}

BEGIN_MESSAGE_MAP(PngButton, CButton)
ON_WM_MOUSEMOVE()
ON_MESSAGE(WM_MOUSEHOVER,OnMouseHover)
ON_MESSAGE(WM_MOUSELEAVE,OnMouseLeave)
ON_WM_LBUTTONDOWN()
ON_WM_LBUTTONUP()
ON_WM_ERASEBKGND()
END_MESSAGE_MAP()

void PngButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
CDC* pDC = CDC::FromHandle(lpDrawItemStruct -> hDC);

Graphics graphics(pDC -> m_hDC);

if( m_bDisable == TRUE )
{
;
graphics.DrawImage(m_btnImage,Rect(0,0,m_nSliceWidth,m_nHeight),
BUTTON_DISABLE * m_nSliceWidth,0,m_nSliceWidth, m_nHeight,UnitPixel,NULL,NULL,NULL);
}

else
{
// click state
if( lpDrawItemStruct -> itemState & ODS_SELECTED )
{


graphics.DrawImage (m_btnImage,Rect( 0 ,0 , m_nSliceWidth , m_nHeight),
BUTTON_CLICK * m_nSliceWidth , 0 , m_nSliceWidth , m_nHeight ,UnitPixel,NULL,NULL,NULL);
}

// hover state
else if ( m_bPress)
{

graphics.DrawImage(m_btnImage, Rect( 0, 0, m_nSliceWidth, m_nHeight),
BUTTON_HOVER * m_nSliceWidth,0, m_nSliceWidth, m_nHeight,UnitPixel,NULL,NULL,NULL);


}

// enable state
else
{

graphics.DrawImage(m_btnImage,Rect( 0, 0,m_nSliceWidth,m_nHeight),
BUTTON_ENABLE*m_nSliceWidth,0, m_nSliceWidth, m_nHeight,UnitPixel,NULL,NULL,NULL);
}
}
}

void PngButton::SetButtonImage( WCHAR* str )
{
m_btnImage = new Bitmap( str);
m_nWidth = m_btnImage -> GetWidth();
m_nHeight = m_btnImage -> GetHeight();

m_nSliceWidth = m_nWidth/4; //图片切成四分

CWnd *pWnd = this -> GetParent();
GetWindowRect( &m_rectButton );
pWnd -> ScreenToClient(m_rectButton);
m_rectButton.right = m_rectButton.left + m_nSliceWidth;
m_rectButton.bottom = m_rectButton.top + m_nHeight;
MoveWindow(m_rectButton); //调整按钮大小以适应图片
}

void PngButton::OnMouseMove(UINT nFlags, CPoint point)
{
if( m_bCursorOnButton == FALSE )
{
TRACKMOUSEEVENT tme;
ZeroMemory(&tme,sizeof(TRACKMOUSEEVENT));
tme.cbSize = sizeof(tme);
tme.hwndTrack = m_hWnd;
tme.dwFlags = TME_LEAVE|TME_HOVER;
tme.dwHoverTime = 1;
m_bCursorOnButton = _TrackMouseEvent(&tme);
}

CButton::OnMouseMove(nFlags, point);
}

LRESULT PngButton::OnMouseLeave(WPARAM wparam, LPARAM lparam)
{
m_bCursorOnButton = FALSE;
m_bPress = FALSE;

Invalidate();
return 0L;
}

LRESULT PngButton::OnMouseHover(WPARAM wparam, LPARAM lparam)
{
m_bPress = TRUE;

Invalidate();
return 0L;
}


void PngButton::OnLButtonDown(UINT nFlags, CPoint point)
{
Invalidate();

CButton::OnLButtonDown(nFlags, point);
}

void PngButton::OnLButtonUp(UINT nFlags, CPoint point)
{
Invalidate();
CButton::OnLButtonUp(nFlags, point);
}

LRESULT PngButton::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
if (message == WM_LBUTTONDBLCLK)
{
message = WM_LBUTTONDOWN;
}
return CButton::DefWindowProc(message, wParam, lParam);//很重要,消除双击没反应
}

BOOL PngButton::OnEraseBkgnd(CDC* pDC)
{
return true;
}

Tinary3v0 2012-07-10
  • 打赏
  • 举报
回复
.h文件
#pragma once

class PngButton : public CButton
{
DECLARE_DYNAMIC(PngButton)

public:


enum BUTTON_STATE
{
BUTTON_ENABLE = 0,
BUTTON_HOVER = 1,
BUTTON_CLICK = 2,
BUTTON_DISABLE= 3
}; //按钮状态


PngButton();
virtual ~PngButton();

protected:

afx_msg LRESULT OnMouseLeave(WPARAM wparam, LPARAM lparam);
afx_msg LRESULT OnMouseHover(WPARAM wparam, LPARAM lparam);

DECLARE_MESSAGE_MAP()
public:
virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);
void SetButtonImage(WCHAR* str);

afx_msg void OnMouseMove(UINT nFlags, CPoint point);
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
afx_msg void OnLButtonUp(UINT nFlags, CPoint point);


BOOL m_bDisable; // 按钮是否禁用
BOOL m_bCursorOnButton; // 鼠标是否在按钮上
BOOL m_bPress; // 按钮是否被按下

int m_nWidth; //图片宽
int m_nHeight; //图片高
int m_nSliceWidth; //每一块图片的宽


Bitmap *m_btnImage; //按钮图片
CRect m_rectButton; //按钮区域

protected:
virtual LRESULT DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam);

public:
afx_msg BOOL OnEraseBkgnd(CDC* pDC);
};
  • 打赏
  • 举报
回复
在OnLButtonDown 和 OnLButtonUp中处理

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧