首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

求 CBit地图Button使用,换肤-分不够再加

2013-02-18 
求 CBitmapButton使用,换肤---分不够再加1.CBitmapButton使用主要是如何只设置一张bmp图片(里面有4段按钮

求 CBitmapButton使用,换肤---分不够再加
1.CBitmapButton使用
  主要是如何只设置一张bmp图片(里面有4段按钮不同状态图形)得到按钮在up-down-等四种状态的表示。
  如果单独设置 4张资源图片肯定可以达到目的。但我看大部分程序都只有一个资源(一个bmp文件中有按钮的4副图片) 。如何实现一张bmp图片达到目的?


2 vc(不依赖其它库)动态(在程序执行中)换肤如何实现,提供例子最好。 Cbitmapbutton 换肤
[解决办法]
MFC没用过,
1.猜测:CBitmapButton如果可以用一张4种状态图,实现按钮的4种状态,那肯定做了相应的处理。
例:获取位图像素坐标Rect(0,0,30,20),作为第一张正常状态下按钮.. 
2.
楼主可以看一下CBitmapButton的实现,应该是基于Button类扩展的按钮,如果当前的button满足不了你的需求,楼主也可以自己实现一个button类,扩展一些功能..
动态换肤的例子教程:http://www.vckbase.com/index.php/wv/1529.html

[解决办法]
CButton类响应鼠标事件时重画底图,重画的坐标不同就成。

[解决办法]
N早前做的一个,还能用。

// CAmoymanButton.h
#pragma once

#include <AtlImage.h>
using namespace Gdiplus;

class CAmoymanButton : public CWnd
{
DECLARE_DYNAMIC(CAmoymanButton)

public:
CAmoymanButton();
virtual ~CAmoymanButton();

public:
BOOL Create(int Left, int Top, int Width, int Height, CWnd* pParentWnd, UINT nID, CImage& ButtonImage);
void Enabled(bool bEnabled);
bool Enabled(void);

private:
void ChangeState(int State);

private:
enum State {Normal = 0, Focus, Selected, Disabled};

private:
CImagem_Image;
boolm_Enabled;
intm_State;
intm_ImageWidth;
intm_ImageHeight;
intm_Width;
intm_Height;

protected:
afx_msg void OnPaint();
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
afx_msg void OnMouseMove(UINT nFlags, CPoint point);
DECLARE_MESSAGE_MAP()
};



// CAmoymanButton.cpp
#include "stdafx.h"
#include "AmoymanGobang.h"
#include "AmoymanButton.h"


IMPLEMENT_DYNAMIC(CAmoymanButton, CWnd)

CAmoymanButton::CAmoymanButton()
{
m_State   = Normal;
m_Enabled = true;
}

CAmoymanButton::~CAmoymanButton()
{
}


BEGIN_MESSAGE_MAP(CAmoymanButton, CWnd)
ON_WM_LBUTTONDOWN()
ON_WM_LBUTTONUP()
ON_WM_MOUSEMOVE()
ON_WM_PAINT()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()



// CAmoymanButton 消息处理程序
BOOL CAmoymanButton::Create(int Left, int Top, int Width, int Height, CWnd* pParentWnd, UINT nID, CImage& ButtonImage)
{
BOOL Result = CWnd::Create(NULL, NULL, WS_CHILD 
[解决办法]
 WS_VISIBLE, CRect(Left, Top, Left + Width, Top + Height), pParentWnd, nID);
if (!m_Image.IsNull())
{
m_Image.Destroy();
}
m_Image.Create(Width * 4, Height, 32, CImage::createAlphaChannel);
m_Width = Width;
m_Height = Height;
m_ImageWidth = ButtonImage.GetWidth();
m_ImageHeight = ButtonImage.GetHeight();
int nRowBytesSrc = ButtonImage.GetPitch();
int nRowBytesDst = m_Image.GetPitch();


BYTE* pBitsSrc = (BYTE*)ButtonImage.GetBits();
BYTE* pBitsDst = (BYTE*)m_Image.GetBits();
for (int y = 0; y < m_ImageHeight; ++y, pBitsSrc += nRowBytesSrc, pBitsDst += nRowBytesDst)
{
UINT* pSrc = (UINT*)pBitsSrc;
UINT* pDst = (UINT*)pBitsDst;
for (int x = 0; x < m_ImageWidth; ++x)
{
*pDst++ = *pSrc++;
}
}
return Result;
}

void CAmoymanButton::OnPaint()
{
static int State = -1;
CPaintDC dc(this);
m_Image.Draw(dc.m_hDC, 0, 0, m_Width, m_Height, m_State * m_Width, 0, m_Width, m_Height);
if (m_State != State)
{
State = m_State;
CRect Rect;
CWnd* pParent = GetParent();
GetWindowRect(&Rect);
pParent->ScreenToClient(&Rect);
pParent->InvalidateRect(&Rect);
pParent->UpdateWindow();
}
}

void CAmoymanButton::OnLButtonDown(UINT nFlags, CPoint point)
{
if (m_Enabled)
{
SetCapture();
ChangeState(Selected);
}
CWnd::OnLButtonDown(nFlags, point);
}

void CAmoymanButton::OnLButtonUp(UINT nFlags, CPoint point)
{
if (m_Enabled)
{
ReleaseCapture();
ChangeState(Normal);
CRect rect;
GetClientRect(&rect);
if (rect.PtInRect(point))
{
::PostMessage(GetParent()->GetSafeHwnd(), WM_SYSCOMMAND, GetDlgCtrlID(), 0);
}
}
CWnd::OnLButtonUp(nFlags, point);
}

void CAmoymanButton::OnMouseMove(UINT nFlags, CPoint point)
{
if (m_Enabled)
{
CRect rect;
GetClientRect(&rect);
if (rect.PtInRect(point))
{
ChangeState((GetKeyState(VK_LBUTTON) & 0x8000) > 0 ? Selected : Focus);
SetCapture();
}
else
{
ReleaseCapture();
ChangeState(Normal);
}
}
CWnd::OnMouseMove(nFlags, point);
}

void CAmoymanButton::ChangeState(int State)
{
if (m_Enabled)
{
if (m_State != State)
{
m_State = State;
RedrawWindow();
}
}
else
{
if (m_State != Disabled)
{
m_State = Disabled;
RedrawWindow();
}
}
}

void CAmoymanButton::Enabled(bool bEnabled)
{
m_Enabled = bEnabled;
ChangeState(Normal);
}

bool CAmoymanButton::Enabled(void)
{
return m_Enabled;
}
[解决办法]
看看我N早做的一个类(5楼)
BOOL Create(int Left, int Top, int Width, int Height, CWnd* pParentWnd, UINT nID, CImage& ButtonImage);
传入参数中只有一张图片(CImage& ButtonImage)
它是按钮的高度*宽度的四倍。
你说的应该是这样吧

热点排行