vc学习(一)单文档画圆,鼠标点击变色

本人最近心血来潮,正在看《vc++技术内幕》这本书,以下内容可以说是一个《vc++技术内幕》这本书的读书笔记。

我用的是vs2010编译器,根据向导创建一个简单的单文档项目。

简单说一下创建过程:

文件->新建->项目,选MFC中的MFC应用程序,下面的路径,名称填好,点击确定会弹出MFC应用程序向导。

点击下一步,应用程序类型选单文档,项目类型选MFC标准,一直默认下一步到用户界面功能这里,命令栏使用经典菜单,点击完成,好了,一个简单的单文档项目建立成功,编译运行一下。


接下来画圆

以类视图查看项目,在view类(如果你创建的项目名为test,那么view类就是Ctestview)中找到OnDraw。为什么是view类呢?因为view类是此应用程序的核心,与该应用程序的视窗相关联,应用程序的所有动作都会在该视窗中反映出来。

OnDraw函数是CView类中的一个虚成员函数,每次当视窗需要被重绘时,应用程序框架都要调用OnDraw函数。调用Invalidate后会触发对OnDraw函数的调用,我们这里就是用到了这个来使鼠标点击圆变色。

在OnDraw函数中原有的代码我们这里用不到可以删掉。(GetDocument()的返回值指向的是当前文档的指针)

在View类中添加两个变量

int m_nColor;

CRect m_rectEllipse;

在构造函数里初始化

CtestView::CtestView()
	: m_rectEllipse(20,20,120,120)
	, m_nColor(GRAY_BRUSH)
{
	// TODO: 在此处添加构造代码
	
}

在OnDraw函数中添加以下代码:

void CtestView::OnDraw(CDC* pDC)
{
	pDC->SelectStockObject(m_nColor);//灰色画刷
	pDC->Ellipse(m_rectEllipse);//画一椭圆,左上角坐标(0,20),右下角坐标(100,120)
}

pDC是一CDC指针,在MFC库中,设备环境是由C++的CDC类对象来表示的,该对象被作为参数传给OnDraw函数。

SelectStockObject方法选用系统设备不需要释放,也可以自己构造颜色画刷,调用SelectObject用完之后再释放,这里暂时不详说,就用SelectStockObject选用系统画刷。  

Ellipse函数是用来画一个椭圆,这里传的是一个CRect参数进去,CRect的四个参数分别是left,top,right,和bottom

编译运行一下,一个灰色的圆出现了。


接下来实现鼠标点击变色

要响应鼠标点击消息,对着早类试图CtestView类点击右键选择类向导,消息里面找到WM_LBUTTONDOWN,添加处理程序,编辑代码。 

void CtestView::OnLButtonDown(UINT nFlags, CPoint point)  
{  
    // TODO: 在此添加消息处理程序代码和/或调用默认值  
    CRgn rgn;  
    rgn.CreateEllipticRgnIndirect(m_rectEllipse);  
  
    if (rgn.PtInRegion(point)) {  
        if (m_nColor == GRAY_BRUSH) {  
            m_nColor=BLACK_BRUSH;  
        } else {  
            m_nColor=GRAY_BRUSH;  
        }  
        InvalidateRect(m_rectEllipse);  
    }  
    CView::OnLButtonDown(nFlags, point);  
}  

编译运行,这一次的目地就达到了。

(点击鼠标左键过快可能会被系统解释为双击左键,而不会触发WM_LBUTTONDOWN消息。)

CRgn对象能保存一个椭圆区域,调用CreateEllipticRgnIndirect方法,参数是一个CRect矩形区域。rgn,PtInRegion检查点是否在矩形区域内,InvalidateRect更新一个矩形区域。

以上内容多为本人自行理解,如哪有错误欢迎大家指出,如初学者哪有不懂也可以提出来,我能解答的一定认真解答。

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
您可以在您的文档应用程序中实现鼠标左键长按功能,并在鼠标移动时显示五个环。下面是一些实现步骤: 1. 在您的 CView 派生类中添加以下成员变量: ``` CPoint m_ptMousePos; // 鼠标位置 BOOL m_bLButtonDown; // 鼠标左键是否按下 BOOL m_bTimerStarted; // 计时器是否已启动 UINT m_nTimerID; // 计时器ID int m_nTimerElapse; // 计时器时间间隔 ``` 2. 在您的 CView 派生类中添加以下消息处理函数: ``` 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); ``` 3. 在您的 CView 派生类的 OnLButtonDown 函数中启动计时器并记录鼠标左键按下的状态和位置: ``` void CMyView::OnLButtonDown(UINT nFlags, CPoint point) { m_bLButtonDown = TRUE; m_ptMousePos = point; m_bTimerStarted = FALSE; m_nTimerID = SetTimer(1, 10, NULL); CView::OnLButtonDown(nFlags, point); } ``` 4. 在您的 CView 派生类的 OnLButtonUp 函数中停止计时器并重置鼠标左键按下的状态: ``` void CMyView::OnLButtonUp(UINT nFlags, CPoint point) { m_bLButtonDown = FALSE; if (m_bTimerStarted) { KillTimer(m_nTimerID); m_bTimerStarted = FALSE; } CView::OnLButtonUp(nFlags, point); } ``` 5. 在您的 CView 派生类的 OnMouseMove 函数中更新鼠标位置,并根据鼠标左键状态显示环: ``` void CMyView::OnMouseMove(UINT nFlags, CPoint point) { if (m_bLButtonDown) { m_ptMousePos = point; if (!m_bTimerStarted) { m_bTimerStarted = TRUE; m_nTimerElapse = 0; SetTimer(m_nTimerID, 10, NULL); } } CView::OnMouseMove(nFlags, point); } ``` 6. 在您的 CView 派生类的 OnTimer 函数中绘制环: ``` void CMyView::OnTimer(UINT_PTR nIDEvent) { if (nIDEvent == m_nTimerID) { m_nTimerElapse++; if (m_nTimerElapse == 50) { KillTimer(m_nTimerID); m_bTimerStarted = FALSE; } else { CDC* pDC = GetDC(); CPen pen(PS_SOLID, 2, RGB(255, 0, 0)); CPen* pOldPen = pDC->SelectObject(&pen); pDC->Ellipse(m_ptMousePos.x - m_nTimerElapse, m_ptMousePos.y - m_nTimerElapse, m_ptMousePos.x + m_nTimerElapse, m_ptMousePos.y + m_nTimerElapse); pDC->SelectObject(pOldPen); ReleaseDC(pDC); } } CView::OnTimer(nIDEvent); } ``` 在这个示例中,我们使用计时器来控制环的绘制时间,并在鼠标左键按下和移动时启动计时器和更新鼠标位置。您可以根据需要调整计时器时间间隔和环的大小和样式。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值