VC常用技巧集锦
一。如何限制编辑框中的准许字符以及修改输入的字符
使用ClassWizard处理WM_CHAR消息,计算nChar参量并决定所执行的操作,用户可以确定是否修改、传送字符。下例说明了如何显示字母字符,如果字符是字母字符,则调用CWnd ; OnChar,否则不调用OnChar.
void CMyEdit : : OnChar (UINT nChar , UINT nRepCnt , UITN nFlags )
{
file://Determine if nChar is an alphabetic character .
if (: : IsCharAlpha ( ( TCHAR) nChar ) )
CEdit : : OnChar (nChar, nRepCnt , nFlags );
}
如果要修改字符,则不能仅仅简单地用修改过的nChar调用CEdit : : OnChar,然后CEdit: : OnChar调用CWnd: : Default获取原来的wParam 和lParam 的值 ,这样是不行的。要修改一个字符,需要首先修改nChar,然后用修改过的nChar调用CWnd: : DefWindowProc。下例说明了如何将字符转变为大写:
file://Make all characters uppercase
void CMyEdit : : OnChar (UINT nChar , UINT nRepCnt , UINT nFlags )
{
file://Make sure character is uppercase .
if (: : IsCharAlpha ( .( TCHAR) nChar)
nChar=: : CharUpper (nChar ) ;
file://Bypass default OnChar processing and directly call
file://default window proc.
DefWindProc (WM_CHAR, nChar , MAKELPARAM (nRepCnt , nFlags )) ;
}
二。在程序运行期间,怎样禁止窗口右上方的关闭按钮
CMenu *pMenu = AfxGetMainWnd()->GetSystemMenu(FALSE) ;
if (pMenu)
pMenu->EnableMenuItem(SC_CLOSE, MF_BYCOMMAND|MF_GRAYED) ;
// 变为非禁止状态
CMenu *pMenu = AfxGetMainWnd()->GetSystemMenu(FALSE) ;
if (pMenu)
pMenu->EnableMenuItem(SC_CLOSE, MF_BYCOMMAND|MF_ENABLED) ;
三。画图屏幕不闪烁的方法
当使视窗的某一区域无效时,系统将发送WM_UPDATE消息,引发视类的重画。如果在OnDraw()函数中简单地将所有的图形对象重画,将引起明显的闪烁。因此,需要做相应的处理。本系统采用了先在内存中绘制图形,然后再把绘好的图形以位图方式从内存拷贝到窗口客户。
void CDrawView:nDraw(CDC* pDC)
{
CDrawDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
CDC dc;
CBitmap bitmap;
CBitmap* pOldBitmap;
CRect client;
CRect rect;
pDC->GetClipBox(client);//检取无效区
GetClientRect(rect);//检取整个客户区
if(dc.CreateCompatibleDC(pDC))//创建一个与pDC兼容的内存设备环境
{
if(bitmap.CreateCompatibleBitmap(pDC,rect.Width(),
rect.Height()))//创建一与pDC兼容的位图,大小为整个客户区
{
OnPrepareDC(&dc,NULL);//使dc与pDC具有同样的映射关系
pOldBitmap=dc.SelectObject(&bitmap);//将位图选入内存环境
dc.SelectClipRgn(NULL);//使dc的整个客户区都成无效区
dc.IntersectClipRect(client);//再“与上”检取的无效区,使
file://内存环境与pDC检取的无效区相等
}
}
CBrush brush;
if(!brush.CreateSolidBrush(RGB(255,255,255)))
return ;
brush.UnrealizeObject();
dc.FillRect(client,&brush);//将dc的作图区刷新成背景色
if(m_drawObjs.GetCount()!=0)
Draw(&dc);//将所有的画图对象在内存裁减区内重画
pDC->BitBlt(client.left,client.top,client.Width(),client.Height(),
&dc,client.left,client.top,SRCCOPY);//将内存裁减区的位图
file://拷贝到窗口裁减区
dc.SelectObject(pOldBitmap);
}
使用ClassWizard处理WM_CHAR消息,计算nChar参量并决定所执行的操作,用户可以确定是否修改、传送字符。下例说明了如何显示字母字符,如果字符是字母字符,则调用CWnd ; OnChar,否则不调用OnChar.
void CMyEdit : : OnChar (UINT nChar , UINT nRepCnt , UITN nFlags )
{
file://Determine if nChar is an alphabetic character .
if (: : IsCharAlpha ( ( TCHAR) nChar ) )
CEdit : : OnChar (nChar, nRepCnt , nFlags );
}
如果要修改字符,则不能仅仅简单地用修改过的nChar调用CEdit : : OnChar,然后CEdit: : OnChar调用CWnd: : Default获取原来的wParam 和lParam 的值 ,这样是不行的。要修改一个字符,需要首先修改nChar,然后用修改过的nChar调用CWnd: : DefWindowProc。下例说明了如何将字符转变为大写:
file://Make all characters uppercase
void CMyEdit : : OnChar (UINT nChar , UINT nRepCnt , UINT nFlags )
{
file://Make sure character is uppercase .
if (: : IsCharAlpha ( .( TCHAR) nChar)
nChar=: : CharUpper (nChar ) ;
file://Bypass default OnChar processing and directly call
file://default window proc.
DefWindProc (WM_CHAR, nChar , MAKELPARAM (nRepCnt , nFlags )) ;
}
二。在程序运行期间,怎样禁止窗口右上方的关闭按钮
CMenu *pMenu = AfxGetMainWnd()->GetSystemMenu(FALSE) ;
if (pMenu)
pMenu->EnableMenuItem(SC_CLOSE, MF_BYCOMMAND|MF_GRAYED) ;
// 变为非禁止状态
CMenu *pMenu = AfxGetMainWnd()->GetSystemMenu(FALSE) ;
if (pMenu)
pMenu->EnableMenuItem(SC_CLOSE, MF_BYCOMMAND|MF_ENABLED) ;
三。画图屏幕不闪烁的方法
当使视窗的某一区域无效时,系统将发送WM_UPDATE消息,引发视类的重画。如果在OnDraw()函数中简单地将所有的图形对象重画,将引起明显的闪烁。因此,需要做相应的处理。本系统采用了先在内存中绘制图形,然后再把绘好的图形以位图方式从内存拷贝到窗口客户。
void CDrawView:nDraw(CDC* pDC)
{
CDrawDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
CDC dc;
CBitmap bitmap;
CBitmap* pOldBitmap;
CRect client;
CRect rect;
pDC->GetClipBox(client);//检取无效区
GetClientRect(rect);//检取整个客户区
if(dc.CreateCompatibleDC(pDC))//创建一个与pDC兼容的内存设备环境
{
if(bitmap.CreateCompatibleBitmap(pDC,rect.Width(),
rect.Height()))//创建一与pDC兼容的位图,大小为整个客户区
{
OnPrepareDC(&dc,NULL);//使dc与pDC具有同样的映射关系
pOldBitmap=dc.SelectObject(&bitmap);//将位图选入内存环境
dc.SelectClipRgn(NULL);//使dc的整个客户区都成无效区
dc.IntersectClipRect(client);//再“与上”检取的无效区,使
file://内存环境与pDC检取的无效区相等
}
}
CBrush brush;
if(!brush.CreateSolidBrush(RGB(255,255,255)))
return ;
brush.UnrealizeObject();
dc.FillRect(client,&brush);//将dc的作图区刷新成背景色
if(m_drawObjs.GetCount()!=0)
Draw(&dc);//将所有的画图对象在内存裁减区内重画
pDC->BitBlt(client.left,client.top,client.Width(),client.Height(),
&dc,client.left,client.top,SRCCOPY);//将内存裁减区的位图
file://拷贝到窗口裁减区
dc.SelectObject(pOldBitmap);
}