鼠标移到cstatic,改变光标/鼠标。 setcursor

老哥刚好有这样一段现成的程序,功能比你的不多一点:增加了改变为红色的功能,还是比较简单:
1 定义手形鼠标资源:
#ifndef  IDC_HAND 
#define  IDC_HAND  MAKEINTRESOURCE(32649) 
#endif
2 定义好字体变色色开关bool m_bColorSwitchOpened;不为TRUE时字体变红,初始化为FALSE,
3 定义下画线函数,以便于调用

  void CCtmpDlg::AddLine() 
{ 
CRect rect; 
CStatic *sta=(CStatic *)GetDlgItem(IDC_STATIC1); 
CDC* DC=GetDC(); 
sta->GetWindowRect(&rect); 
ScreenToClient(&rect); 
DC->MoveTo(rect.left,rect.bottom); 
DC->LineTo(rect.right,rect.bottom); 

} 


4 增加WM_CTLCOLOR消息函数,以改变CStatic的颜色和加上下划线

HBRUSH CCtmpDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
{ 
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor); 

if(( pWnd->GetDlgCtrlID()==IDC_STATIC1)&&m_bColorSwitchOpened)//CStatic ID 
{ 

SetTextColor(pDC->GetSafeHdc(),RGB(255,0,0));//改为红色 
} 
AddLine();//加上下画线 
return hbr; 
} 


4 增加WM_MOUSEMOVE消息函数,当鼠标移到CStatic上时为手形鼠标,并触发改变字体颜色开关

void CComToolsDlg::OnMouseMove(UINT nFlags, CPoint point) 
{ 

CStatic *msgbox=(CStatic*)GetDlgItem(IDC_STATIC1); 
CRect rect; 
    GetClientRect(&rect); 
static bool //为消除闪烁设定 
oldSwitch=false, 
newSwitch=false; 

msgbox->GetWindowRect(&rect); 
ScreenToClient(&rect); 
if(PtInRect(rect,point)) 
{ 
SetCursor(LoadCursor(NULL,IDC_HAND)); //手形 
newSwitch=true; 
m_bColorSwitchOpened=true;//变红字 
} 
else 
{ 
newSwitch=false; 
m_bColorSwitchOpened=false; 
} 
if(oldSwitch!=newSwitch) 
{ 
oldSwitch=newSwitch; 
msgbox->Invalidate(); 
} 
CDialog::OnMouseMove(nFlags, point); 
}

转载于:https://www.cnblogs.com/rogee/archive/2011/02/16/1956219.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 MFC 对话框中,可以通过 CStatic 控件来显示图片,并通过鼠标事件处理函数来实现图片的平移和放缩。下面是实现方法的大致步骤: 1. 在对话框类的头文件中添加成员变量,用于保存图片的句柄和位置信息: ``` HBITMAP m_hBitmap; // 图片句柄 CPoint m_ptOrigin; // 原点坐标 CSize m_sizeBitmap; // 图片大小 double m_fScale; // 放缩比例 ``` 2. 在 OnInitDialog 函数中,使用 LoadImage 函数加载图片,并获取图片的大小信息: ``` m_hBitmap = (HBITMAP)LoadImage(NULL, L"image.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); BITMAP bm; GetObject(m_hBitmap, sizeof(BITMAP), &bm); m_sizeBitmap.cx = bm.bmWidth; m_sizeBitmap.cy = bm.bmHeight; m_ptOrigin = CPoint(m_sizeBitmap.cx / 2, m_sizeBitmap.cy / 2); m_fScale = 1.0; ``` 3. 在 OnPaint 函数中,使用 CDC 类的函数将图片绘制到控件上: ``` CPaintDC dc(this); CDC dcMem; dcMem.CreateCompatibleDC(&dc); CBitmap* pOldBitmap = dcMem.SelectObject(CBitmap::FromHandle(m_hBitmap)); dc.StretchBlt(0, 0, (int)(m_sizeBitmap.cx * m_fScale), (int)(m_sizeBitmap.cy * m_fScale), &dcMem, 0, 0, m_sizeBitmap.cx, m_sizeBitmap.cy, SRCCOPY); dcMem.SelectObject(pOldBitmap); ``` 4. 在 OnLButtonDown 函数中,记录鼠标按下时的位置: ``` SetCapture(); m_ptOrigin = point; ``` 5. 在 OnMouseMove 函数中,计算鼠标移动的距离,并根据距离调整图片的位置: ``` if (GetCapture() == this) { CPoint ptOffset = point - m_ptOrigin; m_ptOrigin = point; Invalidate(); } ``` 6. 在 OnLButtonUp 函数中,释放鼠标捕获: ``` ReleaseCapture(); ``` 7. 在 OnMouseWheel 函数中,根据滚轮的方向调整图片的大小,并根据放缩中心点的位置调整图片的位置: ``` ScreenToClient(&point); double fScale = (double)(wParam > 0 ? 1.1 : 0.9); m_fScale *= fScale; m_ptOrigin.x = (int)(point.x - fScale * (point.x - m_ptOrigin.x)); m_ptOrigin.y = (int)(point.y - fScale * (point.y - m_ptOrigin.y)); Invalidate(); ``` 需要注意的是,为了避免图片超出控件范围,需要对图片的位置进行一些限制。另外,放缩时需要将鼠标坐标转换成相对于控件的坐标,并且调整图片的大小和位置。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值