求 CBitmapButton使用,换肤---分不够再加

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


2 vc(不依赖其它库)动态(在程序执行中)换肤如何实现,提供例子最好。
...全文
203 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
linuxlsx 2013-01-16
  • 打赏
  • 举报
回复
linuxlsx 2013-01-16
  • 打赏
  • 举报
回复
是的 你这个怎么用的啊,没个demo?
阿麦 2013-01-16
  • 打赏
  • 举报
回复
看看我N早做的一个类(5楼) BOOL Create(int Left, int Top, int Width, int Height, CWnd* pParentWnd, UINT nID, CImage& ButtonImage); 传入参数中只有一张图片(CImage& ButtonImage) 它是按钮的高度*宽度的四倍。 你说的应该是这样吧
linuxlsx 2013-01-16
  • 打赏
  • 举报
回复

譬如上面 一张图片 就表示关闭按钮 在四种状态下的图像 。程序就是得到是一整张图片对象,如何将其切分成四块传入上述函数。我想大部分人都没把图片 分成4张分别载入肯定是有简单方法,不会一个像素去切分吧。?
linuxlsx 2013-01-16
  • 打赏
  • 举报
回复
CBitmapButton的加载图片函数 BOOL LoadBitmaps( LPCTSTR lpszBitmapResource, LPCTSTR lpszBitmapResourceSel = NULL, LPCTSTR lpszBitmapResourceFocus = NULL, LPCTSTR lpszBitmapResourceDisabled = NULL ); 四个传入参数分别是 up down focuse disable的图片资源。 我是想只要一张bmp图片包含这四个是如何处理的都。
阿麦 2013-01-16
  • 打赏
  • 举报
回复
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: CImage m_Image; bool m_Enabled; int m_State; int m_ImageWidth; int m_ImageHeight; int m_Width; int m_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; }
linuxlsx 2013-01-16
  • 打赏
  • 举报
回复
难道发错版块了
阿麦 2013-01-16
  • 打赏
  • 举报
回复
CButton类响应鼠标事件时重画底图,重画的坐标不同就成。
linuxlsx 2013-01-16
  • 打赏
  • 举报
回复
没人教怎么搞么?
lee_鹿游原 2013-01-16
  • 打赏
  • 举报
回复
MFC没用过, 1.猜测:CBitmapButton如果可以用一张4种状态图,实现按钮的4种状态,那肯定做了相应的处理。 例:获取位图像素坐标Rect(0,0,30,20),作为第一张正常状态下按钮.. 2. 楼主可以看一下CBitmapButton的实现,应该是基于Button类扩展的按钮,如果当前的button满足不了你的需求,楼主也可以自己实现一个button类,扩展一些功能.. 动态换肤的例子教程:http://www.vckbase.com/index.php/wv/1529.html

64,685

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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