社区
C++ 语言
帖子详情
求 CBitmapButton使用,换肤---分不够再加
linuxlsx
2013-01-16 01:12:09
1.CBitmapButton使用
主要是如何只设置一张bmp图片(里面有4段按钮不同状态图形)得到按钮在up-down-等四种状态的表示。
如果单独设置 4张资源图片肯定可以达到目的。但我看大部分程序都只有一个资源(一个bmp文件中有按钮的4副图片) 。如何实现一张bmp图片达到目的?
2 vc(不依赖其它库)动态(在程序执行中)换肤如何实现,提供例子最好。
...全文
203
10
打赏
收藏
求 CBitmapButton使用,换肤---分不够再加
1.CBitmapButton使用 主要是如何只设置一张bmp图片(里面有4段按钮不同状态图形)得到按钮在up-down-等四种状态的表示。 如果单独设置 4张资源图片肯定可以达到目的。但我看大部分程序都只有一个资源(一个bmp文件中有按钮的4副图片) 。如何实现一张bmp图片达到目的? 2 vc(不依赖其它库)动态(在程序执行中)换肤如何实现,提供例子最好。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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
《VC 位图按钮C
Bitmap
Button
的
使用
》
《VC 位图按钮C
Bitmap
Button
的
使用
》,http://blog.csdn.net/akof1314/article/details/4951836
C
Bitmap
Button
使用
采用MFC动态加载C
Bitmap
Button
的四副状态图,制作出漂亮的按钮
vc怎样在图形(
BITMAP
)按钮(C
Bitmap
Button
)上加文字
vc怎样在位图按钮(C
Bitmap
Button
)上添加文字
VC 位图按钮C
Bitmap
Button
的
使用
VC 位图按钮C
Bitmap
Button
的
使用
,可实现按钮多样化
商业编程-源码-动态加载C
Bitmap
Button
的四副状态图.zip
商业编程-源码-动态加载C
Bitmap
Button
的四副状态图.zip
C++ 语言
64,685
社区成员
250,491
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章