阅读:1873回复:3
VC技巧 - 常用控制
如何创建一个字回绕的CEditView
重载CWnd : : PreCreateWindow和修改CREATESTRUCT结构,关闭CEditView对象的 ES_AUTOHSCROLL和WS_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 ; 通用控件的显示窗口 MFC提供了几个CView派生的视窗类,封装了通用控件的功能,但仍然使用工 作框文档显示窗口体系结构:CEditView封装了编辑控件,CTreeView保持了树列表 控件,CListView封装了列表显示窗口控件,CRichEditView可以处理多种编辑控件。 如何禁止和使能控件 控件也是窗口,所以可以调用CWnd : : EnableWindow使能和禁止控件。 //Disable button controls . m_wndOK.EnableWindow (FALSE ) ; m_wndApply.EnableWindow (FALSE ) ; 如何在OLE控件中使用OLE_COLOR数据类型 诸如COleControl : : GetFortColor和COleControl : : GetBackColor等函数返回OLE _COLOR数据类型的颜色,而GDI对象诸如笔和刷子使用的是COLORREF数据类型,调用COleControl : : TranslateColor可以很容易地将OLE_COLOR类型改为COLORREF类型。下例创建了一个当前背景颜色的刷子: void CSampleControl : : OnDraw (CDC* pdc const Crect& rcBounds , const Crect& rcInvalid ) //Create a brush of the cuttent background color . CBrush brushBack (TranslateColor (GetBackColor ( ) ) ); //Paint the background using the current background color . pdc—> FilllRect (rcBounds , &brushBack) ; //other drawign commands … 在不使用通用文件打开对话的情况下如何显示一个文件列表 调用CWnd: : DlgDirList或者CWnd: : DlgDirListComboBox, Windows 将自动地向列表框或组合框填充可用的驱动器名或者 指定目录中的文件,下例将Windows目录中的文件填充在组合框中: BOOL CSampleDig : : OnInitDialog ( ) CDialog : : OnInitDialog ( ) TCHAR szPath [MAX_PATH] = {"c:\\windows"} ; int nReslt = DlgDirListComboBox (szPath , IDC_COMBO , IDC_CURIDIR, DDL_READWRITE |DDL_READONLY|DDL_HIDDEN| DDL_SYSTEM|DDL_ARCHIVE ) ; return TRUE ; 为什么旋转按钮控件看起来倒转 需要调用CSpinCtrl : : SetRange 设置旋转按钮控件的范围,旋转 按钮控件的缺省上限为0,缺省下限为100,这意味着增加时旋转按控 件的值由100变为0。下例将旋转按钮控件的范围设置为0到100: BOOL CAboutDlg : : OnInitDialog ( ) CDialog : : OnInitDialog ( ) //set the lower and upper limit of the spin button m_wndSpin . SetRange ( 0 ,100 ) ; return TRUE ; Visual C++ 4.0 Print对话中的Copise旋转按钮控件也有同样的问题 :按下Up按钮时拷贝的数目减少,而按下Down 按钮时拷贝的数目增加。 为什么旋转按钮控件不能自动地更新它下面的编辑控件 如果使用旋转按钮的autu buddy特性, 则必须保证在对话的标记顺序 中buddy窗口优先于旋转按钮控件。从Layout菜单中选择Tab Order菜单 项(或者按下Crtl+D)可以设置对话的标签顺序。 如何动态创建控件 分配一个控件对象的实例并调用其Create成员函数。开发者最容易忽略 两件事:忘记指定WS_VISBLE标签和在栈中分配控件对象。下例动态地创 建一个下压按钮控件: //In class declaration (.H file ). private : CButton* m _pButton ; //In class implementation (.cpp file ) . m_pButton =new CButton ; ASSERT_VALID (m_pButton); m_pButton —>Create (_T ("Button Title ") , WS_CHILD |WS_VISIBLE |BS_PUSHBUTTON. Crect ( 0, 0, 100 , 24) , this , IDC _MYBUTTON ) 如何显示旋转文本 只要用户使用TrueType或者GDI笔或字体就可以显示旋转文本(有些硬 件设备也支持旋转光栅字体)。LOGFONT结构中的ifEscapement成员 指定了文本行和x轴的角度,角度的单位是十分之一度而不是度,例如 ,ifEscapement为450表示字体旋转45度。为确保所有的字体沿坐标系 统的同一方向旋转,一定要设置ifEscapement成员的CLIP_LH_ANGLES 位,否则,有些字体可能反向旋转。下例使用了14点Arial字体每间隔15 度画一个串。 void CSampleView:: OnDraw (CDC* pDC) //Determine the size of the window. CRect rcClient; GetClientRect (rcClient); //Create sample string. CString str (_T ("Wheeee...I am rotating!")); //Draw transparent, red text. pDC->SetBkMode (TRANSPARENT); pDC->SetTextColor (RGB (255,0,0)); CFont font; //font object LOGFONT stFont; //font definition //Set font attributes that will not change. memset (&stFont, 0, sizeof (LOGFONT)); stFont.ifheight=MulDiv (14, -pDC->GetDeviceCaps (LOGPIXELSY), 72); stFont.ifWeight=FW_NORMAL; stFont.ifClipPrecision=LCIP_LH_ANGLES; strcpy (stFont.lfFaceName, "Arial"); //Draw text at 15degree intervals. for (int nAngle=0; nAngle<3600; nAngle+="150) { //Specify new angle. stFont.lfEscapement=nAngle; //Create and select font into dc. font.CreateFontIndirect (&stfont); CFont* pOldFont=pDC->SelectObject (&font); //Draw the text. pDC->SelectObject (pOldFont); font.DelectObjext (); 如何让TOOLTIP的字体变大 前几天有个虫虫问如何让vc4.0的Tooltip的字体变大,可现在文章没有了.不过现在我 有个方法:在Windows 95 Desktop 属性中有desktop scheme中有Tooltip一项,可以该变 TOOLTIP的字体和大小.不过这样做所有程序的Tooltip都变大了.这可能不是你的本意. 但Tooltip是Windows 95 Common Control,由Windows 95内部实现,VC4.0的CTooltip类并不实现Tips的显示,所以要实现针对某个程序的 Tooltip的特殊显示,有一定难度.我以前曾经试图实现Tooltip的多行显示,做到了当Toolt. 显示时触发我的函数,消失时触发我的函数,但在显示时却出GP错误.现在我认为最简 单的方法是从头自己实现Tooltip类.一切随心所欲.* 在TreeList中使用Edit功能 闻洋译 首先了讲该TreeList应该使用TVS_EDITLABELS风格,可以在创建资源时指定,或 者在使用Create时指定,或者在PreCreateWindos()中改变。接下来需要处理TVN_BEGINLABELEDIT和TVN_ENDLABELEDIT消息。 void CXXXX::OnBeginLabelEdit(NMHDR* pNMHDR, LRESULT* pResult) TV_DISPINFO* pTVDispInfo = (TV_DISPINFO*)pNMHDR; // Limit text length GetEditControl()->LimitText(127); *pResult = 0; 如果不处理 TVN_ENDLABELEDIT 消息,则文本的更改不会生效。 void COutline::OnEndLabelEdit(NMHDR* pNMHDR, LRESULT* pResult) GetEditControl()->GetWindowText(s); // Set result to TRUE to accept the changes *pResult = TRUE; TreeList control中使用check box 闻怡洋译 方法很简单,一句话总结:定义用户定义状态,并对不同的状态(state)使用不同的图片。 在下面的sample中,我们使用CTreeListCtrl作为父类。由于TreeList control支持一些现有state 所以用户定义的state必需使用INDEXTOSTATEIMAGEMASK(i)进行变换。 如果对本文所讲的方法有不明的地方,可以先熟悉一下TreeList Control的使用,然后再看本文。 Step 1: 创建state list image 创建的图片有三种状态。 state ImageList只是用于和state改变有关的显示图片,TreeList Control中还应包含其他image List,如:焦点选择改变的imageList,用于在选中和未选中是改变显示图片。 Step 2: 初始化 CImageList m_imageState; 成员变量 m_imageState.Create( IDB_STATE, 13, 1, RGB(255,255,255) );//创建ImageList m_tree.SetImageList( &(m_tree.m_imageState), TVSIL_STATE );//在TreeList中加入表示状态的ImageList。 Step 3: 增加结点时设置标记 重新定义一个InsertItem函数。使用TV_INSERTSTRUCT来插入结点。 即使用函数HTREEITEM InsertItem( LPTV_INSERTSTRUCT lpInsertStruct ); lpInsertStruct->item.mask |= TVIF_STATE ;//保证state 和stateMask是有效的。 你必须在TV_ITEM中标明state和stateMask。(INDEXTOSTATEIMAGEMASK宏可以得到state image的下标) state 设置为INDEXTOSTATEIMAGEMASK(1)表示用户定义的第一种状态 stateMask设置为TVIS_STATEIMAGEMASK.表示用户定义的状态。 当然也可以调用SetItemState设置state. SetItemState( hItem, INDEXTOSTATEIMAGEMASK(1), TVIS_STATEIMAGEMASK ); Step 4: 增加mouse button down消息映射 通过使用HitTest来得知是否按在State图片上。并需要得到当前state。 void CTreeCtrlX::OnLButtonDown(UINT nFlags, CPoint point) UINT uFlags=0; HTREEITEM hti = HitTest(point,&uFlags); if( uFlags & TVHT_ONITEMSTATEICON ) { int iImage = GetItemState( hti, TVIS_STATEIMAGEMASK )>>12; //GetItemState( hti, TVIS_STATEIMAGEMASK )>>12 对用户定义state反变换 SetItemState( hti, INDEXTOSTATEIMAGEMASK(iImage == 1 ? 2 : 1), TVIS_STATEIMAGEMASK ); return; } Step 5:处理 OnKeyDown void CTreeCtrlX::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) if( nChar == VK_SPACE ) { HTREEITEM hti = GetSelectedItem(); int iImage = GetItemState( hti, TVIS_STATEIMAGEMASK )>>12; SetItemState( hti, INDEXTOSTATEIMAGEMASK(iImage == 1 ? 2 : 1), TVIS_STATEIMAGEMASK ); return; } Step 6: 增加其他的功能函数 BOOL CTreeCtrlX::IsItemChecked(HTREEITEM hItem) return GetItemState( hItem, TVIS_STATEIMAGEMASK )>>12 == 2; HTREEITEM CTreeCtrlX::GetFirstCheckedItem() for ( HTREEITEM hItem = GetRootItem(); hItem!=NULL; hItem = GetNextItem( hItem ) ) if ( IsItemChecked(hItem) ) return hItem; return NULL; HTREEITEM CTreeCtrlX::GetNextCheckedItem( HTREEITEM hItem ) for ( hItem = GetNextItem( hItem ); hItem!=NULL; hItem = GetNextItem( hItem ) ) if ( IsItemChecked(hItem) ) return hItem; return NULL; HTREEITEM CTreeCtrlX::GetPrevCheckedItem( HTREEITEM hItem ) for ( hItem = GetPrevItem( hItem ); hItem!=NULL; hItem = GetPrevItem( hItem ) ) if ( IsItemChecked(hItem) ) return hItem; return NULL; |
|
|
1楼#
发布于:2003-10-07 21:02
ok
|
|
|
2楼#
发布于:2005-05-03 16:48
挺好的,太高深了
|
|
3楼#
发布于:2005-05-11 14:33
<img src="images/post/smile/dvbbs/em01.gif" /><img src="images/post/smile/dvbbs/em06.gif" /><img src="images/post/smile/dvbbs/em05.gif" />嘿嘿
|
|