项目中遇到的技术点总结
一. Sscanf的使用
读取16进制的单个字符。形如”1A 2B 3C 4D 78”等,读取的结果为0x1A 0x2B 0x3C 0x4D 0x78.
int n ;
unsigned char c ;
sscanf(pszHexString , “%d” , &n) ;
c = (unsigned char) n ;
这里使用&n,而不用&c的原因是,&c的话,会导致&c之后的3个字节的数据被清空。
因为sscanf中的操作为 *(int*)p = 0x1A ;所以导致buffer overflow。数据被覆盖。
二. VC2005的事件处理
可以很方便的添加:
1, Event
系统中的menu项,本对话框的所有控件等。
2, Override
Override函数
3, Message
本对话框的所有message等。
三. CEdit
有个Edit控件时,如果需要响应该控件上的Enter键,限制可输入字符需求时,需要从CEdit继承一个类,并截获如下message。
OnChar,OnKeyUp
void CEditEx::OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags) {
if ( (char) nChar == '/r' ) {
if ( m_pfnEnterHandler ) {
m_pfnEnterHandler( m_pContext ) ;
}
}
else
{ CEdit::OnKeyUp(nChar, nRepCnt, nFlags); }
}
四. CRichEdit
使用之前,需要调用AfxInitRichEdit2()进行初期化。
设置等宽字体
CHARFORMAT2 cf ;
DWORD dw = GetDefaultCharFormat( cf ) ;
strcpy( cf.szFaceName , "MSゴシック" ) ;
SetDefaultCharFormat( cf ) ;
改变字体颜色
CHARRANGE cr ;
CHARFORMAT2 cf ;
memset( &cr , 0 , sizeof(cr) ) ;
cr.cpMin = 10 ;
cr.cpMax = 20 ;
SetSel( cr ) ;
cf.cbSize = sizeof(cf) ;
cf.dwMask = CFM_COLOR ;
cf.crTextColor = RGB( 0xFF , 0 , 0xFF ) ;
SetSelectionCharFormat( cf ) ;
五. CMSFlexGrid
控件注册:regsvr32 MSFLXGRD.OCX
同时选中多列:设置当前列为1,设置选中列为5。那么从第一列到第五列都被选中。多行同时选中也同样。
动态追加行:使用AddItem,列字符串间由/t分割,第二个参数为插入的行号。
列对齐:ColAlignment属性
HightLight属性,即使失去焦点也显示选中状态
所有EVENT都由控件的父窗口进行处理
char szTLVItem[256] = { 0 } ;
VARIANT myVar;
long lRow = get_Rows() ;
myVar.vt = VT_I4; // 4BYTE Integer
myVar.lVal = lRow ; // 行号
sprintf(szTLVItem , "/t%s/t%s/t%s" ,
pszTag , pszLength , pszValue ) ;
AddItem( szTLVItem, myVar );