关于按钮重绘的问题,本人水平有限,请大家指点 各位,如果实现当鼠标移动到按钮时顔色改变,移走时又恢复原来的样子,这要用到按钮重绘,就是OWER_DRAW,是不是每一个按钮都要关联变量?但如果有几十个按钮都要实现这种功能,那不是要关联几十个变量?各位有什么解决方法,或者有更好的方法,麻烦说一下,谢谢了 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 网上有已写好的类CButtonST,符合LZ的要求,去搜一下下载使用即可 仿照QQ登陆时的登陆按钮。楼主说按钮很多,可以这么做,关联还是要的。UINT butt_id[20]; //记录按钮IDCButtonEx butt[20]; //用作关联在DDX中写循环for(int i=0; i<20; i++) DDX...重写有两种方式,一是ownerdraw,响应DrawItem消息,重写DrawItem。而是响应PAINT消息,重写OnPaint。代码:ButtonEx.h#pragma once// CButtonExclass CButtonEx : public CButton{private: bool down; int on; CString cap;public: CButtonEx(); void SetText(CString);protected: DECLARE_MESSAGE_MAP()public: afx_msg LRESULT OnMouseHover(WPARAM,LPARAM); afx_msg LRESULT OnMouseLeave(WPARAM,LPARAM); afx_msg void OnLButtonDown(UINT nFlags, CPoint point); afx_msg void OnLButtonUp(UINT nFlags, CPoint point); afx_msg void OnMouseMove(UINT nFlags, CPoint point); afx_msg void OnTimer(UINT_PTR nIDEvent); afx_msg void OnPaint();};ButtonEx.cpp#include "ButtonEx.h"#include <atlimage.h>CButtonEx::CButtonEx(){ down = false; on = 0;}void CButtonEx::SetText(CString text){ cap = text; Invalidate();}BEGIN_MESSAGE_MAP(CButtonEx, CButton) ON_WM_LBUTTONDOWN() ON_WM_LBUTTONUP() ON_WM_MOUSEMOVE() ON_WM_TIMER() ON_WM_PAINT() ON_MESSAGE(WM_MOUSEHOVER,OnMouseHover) ON_MESSAGE(WM_MOUSELEAVE,OnMouseLeave)END_MESSAGE_MAP()// CButtonEx 消息处理程序void CButtonEx::OnPaint(){ CPaintDC dc(this); CString path; if( down ) path = L"res\\down.png"; else { if( on==0 ) path = L"res\\normal.png"; else path = L"res\\light.png"; } CImage im; HRESULT rs = im.Load(path); if( FAILED(rs) ) return; RECT rc; GetClientRect(&rc); im.Draw(dc.GetSafeHdc(),rc); if( cap.IsEmpty() ) return; dc.SetBkMode(TRANSPARENT); dc.DrawText(cap,&rc,DT_CENTER | DT_VCENTER | DT_SINGLELINE);}void CButtonEx::OnLButtonDown(UINT nFlags, CPoint point){ CButton::OnLButtonDown(nFlags, point); down = true; Invalidate();}void CButtonEx::OnLButtonUp(UINT nFlags, CPoint point){ CButton::OnLButtonUp(nFlags, point); down = false; on = 1; Invalidate();}void CButtonEx::OnMouseMove(UINT nFlags, CPoint point){ CButton::OnMouseMove(nFlags, point); if( on==0 ) { on = 1; SetTimer(1212,50,NULL); }}void CButtonEx::OnTimer(UINT_PTR nIDEvent){ CButton::OnTimer(nIDEvent); if( down ) return; CPoint p; ::GetCursorPos(&p); ScreenToClient(&p); CRect rc; GetClientRect(&rc); if( rc.PtInRect(p) ) { if( on==2 ) return; on = 2; PostMessage(WM_MOUSEHOVER); } else PostMessage(WM_MOUSELEAVE);}LRESULT CButtonEx::OnMouseHover(WPARAM,LPARAM){ Invalidate(); return 0;}LRESULT CButtonEx::OnMouseLeave(WPARAM,LPARAM){ KillTimer(1212); down = false; on = 0; Invalidate(); return 0;} 至于图片可以在qq安装文件里面找,loginpanel 如果不想关联那么多变量怎么做,毕竟一个对象里放那么多BUTTON类的变量 ,不太好吧 HMENU问题 请问数据包截取具体是在哪个层实现的? EDIT 框如果超过EDIT长度 EDIT框自动变长怎么弄 如何扫描MAC与局域网IP扫描并替换 一个超级奇怪的问题,大家千万不要不相信,帮帮我。 英文版的VC怎么界面首页没法显示汉字? 寻求英语高手帮助!毕业论文摘要的翻译,谢谢!!!!! ado兼容问题 如何在CFORMVIEW里重画背景 VC++ 引用外部OCX进行封装 DirectShow媒体播放器以及Filter的学习总结 大侠看过来!bho和信息栏的问题,顶者有分
楼主说按钮很多,可以这么做,关联还是要的。
UINT butt_id[20]; //记录按钮ID
CButtonEx butt[20]; //用作关联
在DDX中写循环for(int i=0; i<20; i++) DDX...
重写有两种方式,一是ownerdraw,响应DrawItem消息,重写DrawItem。而是响应PAINT消息,重写OnPaint。
代码:
ButtonEx.h#pragma once// CButtonExclass CButtonEx : public CButton
{
private:
bool down;
int on;
CString cap;
public:
CButtonEx();
void SetText(CString);
protected:
DECLARE_MESSAGE_MAP()
public:
afx_msg LRESULT OnMouseHover(WPARAM,LPARAM);
afx_msg LRESULT OnMouseLeave(WPARAM,LPARAM);
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
afx_msg void OnMouseMove(UINT nFlags, CPoint point);
afx_msg void OnTimer(UINT_PTR nIDEvent);
afx_msg void OnPaint();
};
ButtonEx.cpp#include "ButtonEx.h"
#include <atlimage.h>CButtonEx::CButtonEx()
{
down = false;
on = 0;
}void CButtonEx::SetText(CString text)
{
cap = text;
Invalidate();
}BEGIN_MESSAGE_MAP(CButtonEx, CButton)
ON_WM_LBUTTONDOWN()
ON_WM_LBUTTONUP()
ON_WM_MOUSEMOVE()
ON_WM_TIMER()
ON_WM_PAINT()
ON_MESSAGE(WM_MOUSEHOVER,OnMouseHover)
ON_MESSAGE(WM_MOUSELEAVE,OnMouseLeave)
END_MESSAGE_MAP()// CButtonEx 消息处理程序void CButtonEx::OnPaint()
{
CPaintDC dc(this);
CString path;
if( down )
path = L"res\\down.png";
else
{
if( on==0 )
path = L"res\\normal.png";
else
path = L"res\\light.png";
}
CImage im;
HRESULT rs = im.Load(path);
if( FAILED(rs) )
return;
RECT rc;
GetClientRect(&rc);
im.Draw(dc.GetSafeHdc(),rc);
if( cap.IsEmpty() )
return;
dc.SetBkMode(TRANSPARENT);
dc.DrawText(cap,&rc,DT_CENTER | DT_VCENTER | DT_SINGLELINE);
}void CButtonEx::OnLButtonDown(UINT nFlags, CPoint point)
{
CButton::OnLButtonDown(nFlags, point);
down = true;
Invalidate();
}void CButtonEx::OnLButtonUp(UINT nFlags, CPoint point)
{
CButton::OnLButtonUp(nFlags, point);
down = false;
on = 1;
Invalidate();
}void CButtonEx::OnMouseMove(UINT nFlags, CPoint point)
{
CButton::OnMouseMove(nFlags, point);
if( on==0 )
{
on = 1;
SetTimer(1212,50,NULL);
}
}void CButtonEx::OnTimer(UINT_PTR nIDEvent)
{
CButton::OnTimer(nIDEvent);
if( down )
return;
CPoint p;
::GetCursorPos(&p);
ScreenToClient(&p);
CRect rc;
GetClientRect(&rc);
if( rc.PtInRect(p) )
{
if( on==2 )
return;
on = 2;
PostMessage(WM_MOUSEHOVER);
}
else
PostMessage(WM_MOUSELEAVE);
}LRESULT CButtonEx::OnMouseHover(WPARAM,LPARAM)
{
Invalidate();
return 0;
}LRESULT CButtonEx::OnMouseLeave(WPARAM,LPARAM)
{
KillTimer(1212);
down = false;
on = 0;
Invalidate();
return 0;
}