一。如何限制编辑框中的准许字符以及修改输入的字符 使用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::OnDraw(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);
}

|