GetSafeHwnd()

本文详细介绍了 CWnd 类中的 GetSafeHwnd 成员函数,该函数能够安全地获取窗口句柄(HWND)。文章通过示例代码解释了在何种情况下使用此函数可以避免潜在的错误,并说明了当 CWnd 对象未与窗口关联时函数将返回 NULL 的情况。

CWnd::GetSafeHwnd  
(这是CWnd的一个成员函数)
HWND GetSafeHwnd()const;
(这是个const 函数)
Return Value
Returns the window handle for a window. Returns NULL if the CWnd is not attached to a window or if it is used with a NULL CWnd pointer. 
(调用它返回窗口的句柄,如果CWnd没有与任何窗口联系或者用于一直空的CWnd指针,它返回NULL)

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

当我们想得到一个窗口对象(CWnd的派生对象)指针的句柄(HWND)时,最安全的方法是使用GetSafeHwnd()函数,通过下面的例子来看其理由:

  HWND hwnd;
  CWnd* pWnd;
  pWnd=((CFrameWnd*)(AfxGetApp()->m_pMainWnd))->GetActiveView();
  hwnd=pWnd->GetDlgItem(IDC_EDIT2)->GetSafeHwnd();

  ::SetWindowText(hwnd,m_strResult);

//m_strResult 是变量 IDC_EDIT2是一个编辑框的id

 

原文: http://blog.youkuaiyun.com/wuyuan2011woaini/article/details/7558788

#include"stdafx.h" #include "ProcessResTest.h" #include "ResTestDlg.h" #include "StatusLog.h" #include "Mysql.h" #include "SerialPortEx.h" #include <map> #include "HttpClient.h" using namespace std; bool m_UpdateSql=true; CMysql mysql; CStatusLog m_StatusLog; CString m_ServerIP=_T(""); CStdioFile m_WriteLog; CSerialPortEx m_ResCom; int m_ResComNo; int m_PrintComNo; int m_SataionID=-1; CString m_SNID=_T(""); int m_SQLResult=0; CString m_ChanleList=_T("test"); CString m_UpdateStr=_T(""); CString m_Model=_T(""); CString m_SNStr=_T(""); CString m_LogPath=_T(""); CString m_TestStation=_T(""); CString m_Operator; bool m_TestFinalResult; int m_TotalCount=0; CString m_StrDesc; CString m_StrMax; CString m_StrMin; int m_ProTestDelay=0; int m_Coun=0; CString m_TestResult=_T(""); CString m_MachineID=_T(""); CHttpClient m_MesHttp; struct ProCahnel { CString m_Upper; CString m_Lower; CString m_Count; CString m_Moffset; double m_TestValue; double m_MaxValue; double m_MinValue; CString m_Result; }; map <CString,ProCahnel> ProMap; typedef map<CString,ProCahnel>::iterator ProMap_it; enum ResultList { Result_OK, Result_NG, //上一个站位NG Result_Repeat, //当前SN已过该站位,SN重复 Result_NoRecord, //数据库中没有记录 Result_DataBaseError, //数据库错误 Result_StationError, //站位错误,当前SN下一站位不是当前站位 }; void ConnectToMYSQL(void) //连接mysql数据库 { CStringA m_IP; m_IP=m_ServerIP; string dbName = "mes"; string host = m_IP.GetBuffer();//pHost->h_name; m_IP.ReleaseBuffer(); string user = "root"; string password = "liom9028"; Database_Param Database_p(host,user,password,dbName,0,NULL,0); if(!mysql.ConnectDB(&Database_p)) { AfxMessageBox(_T("连接mysql数据库失败!\r\n")); } else { CString m_MessageStr=_T("1>Connect TO MYSQL IS OK \r\n"); SendMessage(AfxGetMainWnd()->GetSafeHwnd(), WM_UPDATA_MESSAGE, 1,(LPARAM)(LPCTSTR)m_MessageStr); } } int CheckSNInformation(CString m_SNID) //检查当前SN在数据库中的信息 { CString m_Buffer=_T(""); CString m_Result=_T(""); CStringA m_IDBuffer; m_IDBuffer=_T("SNID=")+m_SNID+_T(" order by id desc limit 1"); string db_name = "mes"; string tab_name = "historylist"; string where_def =m_IDBuffer.GetBuffer(); m_IDBuffer.ReleaseBuffer(); string select_exp = "*"; Data_Param data_p(db_name,tab_name,where_def,select_exp,""); mysql.SelectDB(&data_p); if(mysql.SelectRecord(&data_p)) { if (mysql.GetRecord()) { m_Buffer=mysql.row[2]; //获取当前最新站位信息 int m_StationBuffer=_ttoi(m_Buffer); if (m_SataionID!=m_StationBuffer) { if (m_SataionID==(m_StationBuffer+1)) { m_Buffer=mysql.row[3]; //获取前一个站位的状态 mysql.FreeResult(); if (m_Buffer==_T("1")) { return Result_OK; //当前SN 可以通过该站位 } else { AfxMessageBox(_T("当前SN在上一个站位是处于NG状态,请检查!")); return Result_NG; //上一个站位状态NG } } else { mysql.FreeResult(); AfxMessageBox(_T("站位错误,当前SN下一站位不是电阻测试站位,请检查!")); return Result_StationError; } } else //如果站位ID相同 检查站位状态 { m_Buffer=mysql.row[3]; //获取前站位的状态 if (m_Buffer==_T("0")) { mysql.FreeResult(); return Result_OK; //当前SN 可以通过该站位 } else { mysql.FreeResult(); AfxMessageBox(_T("SN 重复,当前SN已通过电阻测试站位,请检查!")); return Result_Repeat; // 当前SN 重复 } } } else { mysql.FreeResult(); AfxMessageBox(_T("当前SN在数据库中没有记录,请检查!")); return Result_NoRecord; //在记录中没有查找到当前sn } } else { ConnectToMYSQL(); AfxMessageBox(_T("链接数据库失败,请检查网络链接!")); return Result_DataBaseError; //数据库链接异常 } } int SearchSNList(CString m_SN) //查找当前SN信息 { CStringA m_IDBuffer; m_IDBuffer=_T("SN='")+m_SN+_T("'"); string db_name = "mes"; string tab_name = "snlist"; string where_def =m_IDBuffer.GetBuffer(); m_IDBuffer.ReleaseBuffer(); string select_exp = "*"; Data_Param data_p(db_name,tab_name,where_def,select_exp,""); mysql.SelectDB(&data_p); if(mysql.SelectRecord(&data_p)) { if (mysql.GetRecord()) { m_SNID=mysql.row[0]; mysql.FreeResult(); return 0; } else { mysql.FreeResult(); return 1; } } else { ConnectToMYSQL(); return 2; } } bool InsertTestResult(void) //上传测试结果到history { CString m_ResID; CStringA m_Valu; if (m_TestFinalResult) { m_Valu=_T("'")+m_SNID+_T("','")+m_TestStation+_T("','1',")+m_TestResult; } else { m_Valu=_T("'")+m_SNID+_T("','")+m_TestStation+_T("','0',")+m_TestResult; } string db_name = ""; string tab_name = "historylist (SNID,StationID,TestResult,TestData)"; string where_def =""; string select_exp = ""; string m_InsertV=m_Valu.GetBuffer(); m_Valu.ReleaseBuffer(); Data_Param data_p(db_name,tab_name,where_def,select_exp,m_InsertV); if (!mysql.InsertRecord(&data_p)) { ConnectToMYSQL(); return false; } if (mysql.SelectRecordID()) { if (mysql.GetRecord()) { m_ResID=mysql.row[0]; mysql.FreeResult(); return 1; } else { mysql.FreeResult(); return 0; } } return 0; } void ReadConfig(void) { CString m_FilePath; GetModuleFileName(NULL,m_FilePath.GetBufferSetLength(MAX_PATH),MAX_PATH); m_FilePath.ReleaseBuffer(); m_FilePath = m_FilePath.Left( m_FilePath.ReverseFind( '\\' ) + 1 ); m_LogPath=m_FilePath; m_FilePath=m_FilePath+_T("config.ini"); GetPrivateProfileString(_T("ServerIPAdress"),_T("IP"),_T(""),m_ServerIP.GetBufferSetLength(20),20,m_FilePath); m_ServerIP.ReleaseBuffer(); GetPrivateProfileString(_T("MachieID"),_T("Machine"),_T("1"),m_MachineID.GetBufferSetLength(MAX_PATH),MAX_PATH,m_FilePath); m_MachineID.ReleaseBuffer(); m_ResComNo=GetPrivateProfileInt(_T("ResCom"),_T("Com"),0,m_FilePath); int m_Data=0; m_Data=GetPrivateProfileInt(_T("Function"),_T("EnableUpdateSQL"),0,m_FilePath); if (m_Data) { m_UpdateSql=true; } else { m_UpdateSql=false; } m_SataionID=GetPrivateProfileInt(_T("StationID"),_T("ID"),-1,m_FilePath); } void WriteLogFile(void) { CTime m_time=CTime::GetCurrentTime(); CString m_TestTime; CString m_FileName; m_TestTime=m_time.Format("%Y/%m/%d %H:%M:%S"); ProMap_it m_ProMap_it; m_ProMap_it=ProMap.begin(); CString m_UpperStr; CString m_LowerStr; CString m_WriteBuffer1=_T(""); CString m_WriteBuffer2=_T(""); CString m_WriteBuffer=_T(""); m_WriteBuffer1=_T("'"); m_WriteBuffer1+=m_Model+_T(",'")+m_SNStr+_T(","); CString m_Str; for (;m_ProMap_it!=ProMap.end();m_ProMap_it++) { m_UpperStr=m_ProMap_it->second.m_Upper; m_LowerStr=m_ProMap_it->second.m_Lower; m_Str.Format(_T("%0.5lf"),m_ProMap_it->second.m_TestValue); m_WriteBuffer2+=m_Str+_T(","); } m_WriteBuffer=m_WriteBuffer1+m_UpperStr+_T(",")+m_LowerStr+_T(",")+m_WriteBuffer2+_T(","); if (m_TestFinalResult) { m_FileName=m_Model+m_time.Format("_%Y-%m-%d_GOOD.csv"); m_WriteBuffer=m_WriteBuffer+m_TestTime+_T(",PASS,")+m_Operator+_T(",\n"); } else { m_FileName=m_Model+m_time.Format("_%Y-%m-%d_NG.csv"); m_WriteBuffer=m_WriteBuffer+m_TestTime+_T(",NG,")+m_Operator+_T(",\n"); } CString m_LogWritePath; m_LogWritePath=m_LogPath+_T("\\log\\")+m_FileName; if ( m_WriteLog.Open(m_LogWritePath,CFile::modeCreate|CFile::modeWrite|CFile::modeNoTruncate)) { char* old_locale = _strdup( setlocale(LC_CTYPE,NULL) ); setlocale(LC_CTYPE, "chs" );//设定 m_WriteLog.SeekToEnd(); m_WriteLog.WriteString(m_WriteBuffer); setlocale( LC_CTYPE, old_locale ); free( old_locale );//还原区域设定 m_WriteLog.Close(); } } int SplitCString(CString &strIn, CStringArray& strAryRe, LPCTSTR str) //字符串分割 { assert(str!=_T("")); strAryRe.RemoveAll(); int nStart = 0; int nEnd = 0; CString strTmp; while ( (nEnd = strIn.Find(str, nStart)) != -1 ) { strTmp = strIn.Mid(nStart, nEnd-nStart); strAryRe.Add(strTmp); nStart = nEnd+1; } strTmp = strIn.Mid(nStart, strIn.GetLength()); strAryRe.Add(strTmp); return strAryRe.GetSize(); } bool TestRes(void) { CString m_RestultMs=_T(""); CString m_StrBuffer=_T(""); CString m_TestStr=_T(""); int m_Count=0; int m_Index=1; double m_Upper=0.0; double m_Lower=0.0; double m_Test=0.0; double m_TestMax=0.0; double m_TestMin=0.0; double m_TestVauleBuffer=0.0; m_TestFinalResult=true; m_UpdateStr=_T(""); for (int i=0;i<m_TotalCount;i++) //循环测试次数 { m_Index=1; m_ResCom.ClearBuffer(); m_ResCom.WriteToPort(_T("G\n")); //触发扫描开始扫描 Sleep(m_ProTestDelay); m_ResCom.WriteToPort(_T("?\n")); //查询数据 Sleep(200); m_RestultMs=m_ResCom.RecvData(); //接收数据 m_StatusLog.StatusOut(_T("Receive from machine : ")+m_RestultMs); ///////////////////// m_Count=m_RestultMs.Find(_T("=")); if(m_Count>=0) { m_RestultMs=m_RestultMs.Mid(m_Count+1,m_RestultMs.GetLength()-m_Count-1); //得到电阻数据 if (m_RestultMs.Find(_T("mO"))>=0) //毫欧 { m_RestultMs.Replace(_T("mO"),_T("")); m_TestVauleBuffer=_ttof(m_RestultMs)/1000.0; } else if (m_RestultMs.Find(_T("kO"))>=0) //k欧 超量程 { AfxMessageBox(_T("测试值超过量程 当前测量值是: ") +m_RestultMs); return false; } else if(m_RestultMs.Find(_T("KO"))>=0) //K欧 { m_RestultMs.Replace(_T("KO"),_T("")); m_TestVauleBuffer=_ttof(m_RestultMs)*1000; } else if (m_RestultMs.Find(_T("O"))>=0) //欧 { m_RestultMs.Replace(_T("O"),_T("")); m_TestVauleBuffer=_ttof(m_RestultMs); } else { AfxMessageBox(_T("仪器返回数据异常!")); return false; } ProMap_it m_ProMap_it; m_ProMap_it=ProMap.begin(); for (;m_ProMap_it!=ProMap.end();m_ProMap_it++) { m_Index=_ttoi(m_ProMap_it->first); if (m_Index==1) //检查测试通道 { if (i==0) { m_ProMap_it->second.m_TestValue=0.0; m_ProMap_it->second.m_MaxValue=m_TestVauleBuffer; m_ProMap_it->second.m_MinValue=m_TestVauleBuffer; m_ProMap_it->second.m_TestValue+=m_TestVauleBuffer; } else { m_ProMap_it->second.m_TestValue+=m_TestVauleBuffer; //计算几次测试值的总和 if(m_ProMap_it->second.m_MaxValue<m_TestVauleBuffer) { m_ProMap_it->second.m_MaxValue=m_TestVauleBuffer; } if (m_ProMap_it->second.m_MinValue>m_TestVauleBuffer) { m_ProMap_it->second.m_MinValue=m_TestVauleBuffer; } } if (i==m_TotalCount-1) { m_Upper=_ttof(m_ProMap_it->second.m_Upper); m_Lower=_ttof(m_ProMap_it->second.m_Lower); m_ProMap_it->second.m_TestValue=m_ProMap_it->second.m_TestValue/m_TotalCount; m_TestResult.Format(_T("%0.6lf"),m_ProMap_it->second.m_TestValue); m_Test=m_ProMap_it->second.m_TestValue; m_StrDesc.Format(_T("%0.6lf"),m_ProMap_it->second.m_MaxValue-m_ProMap_it->second.m_MinValue); double m_MaxOff=0.0; double m_MinOff=0.0; m_MaxOff=m_ProMap_it->second.m_MaxValue; m_MinOff=m_ProMap_it->second.m_MinValue; m_StrMax.Format(_T("%0.6lf"),m_MaxOff); m_StrMin.Format(_T("%0.6lf"),m_MinOff); if((m_Test>=m_Lower)&&(m_Test<=m_Upper)) { if ((m_MaxOff>=m_Lower)&&(m_MaxOff<=m_Upper)) { if ((m_MinOff>=m_Lower)&&(m_MinOff<=m_Upper)) { m_ProMap_it->second.m_Result=_T("1"); if((_ttof(m_StrDesc))<=(_ttof(m_ProMap_it->second.m_Moffset))) { m_TestFinalResult=true ; m_UpdateStr+=m_TestResult+_T(",")+m_StrDesc+_T(",")+m_StrMax+_T(",")+m_StrMin+_T(",1,"); } else { m_TestFinalResult=false ; m_UpdateStr+=m_TestResult+_T(",")+m_StrDesc+_T(",")+m_StrMax+_T(",")+m_StrMin+_T(",0,"); } } else { m_TestFinalResult=false ; m_ProMap_it->second.m_Result=_T("0"); m_UpdateStr+=m_TestResult+_T(",")+m_StrDesc+_T(",")+m_StrMax+_T(",")+m_StrMin+_T(",0,"); } } else { m_TestFinalResult=false ; m_ProMap_it->second.m_Result=_T("0"); m_UpdateStr+=m_TestResult+_T(",")+m_StrDesc+_T(",")+m_StrMax+_T(",")+m_StrMin+_T(",0,"); } } else { m_TestFinalResult=false; m_ProMap_it->second.m_Result=_T("0"); m_UpdateStr+=m_TestResult+_T(",")+m_StrDesc+_T(",")+m_StrMax+_T(",")+m_StrMin+_T(",0,"); } } } else { AfxMessageBox(_T("测试通道设定应该是1,当前是: ") +m_Index); return false; } } } else { AfxMessageBox(_T("仪器返回数据异常!")); return false; } } return true; } bool RunInitOperation(void) { CString m_ResBuffer; if(m_ResCom.OpenComm(m_ResComNo,9600,'N',8,0)) { m_ResCom.WriteToPort(_T("?\n")); Sleep(100); m_ResBuffer=m_ResCom.RecvData(); if (m_ResBuffer.IsEmpty()) { return false; } else { m_ResCom.WriteToPort(_T("AF\n")); //关闭数据自动返回 Sleep(200); m_ResCom.WriteToPort(_T("S7\n")); //单次触发 Sleep(200); m_ResCom.WriteToPort(_T("S4\n")); //显示R值 Sleep(200); m_ResCom.WriteToPort(_T("S3\n")); //关闭分选 Sleep(200); m_ResCom.WriteToPort(_T("S0\n")); //慢速 Sleep(200); m_ResCom.WriteToPort(_T("R0\n")); //自动量程 return true; } } else { AfxMessageBox(_T("打开通讯串口失败!")); return false; } } UINT RunProcessResTest(LPVOID pParam) { bool m_RunMark=true; bool m_PrintMark=false; CString m_ResPStr=_T(""); int m_Step=0; CString m_ChanleListOld=_T(""); m_StatusLog.Init(_T("")); //初始化log文件记录类 CResTestDlg* m_PResTestDlg =(CResTestDlg*)pParam; ReadConfig(); ConnectToMYSQL(); //链接数据库 while(1) { WaitForSingleObject(m_StartHandle,INFINITE); if (m_PResTestDlg->m_InitMachine) { if (RunInitOperation()) { CString m_MessageStr=_T("1> 电阻测试仪初始化成功\r\n"); SendMessage(AfxGetMainWnd()->GetSafeHwnd(), WM_UPDATA_MESSAGE, 2,(LPARAM)(LPCTSTR)m_MessageStr); } else { CString m_MessageStr=_T("1> 电阻测试仪初始化失败\r\n"); SendMessage(AfxGetMainWnd()->GetSafeHwnd(), WM_UPDATA_MESSAGE, 3,(LPARAM)(LPCTSTR)m_MessageStr); } m_PResTestDlg->m_InitMachine=false; ResetEvent(m_StartHandle); continue; } m_PrintMark=m_PResTestDlg->m_PrintEnable; m_ChanleList=m_PResTestDlg->m_ProList; m_TestStation=m_PResTestDlg->m_StationID; m_Model=m_PResTestDlg->m_ProName; m_Operator=m_PResTestDlg->m_OperatorStr; m_ProTestDelay=m_PResTestDlg->m_TestDelay; m_SNStr=m_PResTestDlg->m_SNString; m_Step=0; m_RunMark=TRUE; while(m_RunMark) { switch (m_Step) { case 0: //分析测试通道 { m_UpdateSql=m_PResTestDlg->m_SNEnable; if (m_ChanleListOld!=m_ChanleList) { m_ChanleListOld=m_ChanleList; ProCahnel m_ProCahnel; CStringArray m_ProArray; if (!ProMap.empty()) { ProMap.clear(); } m_Coun= SplitCString(m_ChanleList,m_ProArray,_T(","))/6; if (m_Coun==0) { AfxMessageBox(_T("解析测试程序文件异常!")); m_RunMark=false; ResetEvent(m_StartHandle); break; } for (int i=0;i<1;i++) //当前程序是单通道的 { m_ProCahnel.m_Upper=m_ProArray.GetAt(i*6+1); m_ProCahnel.m_Lower=m_ProArray.GetAt(i*6+2); m_ProCahnel.m_Count=m_ProArray.GetAt(i*6+3); m_TotalCount=_ttoi(m_ProArray.GetAt(i*6+3)); m_ProCahnel.m_Moffset=m_ProArray.GetAt(i*6+4); m_ProCahnel.m_TestValue=0; m_ProCahnel.m_MaxValue=0; m_ProCahnel.m_MinValue=0; m_ProCahnel.m_Result=_T(""); ProMap.insert(make_pair(m_ProArray.GetAt(i*6+0),m_ProCahnel)); } } m_Step++; break; } case 1: //发送触发命令 { if (!TestRes()) { if(AfxMessageBox(_T("测试失败,是否重试!"),MB_YESNO)==IDYES) { break; } else { m_RunMark=false; ResetEvent(m_StartHandle); break; } } m_Step++; break; } case 2: //获取当前SN的ID { if (m_UpdateSql) { int m_SerachResult=-1; m_SerachResult=SearchSNList(m_SNStr); if (m_SerachResult==0) // 查找到当前SN的ID { m_Step++; } else { m_SQLResult=0; m_Step=4; //返回测试结果 break; } } else { m_SQLResult=1; m_Step=4; //返回测试结果 break; } m_Step=3; break; } case 3: //开始检查当前SN 在数据库中的记录 { if (CheckSNInformation(m_SNID)!=Result_OK) { m_SQLResult=0; m_Step=4; break; } if (!InsertTestResult()) { if(AfxMessageBox(_T("上传数据库失败,是否重试!"),MB_YESNO)==IDYES) { break; } else { m_RunMark=false; ResetEvent(m_StartHandle); break; } } m_SQLResult=1; m_Step++; break; } case 4: //返回测试结果数据 { if (m_UpdateSql) { if (!m_MesHttp.MesStartTEST(m_SNStr,m_MachineID,_T(""),m_Model,m_UpdateStr,m_ResPStr)) { m_StatusLog.StatusOut(m_ResPStr+_T("\r\n")); AfxMessageBox(_T("上传MES失败")); SendMessage(AfxGetMainWnd()->GetSafeHwnd(),WM_UpdateResult,false,(LPARAM)(LPCTSTR)m_UpdateStr); m_Step++; break; } m_StatusLog.StatusOut(m_ResPStr+_T("\r\n")); } if (m_TestFinalResult&m_SQLResult)////////////// { SendMessage(AfxGetMainWnd()->GetSafeHwnd(),WM_UpdateResult,true,(LPARAM)(LPCTSTR)m_UpdateStr); } else { SendMessage(AfxGetMainWnd()->GetSafeHwnd(),WM_UpdateResult,false,(LPARAM)(LPCTSTR)m_UpdateStr); } m_Step++; break; } case 5: //写入log文件 { WriteLogFile(); m_Step=0; m_RunMark=false ; ResetEvent(m_StartHandle); } default:break; } } Sleep(10); } return 1; } 解释每一行代码
最新发布
09-16
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值