VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

有编程疑问吗?还请到提问专区发帖提问!
搜索
查看: 615|回复: 7

[求助] 请问一下win32编程时函数前有双冒号和没有双冒号的区别?

[复制链接]
04_avatar_middle
online_vip yanghbao 发表于 2017-8-16 13:35:35 | 显示全部楼层 |阅读模式
在win32编程时,函数前有双冒号和没有双冒号有区别吗?
比如下面一段创建简单的一个窗口的win32程序代码(见下面),像CreateWindow、ShowWindow、UpdateWindow、GetMessage、TranslateMessage、DispatchMessage等等这些函数,测试了一下,前面有双冒号和没有双冒号都能正常执行,请问一下两者有没有什么区别?

#include <windows.h>
#include <stdio.h>


LRESULT CALLBACK WinSunProc(
  HWND hwnd,      // handle to window
  UINT uMsg,      // message identifier
  WPARAM wParam,  // first message parameter
  LPARAM lParam   // second message parameter
);

int WINAPI WinMain(
  HINSTANCE hInstance,      // handle to current instance
  HINSTANCE hPrevInstance,  // handle to previous instance
  LPSTR lpCmdLine,          // command line
  int nCmdShow              // show state
)
{
        WNDCLASS wndcls;
        wndcls.cbClsExtra=0;
        wndcls.cbWndExtra=0;
        wndcls.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);
        wndcls.hCursor=LoadCursor(NULL,IDC_CROSS);
        wndcls.hIcon=LoadIcon(NULL,IDI_ERROR);
        wndcls.hInstance=hInstance;
        wndcls.lpfnWndProc=WinSunProc;
        wndcls.lpszClassName="VC";
        wndcls.lpszMenuName=NULL;
        wndcls.style=CS_HREDRAW | CS_VREDRAW;
        RegisterClass(&wndcls);

        HWND hwnd;
        hwnd=CreateWindow("VC","窗口标题",WS_OVERLAPPEDWINDOW,
                0,0,600,400,NULL,NULL,hInstance,NULL);

        ShowWindow(hwnd,SW_SHOWNORMAL);
        UpdateWindow(hwnd);

        MSG msg;
        while(GetMessage(&msg,NULL,0,0))
        {
                TranslateMessage(&msg);
                DispatchMessage(&msg);
        }
        return 0;
}

LRESULT CALLBACK WinSunProc(
  HWND hwnd,      // handle to window
  UINT uMsg,      // message identifier
  WPARAM wParam,  // first message parameter
  LPARAM lParam   // second message parameter
)
{
        switch(uMsg)
        {
        case WM_CHAR:
                char szChar[20];
                sprintf(szChar,"char is %d",wParam);
                MessageBox(hwnd,szChar,"weixin",0);
                break;
        case WM_LBUTTONDOWN:
                MessageBox(hwnd,"mouse clicked","weixin",0);
                HDC hdc;
                hdc=GetDC(hwnd);
                TextOut(hdc,0,50,"测试文字",strlen("测试文字"));
                ReleaseDC(hwnd,hdc);
                break;
        case WM_PAINT:
                HDC hDC;
                PAINTSTRUCT ps;
                hDC=BeginPaint(hwnd,&ps);
                TextOut(hDC,0,0,"测试文字",strlen("测试文字"));
                EndPaint(hwnd,&ps);
                break;
        case WM_CLOSE:
                if(IDYES==MessageBox(hwnd,"是否真的结束?","weixin",MB_YESNO))
                {
                        DestroyWindow(hwnd);
                }
                break;
        case WM_DESTROY:
                PostQuitMessage(0);
                break;
        default:
                return DefWindowProc(hwnd,uMsg,wParam,lParam);
        }
        return 0;
}




上一篇:VC中关于http、socket5代理测试及使用的问题
下一篇:MFC机制问题咨询,谢谢!

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

01_avatar_middle
online_admins admin 发表于 2017-8-16 14:00:29 | 显示全部楼层
:: 双冒号指的是调用全局的作用域,如果在 Win32 这种工程中加与不加影响倒是不大,但在 MFC 的工程中,默认MFC中的窗口类 CWnd 其成员函数有很多都是跟 Win32 全局的 API 重名,比如:ShowWindow、GetMessage、GetWindowText 等等,所以这时候如果你再 CWnd 或其派生类中调用了 ShowWindow 之后,默认调用的就是 CWnd 的成员函数 ShowWindow,如果你想要调用全局的,那么就必须使用双冒号前缀。

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

04_avatar_middle
ico_lz  楼主| yanghbao 发表于 2017-8-16 14:06:57 | 显示全部楼层
如题目所示,如果在win32中,不加双冒号的话调用的是全局函数吗?跟加双冒号有区别吗?@Syc

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

51_avatar_middle
online_admins Syc 发表于 2017-8-16 14:10:45 | 显示全部楼层
yanghbao 发表于 2017-8-16 14:06
如题目所示,如果在win32中,不加双冒号的话调用的是全局函数吗?跟加双冒号有区别吗?@Syc

嗯,加了双冒号就是调用全局的,如果在局部没有同名函数的话,加与不加没什么区别

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

04_avatar_middle
ico_lz  楼主| yanghbao 发表于 2017-8-16 14:18:01 | 显示全部楼层
比如具体到win32编程环境下上述代码的MessageBox这个函数吧,不加双冒号的话调用的是全局函数吗?我不知道这里的MessageBox是不是全局的MessageBox。@syc

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

51_avatar_middle
online_admins Syc 发表于 2017-8-16 14:49:39 | 显示全部楼层
yanghbao 发表于 2017-8-16 14:18
比如具体到win32编程环境下上述代码的MessageBox这个函数吧,不加双冒号的话调用的是全局函数吗?我不知道 ...

没错的,如果是全局的 MessageBox,那么 MessageBox 的第一个参数要求的是一个 HWND 的窗口句柄。

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

04_avatar_middle
ico_lz  楼主| yanghbao 发表于 2017-8-16 15:30:55 | 显示全部楼层
好的,这下就明白了,谢谢!

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

75_avatar_middle
在线会员 besteast 发表于 2017-8-17 22:47:21 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

关闭

站长提醒上一条 /1 下一条

QQ
QQ在线咨询
联系电话
13591366679
手机扫一扫 关注本站精彩内容
wxqrcode

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2018-11-16 12:17

Powered by Discuz! X3.4

© 2009-2018 cctry.com

快速回复 返回顶部 返回列表