📄 chapter7.htm
字号:
pFrame->SetIcon(hIcon, TRUE); // 设置大图标<br>
pFrame->SetIcon(hIcon, FALSE); // 设置小图标<br>
pFrame->ShowWindow(m_nCmdShow);<br>
this->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 <afxwin.h><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(&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(&m_Bitmap);<br>
dc.BitBlt(0,0,m_nWidth,m_nHeight,&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->Create(0,_T("Beautiful Cats”));<br>
pFrame->ShowWindow(m_nCmdShow);<br>
this->m_pMainWnd = pFrame;<br>
return TRUE;<br>
}<br>
// 全局应用程序对象<br>
CMinMFCApp ThisApp;</span></p>
<p class=style3> </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 <afxwin.h><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 &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(&BM);<br>
m_nWidth = BM.bmWidth;<br>
m_nHeight = BM.bmHeight;<br>
m_fTimes = 1.0;<br>
}<br>
// 装入菜单<br>
BOOL CMyWnd::PreCreateWindow(CREATESTRUCT &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(&m_Bitmap);<br>
dc.StretchBlt(0, 0, (int)(m_nWidth*m_fTimes),<br>
(int)(m_nHeight*m_fTimes),<br>
&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->Create(0,_T("Show Bitmap 1.0"));<br>
pFrame->ShowWindow(SW_SHOWMAXIMIZED);<br>
pFrame->UpdateWindow(); <br>
this->m_pMainWnd = pFrame;<br>
return TRUE;<br>
}<br>
// 全局应用程序对象<br>
CMyApp ThisApp;</p>
<p class=style3> </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 <afxwin.h><br>
#include <afxext.h><br>
#include <stdlib.h><br>
#include <time.h><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), &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<m_nRowCount; row++)<br>
for(int col=0; col<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<m_nRowCount; row++)<br>
for(int col=0; col<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>=0; row--)<br>
for(int col=m_nColCount-1; col>=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(&m_bmpPuzzle);<br>
for(int row=0; row<m_nRowCount; row++)<br>
for(int col=0; col<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>
&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->LoadFrame(IDR_MAINMENU);<br>
pFrame->ShowWindow(SW_SHOWMAXIMIZED);<br>
this->m_pMainWnd = pFrame;<br>
return TRUE;<br>
}<br>
// 全局应用程序对象<br>
CPuzzleApp TheApp;</p>
<p class=style3>// Example 11-5: 地空战游戏程序<br>
#include <afxwin.h><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 + -