本文中记录了笔者在基于Visual Studio MFC编程时, 程序调试过程中所遇到的问题及解决方法。
目录
1、Visual Studio MFC中的快捷方式
1.1、问题:Visual Studio MFC中修改好程序之后,怎样编译并建立可运行的exe
1.2、问题:Visual Studio的代码怎么快捷排版/自动排版/代码行自动对齐?
2、问题:怎样实现两台电脑之间的网络通讯(20171123YC)
3、问题:Rich Edit 2.0 Control相关
4、问题:字符类型转换故障
5、问题:WSAGetLastError返回0
6、问题:以太网连接若出现故障则程序卡死
7、问题:成员的跨类使用
8、问题:编译时无报错,而运行时产生如下报错
9、问题:C++中定时器的使用方法记录
10、问题:C++中测量某一段代码的运行时间的方法
11、问题:C++建立并写入.txt文件的方法
12、问题:C++创建文件夹和子文件夹的方法
13、问题:C++中怎么将CString赋值给char数组
14、问题:C++中怎么将char转化为CString
15、问题:VS2012中32位和64位之间编译的转换问题
16、问题:Debug Assertion Failed!
17、问题:怎样使得VC++对话框大小不可调
18、问题:怎样使得VC++对话框最大化 / 最小化
19、问题:Visual Studio MFC中修改STATIC的文本颜色和文本字体等
20、问题:VC++串口通讯怎么以HEX格式通讯 20170921YC
21、问题:VS怎么加快编译速度?
22、问题:怎样让VS只显示error不显示warning?
23、std::vector的清空,Vector清空数据与释放内存(.clear与.swap的区别与使用)
24、c++ vector(向量)使用方法详解(顺序访问vector的多种方式)
25、问题:怎样让工控机一上电就自动运行某程序?(20171113YC)
26、问题:基于对话框的MFC怎样不按按钮自动运行该按钮的响应函数?(20171113YC)
27、问题:MFC鼠标滚轮消息WM_MOUSEWHEEL失灵
28、问题:在对话框最小化之后恢复对话框显示,此时怎样执行响应函数
29、问题:怎样获取MFC对话框中某一控件的位置(在对话框中的坐标)
30、问题:怎样实现MFC对话框最大化时控件也随比例最大化或者还原
31、问题:error C2061 语法错误: 标识符“CMy3DLaserApp1Dlg …… 注意: C++ 不支持默认 int
32、问题:怎样实现VS2010生成的.exe在其他电脑运(20171127YC)
33、问题:vs2010 资源在另一个编辑器中打开 怎么回事?
35、问题:文件打开和保存时,路径、文件名的选择
36、问题:在其它电脑上,exe双击之后或程序编译运行之后,程序不运行也无报错。(20171226)
37、问题:USB接口无反应
38、问题:Visual Assist X插件安装
39、问题:彻底解决COM端口被占用(在使用中)问题的办法
40、问题:MFC Radio Button 使用 分组 RadioButton 用法
41、问题:怎样让VC自动关闭弹出的MessageBox对话框
42、问题:MFC怎样截获界面最大化最小化按钮的处理
43、问题:使MFC对话框不响应标题栏双击
44、问题:MFC获取系统当前时间
45、MFC的对话框的密码登录
46、C++中怎样将double转化成字符串
1、Visual Studio MFC中的快捷方式
1.1、问题:Visual Studio MFC中修改好程序之后,怎样编译并建立可运行的exe
Ctrl+F5两个按钮同时按下。
1.2、问题:Visual Studio的代码怎么快捷排版/自动排版/代码行自动对齐?
在代码页面,Ctrl+A,全选代码,之后分别:Ctrl+K、Ctrl+F,即可实现自动排版。
或者采用另一种方式:Ctrl+A,Alt+F8,即可实现。
……………………………………………………………………………………………………………………………………………
2、问题:怎样实现两台电脑之间的网络通讯(20171123YC)
1)、用网线连接两台电脑
2)、在两台电脑的“打开网络和共享中心”→“更改适配器设置”中均应该是如下状态:
IP地址:设置成最后一位不一样的
3)、在两台电脑上打开“网络调试助手”(可网上下载),协议类型分别是server和client,两边的IP都设置成和服务器server一致,端口号设置成一样的。
4)、连接正常的现象:两端能正常互相传输信息即可。
5)、如果连接有问题,可尝试以下操作:
①更改端口号;
②服务器和客户端反向,也即两台电脑配置颠倒一下试一试。20171123采用这个办法解决了两台电脑无法网络通讯的问题。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
怎样实现2个网络调试助手的通信?
使2个网络调试助手之间建立通信,以方便调试:
1、两台电脑用网线连接。确保网线两端的连接有效。
2、电脑1的设置:
①
②
→右键,属性
③
双击
④
网络配置成上述那样,之后确定。
3、电脑1上打开如下软件:
软件的参数配置如下:
协议类型:TCP Server(应先配置服务器);本地IP地址:和刚才在“网络和共享中心”中配置的一致;本地端口号:如果配置成8080则无法连接,最后配置成了8081方可连接。
4、之后就可以进行连接,连接成功后如下图所示:
5、电脑2上:
“网络和共享中心”中配置IP地址为:192.168.1.90,也即和电脑1的192.168.1.91在最后一位有区别即可。
6、在电脑2上打开如下软件:
软件的参数配置如下:
协议类型:TCP Client
服务器IP地址:192.168.1.91(和电脑1保持一致)
服务器端口:8081(和电脑1保持一致)
之后就可以进行连接。
(客户端Client的连接应该是在服务器Server之后。)
7、服务器连接成功之后,就可以进行电脑1和电脑2之间的网络通信。
……………………………………………………………………………………………………………………………………………
3、问题:Rich Edit 2.0 Control相关
一个基于Dialog的对话框,放入一个Rich Edit 2.0 Control,(其他都不作改动)对话框就不显示了呢?
http://bbs.csdn.net/topics/20383900
http://blog.csdn.net/wuhenyouyuyouyu/article/details/40422247
解决办法:
Caution If you are using a rich edit control in a dialog box (regardless whether your application is SDI, MDI, or dialog-based), you must call AfxInitRichEdit once before the dialog box is displayed. A typical place to call this function is in your program's InitInstance member function. You do not need to call it for each time you display the dialog box, only the first time. You do not have to call AfxInitRichEdit if you are working with CRichEditView.
也即在CMyApp::InitInstance()中加上这条语句
AfxInitRichEdit();
【YC:注意:应该在C<工程名>App::InitInstance()中的最前面加上上述语句。】
今天遇到这个问题,特此记录!
总结:对于子对话框中运用rich-edit control控件的情况,应该在主对话框对应的.cpp(注意,不是Dlg.cpp)文件的InitInstance()函数的开头处添加语句:AfxInitRichEdit();
……………………………………………………………………………………………………………………………………………
4、问题:字符类型转换故障
报错:不能将参数 1 从“LPTSTR”转换为“char *”与指向的类型无关;转换要求 reinterpret_cast、C 样式转换或函数样式转换
http://www.aiuxian.com/article/p-1257009.html
……………………………………………………………………………………………………………………………………………
5、问题:WSAGetLastError返回0
WSAGetLastError返回0
最近使用wince开发的socket连接公网IP,发现一些情况下调用WSAGetLastError返回的结果为0,而0是socket正常的标志,而明明SOCKET_ERROR == nRet了,具体发现一部分调用返回10065之类的,而一部分返回0.后终于找到原因:int err=WSAGetLastError();的调用必须放到其他系统函数调用之前,也就是说,出现错误后,第一时间存储WSAGetLastError结果,而不能调用其他函数之后再调用此函数。因为调用系统函数会清除WSAGetLastError,致使结果返回0.
http://blog.csdn.net/tianbaowen/article/details/8485567
……………………………………………………………………………………………………………………………………………
6、问题:以太网连接若出现故障则程序卡死
网络连接不顺利则程序卡死。需要有网络连接延时判断,连接超时则报错,从而保证程序的鲁棒性。
参考链接:
http://www.cnblogs.com/gaoteng/p/3767967.html
C++ Socket超时设置
用winsocket时,send(),recv()过程中有时由于网络状况等原因,收发不能预期进行,可以设置收发时限:
int nNetTimeout = 1000; //1秒
//发送时限
setsockopt( socket, SOL_SOCKET, SO_SNDTIMEO, ( char * )&nNetTimeout, sizeof( int ) );
//接收时限
setsockopt( socket, SOL_SOCKET, SO_RCVTIMEO, ( char * )&nNetTimeout, sizeof( int ) );
但是当我们的客户端通过connect 函数连接服务端时,这时超时时间很长,那我们应该如何设置connect的超时时间呢?
查资料后发现,select方法可以查询socket套接字的状态。
fd_set rfd; //描述符集 这个将测试连接是否可用
struct timeval timeout; //时间结构体
FD_ZERO($rfd);//先清空一个描述符集
timeout.tv_sec = 60;//秒
timeout.tv_usec = 0;//一百万分之一秒,微秒
u_long ul=1;//代表非阻塞
ioctlsocket(socket,FIONBIO,$ul);//设置为非阻塞连接
下面开始进行connect
connect(socket,(SOCKADDR*)&addrClient,sizeof(SOCKADDR))
FD_SET(sock,&rfd);
连接之后将socket添加到描述符rfb中,这样就可以对这个socket进行测试了。一个描述符可以添加多个socket
下面执行select函数,进行查询
ret = select(0, 0, &rfd, 0, &timeout);
if(ret<=0)
{
说明超时,仍然没有连接成功
然后可以在程序中做相应的处理
}
如果在超时时间之内连接成功
则将socket重新设置为阻塞状态
如下
ul = 0;
ioctlsocket(socket,FIONBIO,&ul);
下面就可以进行正常的recv与send操作了。
顺便记录下,多网卡发送数据的操作。
当客户端去主动连接服务端的时候(TCP),默认是不需要指定,本地的ip与端口的,操作系统会自动给你分配端口,然后根据路由自动选择出口。
但是当你想主动根据不同的数据去选择不同的网卡发送时,我们应该怎么做呢。
答案很简单,
SOCKADDR_IN addrSelf;//本地地址
addrSelf.sin_addr.s_addr = inet_addr("192.168.1.110");//指定网卡的地址
addrSelf.sin_family = AF_INET; addrSelf.sin_port = htons(20000);//本地端口
if( -1 == bind(sockClient[i],(SOCKADDR*)&addrSelf,sizeof(SOCKADDR)))//把网卡地址强行绑定到Soket
{
绑定成功
}
YC:在激光雷达网络通讯程序中,调通的代码记录如下:(在TCPSocket.cpp中)
//↓↓//
fd_set rfd;//描述符集 这个将测试连接是否可用
struct timeval timeout; //时间结构体
FD_ZERO(&rfd);//先清空一个描述符集
timeout.tv_sec = 2;//秒 (延时时间)
timeout.tv_usec = 0;//一百万分之一秒,微秒 (延时时间)
u_long ul=1;//代表非阻塞
ioctlsocket(m_sSocket,FIONBIO,&ul);//将socket置为非阻塞模式;
//↑↑// 20170628YC
if(connect(m_sSocket,(LPSOCKADDR)&server,sizeof(SOCKADDR))==SOCKET_ERROR)
{
error=WSAGetLastError();
if(error==EINPROGRESS) //错误码如果是EINPROGRESS,那说明connect还在继续
{
;
}
else
{
//↓↓//
int result;
FD_SET(m_sSocket,&rfd);
result = select(0, 0, &rfd, 0, &timeout); //设置延时时间限制。
if(0==result) //超时
{
error=WSAGetLastError();
/*
→ “int err=WSAGetLastError();”的调用必须放到其他系统函数调用之前,
也就是说,出现错误后,第一时间存储WSAGetLastError结果,
而不能调用其他函数之后再调用此函数。因为调用系统函数会清除WSAGetLastError,
致使结果返回0。
*/
AfxMessageBox("报错:网络连接超时!");
closesocket(m_sSocket);
m_sSocket=NULL;
return FALSE;
}
else if(result<0) //select代码执行错误
{
error=WSAGetLastError();
AfxMessageBox("报错:select代码执行错误!");
closesocket(m_sSocket);
m_sSocket=NULL;
return FALSE;
}
else //正常的情况
{
//AfxMessageBox("{ 正常的情况 }");
ul = 0;
ioctlsocket(m_sSocket,FIONBIO,&ul); //如果在超时时间之内连接成功,则将socket重新设置为阻塞状态。
}
//↑↑// 20170628YC
}
}
……………………………………………………………………………………………………………………………………………
7、问题:成员的跨类使用
在主对话框中调用子对话框类中的成员函数,也即成员的跨类使用:
参考网址:http://blog.csdn.net/abcjennifer/article/details/5502558
实现过程记录(20170711YC):
主对话框对应的类:CHokuyoUST10LXDlg;子对话框对应的类:C_MOTOR。
要在主对话框对应的.cpp中(HokuyoUST10LXDlg.cpp)调用子对话框类的成员函数“void close_window();”,需要有以下几个步骤:
①头文件:
#include "C_MOTOR.h",要么包含在HokuyoUST10LXDlg.h中(推荐),要么包含在HokuyoUST10LXDlg.cpp(推荐)中。 (20180717YC:头文件包含在.cpp中比包含在.h中更合适,因为如果包含在.h中,容易导致头文件互相包含、自我包含的问题。在实际使用时,这些问题都需要注意。)
②友元:
C_MOTOR.h中定义了C_MOTOR类,在其中加上一句“friend class CHokuyoUST10LXDlg;”,建立友元关系,让CHokuyoUST10LXDlg类成员函数能够调用C_MOTOR类成员。如下图所示:
③指针:
在C_MOTOR.cpp文件开头定义全局变量:
在子界面的初始化函数BOOL C_MOTOR::OnInitDialog()中,添加代码:pDlg = this;用于记录此时此刻的对话框指针,后续在主对话框中调用该子对话框的函数时需要用到。如下图所示:
在HokuyoUST10LXDlg.cpp文件开头声明全局变量pDlg:
在主对话框中(也即HokuyoUST10LXDlg.cpp中)调用函数close_window()时采用如下语句:
pDlg->close_window();
如此即可实现主界面对子界面函数的调用,也即跨类调用成员函数。
(此外,如果需要跨类调用变量,需要对其进行实例化。)
……………………………………………………………………………………………………………………………………………
8、问题:编译时无报错,而运行时产生如下报错
编译时无报错,而运行时产生如下报错:
解决方法1:
http://www.cnblogs.com/flysnail/archive/2011/09/21/2184114.html
解决方法2:
也即可能是数组空间不足导致此错误,将数组存储空间进行扩充,将工程中的代码进行如下修改后则不再出现此错误(20170715YC):
将:
char trans_former[6+1]={'0','0','0','0','0','0'}; //定义数据转换所用的数组。 <ASCII码→二进制,将转换结果存储在trans_former数组中>
char trans[6+1]={'0','0','0','0','0','0'}; //定义数据转换所用的数组。 <对trans_former数组中的结果进行规范化,存储在trans数组中>
char trans_H[6+1]={'0','0','0','0','0','0'}; //定义数据转换所用的数组。 <3 character encoded → 1>
char trans_M[6+1]={'0','0','0','0','0','0'}; //定义数据转换所用的数组。 <3 character encoded → 2>
char trans_L[6+1]={'0','0','0','0','0','0'}; //定义数据转换所用的数组。 <3 character encoded → 3>
改成:
char trans_former[6+10]={'0','0','0','0','0','0'}; //定义数据转换所用的数组。 <ASCII码→二进制,将转换结果存储在trans_former数组中>
char trans[6+10]={'0','0','0','0','0','0'}; //定义数据转换所用的数组。 <对trans_former数组中的结果进行规范化,存储在trans数组中>
char trans_H[6+10]={'0','0','0','0','0','0'}; //定义数据转换所用的数组。 <3 character encoded → 1>
char trans_M[6+10]={'0','0','0','0','0','0'}; //定义数据转换所用的数组。 <3 character encoded → 2>
char trans_L[6+10]={'0','0','0','0','0','0'}; //定义数据转换所用的数组。 <3 character encoded → 3>
有望排除此错误。
……………………………………………………………………………………………………………………………………………
9、问题:C++中定时器的使用方法记录
C++中定时器的使用方法记录:
① 启动定时器:
SetTimer(1,1000,NULL);//启动定时器1,定时时间是1秒
② 定时器回调函数的定义:(.c和.h文件中都应该有)
范例:
.c文件中:
//定时器回调函数。
void C_3DLS::OnTimer(UINT nIDEvent)
{
KillTimer(1); //取消该定时器。此处的ID号“1 ”应与SetTimer()中的ID号一致
//↑注意:取消定时器的代码宜放在最前面。
//MessageBox(_T("测试定时器中断函数是否执行!"));
OnBnClickedButtonData_Original();//→给激光雷达发送“GD0000108000\n”,获取激光雷达本次扫描数据。
//KillTimer(1); //取消该定时器。此处的ID号“1 ”应与SetTimer()中的ID号一致
}
.h文件中:
void OnTimer(UINT nIDEvent);
③ 加上“ON_WM_TIMER()”
C++定时器方面的参考网址:
1)、
http://www.jb51.net/article/56623.htm
2)、
http://blog.csdn.net/jerrytong/article/details/5771136
3)、
http://baike.baidu.com/link?url=792vYttiUxNFFjXVS108ytvp7eFnayYOijrgI85ViZ4tX1hr8U3dJMa4i0vE2cQs7nJkpUDdoa6924PGxxFz2bB6e4Biwqv3G9cmySWBrk3
……………………………………………………………………………………………………………………………………………
10、问题:C++中测量某一段代码的运行时间的方法
C++中测量某一段代码的运行时间的方法:
参考网址:
http://www.cnblogs.com/csonezp/archive/2012/12/25/2833009.html
1.如果只是要计算程序运行的时间,不需要那么复杂。
<windows.h> 中的 GetTickCount() 就是干这个的。
TimeStart=GetTickCount();
.......(代码段)
TimeEnd=GetTickCount();
TimeUsed=TimeEnd-TimeStart;
范例:(20170718YC)
TimeStart2=GetTickCount();
.......(代码段)
TimeEnd2=GetTickCount();
TimeUsed2=TimeEnd2-TimeStart2;
CString test2;
test2.Format( _T("%d"),TimeUsed2);//格式转换。
MessageBox(test2); //对话框显示TimeUsed2的大小。
……………………………………………………………………………………………………………………………………………
11、问题:C++建立并写入.txt文件的方法
C++建立并写入.txt文件的方法:
//(以下一一种建立并写入.txt文件的方法——例程原码。)
CFile file;
CString filepath,filename,s;
filepath=_T("c:\\"); //文件位置
filename="a.txt"; //文件名
filename=filepath+filename; //文件路径
file.Open(filename,CFile::modeCreate|CFile::modeWrite);//建立文件
s="Hello Motor!";
file.Write(s,strlen(s)); //把字符串s写入文件
file.Close(); //关闭文件
参考网址:
http://blog.csdn.net/u012987386/article/details/71088296
……………………………………………………………………………………………………………………………………………
12、问题:C++创建文件夹和子文件夹的方法
C++创建文件夹和子文件夹的方法:
http://blog.163.com/kevinlee_2010/blog/static/16982082020116295372304/
上面网址中,通过测试的两段代码如下(分别对应两种方法)(20170718YC):
1)、
char *fileName="C:\\Users\\FalconBot\\Desktop\\point_cloud\\",*tag,path[1000];
strcpy(path,fileName);
int a=0;
for(tag=fileName;*tag;tag++)
{
if (*tag=='\\')
{
a=strlen(fileName)-strlen(tag);
}
}
path[a]=NULL;
char filePath[1000];
sprintf(filePath,"md %s",path);
system(filePath);
2)、
char *fileName="C:\\Users\\FalconBot\\Desktop\\point_cloud\\",*tag;
for(tag=fileName;*tag;tag++)
{
if (*tag=='\\')
{
char buf[1000],path[1000];
strcpy(buf,fileName);
buf[strlen(fileName)-strlen(tag)+1]=NULL;
strcpy(path,buf);
if (access(path,6)==-1)
{
mkdir(path);
}
}
}
……………………………………………………………………………………………………………………………………………
13、问题:C++中怎么将CString赋值给char数组
C++中怎么将CString赋值给char数组:
参考网址:
http://blog.csdn.net/bizhu12/article/details/6786356
上述网址中的推荐方法(已通过测试,20170718YC ):
2.传给未分配内存的指针.
CString cstr = "ASDDSD";
char *ch = cstr.GetBuffer(cstr1.GetLength() + 1);
cstr.ReleaseBuffer();
//修改ch指向的值等于修改cstr里面的值.
//PS:用完ch后,不用delete ch,因为这样会破坏cstr内部空间,容易造成程序崩溃.
……………………………………………………………………………………………………………………………………………
14、问题:C++中怎么将char转化为CString
参考以下代码:
char cstr[]="this C++";
CString str;
str.Format("%s",cstr);
……………………………………………………………………………………………………………………………………………
15、问题:VS2012中32位和64位之间编译的转换问题
VS2012中32位和64位之间编译的转换问题:
报错:error C2440: “static_cast”: 无法从“void (__thiscall CChatDlg::* )(WPARAM,LPARAM)”转换为“LRE
http://blog.sina.com.cn/s/blog_6f2d29af01011n77.html
……………………………………………………………………………………………………………………………………………
16、问题:Debug Assertion Failed!
根据调试经验(20170727YC),如果出现上图所示的问题,有可能是工程所在的文件路径有问题(有可能是因为路径过长),将工程复制到桌面上,则有可能避免该问题。
也有可能是控件的配置问题。(20171124YC)
→其实这个有可能是你多加了一个你没用到的控件 变量已经添加 但你仅仅删掉了控件 却没有删掉里边的声明(20171205YC)
……………………………………………………………………………………………………………………………………………
17、问题:怎样使得VC++对话框大小不可调
在对话框的属性里面,Border设为Dialog Frame
……………………………………………………………………………………………………………………………………………
18、问题:怎样使得VC++对话框最大化 / 最小化
在对话框的属性里面,[Minimize box]设为True:最小化,[maximize box] 设为True:最大化。
……………………………………………………………………………………………………………………………………………
19、问题:Visual Studio MFC中修改STATIC的文本颜色和文本字体等
参考网址:
http://blog.csdn.net/qq61394323/article/details/39939239
调试通过代码(关键部分截取):(20170918YC)
注意:前面别忘了加事件响应:
ON_WM_CTLCOLOR()
……………………………………………………………………………………………………………………………………………
20、问题:VC++串口通讯怎么以HEX格式通讯 20170921YC
参考网址1:
http://blog.csdn.net/NNNNNNNNNNNNY/article/details/45341983
(↑实现了ASCII码格式的串口通讯,测试通过 20170921YC)
参考网址2:
http://blog.csdn.net/warlice/article/details/7777978
(↑《串口调试助手源程序及编程详细过程(一)》《串口调试助手源程序及编程详细过程(二)》)
备注(YC):
可结合网址1实现基本的串口通讯,并在此基础上借鉴网址2的后半部分《串口调试助手源程序及编程详细过程(二)》实现HEX格式的通讯。20170921YC
……………………………………………………………………………………………………………………………………………
21、问题:VS怎么加快编译速度?
1.更改项目设置
- 项目|属性|C/C++|代码生成|启用最小重新生成:Yes(/Gm)
- 项目|属性|C/C++|常规|调试信息格式:程序数据库(/Zi)
- 项目|属性|配置属性-链接器-常规-“启用增量链接”选择“是”
2.使用多核编译
- Properties -> Configuration Properties -> C/C++ -> Geneal -> Multi-processor Compilation -> Yes(/MP)
- 翻译:(属性 -> 配置属性 -> C/C++ -> 常规 -> 多处理器编译 -> 是(/MP))
3.代码层面
合理的划分模块,减少link的时间外,充分利用多核编译也很重要。
上述的参考网址:
http://blog.csdn.net/hyqsong/article/details/50175523
……………………………………………………………………………………………………………………………………………
22、问题:怎样让VS只显示error不显示warning?
参考网址:
http://blog.csdn.net/github_35160620/article/details/51864060
……………………………………………………………………………………………………………………………………………
23、std::vector<int>的清空,Vector清空数据与释放内存(.clear与.swap的区别与使用)
参考网址:
http://blog.csdn.net/a272846945/article/details/51182144
……………………………………………………………………………………………………………………………………………
24、c++ vector(向量)使用方法详解(顺序访问vector的多种方式)
参考网址:http://www.jb51.net/article/44231.htm
……………………………………………………………………………………………………………………………………………
25、问题:怎样让工控机一上电就自动运行某程序?(20171113YC)
电脑左下角开始→所有程序→启动(右键)→打开,将要运行的程序exe或快捷方式拖入其中即可。
(20171113YC)
→20180529YC:经测试,该方法可行。
……………………………………………………………………………………………………………………………………………
26、问题:基于对话框的MFC怎样不按按钮自动运行该按钮的响应函数?(20171113YC)
解决方法:将对应函数添加到初始化函数OnInitDialog()中:
……………………………………………………………………………………………………………………………………………
27、问题:MFC鼠标滚轮消息WM_MOUSEWHEEL失灵
在执行鼠标滚轮滚动之前,确保运行了以下代码:
GetDlgItem(IDC_RENDER)->SetFocus();//需要把图像控件picture control置为对焦,否则鼠标滚轮事件失灵。(20171121YC)
鼠标滚轮消息似乎只会发给当前获得焦点的窗口,所以当子窗体没有焦点时是收不到滚轮消息的,收到消息的可能是父窗口。
……………………………………………………………………………………………………………………………………………
28、问题:在对话框最小化之后恢复对话框显示,此时怎样执行响应函数
工程的主对话框的Dlg.cpp中添加如下代码(蓝色选中部分):
(20171121YC)
……………………………………………………………………………………………………………………………………………
29、问题:怎样获取MFC对话框中某一控件的位置(在对话框中的坐标)
网上代码:
CRect rect;
GetDlgItem(控件ID)->GetWindowRect(&rect);//获取控件的屏幕坐标
ScreenToClient(&rect);//转换为对话框上的客户坐标
经过测试的代码:(20171121YC)
CRect size_pic;
CWnd *pWnd_pic = GetDlgItem(IDC_RENDER);
//pWnd_pic->GetClientRect(&size_pic);
pWnd_pic->GetWindowRect(&size_pic);//获取控件的屏幕坐标
ScreenToClient(&size_pic);//转换为对话框上的客户坐标
if(size_pic.Width()>size_pic.Height())//如果是宽>高
{
glViewport(0.5*(size_pic.Width()-size_pic.Height()),0,size_pic.Height(),size_pic.Height());//【Picture Control控件中显示图像区域的大小】
}
else//如果是高>宽
{
glViewport(0,0.5*(size_pic.Height()-size_pic.Width()),size_pic.Width(),size_pic.Width());//【Picture Control控件中显示图像区域的大小】
}
CString test0;
//test0.Format( _T("中间点X坐标:%d 中间点Y坐标:%d"),size_pic.CenterPoint().x,size_pic.CenterPoint().y);//格式转换。
test0.Format( _T("左上X坐标:%d 左上Y坐标:%d 右下X坐标:%d 右下Y坐标:%d"),size_pic.TopLeft().x,size_pic.TopLeft().y,size_pic.BottomRight().x,size_pic.BottomRight().y);//格式转换。
MessageBox(test0);
更多可参考网址:
http://blog.csdn.net/wangdong770909027/article/details/47102009
……………………………………………………………………………………………………………………………………………
30、问题:怎样实现MFC对话框最大化时控件也随比例最大化或者还原
参考网址:
http://blog.csdn.net/zyw_anquan/article/details/8257722
推荐里面的方法二
……………………………………………………………………………………………………………………………………………
31、问题:error C2061 语法错误: 标识符“CMy3DLaserApp1Dlg …… 注意: C++ 不支持默认 int
参考网址:
http://blog.csdn.net/u011435712/article/details/41628785
→网址重点摘录:
下面贴出解决方案:在DrawLine头文件中先声明一下类:class MonsterSprite;然后在DrawLine.cpp文件中#include “MonsterSprite.h”,(也即在DrawLine头文件中不要包含该头文件。 YC)
32、问题:怎样实现VS2010生成的.exe在其他电脑运(20171127YC)
注:经调试,“在静态库中使用MFC”的方法会使程序在编译的时候产生很多错误、难以解决,因此不采用此方法。以下是测试通过的方法(20171127YC):
不修改“在静态库中使用MFC”等配置(也即使用默认配置),对编译生成的.exe文件,如果想让它在其它电脑上运行,需要:
①安装:
事先需要对要运行.exe的电脑安装“VC6.0”和“微软常用运行库合集”(参考下图)
②dll文件:
和工程相关的dll文件,应该和visualstudio生成的.exe文件在同一目录下。
(长沙项目程序的相关dll文件已经存储在文件夹“exe文件在其它电脑上运行相关”中。20171127YC)
→备忘录:
①目标电脑最好是WIN7 64位操作系统
②控制电机所用的串口号:程序中默认是串口6(COM6),在目标电脑上需要事先将串口号配置/修改成6
……………………………………………………………………………………………………………………………………………
33、问题:vs2010 资源在另一个编辑器中打开 怎么回事?
……………………………………………………………………………………………………………………………………………
34、问题:radio button怎样设置为默认选中?
参考网址:
http://blog.csdn.net/arcsinsin/article/details/9338811
→网址内容如下:
我们假设有两个RADIO控件:IDC_RADIO_SINGLE和IDC_RADIO_RANGE,我们的目的是默认选种IDC_RADIO_SINGLE控件。
方法一:
CheckRadioButton(IDC_RADIO_SINGLE,IDC_RADIO_RANGE,IDC_RADIO_SINGLE);
方法二:
将IDC_RADIO_SINGLE设置为有Group属性,IDC_RADIO_RANGE没有;
CTRL +双击IDC_RADIO_SINGLE按钮,为其添加一个成员变量m_Radio;
在初始化RADIO时添加如下代码:
m_Radio=0;
UpdateData(FALSE);
方法三:
CButton* radio=(CButton*)GetDlgItem(IDC_RADIO_SINGLE);
radio->SetCheck(1);//括号中的数字是该radio控件在几个radio控件中的编号
还是第三种方法吃香呵。这也是访问控件的常用方法之一。
经测试方法一可以使用,在OnInitDialog()初始化函数里加入上述代码即可。(20171201YC)
…………………………………………………………………………………………………………………………………………
35、问题:文件打开和保存时,路径、文件名的选择
参考网址:(MFC——文件打开和保存对话框(CFileDialog))
http://blog.csdn.net/luoweifu/article/details/24672347
……………………………………………………………………………………………………………………………………………
36、问题:在其它电脑上,exe双击之后或程序编译运行之后,程序不运行也无报错。(20171226)
对于长沙项目的相关程序,通过排查(20171226),这个问题主要是由于主对话框中的屏幕尺寸变化响应函数导致的,也即WM_SIZE和Onsize。去掉屏幕尺寸变化响应,则该问题得以解决。
究其原因,是由于exe已开始运行的时候,就触发了WM_SIZE,从而导致程序故障。
……………………………………………………………………………………………………………………………………………
37、问题:USB接口无反应
看设备管理器中的上述是否有感叹号,有的话,对它禁用、再启动。
……………………………………………………………………………………………………………………………………………
38、问题:Visual Assist X插件安装
参考网址:
http://blog.csdn.net/to_baidu/article/details/54846962
……………………………………………………………………………………………………………………………………………
39、问题:彻底解决COM端口被占用(在使用中)问题的办法
参考网址:
http://blog.csdn.net/yimu13/article/details/6024991
……………………………………………………………………………………………………………………………………………
40、问题:MFC Radio Button 使用 分组 RadioButton 用法
3. 按CTRL+D,保证同一组内的radio的tab序号是连续的;调整tab序号的方式是:鼠标点击数字,比如先点3,然后点7,则3和7会交换,即radio1变为7,radio5变为3;
4. 关联int型变量 注意:只需将group属性为true的radio1关联,radio2和radio3无需关联; 同样,radio4需关联,radio5无需关联
5. 第4步完成后,在窗体头文件中可以看到
构造函数:
默认第一个radio被选中,即radio1被选中
6. 事件处理
设置radio1的事件
设置radio2和radio3的点击事件函数 和 radio1 相同
事件代码:
注意:updatedata(true) 不能少; 它的作用是 将radio的状态值更新给关联的变量,即m_radiobtngroup1;
·以上内容参考自网址:https://blog.csdn.net/c_cyoxi/article/details/23868979
……………………………………………………………………………………………………………………………………………
41、问题:怎样让VC自动关闭弹出的MessageBox对话框
20180717YC:经测试,可使用如下代码:
//↓弹出报警对话框,并在片刻之后自动关闭该对话框。
//所弹出的对话框为模态对话框。
SetTimer(1, 1500, NULL);//启动定时器,一定时间间隔之后,自动关闭所弹出的对话框。
int ret = MessageBox("←本次数据采集格式有误,已启用备用解码程序→", "WarningMessageBox", MB_ICONWARNING);
if (ret == IDYES)
{
TRACE("按钮【YES】被按下\n");
}
else if(ret == IDNO)
{
TRACE("按钮【NO】被按下\n");
}
//↑弹出报警对话框,并在片刻之后自动关闭该对话框。
对应的定时器响应函数:
case 1:
{
KillTimer(nIDEvent); //取消该定时器。此处的ID号应与SetTimer()中的ID号一致
//定时器函数的作用:自动关闭所弹出的对话框。
HANDLE hWnd = ::FindWindowEx(NULL, NULL, NULL, "WarningMessageBox");
if (hWnd)
{
TRACE("发现了MyMessageBox窗口\n");
::EndDialog((HWND)hWnd, IDNO);
}
}break;
参考网址:https://blog.csdn.net/dijkstar/article/details/8761481
上述代码源于该网址中的“方法二”。
……………………………………………………………………………………………………………………………………………
42、问题:MFC怎样截获界面最大化最小化按钮的处理
方法:在函数OnSysCommand(UINT nID, LPARAM lParam)中加代码(红色部分是后加的),参考如下:
void CMy3DLS_UST10LXDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else if(nID==SC_MINIMIZE) //软件界面的最小化
{
//在3D点云采集期间,无法最小化/最大化软件界面。
if(1==flag_CodeRun01) //标志量,控制代码运行与否。=1运行,=0不运行。 激光雷达回传数据期间置为0,其余时间为1
{
CDialogEx::OnSysCommand(nID, lParam);
}
}
else if(nID==SC_MAXIMIZE) //软件界面的最大化
{
//在3D点云采集期间,无法最小化/最大化软件界面。
if(1==flag_CodeRun01) //标志量,控制代码运行与否。=1运行,=0不运行。 激光雷达回传数据期间置为0,其余时间为1
{
CDialogEx::OnSysCommand(nID, lParam);
}
}
else
{
CDialogEx::OnSysCommand(nID, lParam);
}
}
……………………………………………………………………………………………………………………………………………
43、问题:使MFC对话框不响应标题栏双击
参考网址:
https://blog.csdn.net/eickandy/article/details/48520439
所采用的是上述网址中的方法二(20180717),重载了三个函数。所编程序中的具体代码(YC):
Dlg.cpp中的代码:
/*
-----功能:使MFC对话框不响应标题栏双击
-----注意:在CWnd::OnNcLButtonDblClk(nHitTest, point)使用时,不
能用CMainFrame::OnNcLButtonDblClk(nHitTest, point),
不然菜单就无法使用了。
*/
void CMy3DLS_UST10LXDlg::OnNcLButtonDblClk( UINT nHitTest, CPoint point )
{
if(nHitTest == HTCAPTION /*&& g_bTK*/) // 为标题栏的双击
return;
CWnd::OnNcLButtonDblClk(nHitTest, point);
}
///*
//-----功能:使标题栏的窗体不能被鼠标拖动,固定在当前屏幕中的位置:
//-----注意:在CWnd::OnNcLButtonDown(nHitTest, point)使用时,不
// 能用CMainFrame::OnNcLButtonDown(nHitTest, point),
// 不然菜单就无法使用了。
//*/
//void CMy3DLS_UST10LXDlg::OnNcLButtonDown(UINT nHitTest, CPoint point)
//{
// if(nHitTest==HTCAPTION /*&& g_bTK*/)
// return;
//
// CWnd::OnNcLButtonDown(nHitTest, point);
//}
/*
-----功能:屏蔽在标题栏点击鼠标右键事件。
-----注意:在CWnd::OnNcRButtonDown(nHitTest, point);使用时,不
能用CMainFrame::OnNcRButtonDown(nHitTest, point),
不然菜单就无法使用了。
*/
void CMy3DLS_UST10LXDlg::OnNcRButtonDown(UINT nHitTest, CPoint point)
{
if(nHitTest==HTCAPTION /*&& g_bTK*/)
return;
CWnd::OnNcRButtonDown(nHitTest, point);
}
Dlg.h中的代码:
//↓使MFC对话框不响应界面双击等操作
afx_msg void OnNcLButtonDblClk( UINT nHitTest, CPoint point ); //功能:使MFC对话框不响应标题栏双击
//afx_msg void OnNcLButtonDown(UINT nHitTest, CPoint point); //功能:使标题栏的窗体不能被鼠标拖动,固定在当前屏幕中的位置
afx_msg void OnNcRButtonDown(UINT nHitTest, CPoint point); //功能:屏蔽在标题栏点击鼠标右键事件。
//↑使MFC对话框不响应界面双击等操作
……………………………………………………………………………………………………………………………………………
44、问题:MFC获取系统当前时间
网址:
https://www.cnblogs.com/bigbigtree/archive/2011/12/02/2272066.html
网址内容:
1.使用CTime类
CString str; //获取系统时间
CTime tm; tm=CTime::GetCurrentTime();
str=tm.Format("现在时间是%Y年%m月%d日 %X");
MessageBox(str,NULL,MB_OK);
2: 得到系统时间日期(使用GetLocalTime)
SYSTEMTIME st;
CString strDateTime;
GetLocalTime(&st);
strDateTime.Format(_T("%04d%02d%02d_%02d%02d%02d"),st.wYear,st.wMonth,st.wDay,st.wHour,st.wMinute,st.wSecond);
MessageBox(_T(strDateTime));
3.使用GetTickCount//获取程序运行时间
long t1=GetTickCount();//程序段开始前取得系统运行时间(ms)
Sleep(500); long t2=GetTickCount();//程序段结束后取得系统运行时间(ms)
str.Format("time:%dms",t2-t1);//前后之差即 程序运行时间
AfxMessageBox(str);//获取系统运行时间
long t=GetTickCount();
CString str,str1;
str1.Format("系统已运行 %d时",t/3600000);
str=str1; t%=3600000;
str1.Format("%d分",t/60000);
str+=str1; t%=60000;
str1.Format("%d秒",t/1000);
str+=str1; AfxMessageBox(str);
上述方法2通过了实际测试,可满足功能。
……………………………………………………………………………………………………………………………………………
45、MFC的对话框的密码登录
参考网址1:
http://jingyan.baidu.com/article/2fb0ba404a6e5300f2ec5ff3.html
参考网址2:
https://zhidao.baidu.com/question/92516133.html
……………………………………………………………………………………………………………………………………………
46、C++中怎样将double转化成字符串
http://jingyan.baidu.com/article/3f16e003d076602590c10370.html
……………………………………………………………………………………………………………………………………………
本文由VS软件圈(vssoft.net)发布,不代表VS软件圈立场,转载联系作者并注明出处:https://vssoft.net/vsazwt/VS2010anzhuangwenti/2020/0724/2572.html