工作两个月以来的总结
1 用++i代替i++
所以如果退出时有操作可继承CDialog类中的OnCancel函数进行统一处理
3 编码时要尽量做到业务与界面的分离,例如要读入对话框的数据最好单独实现,这样可以避免后期因为依赖关系太强难以维护
4 编码要遵循低耦合高内聚的原则,模块功能尽量单一,提高代码重用率
5 在需要使用COM组件的时候必须在开头处加入::CoInitialize(NULL),在结尾处加入::CoUninitalize();而两者的位置放置不合适会导致代码出现问题,所以可以用一 个结构体替换
STRUCT _tagInitCom
{
_tadInitCom(){::CoInitialize(NULL); }
~tagInitCom(){ ::CoUninitalize(); }
};
在使用COM组件之前直接定义一下结构体类型的数据即可:_tagInitCom InitCom;
6 在创建多线程的时候如果同时有界面操作和后台的信息处理,最好将界面操作作为主线程,后台业务处理作为辅助线程(目前还不是很明白为什么,只是直到反过 来容易出问题)
7 在判断指针型字符串是否为空时
用if(szContent == NULL || szContent == "")
不要用if(szContent == "" || szContent == NULL ),因为后者会导致程序挂掉
8 在dll中调对话框的时候要先将本dll的句柄加入到资源链中
HINSTANCE hDll = GetModuleHandle((char*)strPath.GetString());
AfxSetResourceHandle(hDll);
9 static 成员函数没有this指针,所以如果要调用到类中的非静态成员函数需要使用指针
eg.
HANDLE hMailHandler = (HANDLE)_beginthreadex(NULL, 0,&CDlgLicProcCtrl::ApplyLicense,this, NULL,&threadId );
/*static*/unsigned __stdcall CDlgLicProcCtrl::ApplyLicense(PVOID pParam)
{
CDlgLicProcCtrl* pDlg = (CDlgLicProcCtrl*)pParam;
return pDlg->ApplyLicenseHelper();
}
unsigned CDlgLicProcCtrl::ApplyLicenseHelper()
{
...
}
10 对于两组数据一现有、一组动态获取的,两者要一一对应组合成另一组数据时的编程思路
用数组存放现有数据,循环获取动态数据并根据界标获取数组中的数据进行组装
eg. const char*szDesc[] = { "UserID", "UserName", "PrimaryDept", "SecondaryDept", "TertiayDept", "PDU", "ProjectName" };
CString sText;
for(int nID = IDC_EDIT_USERID; nID <= IDC_EDIT_PROJECTNAME; nID++)
{
//获取动态数据
((CEdit*)GetDlgItem(nID))->GetWindowText(sText);
//获取现有数据
StUser.sFieldName = szDesc[nID - IDC_EDIT_USERID];
StUser.sFieldValue = sText;m_vecUserInfo.push_back(StUser);//组合放入动态容器中
}