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

📄 wtl for mfc programmers, part ix - gdi classes, common dialogs, and utility classes - wtl.htm

📁 MFC程序员的WTL指南,非常具体,WTL入门最好的书
💻 HTM
📖 第 1 页 / 共 4 页
字号:
  <DT><CODE>GetObject()</CODE> <code>封装</code>
  
<DD><CODE>CBitmapT</CODE>对Win32 API<CODE> GetObject()</CODE>有一个类型安全的封装:<CODE>GetBitmap(),它有两个重载形式,一个使用</CODE><CODE>LOGBITMAP*</CODE> 
  类型的参数并直接调用<CODE>GetObject();另一个使用</CODE><CODE>LOGBITMAP&amp;</CODE> 类型的参数并返回一个bool值表示操作是否成功,后一个版本比较容易使用,例如: 
  <PRE><font color="#0000FF"> CBitmapHandle bmp2 = <SPAN class=cpp-comment>/* some HBITMAP value */</SPAN>;
LOGBITMAP logbmp = {<SPAN class=cpp-literal>0</SPAN>};
<SPAN class=cpp-keyword>bool</SPAN> bSuccess;
<SPAN class=cpp-keyword>if</SPAN> ( bmp2 )
  bSuccess = bmp2.GetLogBitmap ( logbmp );</font></PRE>
  <dl>
    <DT>对于操作GDI 对象的API的封装 
    <DD><CODE>CBitmapT</CODE> 封装了操作<CODE>HBITMAP</CODE> 的API:<CODE>GetBitmapBits()、</CODE><CODE>SetBitmapBits()、</CODE><CODE>GetBitmapDimension()、</CODE><CODE>SetBitmapDimension()、</CODE><CODE>GetDIBits() 
      和 </CODE><CODE>SetDIBits(),这些函数都对</CODE><CODE>m_hBitmap</CODE>是否是NULL进行断言。 
    <DT><code>其它有用的方法</code> 
    <DD><CODE>CBitmapT</CODE> 有两个很有用操作<CODE>m_hBitmap的函数:</CODE><CODE>LoadOEMBitmap()</CODE> 
      <code>和 </code> <CODE>GetSize()。</CODE></DD>
  </dl>
  <P>&nbsp;</P>
  <H3><A name=usingcdct></A><font color="#FFFF66">Using CDCT</font></H3>
  <P><br>
    <CODE>CDCT</CODE> 与其它类稍有不同,所以这里单独介绍一下这个类。</P>
  <H4>方法有哪些不同</H4>
  <P>销毁DC时调用<CODE>DeleteDC()</CODE> 而不是<CODE>DeleteObject()。</CODE></P>
  <H4>将对象选入DC</H4>
  <P>MFC的CDC类一大诟病就是给DC选入设备时容易出错,MFC的CDC类对SelectObject()函数有几个不同的重载形式,每种重载都使用一个指向不同GDI封装类的指针作为参数,(<CODE>CPen*</CODE>, 
    <CODE>CBitmap*</CODE>, 等等)。如果你传递一个C++对象而不是对象指针给SelectObject()函数,代码最终将调用一个使用<CODE>HGDIOBJ</CODE>作为参数的重载形式(这个重载形式并未见诸于正式文档),这将导致错误发生。</P>
  <P>WTL的 <CODE>CDCT</CODE> 采用一种稍好一点的方法,它的几个select函数都是直接使用对应类型的GDI对象:</P>
  <PRE><font color="#0000FF">HPEN SelectStockPen(<SPAN class=cpp-keyword>int</SPAN> nPen)
HBRUSH SelectStockBrush(<SPAN class=cpp-keyword>int</SPAN> nBrush)
HFONT SelectStockFont(<SPAN class=cpp-keyword>int</SPAN> nFont)
HPALETTE SelectStockPalette(<SPAN class=cpp-keyword>int</SPAN> nPalette, BOOL bForceBackground)</font></PRE>
  <H3><A name=mfcdifferences></A><font color="#FFFF66">与 MFC 封装类的不同之处</font></H3>
  <P><B>较少的构造函数:</B> 这些封装类缺少创建新GDI对象的构造函数,例如:MFC的CBrush类可以创建使用实心填充方式和模式填充方式的画刷对象。在WTL中,你必须调用创建方法来创建一个GDI对象。</P>
  <P><B>向DC选入对象做得比较好:</B> <I>可以参考上面 Using CDCT </I>一节</P>
  <P><B><code>没有</code></B><CODE><B>m_hAttribDC:</B></CODE> WTL<CODE>的CDCT</CODE> 
    <CODE>没有m_hAttribDC</CODE>成员。</P>
  <P><B>一些函数的参数稍有不同:</B> 例如:<CODE>MFC中的CDC::GetWindowExt()</CODE> <CODE>返回一个CSize</CODE> 
    ;而WTL版本的函数返回一个bool值,size的值通过输出参数返回。</P>
  <H2><A name=resourceloading></A><font color="#FFFF66">资源装载(Resource-Loading)函数</font></H2>
  <P>WTL 有几个全局函数对于装载各种资源很有帮助,在了解这些函数之前先要了解一下<CODE>这个工具类:_U_STRINGorID。</CODE></P>
  <P>在Win32平台上,有集中资源既可以用字符串标识(LPCTSTR),也可以用无符号整形数标识(UINT),那些使用资源的API都使用一个LPCTSTR类型的参数作为资源标识,如果你想传递一个UINT,你需要使用<CODE>MAKEINTRESOURCE</CODE>宏将其转换成LPCTSTR。<CODE>_U_STRINGorID就是扮演一个转换资源标识类型的角色,它隐藏了两种类型的区别,函数调用者只需要直接传递</CODE><CODE>UINT</CODE> 
    <CODE>或 LPCTSTR</CODE> 就可以了,这个函数在必要的时候使用<CODE>CString</CODE> 装载字符串:</P>
  <PRE><font color="#0000FF"><SPAN class=cpp-keyword>void</SPAN> somefunc ( _U_STRINGorID id )
{
CString str ( id.m_lpstr );
 
  <SPAN class=cpp-comment>// use str...</SPAN>
}
 
<SPAN class=cpp-keyword>void</SPAN> func2()
{
  <SPAN class=cpp-comment>// Call 1 - using a string literal</SPAN>
  somefunc ( _T(<SPAN class=cpp-string>"Willow Rosenberg"</SPAN>) );
 
  <SPAN class=cpp-comment>// Call 2 - using a string resource ID</SPAN>
  somefunc ( IDS_BUFFY_SUMMERS );
}</font></PRE>
  <P>这样使用之所以有效是因为CString的构造函数会检查LPCTSTR参数是不是一个字符串ID,如果是就从字符串资源表中装载这个字符串并赋值给<CODE>CString。</CODE></P>
  <P>在 VC 6版本中<CODE>_U_STRINGorID由WTL提供,定义在</CODE><I>atlwinx.h</I>中,在 VC 7版本中,<CODE>_U_STRINGorID</CODE> 
    成为ATL的一部分,不过,对于使用没有区别,因为无论何种方式它都已经包含在你的ATL/WTL项目的头文件中了。</P>
  <P>本节中介绍的函数从本地资源句柄装载资源,这个本地资源句柄保存在全局变量_Module(in VC 6)或者是全局变量<CODE>_AtlBaseModule</CODE>(in 
    VC 7)中。使用其它模块的资源已经超出了本文的范畴,这里就不再介绍了。不过请记住,这些函数只能装载代码所在的EXE或DLL中的资源,它们仅仅是使用<code>_U_STRINGorID</code>带来的简化手段调用Win32的API而已。</P>
  <PRE><font color="#0000FF">HACCEL AtlLoadAccelerators(_U_STRINGorID table)</font></PRE>
  <P><CODE>调用 LoadAccelerators()。</CODE></P>
  <PRE><font color="#0000FF">HMENU AtlLoadMenu(_U_STRINGorID menu)</font></PRE>
  <P><CODE>调用 LoadMenu()。</CODE></P>
  <PRE><font color="#0000FF">HBITMAP AtlLoadBitmap(_U_STRINGorID bitmap)</font></PRE>
  <P><CODE>调用 LoadBitmap()。</CODE></P>
  <PRE><font color="#0000FF">HCURSOR AtlLoadCursor(_U_STRINGorID cursor)</font></PRE>
  <P><CODE>调用 LoadCursor()。</CODE></P>
  <PRE><font color="#0000FF">HICON AtlLoadIcon(_U_STRINGorID icon)</font></PRE>
  <P><CODE>调用 LoadIcon()。注意,这个函数和</CODE><CODE>LoadIcon()</CODE> 一样只装载32x32 的图标。</P>
  <PRE><font color="#0000FF"><SPAN class=cpp-keyword>int</SPAN> AtlLoadString(UINT uID, LPTSTR lpBuffer, <SPAN class=cpp-keyword>int</SPAN> nBufferMax)
<SPAN class=cpp-keyword>bool</SPAN> AtlLoadString(UINT uID, BSTR&amp; bstrText)</font></PRE>
  <P><CODE>调用LoadString()。字符串可以返回在</CODE><CODE>TCHAR</CODE>中,也可以指定给一个<CODE>BSTR,这要看你调用的是拿一个重载版本。注意,这个函数只接受UINT类型的资源ID,因为字符串表资源不能用字符串作为标识。</CODE></P>
  <P><CODE>下面这一组函数封装了对LoadImage()的调用,使用一个额外的参数传递给</CODE><CODE>LoadImage()。</CODE></P>
  <PRE><font color="#0000FF">HBITMAP AtlLoadBitmapImage(_U_STRINGorID bitmap, UINT fuLoad = LR_DEFAULTCOLOR)</font></PRE>
  <P><CODE>调用LoadImage(),使用</CODE><CODE>IMAGE_BITMAP</CODE>类型,通过fuLoad传递标志字段。</P>
  <PRE><font color="#0000FF">HCURSOR AtlLoadCursorImage(
          _U_STRINGorID cursor,
          UINT fuLoad = LR_DEFAULTCOLOR | LR_DEFAULTSIZE,
          <SPAN class=cpp-keyword>int</SPAN> cxDesired = <SPAN class=cpp-literal>0</SPAN>, <SPAN class=cpp-keyword>int</SPAN> cyDesired = <SPAN class=cpp-literal>0</SPAN>)</font></PRE>
  <P><CODE>调用LoadImage()</CODE>,使用<CODE>IMAGE_CURSOR</CODE> 类型,使用<CODE>fuLoad</CODE> 
    标志。由于一个图标可能有几个不同大小的图标组成,所以另外两个参数用于指定所要装载图标的大小。</P>
  <PRE><font color="#0000FF">HICON AtlLoadIconImage(
        _U_STRINGorID icon,
        UINT fuLoad = LR_DEFAULTCOLOR | LR_DEFAULTSIZE,
        <SPAN class=cpp-keyword>int</SPAN> cxDesired = <SPAN class=cpp-literal>0</SPAN>, <SPAN class=cpp-keyword>int</SPAN> cyDesired = <SPAN class=cpp-literal>0</SPAN>)</font></PRE>
  <P><CODE>调用LoadImage(),使用</CODE><CODE>IMAGE_ICON</CODE> 类型,<CODE>通过fuLoad</CODE> 
    传递标志字段。<CODE>cxDesired</CODE> <CODE>和cyDesired</CODE> <CODE>参数与AtlLoadCursorImage()函数作用一样。</CODE></P>
  <P>下面这一组函数封装了一些操作系统定义资源的API(例如, 标准的手形鼠标指针)。默认情况下并不包含其中的一些资源ID (大多数是位图资源),你需要在stdafx.h 
    中定义<CODE>OEMRESOURCE</CODE> 标号才能使用它们。</P>
  <PRE><font color="#0000FF">HBITMAP AtlLoadSysBitmap(LPCTSTR lpBitmapName)</font></PRE>
  <P><CODE>使用NULL资源句柄调用LoadBitmap()</CODE> ,使用这个函数可以装载<CODE>LoadBitmap()帮助文档中列举的一些</CODE><code>OBM_*位图。</code></P>
  <PRE><font color="#0000FF">HCURSOR AtlLoadSysCursor(LPCTSTR lpCursorName)</font></PRE>
  <P><CODE>使用NULL资源句柄调用LoadCursor(),使用</CODE>这个函数可以装载<CODE>LoadCursor()</CODE>帮助文档中列举的<code>IDC_*图标</code></P>
  <PRE><font color="#0000FF">HICON AtlLoadSysIcon(LPCTSTR lpIconName)</font></PRE>
  <P><code>使用NULL资源句柄调用</code><CODE>LoadIcon(),</CODE><code>使用</code>这个函数可以装载 
    <code>LoadIcon()</code> 帮助文档中列举的一些<CODE>IDI_*</CODE> 图标。需要注意的是这个函数和<CODE>LoadIcon()一样只装载</CODE> 
    32x32 大小的图标。</P>
  <PRE><font color="#0000FF">HBITMAP AtlLoadSysBitmapImage(
          WORD wBitmapID, UINT fuLoad = LR_DEFAULTCOLOR)</font></PRE>
  <P><code>使用NULL资源句柄调用</code><CODE>LoadImage()</CODE>,装载类型为<CODE>IMAGE_BITMAP</CODE> 
    ,可以使用这个函数装载<CODE>AtlLoadSysBitmap()能够装载的位图。</CODE></P>
  <PRE><font color="#0000FF">HCURSOR AtlLoadSysCursorImage(
         _U_STRINGorID cursor,
          UINT fuLoad = LR_DEFAULTCOLOR | LR_DEFAULTSIZE,
          <SPAN class=cpp-keyword>int</SPAN> cxDesired = <SPAN class=cpp-literal>0</SPAN>, <SPAN class=cpp-keyword>int</SPAN> cyDesired = <SPAN class=cpp-literal>0</SPAN>)</font></PRE>
  <P><code>使用NULL资源句柄调用</code><code>LoadImage()</code>,装载类型为<CODE>IMAGE_CURSOR</CODE>,<CODE>可以使用这个函数装载AtlLoadSysCursor()</CODE><code>)能够装载的图标。</code></P>
  <PRE><font color="#0000FF">HICON AtlLoadSysIconImage(
        _U_STRINGorID icon,
        UINT fuLoad = LR_DEFAULTCOLOR | LR_DEFAULTSIZE,
        <SPAN class=cpp-keyword>int</SPAN> cxDesired = <SPAN class=cpp-literal>0</SPAN>, <SPAN class=cpp-keyword>int</SPAN> cyDesired = <SPAN class=cpp-literal>0</SPAN>)</font></PRE>
  <P><code>使用NULL资源句柄调用</code><code>LoadImage()</code>,装载类型为<code></code><CODE>IMAGE_ICON</CODE>,<code>可以使用这个函数装载</code><CODE>AtlLoadSysIcon()</CODE><code>能够装载的图标</code>,不过只能指定不同的大小,比如16x16。</P>
  <P><CODE>最后这组函数提供了对GetStockObject()</CODE> API的类型安全封装。</P>
  <PRE><font color="#0000FF">HPEN AtlGetStockPen(<SPAN class=cpp-keyword>int</SPAN> nPen)
HBRUSH AtlGetStockBrush(<SPAN class=cpp-keyword>int</SPAN> nBrush)
HFONT AtlGetStockFont(<SPAN class=cpp-keyword>int</SPAN> nFont)
HPALETTE AtlGetStockPalette(<SPAN class=cpp-keyword>int</SPAN> nPalette)</font></PRE>
  <P>这个函数首先将指定的参数转换成对GDI对象有效的类型 (比如<CODE>AtlGetStockPen()</CODE> 只接受<CODE>WHITE_PEN和</CODE><CODE>BLACK_PEN</CODE>, 
    等等),然后直接调用<CODE>GetStockObject()。</CODE></P>
  <H2><A name=usingcommdlg></A><font color="#FFFF66">使用通用对话框</font></H2>
  <P>WTL还提供了一些类用于简化对Win32 通用对话框地使用,这些类响应通用对话框发送的消息和回调函数,依次调用重载的消息处理函数。这种设计方式和属性页非常相似,你需要为每个属性页提供单独的通知消息响应函数(<code>比如,OnWizardNext()</code> 
    <code>处理</code> <code>PSN_WIZNEXT</code>),它们<code>在必要的时候由CPropertyPageImpl调用。</code> 
  <P>WTL 为每个通用对话框提供两个类,例如:选择文件夹对话框由<CODE>CFolderDialogImpl</CODE> <CODE>和 CFolderDialog两个类封装。如果你想改变它们的默认行为或为某个消息定制一个独特的响应函数,就需要从</CODE><CODE>CFolderDialogImpl派生一个新类,在类中做相应的修改。如果默认的</CODE><CODE>CFolderDialogImpl</CODE>够用了,你就可以使用<CODE>CFolderDialog。</CODE></P>
  <P>通用对话框和对应的WTL类:</P>
  <P> 
  <TABLE width="100%" border=1>
    <TBODY>
      <TR> 
        <TH width="25%"> <P>Common dialog </P></TH>
        <TH width="25%"> <P>Corresponding Win32 API </P></TH>
        <TH width="25%"> <P>Implementation class </P></TH>
        <TH width="25%"> <P>Non-customizable class </P></TH>
      </TR>
      <TR> 
        <TD width="25%"> <P>File Open and File Save </P></TD>
        <TD width="25%"> <P><CODE>GetOpenFileName()</CODE>,<BR>
            <CODE>GetSaveFileName()</CODE> </P></TD>
        <TD width="25%"> <P><CODE>CFileDialogImpl</CODE> </P></TD>
        <TD width="25%"> <P><CODE>CFileDialog</CODE> </P></TD>
      </TR>
      <TR> 
        <TD width="25%"> <P>Choose Folder </P></TD>
        <TD width="25%"> <P><CODE>SHBrowseForFolder()</CODE> </P></TD>
        <TD width="25%"> <P><CODE>CFolderDialogImpl</CODE> </P></TD>
        <TD width="25%"> <P><CODE>CFolderDialog</CODE> </P></TD>
      </TR>
      <TR> 
        <TD width="25%"> <P>Choose Font </P></TD>
        <TD width="25%"> <P><CODE>ChooseFont()</CODE> </P></TD>
        <TD width="25%"> <P><CODE>CFontDialogImpl</CODE>,<BR>
            <CODE>CRichEditFontDialogImpl</CODE> </P></TD>
        <TD width="25%"> <P><CODE>CFontDialog</CODE>,<BR>
            <CODE>CRichEditFontDialog</CODE> </P></TD>
      </TR>
      <TR> 
        <TD width="25%"> <P>Choose Color </P></TD>
        <TD width="25%"> <P><CODE>ChooseColor()</CODE> </P></TD>
        <TD width="25%"> <P><CODE>CColorDialogImpl</CODE> </P></TD>
        <TD width="25%"> <P><CODE>CColorDialog</CODE> </P></TD>
      </TR>
      <TR> 
        <TD width="25%"> <P>Printing and Print Setup </P></TD>
        <TD width="25%"> <P><CODE>PrintDlg()</CODE> </P></TD>
        <TD width="25%"> <P><CODE>CPrintDialogImpl</CODE> </P></TD>
        <TD width="25%"> <P><CODE>CPrintDialog</CODE> </P></TD>
      </TR>
      <TR> 
        <TD width="25%"> <P>Printing (Windows 2000 and later) </P></TD>
        <TD width="25%"> <P><CODE>PrintDlgEx()</CODE> </P></TD>
        <TD width="25%"> <P><CODE>CPrintDialogExImpl</CODE> </P></TD>
        <TD width="25%"> <P><CODE>CPrintDialogEx</CODE> </P></TD>
      </TR>
      <TR> 
        <TD width="25%"> <P>Page Setup </P></TD>
        <TD width="25%"> <P><CODE>PageSetupDlg()</CODE> </P></TD>
        <TD width="25%"> <P><CODE>CPageSetupDialogImpl</CODE> </P></TD>
        <TD width="25%"> <P><CODE>CPageSetupDialog</CODE> </P></TD>
      </TR>
      <TR> 
        <TD width="25%"> <P>Text find and replace </P></TD>
        <TD width="25%"> <P><CODE>FindText()</CODE>,<BR>
            <CODE>ReplaceText()</CODE> </P></TD>
        <TD width="25%"> <P><CODE>CFindReplaceDialogImpl</CODE> </P></TD>
        <TD width="25%"> <P><CODE>CFindReplaceDialog</CODE> </P></TD>
      </TR>
    </TBODY>
  </TABLE>
  <p></P>

⌨️ 快捷键说明

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