gis
gis
管理员
管理员
  • 注册日期2003-07-16
  • 发帖数15947
  • QQ554730525
  • 铜币25339枚
  • 威望15364点
  • 贡献值0点
  • 银元0个
  • GIS帝国居民
  • 帝国沙发管家
  • GIS帝国明星
  • GIS帝国铁杆
阅读:1717回复:3

VC技巧 - 常用控制

楼主#
更多 发布于:2003-09-15 17:51
如何创建一个字回绕的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;
喜欢0 评分0
cehuisoft
路人甲
路人甲
  • 注册日期2003-09-07
  • 发帖数206
  • QQ
  • 铜币423枚
  • 威望0点
  • 贡献值0点
  • 银元0个
1楼#
发布于:2003-10-07 21:02
ok
天天交流
举报 回复(0) 喜欢(0)     评分
南院
路人甲
路人甲
  • 注册日期2005-03-22
  • 发帖数46
  • QQ
  • 铜币217枚
  • 威望0点
  • 贡献值0点
  • 银元0个
2楼#
发布于:2005-05-03 16:48
挺好的,太高深了
举报 回复(0) 喜欢(0)     评分
xbdragon
路人甲
路人甲
  • 注册日期2005-05-11
  • 发帖数21
  • QQ
  • 铜币142枚
  • 威望0点
  • 贡献值0点
  • 银元0个
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" />嘿嘿
举报 回复(0) 喜欢(0)     评分
游客

返回顶部