同样是MessageBox ,在VS2010 和VS2013里面参数竟然是不一样的。

时间:2022-07-09 20:14:44
同样是MessageBox ,在VS2010 和VS2013里面参数竟然是不一样的。

×××××××××××
感觉这种事情太奇葩了,不知道是C++的语法有问题,还是MFC的问题,抑或是IDE的开发者有问题。

我认为不应该出现这个问题, 程序的主要心思应该放在逻辑的实现上,而不是把心思放在解决这些无谓的细节上面。

同样是MessageBox ,在VS2010 和VS2013里面参数竟然是不一样的。同样是MessageBox ,在VS2010 和VS2013里面参数竟然是不一样的。

8 个解决方案

#1


MFC   CWnd::MessageBox
int MessageBox( LPCTSTR lpszText, LPCTSTR lpszCaption = NULL, UINT nType = MB_OK );

API 
int MessageBox(
  HWND hWnd,          // handle of owner window
  LPCTSTR lpText,     // address of text in message box
  LPCTSTR lpCaption,  // address of title of message box
  UINT uType          // style of message box
);


#2


::MessageBox

#3


看参数就好 了

#4


引用 1 楼 zgl7903 的回复:
MFC   CWnd::MessageBox
int MessageBox( LPCTSTR lpszText, LPCTSTR lpszCaption = NULL, UINT nType = MB_OK );

API 
int MessageBox(
  HWND hWnd,          // handle of owner window
  LPCTSTR lpText,     // address of text in message box
  LPCTSTR lpCaption,  // address of title of message box
  UINT uType          // style of message box
);

VS是 如何判断  这个MessageBox  是API 里面的 还是CWnd 里面?   他们的名字都是一样。

还请  不吝赐教。。 谢谢

#5


 如果是CWnd及其派生类中,MassageBox自然是默认你的写法,如果是文档类或者CApp类中,你的以上写法自然报错,应该提供参数完整的API函数,MFC程序中任意位置显示消息窗,用AfxMessageBox,

#6


你上一个应该不是放在MFC窗口类里面去调用的,实际调用的是win32的MessageBox:
int MessageBox(  HWND hWnd,          // handle to owner window
  LPCTSTR lpText,     // text in message box
  LPCTSTR lpCaption,  // message box title
  UINT uType          // message box style);


你下一个是在MFC对话框里面调的,其实是调的CWnd封装过的MessageBox:
int MessageBox ( LPCTSTR lpszText, LPCTSTR lpszCaption = NULL, 
UINT nType = MB_OK ); 


这跟IDE毛关系都没有,而是你自己没搞清楚。

#7


关于编译器判断的问题,没有加::标识的函数调用默认在类实现里面去找,加了::的函数调用默认在全局函数里面找,而且两个的参数都不一样,就算没加::,根据函数重载编译器也知道编译哪个版本的函数

#8


引用 5 楼 mlqxj35674 的回复:
 如果是CWnd及其派生类中,MassageBox自然是默认你的写法,如果是文档类或者CApp类中,你的以上写法自然报错,应该提供参数完整的API函数,MFC程序中任意位置显示消息窗,用AfxMassageBox,


就是说如果 Cwnd及其派生类的里面的MassageBox ,就默认只需填写三个参数,

如果其他的类,比如文档类或是CApp类 就需要填写四个参数,第一个参数是 MassageBox的父窗口句柄。

后面三个参数,还是老样子。依次是:消息框的内容,消息框的标题,指定一个决定对话框的内容和行为的位标志集。

#1


MFC   CWnd::MessageBox
int MessageBox( LPCTSTR lpszText, LPCTSTR lpszCaption = NULL, UINT nType = MB_OK );

API 
int MessageBox(
  HWND hWnd,          // handle of owner window
  LPCTSTR lpText,     // address of text in message box
  LPCTSTR lpCaption,  // address of title of message box
  UINT uType          // style of message box
);


#2


::MessageBox

#3


看参数就好 了

#4


引用 1 楼 zgl7903 的回复:
MFC   CWnd::MessageBox
int MessageBox( LPCTSTR lpszText, LPCTSTR lpszCaption = NULL, UINT nType = MB_OK );

API 
int MessageBox(
  HWND hWnd,          // handle of owner window
  LPCTSTR lpText,     // address of text in message box
  LPCTSTR lpCaption,  // address of title of message box
  UINT uType          // style of message box
);

VS是 如何判断  这个MessageBox  是API 里面的 还是CWnd 里面?   他们的名字都是一样。

还请  不吝赐教。。 谢谢

#5


 如果是CWnd及其派生类中,MassageBox自然是默认你的写法,如果是文档类或者CApp类中,你的以上写法自然报错,应该提供参数完整的API函数,MFC程序中任意位置显示消息窗,用AfxMessageBox,

#6


你上一个应该不是放在MFC窗口类里面去调用的,实际调用的是win32的MessageBox:
int MessageBox(  HWND hWnd,          // handle to owner window
  LPCTSTR lpText,     // text in message box
  LPCTSTR lpCaption,  // message box title
  UINT uType          // message box style);


你下一个是在MFC对话框里面调的,其实是调的CWnd封装过的MessageBox:
int MessageBox ( LPCTSTR lpszText, LPCTSTR lpszCaption = NULL, 
UINT nType = MB_OK ); 


这跟IDE毛关系都没有,而是你自己没搞清楚。

#7


关于编译器判断的问题,没有加::标识的函数调用默认在类实现里面去找,加了::的函数调用默认在全局函数里面找,而且两个的参数都不一样,就算没加::,根据函数重载编译器也知道编译哪个版本的函数

#8


引用 5 楼 mlqxj35674 的回复:
 如果是CWnd及其派生类中,MassageBox自然是默认你的写法,如果是文档类或者CApp类中,你的以上写法自然报错,应该提供参数完整的API函数,MFC程序中任意位置显示消息窗,用AfxMassageBox,


就是说如果 Cwnd及其派生类的里面的MassageBox ,就默认只需填写三个参数,

如果其他的类,比如文档类或是CApp类 就需要填写四个参数,第一个参数是 MassageBox的父窗口句柄。

后面三个参数,还是老样子。依次是:消息框的内容,消息框的标题,指定一个决定对话框的内容和行为的位标志集。