基础问题

hdxu8511 2010-11-07 03:38:07
函数的类归属问题。

void CDrawView::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CDC *pDC=GetDC();
。。。

hdc = ::GetDC(m_hWnd);
::MoveToEx(hdc,m_point.x,m_point.y,NULL);
::LineTo(hdc,point.x,point.y);
。。。

MoveToEx(hdc,m_point.x,m_point.y,NULL);
LineTo(hdc,point.x,point.y);
。。。
}

这是划线的代码,想问:GetDC前加与不加::的区别,我理解为没有加的时候哦是CWnd类的成员函数,加了后是API函数。
同样,MoveToEx与LineTo函数也是这样区别。

不知道对吗?

如果对了,但是我查找csdn,CWnd类的成员函数根本就没有这些。。

困扰了蛮久了,请解释给我。
...全文
86 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
hdxu8511 2010-11-08
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 lsq19871207 的回复:]
这是一个作用域的问题

其实加::是为了跟当前类(包括基类)中相同的函数区分开来,

也就是说如果全局函数(API也是全局函数)没有跟当前的类(包括基类)的成员函数冲突,完全可以不用::,不过这时候加上::可以让修改程序的人更清楚你的意图。
[/Quote]

正解。。。 3Q
信阳毛尖 2010-11-07
  • 打赏
  • 举报
回复
这是一个作用域的问题

其实加::是为了跟当前类(包括基类)中相同的函数区分开来,

也就是说如果全局函数(API也是全局函数)没有跟当前的类(包括基类)的成员函数冲突,完全可以不用::,不过这时候加上::可以让修改程序的人更清楚你的意图。

jianshang_xs 2010-11-07
  • 打赏
  • 举报
回复
只是功能相同的函数,封装在不对的类中而已。。。
hdxu8511 2010-11-07
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 yuanmoren 的回复:]
并不是在用windows api时都必须要加上::

比如你这里的
::MoveToEx(hdc,m_point.x,m_point.y,NULL);
MoveToEx(hdc,m_point.x,m_point.y,NULL);
其实都是调用windows api

特意加上::,是因为api函数名和自身的成员函数名称是一样的,
为了区分调用的是自身的成员函数,还是调用api。
……
[/Quote]

既然都是API函数,又分什么自身与API函数呢?有点矛盾吧
hdxu8511 2010-11-07
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 wltg2001 的回复:]
这是划线的代码,想问:GetDC前加与不加::的区别,我理解为没有加的时候哦是CWnd类的成员函数,加了后是API函数。
同样,MoveToEx与LineTo函数也是这样区别。
=============================
基本上是对的,加了::的是API,不加::的是所在类的成员函数,你上面代码所在的类是CDrawView,这个类自己没有MoveToEx等函数,但是它的父类C……
[/Quote]

天啦,我真的在CWnd类中找不到MoveToEx函数的,我不知道你们是怎么确定的。。 擦
yuanmoren 2010-11-07
  • 打赏
  • 举报
回复
并不是在用windows api时都必须要加上::

比如你这里的
::MoveToEx(hdc,m_point.x,m_point.y,NULL);
MoveToEx(hdc,m_point.x,m_point.y,NULL);
其实都是调用windows api

特意加上::,是因为api函数名和自身的成员函数名称是一样的,
为了区分调用的是自身的成员函数,还是调用api。

其实装个Visual Assist X,很容易明白的。
wltg2001 2010-11-07
  • 打赏
  • 举报
回复
这是划线的代码,想问:GetDC前加与不加::的区别,我理解为没有加的时候哦是CWnd类的成员函数,加了后是API函数。
同样,MoveToEx与LineTo函数也是这样区别。
=============================
基本上是对的,加了::的是API,不加::的是所在类的成员函数,你上面代码所在的类是CDrawView,这个类自己没有MoveToEx等函数,但是它的父类CWnd有。
hdxu8511 2010-11-07
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 zjfhgdx 的回复:]
我理解为没有加的时候哦是CWnd类的成员函数,加了后是API函数。
你的理解是对的
[/Quote]

但是LineTo就不说CWnd类的成员函数,而是CDC类的。。这怎么解释
zjfhgdx 2010-11-07
  • 打赏
  • 举报
回复
我理解为没有加的时候哦是CWnd类的成员函数,加了后是API函数。
你的理解是对的
zjfhgdx 2010-11-07
  • 打赏
  • 举报
回复
不知道楼主有没有发现一般使用::的都要有一个句柄参数,因为是API不属于某个类,所以没有this指针
zjfhgdx 2010-11-07
  • 打赏
  • 举报
回复
加上::是使用系统API,
不加的话是使用THIS指针(不过你看不到)隐式的

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧