一、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...");
}