VC++50个必做例子之鼠标划线

本文介绍了一种在视图类中实现鼠标拖拽功能的方法。通过定义鼠标状态、位置等变量,并重写鼠标消息响应函数(如按下、移动、释放),可以绘制跟随鼠标移动的线条。文中详细解释了如何捕获鼠标、限制其移动范围及如何根据鼠标移动更新屏幕显示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 在视图类开头定义

class CMouseView : public CView
{
protected// create from serialization only
    CMouseView();
    DECLARE_DYNCREATE(CMouseView)
// my add
    CString m_ClassName;
    
int
 m_Dragging;  //鼠标状态
    HCURSOR m_HCross; //鼠标形状
    CPoint m_PointOld; //鼠标的初始地点
    CPoint m_pointOrigin; //鼠标原点
 

在构造函数中对

 

CMouseView::CMouseView()
{
    
// TODO: add construction code here
    m_Dragging=0; //鼠标的状态为0,没有按下,1为按下
    m_HCross 
= AfxGetApp()->LoadStandardCursor(IDC_CROSS); //获得鼠标的形状
赋值

 

m_HCross 存放程序的光标句柄,AfxGetApp()获得应用程序类对象的指针,这个指针用于调用应用程序类对象的成员函数LoadStandardCursor()传送光标的句柄。光标句柄参数参考LoadStandardCursor()函数

添加一个鼠标的lbuttondown 消息,然后添加代码,(晕,书是用vc++7.0,看来很多东西以后要自己想了)

(cheat---遇到困难了吗,祝贺你,你获得了进步的机会~)

 添加

void CMouseView::OnLButtonDown(UINT nFlags, CPoint point) 
{
    
// TODO: Add your message handler code here and/or call default
    m_pointOrigin = point; //用鼠标的坐标的赋值
    m_PointOld 
=
 point; /用鼠标的坐标的赋值
    SetCapture();  //捕获鼠标
    m_Dragging 
= 1
; //设置鼠标状态

    RECT Rect; //定义窗口范围
    GetClientRect(
&
Rect); //获得客户区的范围
    ClientToScreen(
&
Rect); //转换为屏幕坐标
    ::ClipCursor(
&Rect); // 限定鼠标范围

 

添加鼠标移动,消息

 

void CMouseView::OnMouseMove(UINT nFlags, CPoint point) 
{
    
// TODO: Add your message handler code here and/or call default
    ::SetCursor(m_HCross); //显示鼠标形状
    

    
if(m_Dragging)
    
{
        CClientDC ClientDC(
this);  //获得视窗设备表述表
        ClientDC.SetROP2(R2_NOT);//生成逆转当前屏幕颜色来绘图方式,
        ClientDC.MoveTo(m_pointOrigin);//画
        ClientDC.LineTo(m_PointOld);//画起点--终点线
        ClientDC.MoveTo(m_pointOrigin);
        ClientDC.LineTo(m_PointOld);

        m_pointOrigin 
= point;

    }

    
    CView::OnMouseMove(nFlags, point);
}

添加鼠标up消息

 

void CMouseView::OnLButtonUp(UINT nFlags, CPoint point) 
{
    
// TODO: Add your message handler code here and/or call default
    if(m_Dragging)
    
{
       m_Dragging 
= 0;
       ::ReleaseCapture();
       ::ClipCursor(NULL);

        CClientDC ClientDC(
this);
        ClientDC.SetROP2(R2_NOT);
           ClientDC.MoveTo(m_pointOrigin);
        ClientDC.LineTo(m_PointOld);
        ClientDC.SetROP2(R2_COPYPEN);
        ClientDC.MoveTo(m_pointOrigin);
        ClientDC.LineTo(m_PointOld);
    }

    CView::OnLButtonUp(nFlags, point);
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值