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

📄 chapter7.htm

📁 为清华大学出版社 C++课后答案
💻 HTM
📖 第 1 页 / 共 5 页
字号:
  pFrame-&gt;SetIcon(hIcon, TRUE); // 设置大图标<br>
  pFrame-&gt;SetIcon(hIcon, FALSE); // 设置小图标<br>
  pFrame-&gt;ShowWindow(m_nCmdShow);<br>
  this-&gt;m_pMainWnd = pFrame;<br>
  return TRUE;<br>
  }<br>
</span></p>
<p class="style3"><strong>7-24 显示一张位图文件(.BMP)。<br>
  说 明:首先建立Win32 Application空白项目和源代码文件(不要忘记设置项目使之可以使用MFC类库),然后按11.8:“向项目中添加资源”的方法为项目建立资源文件,并将待显示的位图文件作为资源装入项目。</strong><br>
</span></p>
<p class="style3">程 序:<br>
  // Example 11-2:显示BMP图片<br>
  #include &lt;afxwin.h&gt;<br>
  #include "resource.h"<br>
  // 框架窗口类<br>
  class CMyWnd: public CFrameWnd<br>
  {<br>
  CBitmap m_Bitmap;<br>
  int m_nHeight;<br>
  int m_nWidth;<br>
  public:<br>
  CMyWnd();<br>
  protected:<br>
  afx_msg void OnPaint();<br>
  DECLARE_MESSAGE_MAP()<br>
  };<br>
  // 消息映射<br>
  BEGIN_MESSAGE_MAP(CMyWnd, CFrameWnd)<br>
  ON_WM_PAINT()<br>
  END_MESSAGE_MAP()<br>
  // 框架窗口类的成员函数<br>
  CMyWnd::CMyWnd()<br>
  {<br>
  m_Bitmap.LoadBitmap(IDB_BITMAP1);<br>
  BITMAP BM;<br>
  m_Bitmap.GetBitmap(&amp;BM);<br>
  m_nWidth = BM.bmWidth;<br>
  m_nHeight = BM.bmHeight;<br>
  }<br>
  // 响应绘制窗口客户区消息<br>
  void CMyWnd::OnPaint()<br>
  {<br>
  CPaintDC dc(this);<br>
  CDC MemDC;<br>
  MemDC.CreateCompatibleDC(NULL);<br>
  MemDC.SelectObject(&amp;m_Bitmap);<br>
  dc.BitBlt(0,0,m_nWidth,m_nHeight,&amp;MemDC,0,0,SRCCOPY);<br>
  }<br>
  // 应用程序类<br>
  class CMinMFCApp: public CWinApp<br>
  {<br>
  public:<br>
  BOOL InitInstance();<br>
  };<br>
  // 应用程序类的成员函数<br>
  // 初始化应用程序实例<br>
  BOOL CMinMFCApp::InitInstance()<br>
  {<br>
  CMyWnd *pFrame = new CMyWnd;<br>
  pFrame-&gt;Create(0,_T("Beautiful Cats”));<br>
  pFrame-&gt;ShowWindow(m_nCmdShow);<br>
  this-&gt;m_pMainWnd = pFrame;<br>
  return TRUE;<br>
  }<br>
  // 全局应用程序对象<br>
  CMinMFCApp ThisApp;</span></p>
<p class=style3>&nbsp;</p>
<p class=style3><strong>7-25 修改11-2,使之可以不同比例放大或缩小图象。<br>
  说 明:使用StretchBlt()函数代替BitBlt()函数就可实现图象的缩放显示。在项目中加入一个弹出式菜单(将标识符改为IDR_MAINMENU),内含3个菜单选项:缩小1倍显示,按原尺寸显示和放大1倍显示,其标识符分别改为ID_SHRINK,ID_BESTFIT和ID_ZOOMOUT。</strong><br>
</p>
<p class=style3>程 序:<br>
  // Example 11-3:以不同尺寸显示BMP图片<br>
  #include &lt;afxwin.h&gt;<br>
  #include "resource.h"<br>
  // 框架窗口类<br>
  class CMyWnd: public CFrameWnd<br>
  {<br>
  CBitmap m_Bitmap;<br>
  float m_fTimes;<br>
  int m_nHeight;<br>
  int m_nWidth;<br>
  public:<br>
  CMyWnd();<br>
  BOOL PreCreateWindow(CREATESTRUCT &amp;cs);<br>
  protected:<br>
  afx_msg void OnPaint();<br>
  afx_msg void OnShrink();<br>
  afx_msg void OnBestFit();<br>
  afx_msg void OnZoomOut();<br>
  DECLARE_MESSAGE_MAP()<br>
  };<br>
  // 消息映射<br>
  BEGIN_MESSAGE_MAP(CMyWnd, CFrameWnd)<br>
  ON_WM_PAINT()<br>
  ON_COMMAND(ID_SHRINK, OnShrink)<br>
  ON_COMMAND(ID_BESTFIT, OnBestFit)<br>
  ON_COMMAND(ID_ZOOMOUT, OnZoomOut)<br>
  END_MESSAGE_MAP()<br>
  // 主窗口类的成员函数<br>
  CMyWnd::CMyWnd()<br>
  {<br>
  BITMAP BM;<br>
  m_Bitmap.LoadBitmap(IDB_BITMAP1);<br>
  m_Bitmap.GetBitmap(&amp;BM);<br>
  m_nWidth = BM.bmWidth;<br>
  m_nHeight = BM.bmHeight;<br>
  m_fTimes = 1.0;<br>
  }<br>
  // 装入菜单<br>
  BOOL CMyWnd::PreCreateWindow(CREATESTRUCT &amp;cs)<br>
  {<br>
  cs.hMenu = LoadMenu(NULL, MAKEINTRESOURCE(IDR_MAINMENU));<br>
  return CFrameWnd::PreCreateWindow(cs);<br>
  }<br>
  // 缩小图象<br>
  void CMyWnd::OnShrink()<br>
  {<br>
  m_fTimes = 0.5;<br>
  Invalidate();<br>
  }<br>
  // 放大图象<br>
  void CMyWnd::OnZoomOut()<br>
  {<br>
  m_fTimes = 2.0;<br>
  Invalidate();<br>
  }<br>
  // 原样显示<br>
  void CMyWnd::OnBestFit()<br>
  {<br>
  m_fTimes = 1.0;<br>
  Invalidate();<br>
  }<br>
  // 响应绘制窗口客户区消息<br>
  void CMyWnd::OnPaint()<br>
  {<br>
  CPaintDC dc(this);<br>
  CDC MemDC;<br>
  MemDC.CreateCompatibleDC(NULL);<br>
  MemDC.SelectObject(&amp;m_Bitmap);<br>
  dc.StretchBlt(0, 0, (int)(m_nWidth*m_fTimes),<br>
  (int)(m_nHeight*m_fTimes),<br>
&amp;MemDC, 0, 0, m_nWidth, m_nHeight, SRCCOPY);<br>
  }<br>
  // 应用程序类<br>
  class CMyApp: public CWinApp<br>
  {<br>
  public:<br>
  BOOL InitInstance();<br>
  };<br>
  // 应用窗口类的成员函数<br>
  // 初始化应用程序实例<br>
  BOOL CMyApp::InitInstance()<br>
  {<br>
  CMyWnd *pFrame = new CMyWnd;<br>
  pFrame-&gt;Create(0,_T("Show Bitmap 1.0"));<br>
  pFrame-&gt;ShowWindow(SW_SHOWMAXIMIZED);<br>
  pFrame-&gt;UpdateWindow(); <br>
  this-&gt;m_pMainWnd = pFrame;<br>
  return TRUE;<br>
  }<br>
  // 全局应用程序对象<br>
  CMyApp ThisApp;</p>
<p class=style3>&nbsp;</p>
<p class=style3><strong>7-26 拼图程序。<br>
  设计思想:将一张图片切分成若干小片,打乱顺序任意显示。用户可用鼠标拖动各小片到正确位置以恢复用来的图象。<br>
  说 明:首先创建一Win32 Application空项目,然后向项目中添加C++ Source File(源程序)和Resource Script(资源描述)文件。在添加资源描述文件后应将其关闭。<br>
  按本单元介绍的有关内容为本程序添加图标、字符串(窗口标题)和下拉菜单(标题为“游戏”)等资源,其标识符均取IDR_MAINFRAME。<br>
  为“游戏”下拉菜单添4个菜单选项,一个是“自动拼图”, 和一个“结束”,标识符分别为ID_BEGIN和ID_END。剩下3个用来控制拼图的难度,标识符分别为ID_GRAD01,ID_GRAD02和ID_GRAD03。<br>
  另选一幅漂亮的图片,作为资源装入项目。该图片即拼图的底图。然后输入以下程序,注意在编译前选择使用MFC。</strong><br>
</p>
<p class=style3>程 序:<br>
  // Example 11-4: 拼图程序<br>
  #include &lt;afxwin.h&gt;<br>
  #include &lt;afxext.h&gt;<br>
  #include &lt;stdlib.h&gt;<br>
  #include &lt;time.h&gt;<br>
  #include "resource.h"<br>
  #define MAX_CHIPS 500<br>
  // 派生一个框架窗口类<br>
  class CPuzzleWnd: public CFrameWnd<br>
  {<br>
  CBitmap m_bmpPuzzle; // 位图<br>
  int m_nPuzzleWidth; // 位图宽<br>
  int m_nPuzzleHeight; // 位图高<br>
  int m_nColCount; // 每行拼图块数<br>
  int m_nRowCount; // 每列拼图块数<br>
  CRect m_rectChips[MAX_CHIPS]; // 每个拼图块的位置<br>
  int m_nChipWidth; // 拼图块宽<br>
  int m_nChipHeight; // 拼图块高<br>
  BOOL m_bCaptured;<br>
  CPoint m_pointMouse;<br>
  int m_nCurrIndex;<br>
  public:<br>
  CPuzzleWnd();<br>
  void InitPuzzle(int colcount, int rowcount);<br>
  protected:<br>
  afx_msg void OnLButtonDown(UINT nFlags, CPoint point);<br>
  afx_msg void OnLButtonUp(UINT nFlags, CPoint point);<br>
  afx_msg void OnMouseMove(UINT nFlags, CPoint point);<br>
  afx_msg void OnPaint();<br>
  afx_msg void OnShowFig();<br>
  afx_msg void OnGrad01();<br>
  afx_msg void OnGrad02();<br>
  afx_msg void OnGrad03();<br>
  DECLARE_MESSAGE_MAP()<br>
  };<br>
  // 消息映射<br>
  BEGIN_MESSAGE_MAP(CPuzzleWnd, CFrameWnd)<br>
  ON_WM_LBUTTONDOWN()<br>
  ON_WM_LBUTTONUP()<br>
  ON_WM_MOUSEMOVE()<br>
  ON_WM_PAINT()<br>
  ON_COMMAND(ID_SHOWFIG, OnShowFig)<br>
  ON_COMMAND(ID_GRAD01, OnGrad01)<br>
  ON_COMMAND(ID_GRAD02, OnGrad02)<br>
  ON_COMMAND(ID_GRAD03, OnGrad03)<br>
  END_MESSAGE_MAP()<br>
  // 主窗口类的成员函数<br>
  // 构造函数: 装入位图资源<br>
  CPuzzleWnd::CPuzzleWnd()<br>
  {<br>
  BITMAP BM;<br>
  m_bmpPuzzle.LoadBitmap(IDB_BITMAP1);<br>
  m_bmpPuzzle.GetObject(sizeof(BM), &amp;BM);<br>
  m_nPuzzleWidth = BM.bmWidth;<br>
  m_nPuzzleHeight = BM.bmHeight;<br>
  InitPuzzle(4, 3);<br>
  m_bCaptured = FALSE;<br>
  }<br>
  // 初始化拼图数组<br>
  void CPuzzleWnd::InitPuzzle(int colcount, int rowcount)<br>
  {<br>
  m_nColCount = colcount;<br>
  m_nRowCount = rowcount;<br>
  m_nChipWidth = m_nPuzzleWidth/m_nColCount;<br>
  m_nChipHeight = m_nPuzzleHeight/m_nRowCount;<br>
  srand((unsigned)time( NULL));<br>
  for(int row=0; row&lt;m_nRowCount; row++)<br>
  for(int col=0; col&lt;m_nColCount; col++)<br>
  {<br>
  int index = row*m_nColCount+col;<br>
  m_rectChips[index].left = rand()%m_nPuzzleWidth+20;<br>
  m_rectChips[index].top = rand()%m_nPuzzleHeight+20;<br>
  m_rectChips[index].right = m_rectChips[index].left<br>
  +m_nChipWidth;<br>
  m_rectChips[index].bottom = m_rectChips[index].top<br>
  +m_nChipHeight;<br>
  }<br>
  }<br>
  // 自动完成拼图<br>
  void CPuzzleWnd::OnShowFig()<br>
  {<br>
  for(int row=0; row&lt;m_nRowCount; row++)<br>
  for(int col=0; col&lt;m_nColCount; col++)<br>
  {<br>
  int index = row*m_nColCount+col;<br>
  m_rectChips[index].left = col*m_nChipWidth;<br>
  m_rectChips[index].top = row*m_nChipHeight;<br>
  m_rectChips[index].right = m_rectChips[index].left<br>
  +m_nChipWidth;<br>
  m_rectChips[index].bottom = m_rectChips[index].top<br>
  +m_nChipHeight;<br>
  }<br>
  Invalidate();<br>
  }<br>
  // 设置一级难度<br>
  void CPuzzleWnd::OnGrad01()<br>
  {<br>
  InitPuzzle(4, 3);<br>
  Invalidate();<br>
  }<br>
  // 设置二级难度<br>
  void CPuzzleWnd::OnGrad02()<br>
  {<br>
  InitPuzzle(8, 6);<br>
  Invalidate();<br>
  }<br>
  // 设置三级难度<br>
  void CPuzzleWnd::OnGrad03()<br>
  {<br>
  InitPuzzle(16, 12);<br>
  Invalidate();<br>
  }<br>
  // 按下鼠标左键 <br>
  void CPuzzleWnd::OnLButtonDown(UINT nFlags, CPoint point)<br>
  {<br>
  for(int row=m_nRowCount-1; row&gt;=0; row--)<br>
  for(int col=m_nColCount-1; col&gt;=0; col--)<br>
  {<br>
  int index = row*m_nColCount+col;<br>
  if(m_rectChips[index].PtInRect(point))<br>
  {<br>
  SetCapture();<br>
  m_bCaptured = TRUE;<br>
  m_pointMouse = point;<br>
  m_nCurrIndex = index;<br>
  return;<br>
  }<br>
  }<br>
  }<br>
  // 释放鼠标左键<br>
  void CPuzzleWnd::OnLButtonUp(UINT nFlags, CPoint point)<br>
  {<br>
  if(m_bCaptured)<br>
  {<br>
  ::ReleaseCapture();<br>
  m_bCaptured = FALSE;<br>
  }<br>
  }<br>
  // 移动鼠标左键<br>
  void CPuzzleWnd::OnMouseMove(UINT nFlags, CPoint point)<br>
  {<br>
  if(m_bCaptured)<br>
  {<br>
  InvalidateRect(m_rectChips[m_nCurrIndex]);<br>
  CSize offset(point-m_pointMouse);<br>
  m_rectChips[m_nCurrIndex] += offset;<br>
  InvalidateRect(m_rectChips[m_nCurrIndex], FALSE);<br>
  m_pointMouse = point;<br>
  }<br>
  }<br>
  // 显示当前拼图<br>
  void CPuzzleWnd::OnPaint()<br>
  {<br>
  CPaintDC dc(this);<br>
  CDC MemDC;<br>
  MemDC.CreateCompatibleDC(NULL);<br>
  MemDC.SelectObject(&amp;m_bmpPuzzle);<br>
  for(int row=0; row&lt;m_nRowCount; row++)<br>
  for(int col=0; col&lt;m_nColCount; col++)<br>
  {<br>
  int index = row*m_nColCount+col;<br>
  dc.BitBlt(m_rectChips[index].left,<br>
  m_rectChips[index].top,<br>
  m_nChipWidth,<br>
  m_nChipHeight,<br>
&amp;MemDC,<br>
  col*m_nChipWidth,<br>
  row*m_nChipHeight,<br>
  SRCCOPY);<br>
  }<br>
  }<br>
  // 应用程序类<br>
  class CPuzzleApp: public CWinApp<br>
  {<br>
  public:<br>
  BOOL InitInstance();<br>
  };<br>
  // 初始化应用程序实例<br>
  BOOL CPuzzleApp::InitInstance()<br>
  {<br>
  CPuzzleWnd *pFrame = new CPuzzleWnd;<br>
  pFrame-&gt;LoadFrame(IDR_MAINMENU);<br>
  pFrame-&gt;ShowWindow(SW_SHOWMAXIMIZED);<br>
  this-&gt;m_pMainWnd = pFrame;<br>
  return TRUE;<br>
  }<br>
  // 全局应用程序对象<br>
  CPuzzleApp TheApp;</p>
<p class=style3>// Example 11-5: 地空战游戏程序<br>
  #include &lt;afxwin.h&gt;<br>
  #include "resource.h"</p>
<p class=style3>// 定义飞机类<br>
  class CPlane: public CObject<br>
  {<br>
  CPoint m_pointPlane; // 飞机位置<br>
  CBitmap m_bmpPlane; // 飞机图象<br>
  int m_nWidth; // 飞机图象宽<br>
  int 

⌨️ 快捷键说明

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