vc常用技巧总2
- 格式:doc
- 大小:47.50 KB
- 文档页数:10
CEdit : : OnChar (nChar, nRepCnt , nFlags )}如果要修改字符,则不能仅仅简单地用修改过的nChar调用CEdit: : OnChar,然后CEdit: : OnChar调用CWnd: : Default获取原来的wParam 和lParam 的值,这样是不行的。
要修改一个字符,需要首先修改nChar,然后用修改过的nChar 调用CWnd: : DefWindowProc。
下例说明了如何将字符转变为大写://Make all characters uppercasevoid CMyEdit : : OnChar (UINT nChar , UINT nRepCnt , UINT nFlags ) {//Make sure character is uppercase .if (: : IsCharAlpha ( .( TCHAR) nChar)nChar=: : CharUpper(nChar )//Bypass default OnChar processing and directly call//default window proc.DefWindProc (WM_CHAR, nChar , MAKELPARAM (nRepCnt, nFlags ))}续:(48)如何改变控件的颜色有两种方法。
其一,可以在父类中指定控件的颜色,或者利用MFC4.0新的消息反射在控件类中指定颜色。
当控件需要重新着色时,工作框调用父窗口(通常是对话框)的CWnd: : OnCrtlColor,可以在父窗口类中重置该函数并指定控件的新的绘画属性。
例如,下述代码将对话中的所有编辑控件文本颜色改为红色:HBRUSH CAboutDig : : OnCtlColor (CDC * pDCM , CWnd * pWnd , UINT nCtlColor){HBRUSH hbr = CDialog : : OnCtlColor (pDC, pWnd , nCtlColor )//Draw red text for all edit controls .if (nCtlColor= = CTLCOLOR_EDIT )pDC —> SetTextColor (RGB (255, 0 , 0 , ) )return hbr}然而,由于每个父窗口必须处理通知消息并指定每个控件的绘画属性,所以,这种方法不是完全的面向对象的方法。
控件处理该消息并指定绘画属性更合情合理。
消息反射允许用户这样做。
通知消息首先发送给父窗口,如果父窗口没有处理则发送给控件。
创建一个定制彩色列表框控件必须遵循下述步骤。
首先,使用ClassWizard 创建一个CListBox 的派生类并为该类添加下述数据成员。
class CMyListBox publilc CListBox{…privateCOLORREF m_clrFor // foreground colorCOLORREF m_clrBack //background colorCbrush m_brush //background brush…}其次,在类的构造函数中,初始化数据中。
CMyListBox : : CMyListBox (){//Initialize data members .m_clrFore =RGB (255 , 255 , 0) //yellow textm_clrBack=RGB (0 , 0 , 255) // blue backgroundm_brush . CreateSolidBrush (m _clrBack )}最后,使用ClassWizard处理反射的WM_CTLCOLOR(=WM_CTLCOLOR)消息并指定新的绘画属性。
HBRUSH CMyListBox : : CtlColor (CDC* pDC, UINT nCtlColor ){pDC—>SetTextColor (m_clrFore)pDC—>SetBkColor (m_clrBack)return (HBRUSH) m_brush.GetSafeHandle ()}现在,控件可以自己决定如何绘画,与父窗口无关。
(49)当向列表框中添加多个项时如何防止闪烁调用CWnd::SetRedraw 清除重画标志可以禁止CListBox(或者窗口)重画。
当向列表框添加几个项时,用户可以清除重画标志,然后添加项,最后恢复重画标志。
为确保重画列表框的新项,调用SetRedraw (TRUE) 之后调用CWnd::Invalidate。
//Disable redrawing.pListBox->SetRedraw (FALSE)//Fill in the list box gere//Enable drwing and make sure list box is redrawn.pListBox->SetRedraw (TRUE)pListBox->Invalidate ()(50)如何向编辑控件中添加文本由于没有CEdit:: AppendText函数,用户只好自己做此项工作。
调用CEdit:: SetSel移动到编辑控件末尾,然后调用CEdit:: ReplaceSel添加文本。
下例是AppendText 的一种实现方法:void CMyEdit:: AppendText (LPCSTR pText){int nLen=GetWindowTextLength ()SetFocus ()SetSel (nLen, nLen)ReplaceSel (pText)}(51)如何访问预定义的GDI对象可以通过调用CDC:: SlectStockObject使用Windows的几个预定义的对象,诸如刷子、笔以及字体。
下例使用了Windows预定义的笔和刷子GDI对象在视窗中画一个椭圆。
//Draw ellipse using stock black pen and gray brush.void CSampleView:: OnDraw (CDC* pDC){//Determine size of view.CRect rcViewGetClientRect (rcView)//Use stock black pen and stock gray brush to draw ellipse.pDC->SelectStockObject (BLACK_PEN)pDC->SelectStockObject (GRAY_BRUSH)//Draw the ellipse.pDC->Ellipse (reView)}也可以调用新的SDK函数GetSysColorBrush获取一个系统颜色刷子,下例用背景色在视窗中画一个椭圆:void CsampleView:: OnDraw (CDC* pDC){//Determine size of view.CRect rcViewGetClientRect (rcView)//Use background color for tooltips brush.CBrush * pOrgBrush=pDC->SelectObject( CBrush ::FromHandle( ::GetSysColorBrush (COLOR_INFOBK)))//Draw the ellipse.pDC->Ellipse (rcView)//Restore original brush.pDC->SelectObject (pOrgBrush)}(52)如何获取GDI对象的属性信息可以调用GDIObject:: GetObject。
这个函数将指定图表设备的消息写入到缓冲区。
下例创建了几个有用的辅助函数。
//Determine if font is bold.BOOL IsFontBold (const CFont&font){LOGFONT stFontfont.GetObject (sizeof (LOGFONT), &stFont)return (stFont.lfBold)? TRUE: FALSE}//Return the size of a bitmap.CSize GetBitmapSize (const CBitmap&bitmap){BITMAP stBitmapbitmap.GetObject (sizeof (BITMAP), &stBitmap)return CSize (stBitmap.bmWidth, stBitmap.bmHeight)}//Create a pen with the same color as a brush.BOOL CreatePenFromBrush (Cpen&pen, cost Cbrush&brush){LOGBRUSH stBrushbrush.Getobject (sizeof (LOGBRUSH), &stBrush)return pen. Createpen (PS_SOLID, 0, stBrush.ibColor)}(53)如何实现一个橡皮区矩形CRectTracker是一个很有用的类,可以通过调用CRectTracker::TrackRubberBand 响应WM_LBUTTONDOWN消息来创建一个橡皮区矩形。
下例表明使用CRectTracker移动和重置视窗中的蓝色椭圆的大小是很容易的事情。
首先,在文件档中声明一个CRectTracker数据成员:class CSampleView : Public CView…public :CrectTracker m_tracker…}其次,在文档类的构造函数中初始化CRectTracker 对象:CSampleDoc:: CSampleDOC (){//Initialize tracker position, size and style.m_tracker.m_rect.SetRect (0, 0, 10, 10)m_tracker.m_nStyle=CRectTracker:: resizeInside | CRectTracker ::dottedLine}然后,在OnDraw函数中画椭圆和踪迹矩形:void CSampleView:: OnDraw (CDC* pDC){CSampleDoc* pDoc=GetDocument ()ASSERT_VALID (pDoc)//Select blue brush into device context.CBrush brush (RGB (0, 0, 255))CBrush* pOldBrush=pDC->SelectObject (&brush)//draw ellipse in tracking rectangle.Crect rcEllipsepDoc->m_tracker.GetTrueRect (rcEllipse)pDC->Ellipse (rcEllipse)//Draw tracking rectangle.pDoc->m_tracker.Draw (pDC)//Select blue brush out of device context.pDC->Selectobject (pOldBrush)}最后,使用ClassWizard处理WM_LBUTTONDOWN消息,并增加下述代码。