首页 > C/C++开发工具专区 > VC技术 > Visual C++编程技巧之三
2006
03-14

Visual C++编程技巧之三






17、如何创建一个字回绕的CEditView


重载CWnd : : PreCreateWindow和修改CREATESTRUCT结构,关闭CEditView对象的ES_AUTOHSCROLLWS_HSCROLL风格位,由于CEditView : : PreCreateWindow显示设置cs. style,调用基类函数后要修改cs . style


BOOL CSampleEDitView : : PreCreateWindow (CREATESTRUCT&cs)


{


//First call basse class function .


BOOL bResutl =CEditView : : PreCreateWindow (cs) ;


// Now specify the new window style .


cs.style &= ~ (ES_AUTOHSCROLL WS_HSCROLL);


return bResult ;


}


18、通用控件的显示窗口


MFC提供了几个CView派生的视窗类,封装了通用控件的功能,但仍然使用工


作框文档显示窗口体系结构:CEditView封装了编辑控件,CTreeView保持了树列表


控件,CListView封装了列表显示窗口控件,CRichEditView可以处理多种编辑控件。


19、移动窗口


调用CWnd : : SetWindowPos并指定SWP_NOSIZE标志。目的位置与父窗口


有关(顶层窗口与屏幕有关)。调用CWnd : : MoveWindow时必须要指定窗口


的大小。


//Move window to positoin 100 , 100 of its parent window .


SetWindowPos (NULL, 100 , 100 , 0 , 0 , SWP_NOSIZE SWP_NOAORDER);


20、重置窗口的大小


调用CWnd: : SetWindowPos并指定SWP_NOMOVE标志, 也可调用


CWnd : : MoveWindow 但必须指定窗口的位置。


// Get the size of the window .


Crect reWindow ;


GetWindowRect (reWindow );


//Make the window twice as wide and twice as tall .


SetWindowPos (NULL , 0 , 0 , reWindow . Width ( ) *2,


reWindow . Height () * 2,


SWP_NOMOVE SWP_NOZORDER );


21、如何单击除了窗口标题栏以外的区域使窗口移动


当窗口需要确定鼠标位置时Windows向窗口发送WM_NCHITTEST信息,可以处理


该信息使Windows认为鼠标在窗口标题上。对于对话框和基于对话的应用程序,可


以使用ClassWizard处理该信息并调用基类函数,如果函数返回HTCLIENT 则表明


鼠标在客房区域,返回HTCAPTION表明鼠标在Windows的标题栏中。


UINT CSampleDialog : : OnNcHitTest (Cpoint point )


{


UINT nHitTest =Cdialog: : OnNcHitTest (point );


return (nHitTest = =HTCLIENT)? HTCAPTION : nHitTest ;


}


上述技术有两点不利之处,其一是在窗口的客户区域双击时, 窗口将极大;


其二,它不适合包含几个视窗的主框窗口。还有一种方法,当用户按下鼠标左键


使主框窗口认为鼠标在其窗口标题上,使用ClassWizard在视窗中处理WM_LBUTTODOWN


信息并向主框窗口发送一个WM_NCLBUTTONDOWN信息和一个单击测试HTCAPTION


void CSampleView : : OnLButtonDown (UINT nFlags , Cpoint point )


{


CView : : OnLButtonDow (nFlags , pont );


//Fool frame window into thinking somene clicked on


its caption bar .


GetParentFrame ( ) > PostMessage (


WM_NCLBUTTONDOWN , HTCAPTION , MAKELPARAM (poitn .x , point .y) );


}


该技术也适用于对话框和基于对的应用程序,只是不必调用CWnd : : GetParentFrame


void CSampleDialog : : OnLbuttonDown (UINT nFlags, Cpoint point )


{


Cdialog : : OnLButtonDow (nFlags, goint );


//Fool dialog into thinking simeone clicked on its caption bar .


PostMessage (WM_NCLBUTTONDOWN , HTCAPTION , MAKELPARM (point.x , point. y ) )


}


22、如何改变视窗的背景颜色


Windows向窗口发送一个WM_ERASEBKGND消息通知该窗口擦除背景,可以使用


ClassWizard重载该消息的缺省处理程序来擦除背景(实际是画),并返回TRUE


防止Windows擦除窗口。


//Paint area that needs to be erased.


BOOL CSampleView : : OnEraseBkgnd (CDC* pDC)


{


// Create a pruple brush.


CBrush Brush (RGB (128 , 0 , 128) );


// Select the brush into the device context .


CBrush* pOldBrush = pDC>SelcetObject (&brush);


// Get the area that needs to be erased .


CRect reClip ;


pDC>GetCilpBox (&rcClip);


//Paint the area.


pDC> PatBlt (rcClip.left , rcClip.top ,


rcClip.Width ( ) , rcClip.Height ( ) , PATCOPY );


//Unselect brush out of device context .


pDC>SelectObject (pOldBrush );


// Return nonzero to half fruther processing .


return TRUE;


}


23、如何改变窗口标题


调用CWnd : : SetWindowText可以改变任何窗口(包括控件)的标题。


//Set title for application’s main frame window .


AfxGetMainWnd ( ) > SetWindowText (_T(“Application title”) );


//Set title for View’s MDI child frame window .


GetParentFrame ( ) > SetWindowText (“_T (“MDI Child Frame new title”) );


//Set title for dialog’s push button control.


GetDigitem (IDC_BUTTON) > SetWindowText (_T (“Button new title “) );


如果需要经常修改窗口的标题(注:控件也是窗口),应该考虑使用半文档化


的函数AfxSetWindowText。该函数在AFXPRIV.H中说明,在WINUTIL.CPP中实现,在


联机帮助中找不到它,它在AFXPRIV.H中半文档化,在以后发行的MFC中将文档化。


AfxSetWindowText的实现如下:


voik AFXAPI AfxSetWindowText (HWND hWndCtrl , LPCTSTR IpszNew )


{


itn nNewLen= Istrlen (Ipaznew);


TCHAR szOld [256];


//fast check to see if text really changes (reduces flash in the controls )


if (nNewLen >_contof (szOld) ||


: : GetWindowText (hWndCrtl , szOld , _countof (szOld) !=nNewLen ||


Istrcmp (szOld , IpszNew )! = 0


{


//change it


: : SetWindowText (hWndCtrl , IpszNew );


}


}


24、如何防止主框窗口在其说明中显示活动的文档名


创建主框窗口和MDI子窗口进通常具有FWS_ADDTOTITLE风格位, 如果不希望在


说明中自动添加文档名, 必须禁止该风格位,可以使用ClassWizard重置


CWnd: : PreCreateWindow并关闭FWS_ADDTOTITLE风格。


BOOL CMainFrame : : PreCreateWindow (CREATESTRUCT&cs)


{


//Turn off FWS_ADDTOTITLE in main frame .


cs.styel & = ~FWS_ADDTOTITLE ; 


return CMDIFrameWnd : : PreCreateWindow (cs );


}


关闭MDI子窗口的FWS _ADDTOTITLE风格将创建一个具有空标题的窗口,可以调


CWnd: : SetWindowText来设置标题。记住自己设置标题时要遵循接口风格指南。


Visual C++编程技巧之三》有 1 条评论

  1. yangxingkuan 说:

留下一个回复