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

📄 chap11_4.htm

📁 VC++教程电子图书
💻 HTM
📖 第 1 页 / 共 3 页
字号:
          <p align="JUSTIFY">}</p>
          <p align="JUSTIFY"> </p>
          <p align="JUSTIFY">CDib::~CDib()</p>
          <p align="JUSTIFY">{</p>
          <p align="JUSTIFY">DeleteDIB();</p>
          <p align="JUSTIFY">}</p>
          <p align="JUSTIFY"> </p>
          <p align="JUSTIFY">void CDib::DeleteDIB()</p>
          <p align="JUSTIFY">{</p>
          <p align="JUSTIFY">if (m_hDIB != NULL)</p>
          <p align="JUSTIFY">::GlobalFree((HGLOBAL) m_hDIB);</p>
          <p align="JUSTIFY">if (m_palDIB != NULL)</p>
          <p align="JUSTIFY">delete m_palDIB;</p>
          <p align="JUSTIFY">}</p>
          <p align="JUSTIFY"> </p>
          <p align="JUSTIFY">//从文件中载入DIB</p>
          <p align="JUSTIFY">BOOL CDib::Load(LPCTSTR lpszFileName)</p>
          <p align="JUSTIFY">{</p>
          <p align="JUSTIFY">HDIB hDIB;</p>
          <p align="JUSTIFY">CFile file;</p>
          <p align="JUSTIFY">CFileException fe;</p>
          <p align="JUSTIFY">if (!file.Open(lpszFileName, CFile::modeRead|CFile::shareDenyWrite, 
            &amp;fe))</p>
          <p align="JUSTIFY">{</p>
          <p align="JUSTIFY">AfxMessageBox(fe.m_cause);</p>
          <p align="JUSTIFY">return FALSE;</p>
          <p align="JUSTIFY">}</p>
          <p align="JUSTIFY">TRY</p>
          <p align="JUSTIFY">{</p>
          <p align="JUSTIFY">hDIB = ::ReadDIBFile(file);</p>
          <p align="JUSTIFY">}</p>
          <p align="JUSTIFY">CATCH (CFileException, eLoad)</p>
          <p align="JUSTIFY">{</p>
          <p align="JUSTIFY">file.Abort(); </p>
          <p align="JUSTIFY">return FALSE;</p>
          <p align="JUSTIFY">}</p>
          <p align="JUSTIFY">END_CATCH</p>
          <p align="JUSTIFY"> </p>
          <p align="JUSTIFY">DeleteDIB(); //清除旧位图</p>
          <p align="JUSTIFY">m_hDIB=hDIB;</p>
          <p align="JUSTIFY"> </p>
          <p align="JUSTIFY">m_palDIB = new CPalette;</p>
          <p align="JUSTIFY">if (::CreateDIBPalette(m_hDIB, m_palDIB) == NULL)</p>
          <p align="JUSTIFY">{</p>
          <p align="JUSTIFY">// DIB有可能没有调色板</p>
          <p align="JUSTIFY">delete m_palDIB;</p>
          <p align="JUSTIFY">m_palDIB = NULL;</p>
          <p align="JUSTIFY">}</p>
          <p align="JUSTIFY">return TRUE;</p>
          <p align="JUSTIFY">}</p>
          <p align="JUSTIFY"> </p>
          <p align="JUSTIFY">//从资源中载入DIB</p>
          <p align="JUSTIFY">BOOL CDib::LoadFromResource(UINT nID)</p>
          <p align="JUSTIFY">{</p>
          <p align="JUSTIFY">HINSTANCE hResInst = AfxGetResourceHandle();</p>
          <p align="JUSTIFY">HRSRC hFindRes;</p>
          <p align="JUSTIFY">HDIB hDIB;</p>
          <p align="JUSTIFY">LPSTR pDIB;</p>
          <p align="JUSTIFY">LPSTR pRes;</p>
          <p align="JUSTIFY">HGLOBAL hRes;</p>
          <p align="JUSTIFY">//搜寻指定的资源</p>
          <p align="JUSTIFY">hFindRes = ::FindResource(hResInst, MAKEINTRESOURCE(nID), 
            RT_BITMAP);</p>
          <p align="JUSTIFY">if (hFindRes == NULL) return FALSE;</p>
          <p align="JUSTIFY">hRes = ::LoadResource(hResInst, hFindRes); //载入位图资源</p>
          <p align="JUSTIFY">if (hRes == NULL) return FALSE;</p>
          <p align="JUSTIFY">DWORD dwSize=::SizeofResource(hResInst,hFindRes);</p>
          <p align="JUSTIFY"> </p>
          <p align="JUSTIFY">hDIB = (HDIB) ::GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT, 
            dwSize);</p>
          <p align="JUSTIFY">if (hDIB == NULL) return FALSE;</p>
          <p align="JUSTIFY">pDIB = (LPSTR)::GlobalLock((HGLOBAL)hDIB);</p>
          <p align="JUSTIFY">pRes = (LPSTR) ::LockResource(hRes);</p>
          <p align="JUSTIFY">memcpy(pDIB, pRes, dwSize); //把hRes中的内容复制hDIB中</p>
          <p align="JUSTIFY">::GlobalUnlock((HGLOBAL) hDIB);</p>
          <p align="JUSTIFY"> </p>
          <p align="JUSTIFY">DeleteDIB();</p>
          <p align="JUSTIFY">m_hDIB=hDIB;</p>
          <p align="JUSTIFY">m_palDIB = new CPalette;</p>
          <p align="JUSTIFY">if (::CreateDIBPalette(m_hDIB, m_palDIB) == NULL)</p>
          <p align="JUSTIFY">{</p>
          <p align="JUSTIFY">// DIB有可能没有调色板</p>
          <p align="JUSTIFY">delete m_palDIB;</p>
          <p align="JUSTIFY">m_palDIB = NULL;</p>
          <p align="JUSTIFY">}</p>
          <p align="JUSTIFY">return TRUE;</p>
          <p align="JUSTIFY">}</p>
          <p align="JUSTIFY"> </p>
          <p align="JUSTIFY">int CDib::Width()</p>
          <p align="JUSTIFY">{</p>
          <p align="JUSTIFY">if(m_hDIB==NULL) return 0;</p>
          <p align="JUSTIFY">LPSTR lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) m_hDIB);</p>
          <p align="JUSTIFY">int cxDIB = (int) ::DIBWidth(lpDIB); // Size of DIB 
            - x</p>
          <p align="JUSTIFY">::GlobalUnlock((HGLOBAL) m_hDIB);</p>
          <p align="JUSTIFY">return cxDIB;</p>
          <p align="JUSTIFY">}</p>
          <p align="JUSTIFY"> </p>
          <p align="JUSTIFY">int CDib::Height()</p>
          <p align="JUSTIFY">{</p>
          <p align="JUSTIFY">if(m_hDIB==NULL) return 0;</p>
          <p align="JUSTIFY">LPSTR lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) m_hDIB);</p>
          <p align="JUSTIFY">int cyDIB = (int) ::DIBHeight(lpDIB); // Size of 
            DIB - y</p>
          <p align="JUSTIFY">::GlobalUnlock((HGLOBAL) m_hDIB);</p>
          <p align="JUSTIFY">return cyDIB;</p>
          <p align="JUSTIFY">}</p>
          <p align="JUSTIFY"> </p>
          <p align="JUSTIFY">//显示DIB,该函数具有缩放功能</p>
          <p align="JUSTIFY">//参数x和y说明了目的矩形的左上角坐标,cx和cy说明了目的矩形的尺寸</p>
          <p align="JUSTIFY">//cx和cy若有一个为0则该函数按DIB的实际大小绘制,cx和cy的缺省值是0</p>
          <p align="JUSTIFY">BOOL CDib::Draw(CDC *pDC, int x, int y, int cx, int 
            cy)</p>
          <p align="JUSTIFY">{</p>
          <p align="JUSTIFY">if(m_hDIB==NULL) return FALSE;</p>
          <p align="JUSTIFY">CRect rDIB,rDest;</p>
          <p align="JUSTIFY">rDest.left=x;</p>
          <p align="JUSTIFY">rDest.top=x;</p>
          <p align="JUSTIFY">if(cx==0||cy==0)</p>
          <p align="JUSTIFY">{</p>
          <p align="JUSTIFY">cx=Width();</p>
          <p align="JUSTIFY">cy=Height();</p>
          <p align="JUSTIFY">}</p>
          <p align="JUSTIFY">rDest.right=rDest.left+cx;</p>
          <p align="JUSTIFY">rDest.bottom=rDest.top+cy;</p>
          <p align="JUSTIFY">rDIB.left=rDIB.top=0;</p>
          <p align="JUSTIFY">rDIB.right=Width();</p>
          <p align="JUSTIFY">rDIB.bottom=Height();</p>
          <p align="JUSTIFY">return ::PaintDIB(pDC-&gt;GetSafeHdc(),&amp;rDest,m_hDIB,&amp;rDIB,m_palDIB);</p>
          <p align="JUSTIFY">}</p>
          <p><b> </b></p>
          <p align="JUSTIFY"> <font color="#3973DE" face="Times New Roman" size="3">11.4.3 
            </font><font color="#3973DE" size="3">使用CDib类的例子</font></p>
          <p align="JUSTIFY">  现在让我们来看一个使用CDib类的例子。如图11.4所示,程序名为ShowDib,是一个多文档应用程序,它的功能与VC的DibLook例程有些类似,可同时打开和显示多个位图。</p>
          <p align="center"><img src="T11_4.jpg" alt="T11_4.jpg (24220 bytes)" width="447" height="337"></p>
          <p align="center">图11.4 用ShowDib来显示位图</p>
          <p align="JUSTIFY"> </p>
          <p align="JUSTIFY">   请读者用AppWizard建立一个名为ShowDib的MFC工程。程序应该用滚动视图来显示较大的位图,所以在MFC 
            AppWizard的第6步应把CShowDibView的基类改为CScrollView。</p>
          <p align="JUSTIFY">  由于ShowDib程序要用到CDib类,所以应该把dibapi.cpp、myfile.cpp、dibapi.h、CDib.cpp和CDib.h文件拷贝到ShowDib目录下,并选择Project-&gt;Add 
            to Project-&gt;Files命令把这些文件加到ShowDib工程中。</p>
          <p align="JUSTIFY">  在ShowDib.h文件中CShowDibApp类的定义之前加入下面一行:</p>
          <b> 
          <p align="JUSTIFY">#define WM_DOREALIZE WM_USER+200</p>
          </b> 
          <p align="JUSTIFY">  当收到调色板消息时,主框架窗口会发送用户定义的WM_DOREALIZE消息通知视图。</p>
          <p align="JUSTIFY">  接下来,需要用ClassWizard为CMainFrame加入WM_QUERYNEWPALETTE和WM_PALETTECHANGED消息的处理函数,为CShowDibDoc类加入OnOpenDocument函数。</p>
          <p align="JUSTIFY">  最后,请读者按清单11.5、11.6和11.7修改程序。</p>
          <b> 
          <p align="JUSTIFY">清单11.5 CMainFrame类的部分代码</p>
          </b> 
          <p align="JUSTIFY">// MainFrm.cpp : implementation of the CMainFrame 
            class</p>
          <p align="JUSTIFY">void CMainFrame::OnPaletteChanged(CWnd* pFocusWnd) 
          </p>
          <p align="JUSTIFY">{</p>
          <p align="JUSTIFY">CMDIFrameWnd::OnPaletteChanged(pFocusWnd);</p>
          <p align="JUSTIFY">// TODO: Add your message handler code here</p>
          <p><b> </b></p>
          <b> 
          <p align="JUSTIFY">SendMessageToDescendants(WM_DOREALIZE, 1); //通知所有的子窗口</p>
          </b> 
          <p align="JUSTIFY">}</p>
          <p align="JUSTIFY"> </p>
          <p align="JUSTIFY">BOOL CMainFrame::OnQueryNewPalette() </p>
          <p align="JUSTIFY">{</p>

⌨️ 快捷键说明

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