⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wtl for mfc programmers, part v - advanced dialog ui classes - wtl.htm

📁 WT教程中文版 内有详细的介绍 包括各个方面
💻 HTM
📖 第 1 页 / 共 3 页
字号:
                                 LPNMCUSTOMDRAW lpNMCD)
{
    <SPAN class=cpp-keyword>return</SPAN> CDRF_NOTIFYITEMDRAW;
}
 
DWORD CBuffyTreeCtrl::OnItemPrePaint(<SPAN class=cpp-keyword>int</SPAN> idCtrl, 
                                     LPNMCUSTOMDRAW lpNMCD)
{
    <SPAN class=cpp-keyword>if</SPAN> ( <SPAN class=cpp-literal>1</SPAN> == lpNMCD-&gt;lItemlParam )
        pnmtv-&gt;clrText = RGB(<SPAN class=cpp-literal>0</SPAN>,<SPAN class=cpp-literal>128</SPAN>,<SPAN class=cpp-literal>0</SPAN>);
 
    <SPAN class=cpp-keyword>return</SPAN> CDRF_DODEFAULT;
}</font></PRE>
      
<P>CCustomDraw类也有SetMsgHandled()函数,你可以像在COwnerDraw类那样使用这个函数。</P>
<H2><A name=newwtlctrls></A><font color="#FFFF66">WTL的新控件</font></H2>
      
<P>WTL有几个新控件,它们要么是其他封装类的扩展(像 CTreeViewCtrlEx),要么是提供windows标准控件没有的新功能(像 CHyperLink)。</P>
      <H3><A name=newcbitmapbutton></A><font color="#FFFF66">CBitmapButton</font></H3>
      
<P>WTL的CBitmapButton类声明在atlctrlx.h中,它比MFC的同名类使用起来要简单的多。WTL的CBitmapButton类使用image 
  list而不是单个的位图资源,你可以将多个按钮的图像放到一个位图文件中,减少GDI资源的占用。这对于使用很多图片并需要在Windows 9X系统上运行的程序很有好处,因为使用太多的单个位图将会很快耗尽GDI资源并导致系统崩溃。</P>
<p>CBitmapButton是一个CWindowImpl派生类,它又很多特色:自动调整控件的大小,自动生成3D边框,支持hot-tracking,每个按钮可以使用多个图像分别表示按钮的不同状态。</p>
<p>在ControlMania2中,我们对前面的例子创建的自画按钮使用CBitmapButton类。现在CMainDlg对话框类中添加CBitmapButton类型的变量m_wndBmpBtn,调用SubclassWindow()函数或使用DDX将其和控件联系起来,将位图装载到image 
  list并告诉按钮使用这个image list,还要告诉按钮每个图像分别对应按钮的什么状态。下面是OnInitDialog()函数中建立和使用这个按钮的代码段:</p>
<PRE>    <font color="#0033FF"><SPAN class=cpp-comment>// Set up the bitmap button</SPAN>
CImageList iml;
 
    iml.CreateFromImage ( IDB_ALYSON_IMGLIST, <SPAN class=cpp-literal>81</SPAN>, <SPAN class=cpp-literal>1</SPAN>, CLR_NONE,
                          IMAGE_BITMAP, LR_CREATEDIBSECTION );
 
    m_wndBmpBtn.SubclassWindow ( GetDlgItem(IDC_ALYSON_BMPBTN) );
    m_wndBmpBtn.SetToolTipText ( _T(<SPAN class=cpp-string>"Alyson"</SPAN>) );
    m_wndBmpBtn.SetImageList ( iml );
    m_wndBmpBtn.SetImages ( <SPAN class=cpp-literal>0</SPAN>, <SPAN class=cpp-literal>1</SPAN>, <SPAN class=cpp-literal>2</SPAN>, <SPAN class=cpp-literal>3</SPAN> );</font></PRE>
      
<P>默认情况下,按钮只是引用image list,所以OnInitDialog()不能delete它所创建的image list。下面显示的是新按钮的一般状态,注意控件是如何根据图像的大小来调整自己的大小。</P>
      
<P><IMG height=324 alt=" [WTL bitmap button - 12K] " 
      src="images/cm2_bb15.png" 
      width=305 align=bottom border=0></P>
      
<P>因为CBitmapButton是一个非常有用的类,我想介绍一下它的公有方法。</P>
      
<H4><font color="#990000">CBitmapButton methods</font></H4>
      
<P>CBitmapButtonImpl类包含了实现一个按钮的所有代码,除非你想重载某个方法或消息处理,你可以对控件直接使用CBitmapButton类。</P>
      <H5><font color="#990000">CBitmapButtonImpl constructor</font></H5>
<PRE><font color="#0033FF">CBitmapButtonImpl(DWORD dwExtendedStyle = BMPBTN_AUTOSIZE,HIMAGELIST hImageList = NULL)</font></PRE>
<P>构造函数可以指定按钮的扩展样式(这与窗口的样式不冲突)和图像列表,通常使用默认参数就足够了,因为可以使用其他的方法设定这些属性。</P>
      
<H5><font color="#990000">SubclassWindow()</font></H5>
<PRE><font color="#0033FF">BOOL SubclassWindow(HWND hWnd)</font></PRE>
<P>SubclassWindow()是个重载函数,主要完成控件的子类化和初始化控件类保有的内部数据。</P>
      
<H5><font color="#990000">Bitmap button extended styles</font></H5>
<PRE><font color="#0033FF">DWORD GetBitmapButtonExtendedStyle()
DWORD SetBitmapButtonExtendedStyle(DWORD dwExtendedStyle, DWORD dwMask = <SPAN class=cpp-literal>0</SPAN>)</font></PRE>
<P>CBitmapButton支持一些扩展样式,这些扩展样式会对按钮的外观和操作方式产生影响:</P>
      
<DL> 
  <DT>BMPBTN_HOVER
  <DD>使用hot-tracking,当鼠标移到按钮上时按钮被画成焦点状态。
  <DT>BMPBTN_AUTO3D_SINGLE, BMPBTN_AUTO3D_DOUBLE 
  <DD>在按钮图像周围自动产生一个三维边框,当按钮拥有焦点时会显示一个表示焦点的虚线矩形框。另外如果你没有指定按钮按下状态的图像,将会自动生成一个。BMPBTN_AUTO3D_DOUBLE样式生成的边框稍微粗一些,其他特征和BMPBTN_AUTO3D_SINGLE一样。
  <DT>BMPBTN_AUTOSIZE 
  <DD>按钮调整自己的大小以适应图像大小,这是默认样式。
  <DT>BMPBTN_SHAREIMAGELISTS
  <DD>如果指定这个样式,按钮不负责销毁按钮使用的image list,如果不使用这个样式,CBitmapButton的析构函数会销毁按钮使用的image 
    list。
  <DT>BMPBTN_AUTOFIRE 
  <DD>如果设置这个样式,在按钮上按住鼠标左键不放将会产生连续的WM_COMMAND消息。</DD>
</DL>
      
<P>调用SetBitmapButtonExtendedStyle()时,dwMask参数控制着那个样式将被改变,默认值是0,意味着用新样式完全替换旧的样式。</P>
      
<H5><font color="#990000">Image list management</font></H5>
<PRE><font color="#0033FF">HIMAGELIST GetImageList()
HIMAGELIST SetImageList(HIMAGELIST hImageList)</font></PRE>
<P>调用SetImageList()设置按钮使用的image list。</P>
      
<H5><font color="#990000">Tooltip management</font></H5>
<PRE><SPAN class=cpp-keyword><font color="#0033FF">int</font></SPAN><font color="#0033FF">  GetToolTipTextLength()
<SPAN class=cpp-keyword>bool</SPAN> GetToolTipText(LPTSTR lpstrText, <SPAN class=cpp-keyword>int</SPAN> nLength)
<SPAN class=cpp-keyword>bool</SPAN> SetToolTipText(LPCTSTR lpstrText)</font></PRE>
<P>CBitmapButton支持显示工具提示(tooltip),调用SetToolTipText()指定显示的文字。</P>
      
<H5><font color="#990000">Setting the images to use</font></H5>
<PRE><SPAN class=cpp-keyword><font color="#0033FF">void</font></SPAN><font color="#0033FF"> SetImages(<SPAN class=cpp-keyword>int</SPAN> nNormal, <SPAN class=cpp-keyword>int</SPAN> nPushed = -<SPAN class=cpp-literal>1</SPAN>,<SPAN class=cpp-keyword>int</SPAN> nFocusOrHover = -<SPAN class=cpp-literal>1</SPAN>, <SPAN class=cpp-keyword>int</SPAN> nDisabled = -<SPAN class=cpp-literal>1</SPAN>)</font></PRE>
<P>调用SetImages()函数告诉按钮分别使用image list的拿一个图像表示那个状态。nNormal是必须的,其它是可选的,使用-1表示对应的状态没有图像。</P>
      
<H3><A name=cchecklist></A><font color="#FFFF66">CCheckListViewCtrl</font></H3>
      
<P>CCheckListViewCtrl类在atlctrlx.h中定义,它是一个CWindowImpl派生类,实现了一个带检查框的list view控件。它和MFC的CCheckListBox不同,CCheckListBox只是一个list 
  box,不是list view。CCheckListViewCtrl类非常简单,只添加了很少的函数,当然,它使用了一个新的辅助类CCheckListViewCtrlImplTraits,它和CWinTraits类的作用类似,只是第三个参数是list 
  view控件的扩展样式属性,如果你没有定义自己的CCheckListViewCtrlImplTraits,它将使用没默认的样式:LVS_EX_CHECKBOXES 
  | LVS_EX_FULLROWSELECT。</P>
<p>下面是一个定义list view扩展样式属性的例子,加入了一个使用这个样式的新类。(注意,扩展属性必须包含LVS_EX_CHECKBOXES,否则会因起断言错误消息。)</p>
<PRE><SPAN class=cpp-keyword><font color="#0033FF">typedef</font></SPAN><font color="#0033FF"> CCheckListViewCtrlImplTraits&lt;
    WS_CHILD | WS_VISIBLE | LVS_REPORT, 
    WS_EX_CLIENTEDGE,
    LVS_EX_CHECKBOXES | LVS_EX_GRIDLINES | LVS_EX_UNDERLINEHOT |
      LVS_EX_ONECLICKACTIVATE&gt; CMyCheckListTraits;
 
<SPAN class=cpp-keyword>class</SPAN> CMyCheckListCtrl :
    <SPAN class=cpp-keyword>public</SPAN> CCheckListViewCtrlImpl&lt;CMyCheckListCtrl, CListViewCtrl, 
                                  CMyCheckListTraits&gt;
{
<SPAN class=cpp-keyword>private</SPAN>:
    <SPAN class=cpp-keyword>typedef</SPAN> CCheckListViewCtrlImpl&lt;CMyCheckListCtrl, CListViewCtrl, 
                                   CMyCheckListTraits&gt; baseClass;
<SPAN class=cpp-keyword>public</SPAN>:
    BEGIN_MSG_MAP(CMyCheckListCtrl)
        CHAIN_MSG_MAP(baseClass)
    END_MSG_MAP()
};</font></PRE>
      
<H4><font color="#990000">CCheckListViewCtrl methods</font></H4>
      
<H5><font color="#990000">SubclassWindow()</font></H5>
      
<P>当子类化一个已经存在的list view控件时,SubclassWindow()查看CCheckListViewCtrlImplTraits的扩展样式属性并将之应用到控件上。未用到前两个参数(窗口样式和扩展窗口样式)。</P>
      
<H5><font color="#990000">SetCheckState() and GetCheckState()</font></H5>
      
<P>这些方法实际上是在CListViewCtrl中,SetCheckState()使用行的索引和一个布尔类型参数,该布尔参数的值表示是否check这一行。GetCheckState()以行索引未参数,返回改行的checked状态。</P>
      
<H5><font color="#990000">CheckSelectedItems()</font></H5>
      
<P>这个方法使用item的索引作为参数,它翻转这个item的check状态,这个item必须是被选定的,同时还将其他所有被选择的item设置成相应状态(译者加:多选状态下)。你大概不会用到这个方法,因为CCheckListViewCtrl会在check 
  box被单击或用户按下了空格键时设置相应的item的状态。</P>
<p>下面是ControlMania2中的CCheckListViewCtrl的样子:</p>
<P><IMG height=429 alt=" [Check list ctrl - 12K] " 
      src="images/cm2_lv5.png" 
      width=305 align=bottom border=0></P>
      
<H3><A name=treeex></A><font color="#FFFF66">CTreeViewCtrlEx and CTreeItem</font></H3>
      
<P>有两个类使得树控件的使用简化了很多:CTreeItem类封装了HTREEITEM,一个CTreeItem对象含有一个HTREEITEM和一个指向包含这个HTREEITEM的树控件的指针,使你不必每次调用都引用树控件;CTreeViewCtrlEx和CTreeViewCtrl一样,只是它的方法操作CTreeItem而不是HTREEITEM。例如,InsertItem()函数返回一个CTreeItem而不是HTREEITEM,你可以使用CTreeItem操作新添加的item。下面是一个例子:</P>
<PRE><SPAN class=cpp-comment><font color="#0033FF">// Using plain HTREEITEMs:</font></SPAN><font color="#0033FF">
HTREEITEM hti, hti2;
 
    hti = m_wndTree.InsertItem ( <SPAN class=cpp-string>"foo"</SPAN>, TVI_ROOT, TVI_LAST );
    hti2 = m_wndTree.InsertItem ( <SPAN class=cpp-string>"bar"</SPAN>, hti, TVI_LAST );
    m_wndTree.SetItemData ( hti2, <SPAN class=cpp-literal>100</SPAN> );
 
<SPAN class=cpp-comment>// Using CTreeItems:</SPAN>
CTreeItem ti, ti2;
 
    ti = m_wndTreeEx.InsertItem ( <SPAN class=cpp-string>"foo"</SPAN>, TVI_ROOT, TVI_LAST );
    ti2 = ti.AddTail ( <SPAN class=cpp-string>"bar"</SPAN>, <SPAN class=cpp-literal>0</SPAN> );
    ti2.SetData ( <SPAN class=cpp-literal>100</SPAN> );</font></PRE>
      
<P>CTreeViewCtrl对HTREEITEM的每一个操作,CTreeItem都有与之对应的方法,正像每一个关于HWND的API都有一个CWindow方法与之对应一样。查看ControlMania2的代码可以看到更多的CTreeViewCtrlEx和CTreeItem类的方法的演示。</P>
      
<H3><A name=chyperlink></A><font color="#FFFF66">CHyperLink</font></H3>
      
<P>CHyperLink是一个CWindowImpl派生类,它子类化一个static text控件,使之变成可点击的超链接。CHyperLink根据用户的IE使用的颜色画链接对象,还支持键盘导航。CHyperLink类的构造函数没有参数,下面是其它的公有方法。</P>
      
<H4><font color="#990000">CHyperLink methods</font></H4>
      
<P>CHyperLinkImpl类内含实现一个超链接的全部代码,如果不需要重载它的方法或处理消息的话,你可以直接使用CHyperLink类。</P>
      
<H5><font color="#990000">SubclassWindow()</font></H5>
<PRE><font color="#0033FF">BOOL SubclassWindow(HWND hWnd)</font></PRE>
<P>重载函数SubclassWindow()完成控件子类化,然后初始化该类保有的内部数据。</P>
      
<H5><font color="#990000">Text label management</font></H5>
<PRE><SPAN class=cpp-keyword><font color="#0033FF">bool</font></SPAN><font color="#0033FF"> GetLabel(LPTSTR lpstrBuffer, <SPAN class=cpp-keyword>int</SPAN> nLength)
<SPAN class=cpp-keyword>bool</SPAN> SetLabel(LPCTSTR lpstrLabel)</font></PRE>
<P>获得或设置控件显示的文字,如果不指定显示文字,控件会显示资源编辑器指定给控件的静态字符串。</P>
      
<H5><font color="#990000">Hyperlink management</font></H5>
<PRE><SPAN class=cpp-keyword><font color="#0033FF">bool</font></SPAN><font color="#0033FF"> GetHyperLink(LPTSTR lpstrBuffer, <SPAN class=cpp-keyword>int</SPAN> nLength)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -