一、CMFCPropertyGridCtrl列宽的动态设置
CMFCPropertyGridCtrl m_pro;
////////////
HDITEM item;
CRect re;
m_pro.GetWindowRect(&re);
item.cxy=re.Width()/2;
item.mask=HDI_WIDTH;
m_pro.GetHeaderCtrl().SetItem(0, &item);
二、VS中宽字符与宅字符之间的转换
USES_CONVERSION;
CString t=A2W(ch);
USES_CONVERSION;
char *t=W2A(str);//t的作用域很小。
三、在对话框中响应ON_UPDATE_COMMAND_UI
BOOL CMyDialog::ContinueModal()//重载这个虚函数后就可以响应了 { if(m_wndtoolbar.IsWindowVisible()) { m_wndtoolbar.OnUpdateCmdUI((CFrameWnd*)this, TRUE); } return CDialog::ContinueModal(); }
四、char与Base64相互转换
1.char转为Base64
发送邮件是用户名和密码需要把char类型转换为Base64类型。可以使用这个来转。
void CSendMail::Char2Base64(char* pBuff64,char* pSrcBuff,int iLen) { //1 1 1 1 1 1 1 1 // 分配给pBuff64 ↑ 分配给pBuff64+1 // point所在的位置 static char Base64Encode[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";//base64所映射的字符表 int point;//每一个源字符拆分的位置,可取2,4,6;初始为2 point=2; int i; int iIndex;//base64字符的索引 char n=0;//上一个源字符的残留值 for(i=0;i<iLen;i++) { if(point==2) { iIndex=((*pSrcBuff)>>point)&0x3f;//取得pSrcBuff的高point位 } else if (point==4) { iIndex=((*pSrcBuff)>>point)&0xf;//取得pSrcBuff的高point位 } else if(point==6) { iIndex=((*pSrcBuff)>>point)&0x3;//取得pSrcBuff的高point位 } iIndex+=n;//与pSrcBuff-1的低point结合组成Base64的索引 *pBuff64++=Base64Encode[iIndex];//由索引表得到pBuff64 n=((*pSrcBuff)<<(6-point));//计算源字符中的残留值 n=n&0x3f;//确保n的最高两位为0 point+=2;//源字符的拆分位置上升2 if(point==8)//如果拆分位置为8说明pSrcBuff有6位残留,可以组成一个完整的Base64字符,所以直接再组合一次 { iIndex=(*pSrcBuff)&0x3f;//提取低6位,这就是索引了 *pBuff64++=Base64Encode[iIndex];// n=0;//残留值为0 point=2;//拆分位置设为2 } pSrcBuff++; } if(n!=0) { *pBuff64++=Base64Encode[n]; } if(iLen%3==2)//如果源字符串长度不是3的倍数要用'='补全 { *pBuff64='='; } else if(iLen%3==1) { *pBuff64++='='; *pBuff64='='; } }
五、自己实现鼠标移动窗口
PostMessage(WM_NCLBUTTONDOWN, HTCAPTION,MAKELPARAM(point.x, point.y));//发送消息移动窗口比MoveWindow好
六、捕获除0和野指针异常
__try { int y = 0; int x = 1 / y; } __except(GetExceptionCode() == EXCEPTION_INT_DIVIDE_BY_ZERO ? EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) { printf("divide by zero exception..."); }
__try { char* p = NULL; strcpy(p, "test"); } __except(GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION ? EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) { printf("access violation exception..."); }