小技巧

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


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值