首先打开MFC窗口编辑,在右侧属性一栏会找到Border、Maximize Box和Minimize Box三个选项,将Border改为Resizing,Maximize Box改为True,Minimize Box改为True,那么你编写的MFC窗口就可以实现改变大小和最小化、最大化的功能,前提是你编写的MFC程序没有错误,可以调试出界面。
? ? ? ? ? ? ?
我这几天学了点MFC编程,在网上偶然看见了用MFC编写的扫雷,老看理论不实践是不行的,就自己模仿编写了个扫雷小游戏,编写过程中果然发现很多问题.
? ? ? ? 首先是前几天学MFC时知道的函数忘完了,在用时,一MSDN一百度才发现还有这么个东西存在(⊙﹏⊙),再来就是看教程时以为很熟悉的WM—类型的消息处理函数,以及加成员变量等在真正自己处理时都没那么简单,还有就是MFC的各个类之间的关联消息处理根本不知道!!!在做这个小游戏的时候,加一些消息处理以及成员变量,都需要看网上教程中加在哪,我曾自己试着加,各种茫然~~~
? ? ? ? 总之通过这个小游戏编写,发现自己很多问题,告诫自己以后看书,看资料要切忌浮躁!!!
? ? ? ? 开始编写步骤(我用的VS2010):
1.创建MFC单文档应用程序
2.切换到资源视图
? ? ? ? 点击Bitmap,按顺序加入14*14的位图12张,同样按顺序加入30*30的位图4张,如图:
ANNIU系列位图自绘为:,,,。
BITMAP系列自绘为:,到的数字,后几幅为,,。
定义新类:
对于雷,我们是单独定义一个类,这样有利于程序的操作。
??????? class Lei
{
public:
??? //显示哪一个位图
?????? int weitu;
??? //这个位置相应的值
?????? int shumu;
};
视图类变量:?(最好在类向导中自动添加,直接在代码中写要修改好几个地方)
接着是在View类添加变量和函数:
//剩下雷数
int leftnum;
//雷数
?????? int leinum;?????
//结束????
?????? int jieshu;
//计时
?????? short second;
//开始计时
?????? int secondstart;
//位图数组
?????? CBitmap m_Bitmap[12];
//按扭位图数组
?????? CBitmap m_anniu[4];
//雷区行数
?????? int m_RowCount;
//雷区列数
?????? int m_ColCount;
//最大雷区
????????????? Lei lei[50][50];
?
??? //这个位置周围雷数为0
?????? void leizero();
??? //计时器函数
?????? afx_msg void OnTimer(UINT nIDEvent);
??? //鼠标按下左键
?????? afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
//鼠标按下右键
?????? afx_msg void OnRButtonDown(UINT nFlags, CPoint point);
??? //初始化函数
?????? afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
??? //鼠标左键松开
?????? afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
删去工具栏:(在CMainFrame::OnCreate函数中注释掉创建工具栏)
可以在return 0前加上这几句,自定义自己的图标
m_hIcon=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDI_ICON1));//加载自定义图标 SetClassLong(m_hWnd,GCL_HICON,(LONG)m_hIcon);//将当前图标变换为自己定义的
设置窗口显示在最前端:
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) { if( !CFrameWndEx::PreCreateWindow(cs) ) return FALSE; // TODO: 在此处通过修改 // ?CREATESTRUCT cs 来修改窗口类或样式 ? ? ? cs.dwExStyle=WS_EX_TOPMOST; ?// www.webguidecorpuschristi.com=WS_SYSMENU|WS_OVERLAPPED|WS_MINIMIZEBOX;//加上的话就不能调窗口大小了 ? ? ? ?//设置窗口大小: ? ? ? ?www.webguidecorpuschristi.com=395; ? www.webguidecorpuschristi.com=320; ? cs.lpszName=_T("扫雷");//换标题 return TRUE; }
构造函数:
由于构造函数是程序运行时就执行的,所以,除了对变量赋值之外,我们还可以把游戏的核心结构即内部数组赋值:先是把全部格子的位图和雷数赋值为0,然后调用随机函数按指定雷数赋值为-1,最后把不是雷的格子的雷数赋值为相应的值。
CMy2_1扫雷View::CMy2_1扫雷View()
: leftnum(0)
{
// TODO: 在此处添加构造代码
for(int ii=0;ii<12;ii++)
m_Bitmap[ii].LoadBitmap(IDB_BITMAP14+ii);//给每个m_Bitmap[]数组加载图像
for(int jj=0;jj<4;jj++)
m_anniu[jj].LoadBitmap(IDB_ANNIU1+jj);//同上
//计时
second=0;
//1时开始计时
secondstart=0;
//行数
m_RowCount=25;
//列数
m_ColCount=16;
//雷数
leinum=80;
//剩余雷数
leftnum=leinum;
//jieshu=1时停止
jieshu=0;
int aa=0;
//初始化为0