如何设置Button1的背景颜色、和加载图片作为背景呢? 不要网上自编的封装类库能给出实际代码吗? 谢谢 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 OnCtlColor可以设置Button的背景颜色,在网上找找,很多的 汗! OnCtlColor不可以可以设置按键Button的背景颜色哦 OnCtlColor不可以可以设置按键Button的背景颜色自画吧CBitmapButton可以加载图片 如何设置Button1的背景颜色、和加载图片作为背景-----------两个要求都可以自己封装 CMyButton实现 自画 实现。 我感觉很奇怪的是,采用这个帖子里“wangpanli(红尘有爱) ”的方法,能编译0错,可是自从第三步开始,就编译无误后,却显示不出来运行的对话框界面,郁闷:-------------------------------------------------------------------------------------http://community.csdn.net/Expert/topic/5036/5036903.xml?temp=.9795648使用CBitmapButton实现如下(假如按钮在对话框中,ID为IDC_BUTTON1):1、插入两个位图资源IDB_RED和IDB_BLUE。2、在按钮的属性中将Owner Draw 和Bitmap选上。3、在按钮所在对话框类加入CBitmapButton类型成员变量m_btn如下:CBitmapButton m_btn;4、初始化时(OnInitDialog函数),调用AutoLoad()函数将按钮与CBitmapButton类对象关联:m_btn.AutoLoad(IDC_BUTTON1, this);5、在你需要修改位图的地方如下调用:m_btn.LoadBitmaps(IDB_RED);m_btn.RedrawWindow();或m_btn.LoadBitmaps(IDB_BLUE);m_btn.RedrawWindow();来实现更换位图显示。 重装vc 实现了“wangpanli(红尘有爱) ”的方法可是这样的图片按钮比较呆板,怎样捕捉鼠标moveover/按下/松开/moveout这些事件 得到比较弹性的变化呢?看了类向导里面 对按钮却只有单击/双击两个事件. #pragma once// CMENU_WndItemclass CMENU_WndItem : public CButton{ DECLARE_DYNAMIC(CMENU_WndItem)public: CMENU_WndItem(); virtual ~CMENU_WndItem();private: CString m_szCaption; CBitmap m_bitmap1; CBitmap m_bitmap2; bool m_bHiLight; //Hight Light the Item CFont font; CDC memDC; bool m_bSavedDC; bool m_bLBOK;protected: DECLARE_MESSAGE_MAP()public: // 创建按钮控件 virtual BOOL Create(LPCTSTR szCaption, CWnd* pParent, CRect& rect, UINT uID); virtual void DrawItem(LPDRAWITEMSTRUCT /*lpDrawItemStruct*/); afx_msg void OnTimer(UINT nIDEvent); afx_msg void OnMouseMove(UINT nFlags, CPoint point); afx_msg void OnLButtonUp(UINT nFlags, CPoint point); afx_msg BOOL OnEraseBkgnd(CDC* pDC); afx_msg void OnLButtonDown(UINT nFlags, CPoint point);}; // MENU_WndItem.cpp : 实现文件//#include "stdafx.h"#include "SYS_HYVDSAPP.h"#include "MENU_WndItem.h"#include ".\menu_wnditem.h"// CMENU_WndItemIMPLEMENT_DYNAMIC(CMENU_WndItem, CButton)CMENU_WndItem::CMENU_WndItem(){ m_bitmap1.LoadBitmap(IDB_MENUITEM_01); m_bitmap2.LoadBitmap(IDB_MENUITEM_02); m_bHiLight = false; font.CreateFont(20,0,0,0,FW_BOLD,0,0,0,0,0,0,0,0,_T("宋体")); m_bSavedDC = false; m_bLBOK = false;}CMENU_WndItem::~CMENU_WndItem(){ if (m_bitmap1.m_hObject != NULL) m_bitmap1.DeleteObject(); if (m_bitmap2.m_hObject != NULL) m_bitmap2.DeleteObject(); font.DeleteObject();}BEGIN_MESSAGE_MAP(CMENU_WndItem, CButton) ON_WM_TIMER() ON_WM_MOUSEMOVE() ON_WM_LBUTTONUP() ON_WM_ERASEBKGND() ON_WM_LBUTTONDOWN()END_MESSAGE_MAP()// 创建按钮控件BOOL CMENU_WndItem::Create(LPCTSTR szCaption, CWnd* pParent, CRect& rect, UINT uID){ DWORD dwStyle = BS_PUSHBUTTON | BS_OWNERDRAW | WS_TABSTOP; m_szCaption = szCaption; BOOL m_bRet = CButton::Create(szCaption,dwStyle,rect,pParent,uID); return m_bRet;}void CMENU_WndItem::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct){ if (lpDrawItemStruct->CtlType == ODT_BUTTON) { CDC dc; CRect rcClient(lpDrawItemStruct->rcItem); UINT uState = lpDrawItemStruct->itemState; UINT uAction = lpDrawItemStruct->itemAction; BITMAP bm; dc.Attach(lpDrawItemStruct->hDC); CRect rcText(rcClient); ASSERT(font.m_hObject != NULL); CFont* pOldFont =(CFont*)dc.SelectObject(&font); dc.BitBlt(0,0,rcClient.Width(),rcClient.Height(),&memDC,0,0,SRCCOPY); dc.SetBkMode(TRANSPARENT); if (uState & ODS_SELECTED) //选中 { rcClient.DeflateRect(2,2,0,0); rcText.DeflateRect(2,2,0,0); m_bitmap2.GetBitmap(&bm); if (rcClient.Height()>= bm.bmHeight) { CSYS_PublicFun::GUI_DrawTransparentBitmap(dc.GetSafeHdc(),(HBITMAP)m_bitmap2,0,(rcClient.Height() - bm.bmHeight)/2,RGB(255,0,255)); rcText.DeflateRect(bm.bmWidth,0,0,0); } rcText.DeflateRect(10,0,0,0); dc.SetTextColor(RGB(65,156,232)); dc.DrawText(m_szCaption,&rcText,DT_SINGLELINE | DT_VCENTER | DT_LEFT); rcText.DeflateRect(2,0,0,0); dc.SetTextColor(RGB(48,132,222)); dc.DrawText(m_szCaption,&rcText,DT_SINGLELINE | DT_VCENTER | DT_LEFT); } else { if (m_bHiLight) { m_bitmap2.GetBitmap(&bm); if (rcClient.Height()>= bm.bmHeight) { CSYS_PublicFun::GUI_DrawTransparentBitmap(dc.GetSafeHdc(),(HBITMAP)m_bitmap2,0,(rcClient.Height() - bm.bmHeight)/2,RGB(255,0,255)); rcText.DeflateRect(bm.bmWidth,0,0,0); } rcText.DeflateRect(10,0,0,0); dc.SetTextColor(RGB(65,156,232)); dc.DrawText(m_szCaption,&rcText,DT_SINGLELINE | DT_VCENTER | DT_LEFT); rcText.DeflateRect(2,0,0,0); dc.SetTextColor(RGB(48,132,222)); dc.DrawText(m_szCaption,&rcText,DT_SINGLELINE | DT_VCENTER | DT_LEFT); } else { m_bitmap1.GetBitmap(&bm); if (rcClient.Height()>= bm.bmHeight) { CSYS_PublicFun::GUI_DrawTransparentBitmap(dc.GetSafeHdc(),(HBITMAP)m_bitmap1,0,(rcClient.Height() - bm.bmHeight)/2,RGB(255,0,255)); rcText.DeflateRect(bm.bmWidth,0,0,0); } rcText.DeflateRect(10,0,0,0); dc.SetTextColor(RGB(208,193,193)); dc.DrawText(m_szCaption,&rcText,DT_SINGLELINE | DT_VCENTER | DT_LEFT); rcText.DeflateRect(3,3,0,0); dc.SetTextColor(RGB(90,89,90)); dc.DrawText(m_szCaption,&rcText,DT_SINGLELINE | DT_VCENTER | DT_LEFT); } } dc.SelectObject(pOldFont); }}void CMENU_WndItem::OnTimer(UINT nIDEvent){ // TODO: 在此添加消息处理程序代码和/或调用默认值 if (nIDEvent == 1001) { CRect rcClient; CPoint pt; GetWindowRect(&rcClient); GetCursorPos(&pt); if (rcClient.PtInRect(pt)) { if (!m_bHiLight) { m_bHiLight = true; Invalidate(true); SetCapture(); } } else { m_bHiLight = false; Invalidate(true); ReleaseCapture(); KillTimer(1001); } } CButton::OnTimer(nIDEvent);}void CMENU_WndItem::OnMouseMove(UINT nFlags, CPoint point){ // TODO: 在此添加消息处理程序代码和/或调用默认值 if (GetActiveWindow()->GetSafeHwnd() == GetParent()->m_hWnd) { SetTimer(1001,10,NULL); } CButton::OnMouseMove(nFlags, point);}void CMENU_WndItem::OnLButtonUp(UINT nFlags, CPoint point){ CRect rcClient; GetWindowRect(&rcClient); if (rcClient.PtInRect(point)) { if (m_bLBOK) { m_bLBOK = false; m_bHiLight = false; ReleaseCapture(); } Invalidate(true); } CButton::OnLButtonUp(nFlags, point);}BOOL CMENU_WndItem::OnEraseBkgnd(CDC* pDC){ if (!m_bSavedDC) { CWnd* pParent = GetParent(); CRect clientRect; GetClientRect(&clientRect); CRect rc; GetWindowRect(&rc); pParent->ScreenToClient(&rc); int cx=clientRect.Width (); int cy=clientRect.Height (); // 保存DC CBitmap bitmap; memDC.CreateCompatibleDC (pDC); bitmap.CreateCompatibleBitmap (pDC,cx,cy); memDC.SelectObject(&bitmap); memDC.BitBlt (0,0,cx,cy,pDC,0,0,SRCCOPY); m_bSavedDC = true; } return TRUE; }void CMENU_WndItem::OnLButtonDown(UINT nFlags, CPoint point){ // TODO: 在此添加消息处理程序代码和/或调用默认值 CRect rcClient; GetWindowRect(&rcClient); if (rcClient.PtInRect(point)) { Invalidate(true); m_bLBOK = true; } else m_bLBOK = false; CButton::OnLButtonDown(nFlags, point);} 在线编译C++源码 关于VS ATL中给已生成的Component implement class添加interface 如何实现QQ消息弹窗? 急!在不用系统中控件的位置会有差异??!!!! CTabCtrl中按钮不能接收到消息 如何用vc做快速傅立叶变换,滤波,大虾帮忙啊 2000下的console程序如何避免鼠标单击暂停 复制黏贴方面的问题 关于GetDlgItem(); CIH毁了我的宝贝,大家帮帮忙啊。 VC中那一个函数与C++ Builder中的ProcessMessage()功能相同? MFC连接数据源的问题
自画吧
CBitmapButton可以加载图片
-----------两个要求都可以自己封装 CMyButton实现 自画 实现。
我感觉很奇怪的是,采用这个帖子里“wangpanli(红尘有爱) ”的方法,能编译0错,可是自从第三步开始,就编译无误后,却显示不出来运行的对话框界面,郁闷:-------------------------------------------------------------------------------------
http://community.csdn.net/Expert/topic/5036/5036903.xml?temp=.9795648使用CBitmapButton实现如下(假如按钮在对话框中,ID为IDC_BUTTON1):
1、插入两个位图资源IDB_RED和IDB_BLUE。2、在按钮的属性中将Owner Draw 和Bitmap选上。3、在按钮所在对话框类加入CBitmapButton类型成员变量m_btn如下:
CBitmapButton m_btn;4、初始化时(OnInitDialog函数),调用AutoLoad()函数将按钮与CBitmapButton类对象关联:
m_btn.AutoLoad(IDC_BUTTON1, this);5、在你需要修改位图的地方如下调用:m_btn.LoadBitmaps(IDB_RED);
m_btn.RedrawWindow();
或
m_btn.LoadBitmaps(IDB_BLUE);
m_btn.RedrawWindow();
来实现更换位图显示。
可是这样的图片按钮比较呆板,怎样捕捉鼠标moveover/按下/松开/moveout这些事件 得到比较弹性的变化呢?看了类向导里面 对按钮却只有单击/双击两个事件.
// CMENU_WndItem
class CMENU_WndItem : public CButton
{
DECLARE_DYNAMIC(CMENU_WndItem)public:
CMENU_WndItem();
virtual ~CMENU_WndItem();
private:
CString m_szCaption;
CBitmap m_bitmap1;
CBitmap m_bitmap2;
bool m_bHiLight; //Hight Light the Item
CFont font;
CDC memDC;
bool m_bSavedDC;
bool m_bLBOK;
protected:
DECLARE_MESSAGE_MAP()
public:
// 创建按钮控件
virtual BOOL Create(LPCTSTR szCaption, CWnd* pParent, CRect& rect, UINT uID);
virtual void DrawItem(LPDRAWITEMSTRUCT /*lpDrawItemStruct*/);
afx_msg void OnTimer(UINT nIDEvent);
afx_msg void OnMouseMove(UINT nFlags, CPoint point);
afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
afx_msg BOOL OnEraseBkgnd(CDC* pDC);
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
};
//#include "stdafx.h"
#include "SYS_HYVDSAPP.h"
#include "MENU_WndItem.h"
#include ".\menu_wnditem.h"// CMENU_WndItem
IMPLEMENT_DYNAMIC(CMENU_WndItem, CButton)
CMENU_WndItem::CMENU_WndItem()
{
m_bitmap1.LoadBitmap(IDB_MENUITEM_01);
m_bitmap2.LoadBitmap(IDB_MENUITEM_02);
m_bHiLight = false;
font.CreateFont(20,0,0,0,FW_BOLD,0,0,0,0,0,0,0,0,_T("宋体"));
m_bSavedDC = false;
m_bLBOK = false;
}CMENU_WndItem::~CMENU_WndItem()
{
if (m_bitmap1.m_hObject != NULL)
m_bitmap1.DeleteObject();
if (m_bitmap2.m_hObject != NULL)
m_bitmap2.DeleteObject();
font.DeleteObject();
}
BEGIN_MESSAGE_MAP(CMENU_WndItem, CButton)
ON_WM_TIMER()
ON_WM_MOUSEMOVE()
ON_WM_LBUTTONUP()
ON_WM_ERASEBKGND()
ON_WM_LBUTTONDOWN()
END_MESSAGE_MAP()// 创建按钮控件
BOOL CMENU_WndItem::Create(LPCTSTR szCaption, CWnd* pParent, CRect& rect, UINT uID)
{
DWORD dwStyle = BS_PUSHBUTTON | BS_OWNERDRAW | WS_TABSTOP;
m_szCaption = szCaption;
BOOL m_bRet = CButton::Create(szCaption,dwStyle,rect,pParent,uID);
return m_bRet;
}void CMENU_WndItem::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
if (lpDrawItemStruct->CtlType == ODT_BUTTON)
{
CDC dc;
CRect rcClient(lpDrawItemStruct->rcItem);
UINT uState = lpDrawItemStruct->itemState;
UINT uAction = lpDrawItemStruct->itemAction;
BITMAP bm;
dc.Attach(lpDrawItemStruct->hDC);
CRect rcText(rcClient);
ASSERT(font.m_hObject != NULL);
CFont* pOldFont =(CFont*)dc.SelectObject(&font); dc.BitBlt(0,0,rcClient.Width(),rcClient.Height(),&memDC,0,0,SRCCOPY);
dc.SetBkMode(TRANSPARENT);
if (uState & ODS_SELECTED) //选中
{
rcClient.DeflateRect(2,2,0,0);
rcText.DeflateRect(2,2,0,0);
m_bitmap2.GetBitmap(&bm);
if (rcClient.Height()>= bm.bmHeight)
{
CSYS_PublicFun::GUI_DrawTransparentBitmap(dc.GetSafeHdc(),(HBITMAP)m_bitmap2,0,(rcClient.Height() - bm.bmHeight)/2,RGB(255,0,255));
rcText.DeflateRect(bm.bmWidth,0,0,0);
}
rcText.DeflateRect(10,0,0,0);
dc.SetTextColor(RGB(65,156,232));
dc.DrawText(m_szCaption,&rcText,DT_SINGLELINE | DT_VCENTER | DT_LEFT);
rcText.DeflateRect(2,0,0,0);
dc.SetTextColor(RGB(48,132,222));
dc.DrawText(m_szCaption,&rcText,DT_SINGLELINE | DT_VCENTER | DT_LEFT);
}
else
{
if (m_bHiLight)
{
m_bitmap2.GetBitmap(&bm);
if (rcClient.Height()>= bm.bmHeight)
{
CSYS_PublicFun::GUI_DrawTransparentBitmap(dc.GetSafeHdc(),(HBITMAP)m_bitmap2,0,(rcClient.Height() - bm.bmHeight)/2,RGB(255,0,255));
rcText.DeflateRect(bm.bmWidth,0,0,0);
}
rcText.DeflateRect(10,0,0,0);
dc.SetTextColor(RGB(65,156,232));
dc.DrawText(m_szCaption,&rcText,DT_SINGLELINE | DT_VCENTER | DT_LEFT);
rcText.DeflateRect(2,0,0,0);
dc.SetTextColor(RGB(48,132,222));
dc.DrawText(m_szCaption,&rcText,DT_SINGLELINE | DT_VCENTER | DT_LEFT);
}
else
{
m_bitmap1.GetBitmap(&bm);
if (rcClient.Height()>= bm.bmHeight)
{
CSYS_PublicFun::GUI_DrawTransparentBitmap(dc.GetSafeHdc(),(HBITMAP)m_bitmap1,0,(rcClient.Height() - bm.bmHeight)/2,RGB(255,0,255));
rcText.DeflateRect(bm.bmWidth,0,0,0);
}
rcText.DeflateRect(10,0,0,0);
dc.SetTextColor(RGB(208,193,193));
dc.DrawText(m_szCaption,&rcText,DT_SINGLELINE | DT_VCENTER | DT_LEFT);
rcText.DeflateRect(3,3,0,0);
dc.SetTextColor(RGB(90,89,90));
dc.DrawText(m_szCaption,&rcText,DT_SINGLELINE | DT_VCENTER | DT_LEFT);
}
}
dc.SelectObject(pOldFont);
}
}
void CMENU_WndItem::OnTimer(UINT nIDEvent)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
if (nIDEvent == 1001)
{
CRect rcClient;
CPoint pt;
GetWindowRect(&rcClient);
GetCursorPos(&pt);
if (rcClient.PtInRect(pt))
{
if (!m_bHiLight)
{
m_bHiLight = true;
Invalidate(true);
SetCapture();
}
}
else
{
m_bHiLight = false;
Invalidate(true);
ReleaseCapture();
KillTimer(1001);
} }
CButton::OnTimer(nIDEvent);
}void CMENU_WndItem::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
if (GetActiveWindow()->GetSafeHwnd() == GetParent()->m_hWnd)
{
SetTimer(1001,10,NULL);
}
CButton::OnMouseMove(nFlags, point);
}void CMENU_WndItem::OnLButtonUp(UINT nFlags, CPoint point)
{
CRect rcClient;
GetWindowRect(&rcClient);
if (rcClient.PtInRect(point))
{
if (m_bLBOK)
{
m_bLBOK = false;
m_bHiLight = false;
ReleaseCapture();
}
Invalidate(true);
}
CButton::OnLButtonUp(nFlags, point);
}
BOOL CMENU_WndItem::OnEraseBkgnd(CDC* pDC)
{
if (!m_bSavedDC)
{
CWnd* pParent = GetParent();
CRect clientRect;
GetClientRect(&clientRect);
CRect rc;
GetWindowRect(&rc);
pParent->ScreenToClient(&rc);
int cx=clientRect.Width ();
int cy=clientRect.Height ();
// 保存DC
CBitmap bitmap;
memDC.CreateCompatibleDC (pDC);
bitmap.CreateCompatibleBitmap (pDC,cx,cy);
memDC.SelectObject(&bitmap);
memDC.BitBlt (0,0,cx,cy,pDC,0,0,SRCCOPY);
m_bSavedDC = true;
}
return TRUE;
}void CMENU_WndItem::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
CRect rcClient;
GetWindowRect(&rcClient);
if (rcClient.PtInRect(point))
{
Invalidate(true);
m_bLBOK = true;
}
else
m_bLBOK = false;
CButton::OnLButtonDown(nFlags, point);
}