亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? mfc

?? 很好的MFC書籍
??
?? 第 1 頁 / 共 4 頁
字號:
<P align=justify>(1)使用設備描述表的步驟</P>
<P align=justify>要使用設備描述表,一般有如下步驟:</P>
<UL>
  <P align=justify>
  <LI>獲取或者創建設備描述表; 
  <P></P>
  <P align=justify></P>
  <LI>必要的話,改變設備描述表的屬性; 
  <P></P>
  <P align=justify></P>
  <LI>使用設備描述表完成繪制操作; 
  <P></P>
  <P align=justify></P>
  <LI>釋放或刪除設備描述表。 
  <P></P></LI></UL>
<P 
align=justify>Common設備描述表通過::GetDC,::GetDCEx,::BeginPaint來獲得一個設備描述表,用畢,用::ReleaseDC或::EndPaint釋放設備描述表;</P>
<P align=justify>Printer設備描述表通過::CreateDC創建設備描述表,用::DeleteDC刪除設備描述表。</P>
<P align=justify>Memory設備描述表通過::CreateCompatibleDC創建設備描述表,用::DeleteDC刪除。</P>
<P align=justify>Information設備描述表通過::CreateIC創建設備描述表,用::DeleteDC刪除。</P>
<P align=justify>(2)改變設備描述表屬性的途徑</P>
<P align=justify>要改變設備描述表的屬性,可通過以下途徑:</P>
<P align=justify>用::SelectObject選入新的除調色板以外的GDI Object到設備描述表中;</P>
<P 
align=justify>對于調色板,使用::SelectPalette函數選入邏輯調色板,并使用::RealizePalette把邏輯調色板的入口映射到物理調色板中。</P>
<P align=justify>用其他API函數改變其他屬性,如::SetMapMode改變映射模式。</P>
<OL>
  <OL>
    <OL>
      <P align=justify>
      <LI><A name=_Toc445888987></A><A name=_Toc445782390></A><A 
      name=_Toc452640886></A><A name=_Toc457298951></A><B>設備描述表在MFC中的實現</B> 
      <P></P></LI></OL></OL></OL>
<P align=justify>MFC提供了CDC類作為設備描述表類的基類,它封裝了Windows的HDC設備描述表對象和相關函數。</P>
<OL>
  <P align=justify>
  <LI>CDC類 
  <P></P>
  <P align=justify>CDC類包含了各種類型的Windows設備描述表的全部功能,封裝了所有的Win32 GDI 
  函數和設備描述表相關的SDK函數。在MFC下,使用CDC的成員函數來完成所有的窗口繪制工作。</P>
  <P align=justify>CDC 類的結構示意圖2-2所示。</P><IMG height=146 hspace=12 
  src="MFC教程_ MFC和Win32.files/image107.gif" width=360 align=left> 
  <P align=justify></P>
  <P 
  align=justify>CDC類有兩個成員變量:m_hDC,m_hAttribDC,它們都是Windows設備描述表句柄。CDC的成員函數作輸出操作時,使用m_Hdc;要獲取設備描述表的屬性時,使用m_hAttribDC。</P>
  <P 
  align=justify>在創建一個CDC類實例時,缺省的m_hDC等于m_hAttribDC。如果需要的話,程序員可以分別指定它們。例如,MFC框架實現CMetaFileDC類時,就是如此:CMetaFileDC從物理設備上讀取設備信息,輸出則送到元文件(metafile)上,所以m_hDC和m_hAttribDC是不同的,各司其責。還有一個類似的例子:打印預覽的實現,一個代表打印機模擬輸出,一個代表屏幕顯示。</P>
  <P align=justify>CDC封裝::SelectObject(HDC hdc,HGDIOBJECT 
  hgdiobject)函數時,采用了重載技術,即它針對不同的GDI對象,提供了名同而參數不同的成員函數:</P>
  <P align=justify>SelectObject(CPen *pen)用于選入筆;</P>
  <P align=justify>SelectObject(CBitmap* pBitmap)用于選入位圖;</P>
  <P align=justify>SelectObject(CRgn *pRgn)用于選入剪裁區域;</P>
  <P align=justify>SelectObject(CBrush *pBrush)用于選入刷子;</P>
  <P align=justify>SelectObject(CFont *pFont)用于選入字體;</P>
  <P align=justify>至于調色板,使用SelectPalette(CPalette *pPalette,BOOL 
  bForceBackground )選入調色板到設備描述表,使用RealizePalletter()實現邏輯調色板到物理調色板的映射。</P>
  <P align=justify></P>
  <LI>從CDC派生出功能更具體的設備描述表 
  <P></P></LI></OL>
<P align=justify>從CDC 派生出四個功能更具體的設備描述表類。層次如圖2-3所示。</P>
<P align=justify></P>
<P align=justify><IMG height=166 src="MFC教程_ MFC和Win32.files/image108.gif" 
width=396></P>
<P align=justify></P>
<P align=justify>下面,分別討論派生出的四種設備描述表。</P>
<UL>
  <P align=justify>
  <LI>CCientDC 
  <P></P></LI></UL>
<P align=justify>代表窗口客戶區的設備描述表。其構造函數CClientDC(CWnd 
*pWin)通過::GetDC獲取指定窗口的客戶區的設備描述表HDC,并且使用成員函數Attach把它和CClientDC對象捆綁在一起;其析構函數使用成員函數Detach把設備描述表句柄HDC分離出來,并調用::ReleaseDC釋放設備描述表HDC。</P>
<UL>
  <P align=justify>
  <LI>CPaintDC 
  <P></P></LI></UL>
<P 
align=justify>僅僅用于響應WM_PAINT消息時繪制窗口,因為它的構造函數調用了::BeginPaint獲取設備描述表HDC,并且使用成員函數Attach把它和CPaintDC對象捆綁在一起;析構函數使用成員函數Detach把設備描述表句柄HDC分離出來,并調用::EndPaint釋放設備描述表HDC,而::BeginPaint和::EndPaint僅僅在響應WM_PAINT時使用。</P>
<UL>
  <P align=justify>
  <LI>CMetaFileDC 
  <P></P></LI></UL>
<P align=justify>用于生成元文件。</P>
<UL>
  <P align=justify>
  <LI>CWindowDC 
  <P></P></LI></UL>
<P align=justify>代表整個窗口區(包括非客戶區)的設備描述表。其構造函數CWindowDC(CWnd 
*pWin)通過::GetWindowDC獲取指定窗口的客戶區的設備描述表HDC,并使用Attach把它和CWindowDC對象捆綁在一起;其析構函數使用Detach把設備描述表HDC分離出來,調用::ReleaseDC釋放設備描述表HDC。</P>
<OL>
  <OL>
    <OL>
      <P align=justify>
      <LI><A name=_Toc445888988></A><A name=_Toc445782391></A><A 
      name=_Toc452640887></A><A name=_Toc457298952></A><B>MFC設備描述表類的使用</B> 
      <P></P></LI></OL></OL></OL>
<OL>
  <P align=justify>
  <LI>使用CPaintDC、CClientDC、CWindowDC的方法 
  <P></P>
  <P align=justify>首先,定義一個這些類的實例變量,通常在棧中定義。然后,使用它。</P>
  <P align=justify>例如,MFC中CView對WM_PAINT消息的實現方法如下:</P>
  <P align=justify>void CView::OnPaint()</P>
  <P align=justify>{</P>
  <P align=justify>// standard paint routine</P>
  <P align=justify>CPaintDC dc(this);</P>
  <P align=justify>OnPrepareDC(&amp;dc);</P>
  <P align=justify>OnDraw(&amp;dc);</P>
  <P align=justify>}</P>
  <P 
  align=justify>在棧中定義了CPaintDC類型的變量dc,隨著構造函數的調用獲取了設備描述表;設備描述表使用完畢,超出其有效范圍就被自動地清除,隨著析構函數的調用,其獲取的設備描述表被釋放。</P>
  <P align=justify>如果希望在堆中創建,例如</P>
  <P align=justify>CPaintDC *pDC;</P>
  <P align=justify>pDC = new CPaintDC(this)</P>
  <P align=justify>則在使用完畢時,用delete刪除pDC:</P>
  <P align=justify>delete pDC;</P>
  <P align=justify></P>
  <P align=justify></P>
  <LI>直接使用CDC 
  <P></P></LI></OL>
<P 
align=justify>需要注意的是:在生成CDC對象的時候,并不像它的派生類那樣,在構造函數里獲取相應的Windows設備描述表。最好不要使用::GetDC等函數來獲取一個設備描述表,而是創建一個設備描述表。其構造函數如下:</P>
<P align=justify>CDC::CDC()</P>
<P align=justify>{</P>
<DIR>
<P align=justify>m_hDC = NULL;</P>
<P align=justify>m_hAttribDC = NULL;</P>
<P align=justify>m_bPrinting = FALSE;</P></DIR>
<P align=justify>}</P>
<P align=justify>其析構函數如下:</P>
<P align=justify>CDC::~CDC()</P>
<P align=justify>{</P>
<DIR>
<P align=justify>if (m_hDC != NULL)</P>
<P align=justify>::DeleteDC(Detach());</P></DIR>
<P align=justify>}</P>
<P 
align=justify>在CDC析構函數中,如果設備描述表句柄不空,則調用DeleteDC刪除它。這是直接使用CDC時最好創建Windows設備描述表的理由。如果設備描述表不是創建的,則應該在析構函數被調用前分離出設備描述表句柄并用::RealeaseDC釋放它,釋放后m_hDC為空,則在析構函數調用時不會執行::DeleteDC。當然,不用擔心CDC的派生類的析構函數調用CDC的析構函數,因為CDC::~CDC()不是虛擬析構函數。</P>
<P align=justify>直接使用CDC的例子是內存設備上下文,例如:</P>
<P align=justify>CDC dcMem; //聲明一個CDC對象</P>
<P align=justify>dcMem.CreateCompatibleDC(&amp;dc); //創建設備描述表</P>
<P align=justify>pbmOld = dcMem.SelectObject(&amp;m_bmBall);//更改設備描述表屬性</P>
<P align=justify>…//作一些繪制操作</P>
<P align=justify></P>
<P align=justify>dcMem.SelectObject(pbmOld);//恢復設備描述表的屬性</P>
<P align=justify>dcMem.DeleteDC(); //可以不調用,而讓析構函數去刪除設備描述表</P>
<OL>
  <OL>
    <P align=justify>
    <LI><A name=_Toc445888989></A><A name=_Toc445782392></A><A 
    name=_Toc452640888></A><A name=_Toc457298953></A><B>GDI對象</B> 
    <P></P></LI></OL></OL>
<P align=justify>在討論設備描述表時,已經多次涉及到GDI對象。這里,需強調一下:GDI對象要選入Windows 
設備描述表后才能使用;用畢,要恢復設備描述表的原GDI對象,并刪除該GDI對象。</P>
<P align=justify>一般按如下步驟使用GDI對象:</P>
<P align=justify>Create or get a GDI OBJECT hNewGdi;</P>
<P align=justify></P>
<P align=justify>hOldGdi = ::SelectObject(hdc, hNewGdi)</P>
<P align=justify>……</P>
<P align=justify>::SelectObject(hdc, hOldGdi)</P>
<P align=justify>::DeleteObject(hNewGdi)</P>
<P 
align=justify>先創建或得到一個GDI對象,然后把它選入設備描述表并保存它原來的GDI對象;用畢恢復設備描述表原來的GDI對象并刪除新創建的GDI對象。</P>
<P align=justify>需要指出的是,如果hNewGdi是一個Stock GDI對象,可以不刪除(刪除也可以)。通過</P>
<DIR>
<DIR>
<P>HGDIOBJ GetStockObject(</P></DIR>
<P>int fnObject // type of stock object </P>
<P align=justify>);</P></DIR>
<P align=justify>來獲取Stock GDI對象。</P>
<P align=justify></P>
<OL>
  <P align=justify>
  <LI>MFC GDI對象 
  <P></P>
  <P align=justify>MFC用一些類封裝了Windows GDI對象和相關函數,層次結構如圖2-4所示:</P>
  <P align=justify></P><IMG height=176 hspace=12 
  src="MFC教程_ MFC和Win32.files/image109.gif" width=373 align=left> 
  <P align=justify></P>
  <P align=justify>CGdiObject封裝了Windows GDI 
  Object共有的特性。其派生類在繼承的基礎上,主要封裝了各類GDI的創建函數以及和具體GDI對象相關的操作。</P>
  <P align=justify></P><IMG height=125 hspace=12 
  src="MFC教程_ MFC和Win32.files/image110.gif" width=372 align=left> 
  <P 
  align=justify>CGdiObject的構造函數僅僅讓m_hObject為空。如果m_hObject不空,其析構函數將刪除對應的Windows 
  GDI對象。MFC GDI對象和Windows GDI對象的關系如圖2-5所示。</P>
  <P align=justify></P>
  <LI>使用MFC GDI類的使用 
  <P></P></LI></OL>
<P align=justify>首先創建GDI對象,可分一步或兩步創建。一步創建就是構造MFC對象和Windows 
GDI對象一步完成;兩步創建則先構造MFC對象,接著創建Windows 
GDI對象。然后,把新創建的GDI對象選進設備描述表,取代原GDI對象并保存。最后,恢復原GDI對象。例如:</P>
<P align=justify>void CMyView::OnDraw(CDC *pDC)</P>
<P align=justify>{</P>
<P align=justify>CPen penBlack; //構造MFC CPen對象</P>
<P align=justify>if (penBlack.CreatePen(PS_SOLID, RGB(0, 0, 0)))</P>
<P align=justify>{</P>
<DIR>
<P align=justify>CPen *pOldPen = pDC-&gt;SelectObject(&amp;penBlack)); 
//選進設備表,保存原筆</P>
<P align=justify>…</P>
<P align=justify>pDC-&gt;SelectObject(pOldPen); //恢復原筆</P></DIR>
<P align=justify>}else</P>
<P align=justify>{</P>
<DIR>
<P align=justify>…</P></DIR>
<P align=justify>}</P>
<P align=justify>}</P>
<P 
align=justify>和在SDK下有一點不同的是:這里沒有DeleteObject。因為執行完OnDraw后,棧中的penBlack被銷毀,它的析構函數被調用,導致DeleteObject的調用。</P>
<P align=justify>還有一點要說明:</P>
<P align=justify>pDC-&gt;SelectObject(&amp;penBlack)返回了一個CPen 
*指針,也就是說,它根據原來PEN的句柄創建了一個MFC 
CPen對象。這個對象是否需要刪除呢?不必要,因為它是一個臨時對象,MFC框架會自動地刪除它。當然,在本函數執行完畢把控制權返回給主消息循環之前,該對象是有效的。</P>
<P align=justify>關于臨時對象及MFC處理它們的內部機制,將在后續章節詳細討論。</P>
<P 
align=justify>至此,Windows編程的核心概念:窗口、GDI界面(設備描述表、GDI對象等)已經陳述清楚,特別揭示了MFC對這些概念的封裝機制,并簡明講述了與這些Windows 
Object對應的MFC類的使用方法。還有其他Windows概念,可以參見SDK開發文檔。在MFC的實現上,基本上僅僅是對和這些概念相關的Win32函數的封裝。如果明白了MFC的窗口、GDI界面的封裝機制,其他就不難了。</P>
<P>
<SCRIPT language=JavaScript>write_tail();</SCRIPT>
</P>
<HR>

<TABLE cellSpacing=0 cellPadding=0 width="100%" align=center border=0>
  <TBODY>
  <TR>
    <TD align=middle><A href="http://www.vczx.com/tutorial/mfc/mfc1.php" 
      target=_self>上一章</A> <A href="http://www.vczx.com/tutorial/mfc/mfc.php" 
      target=_self>回目錄</A> <A href="http://www.vczx.com/tutorial/mfc/mfc3.php" 
      target=_self>下一章</A></TD></TR></TBODY></TABLE>
<P>&nbsp;</P>
<P>&nbsp;</P></BODY></HTML>

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产成人精品午夜视频免费 | 欧美精品一区二区三区蜜桃| 日韩美女一区二区三区| 久久香蕉国产线看观看99| 亚洲欧美自拍偷拍色图| 丝袜美腿亚洲色图| 久久国内精品自在自线400部| 成人福利视频在线看| 97se狠狠狠综合亚洲狠狠| 欧美酷刑日本凌虐凌虐| 精品国产污网站| 一区二区三区免费| 国产一区二区三区黄视频| 欧美又粗又大又爽| 国产日本一区二区| 天天综合日日夜夜精品| 不卡视频免费播放| 日韩欧美成人午夜| 午夜私人影院久久久久| 懂色一区二区三区免费观看| 91精品国产手机| 亚洲愉拍自拍另类高清精品| 国产aⅴ精品一区二区三区色成熟| 在线视频国内自拍亚洲视频| 久久久无码精品亚洲日韩按摩| 亚洲综合精品久久| 成人中文字幕电影| 日韩精品一区二区三区三区免费 | 国产精品不卡一区| 免费视频最近日韩| 丰满白嫩尤物一区二区| 欧美日韩小视频| 亚洲欧美日韩国产综合在线| 国产精品一区在线观看你懂的| 在线播放国产精品二区一二区四区| 国产精品初高中害羞小美女文| 国产精品综合在线视频| 日韩精品在线网站| 蜜臀av一区二区| 91精选在线观看| 亚洲福利一区二区| 在线观看区一区二| 亚洲精品日产精品乱码不卡| 91在线国产观看| 亚洲男同1069视频| 91农村精品一区二区在线| 国产精品人妖ts系列视频| 大胆亚洲人体视频| 亚洲欧美在线aaa| 97久久超碰国产精品电影| 亚洲欧美偷拍另类a∨色屁股| 成人a免费在线看| 中文字幕第一区二区| 国产黄色91视频| 国产精品美女久久福利网站 | 日本亚洲三级在线| 7777精品伊人久久久大香线蕉完整版 | 六月丁香婷婷久久| xfplay精品久久| 国产精品中文字幕一区二区三区| 国产亚洲精品7777| 99热精品一区二区| 一区二区三区在线免费播放| 欧美视频三区在线播放| 日韩精品亚洲专区| 26uuu另类欧美| 懂色av噜噜一区二区三区av| 中文字幕一区二区三中文字幕| 色天天综合色天天久久| 五月天精品一区二区三区| 欧美tickling网站挠脚心| 国产激情91久久精品导航| 亚洲欧美视频在线观看视频| 欧美日韩精品一区二区在线播放| 日韩中文字幕亚洲一区二区va在线 | 91麻豆精品久久久久蜜臀| 狠狠色丁香久久婷婷综合_中| 国产午夜精品一区二区三区四区| 丰满白嫩尤物一区二区| 亚洲在线中文字幕| 精品国精品国产| zzijzzij亚洲日本少妇熟睡| 亚洲成a人片在线不卡一二三区| 精品欧美乱码久久久久久1区2区| 成人中文字幕在线| 午夜影院久久久| 久久久精品国产免费观看同学| 色成年激情久久综合| 免费一区二区视频| 中文字幕一区二区三区色视频| 欧美午夜电影一区| 国产精品正在播放| 亚洲123区在线观看| 亚洲国产精品成人综合色在线婷婷| 在线观看精品一区| 国产激情91久久精品导航| 亚洲v中文字幕| 久久久久久久久久久黄色| 国产sm精品调教视频网站| 有码一区二区三区| 国产日产精品1区| 91精品国产福利在线观看 | 91网址在线看| 精品伊人久久久久7777人| 亚洲永久免费av| 中文字幕 久热精品 视频在线| 欧美日韩国产免费一区二区| 粉嫩av亚洲一区二区图片| 天堂成人免费av电影一区| 最新国产の精品合集bt伙计| 91精品国产综合久久香蕉麻豆| 色综合天天综合| 成人精品一区二区三区四区| 狠狠网亚洲精品| 欧美aaaaaa午夜精品| 欧美日韩高清一区二区三区| 91网址在线看| av日韩在线网站| 国产99久久久国产精品潘金网站| 美女视频黄 久久| 无码av中文一区二区三区桃花岛| 国产精品美女久久久久久久网站| 精品成人免费观看| 日韩三级免费观看| 911精品国产一区二区在线| 欧美午夜在线一二页| 94色蜜桃网一区二区三区| 不卡一区二区在线| 成人av在线资源网站| 粉嫩嫩av羞羞动漫久久久| 国产精品综合网| 粉嫩aⅴ一区二区三区四区| 国产精品亚洲第一区在线暖暖韩国| 老司机免费视频一区二区| 青娱乐精品视频| 免费欧美在线视频| 青青草国产成人av片免费 | 美国毛片一区二区| 青青草精品视频| 麻豆精品一二三| 国产在线国偷精品免费看| 国产一区美女在线| 国产精品中文字幕日韩精品| 国产露脸91国语对白| 国产成人高清在线| 成人国产亚洲欧美成人综合网| gogo大胆日本视频一区| av不卡免费在线观看| 色综合天天视频在线观看| 色婷婷亚洲一区二区三区| 色爱区综合激月婷婷| 欧美日韩午夜影院| 欧美tk丨vk视频| 中文字幕不卡在线播放| 中文字幕欧美一区| 亚洲国产sm捆绑调教视频| 男男gaygay亚洲| 国产精品99久久久久| jlzzjlzz国产精品久久| 欧美日韩精品一区视频| 日韩你懂的电影在线观看| 国产亚洲欧美日韩俺去了| 亚洲特级片在线| 偷拍与自拍一区| 韩国v欧美v亚洲v日本v| av在线综合网| 欧美顶级少妇做爰| 久久精品亚洲精品国产欧美 | 久久综合久久综合亚洲| 亚洲国产精品国自产拍av| 亚洲人妖av一区二区| 午夜国产精品一区| 精品在线一区二区三区| voyeur盗摄精品| 日韩一区二区电影网| 国产精品久久久久久久久免费相片| 亚洲精品美国一| 美女mm1313爽爽久久久蜜臀| 国产suv精品一区二区三区| 欧美影院一区二区| 久久九九久久九九| 亚洲福中文字幕伊人影院| 国产一区二区三区久久悠悠色av| 91高清视频免费看| 久久夜色精品一区| 一区二区三区在线视频播放| 久久成人久久爱| 在线看国产一区二区| 久久久久久日产精品| 婷婷成人激情在线网| 岛国一区二区三区| 日韩一区二区中文字幕| 亚洲三级电影网站| 国产精品亚洲综合一区在线观看| 欧美日韩国产一级片| 国产视频在线观看一区二区三区| 性久久久久久久| 91老司机福利 在线| 久久九九久久九九| 久久精品国产第一区二区三区 |