中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档 | 网通镜像
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > 编程语言 > Visual C++ > 综合文章
用VC实现自定义LISTBOX控件
作者:未知 时间:2005-07-27 21:54 出处:CSDN 责编:chinaitpower
              摘要:用VC实现自定义LISTBOX控件

下午在用EVC在ARM开发板上开发应用程序,需要将LISTBOX控件上的项目放大显示,我先用VC模拟出来,但是很不幸,EVC上LISTBOX不支持OWNER DRAW。不过还好,总算在VC上做了点东西,下面把过程记录下来:

1、在对话框中添加一个LISTBOX控件,将其属性改为“FIXED”(属性说明请参阅MSDN)。
2、建立一个断承CListBox的类CCustomListBox,重载(Override)它的几个函数。
3、在CCustomListBox在PreSubclassWindow函数中添加如下代码:
      CRect rect;
      GetClientRect(rect);
      this->SetItemHeight(-1,rect.Height()/4); //将LISTBOX的子项目高度设置为LISTBOX高度的1/4
4、如果LISTBOX控件选择了“FIXED”属性后不做任何修改,那么用AddString等函数添加的子项将不会被系统自动显示,原因是用户选择了自绘属性。这个属性由CCustomListBox里的DrawItem和MesureItem函数完成。DrawItem用来绘制子项目,MesureItem用来修改项目的一些属性(一般不用更改)。在DrawItem里添加如下代码:
 COLORREF clrItemText;

 switch ( lpDIS->itemAction )   //lpDIS为一个LPMEASUREITEMSTRUCT(记录控件信息)

 {
      case ODA_SELECT:
      case ODA_DRAWENTIRE:
     
         // Is the item selected?
         if ( lpDIS->itemState & ODS_SELECTED )
         {
            clrItemText = GetSysColor( COLOR_HIGHLIGHTTEXT );
            // Clear the rectangle
            FillRect(  lpDIS->hDC,
                      &lpDIS->rcItem,
                      (HBRUSH)(COLOR_ACTIVECAPTION+1) );
         }
         else
         {
            clrItemText = GetSysColor( COLOR_WINDOWTEXT );
            // Clear the rectangle
            FillRect(  lpDIS->hDC,
                      &lpDIS->rcItem,
                       (HBRUSH)(COLOR_WINDOW+1) );                                  
         }
 }


 CDC dc;
 dc.Attach(lpDIS->hDC);
 CRect rectFull = lpDIS->rcItem;
 CRect rect = rectFull;
 rect.left = rect.Width();
 CRect rect2 = rectFull;
 rect2.right = rect.left - 1;
 UINT nIndex = lpDIS->itemID;

 if (nIndex != (UINT) -1)
 {

  LOGFONT lf;

     dc.GetCurrentFont()->GetLogFont(&lf);

  CFont font, *pOldFont;

  lf.lfCharSet=134;

        lf.lfHeight=25;

        lf.lfWidth=0;

        strcpy(lf.lfFaceName, "隶书");

        font.CreateFontIndirect(&lf);

  pOldFont=dc.SelectObject(&font);

  CString sss;
  this->GetText(nIndex,sss);

  dc.SetBkMode(TRANSPARENT);
  dc.DrawText(sss,CRect(rect2.left+3,rect2.top+3,
           rect2.right-3,rect2.bottom+3),
     DT_LEFT | DT_SINGLELINE);
 }
 dc.Detach();

完成上述步骤后,即可看见更改后的LISTBOX,另外按钮等其他控件步骤与思想是大同小异的。


关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有