基础篇 精通Visual C++图像编程 MFC中文帮助 MFC程序员的WTL指南 VC6从入门到精通-开发者眼中的VC VC6从入门到精通-附录 MS VC++60程序员指南 VC6从入门到精通-基础篇 VC6从入门到精通-VC与INTERNET Visual C++ 使用指南 Visual C++知识库 Visual C++ MFC入门教程 Visual C++ 6 参考大全 跟我学 VISUAL C++ 60 Visual C++ 60语言参考手册 Visual Lisp开发人员手册 Visual C++ 从入门到精通 Visual J++ 60 WFC 类库手册 Visual InterDev 从入门到精通 Visual C++ 60用户开发手册 VC编程指南 VC++60 类库参考手册 VC++database编程大全 VC60 运行库参考手册 Visual C++60运行库参考手册 VC++60模板库手册 VC++面向对象入门 VC新手学堂 Visual C++ 60预处理器参考手册 VC50开发人员参考手册 VC6中文版程序员开发指南 Visual J++ 60 WFC类库参考手册一 VC6 模板库参考手册 VC++编程指南 Visual J++ 60 WFC类库参考手册二 VC60 MFC类库参考手册 VC6从入门到精通-VC与数据库管理 MS VC++ 60 MFC类库参考手册 一 MS VC++ 60 MFC类库参考手册 二 走进Visual C++ 实例篇 Visual C++ 实践与提高-图形图像编程篇 Visual C++ 数字图像处理 VC-MFC编程实例 Visual C++实践与提高_环境剖析IDE篇 Visual C++程序设计:基础与实例分析 Visual C++ 60实例 Visual C++课程设计案例精编 Visual C++ 60开发与实例 VISUAL C++扩展编程实例 Visual C++60高级编程技巧与实例 VC++扩展编程实例 Visual C++编程技巧与范例 战胜Visual C++必做练习50题 Visual C++60编程与实例解析 VC-MFC扩展编程实例 MFC资源大全 精通Visual C++ 60 Visual C++程序模块集锦 Visual C++_Turbo C串口通信编程 Visual C++ 60应用编程150例 Visual C++ 60实例教程电子教案 教程篇 MFC Windows程序设计 Visual C++网络通信协议分析 VC60数据库编程 Visual C++ 学习教程 Visual_C++_新起点—60实用教程 Visual C++ 6-24学时学习教程 Visual C++ 60 21天自学教程 VC++网络教程 Visual C++ MFC 简明教程 VC 数据库编程三部教学 Visual C++ 60 数据库编程大全 VC新手学堂简明教程 Visual C++ 60 开发宝典 Visual C++ 60 教程 Visual C++ 60 高级编程 VC++60培训教程 Visual J++ 60 即学即用 Visual C++与面向对象程序设计教程 Visual C++60高级开发教程 Visual C++NET 宝典 Visual C++50 程序设计 技术与应用 VC++60 用户界面制作技术与应用实例 深入浅出WINDOWS MFC程序设计 Visual C++ 角色扮演游戏程序 Visual C++60程序设计提高篇 VC++编程资料 VC++ 函数经典 VC++与Matlab混合编程的快速实现 Visual C++ 50易学活用 VISUAL C++ 设计WIN32应用程序 Visual C++入门与应用 Visual C++60开发宝典 Visual C++60技术内幕 VC++6编程方法 深入VC编程内幕 VC编程经验总结 用VC++编写USB接口通信程序 用VC开发CGI 疯狂VC技巧集 VC6开发宝典 Visual C++经典 Visual C++ 6 轻松进阶 VC编程常用捷径 MFC技术内幕 VC深入编程 >
因为你在VC下编写的程序用到了VC的函数库,比如socket这个套接口函数在VC中的头文件时WinSockh 而到了Linux系统下的编辑器g++中 就是netinet/inh了 当然不会通过编译。而且VC编译器把你得程序生成目标文件 连接函数库这些过程都给你做好了。但是在别的编辑器下 比如g++这些都要你自己来写makefile文件来完成。
1模态
dlg->Domodal();
2非模态
dlg->Create(IDD_DIALOG2,this);
dlg->ShowWindow(sw_show);
3子对话框(这种不是d出的那种,是放置在父对话框上,因此在对话框属性上把Popup改成child)
Crect rc;
GetClientRect(&rc);
dlg->Create(IDD_DIALOG2,this);
dlg->MoveWindow(&rc);
dlg->ShowWindow(sw_show);
在图形用户界面中,对话框(又称对话方块[1])是一种特殊的视窗, 用来在用户界面中向用户显示信息,或者在需要的时候获得用户的输入响应。之所以称之为“对话框”是因为它们使计算机和用户之间构成了一个对话——或者是通知用户一些信息,或者是请求用户的输入,或者两者皆有。
不同的用户交互使用不同的对话框。最简单的对话框是警告,它显示一个信息并且仅仅需要一个信息已读的响应(通常是单击'确定'按钮或“关闭”命令的对话框)。用来为一个 *** 作提供警告和简单的确认,也可能包括程序终止或崩溃的提示,以及用户有意或无意的关闭动作。
虽然对于有模式对话框来说,这是个经常性的交互模式,但是由于它被认为在防止非预期的破坏性 *** 作上不够有效以及存在更好的替换方案[2]而遭到可用性专家的批评。显示一般提示信息的对话框,可以设计为提示气泡等形式来避免打断用户 *** 作。
3 要点分析
蛇的活动区域是由若干个小方格组成的。当这些小方格呈现灰色时,便表示蛇身。设整个区域由m×n个方格组成,最左上角的方格坐标为(0, 0)。蛇是由若干个邻的方格组成的,将这些方格的坐标依蛇头至蛇尾的次序存入到一个数组中便代表了蛇身。当蛇在游戏区域中“游动”一格时,所对应的数组 *** 作应该是,将新的位置坐标插入到数组头部,同时将数组中最后一个元素删除。这项工作可以用一个一般的数组来完成,但当进行插入 *** 作时需要自己移动数组中的元素;也可以使用CArray来完成这些工作,CArray的成员函数提供了需要的 *** 作,这样做简单一些。
4 解题步骤
(1)新建工程Snake,在MFC的向导第一步选择Single Document,按Finish结束。
(2)选择ResourceView窗口,打开菜单编辑器,在顶层菜单上添加一个名为“游戏”的d出式菜单,该菜单下再添加一个名为“开始”的子菜单,其ID为ID_GAME_START,如图1所示。
图1 菜单的设计
(3)在ClassWizard中为刚才编辑好的菜单添加消息处理函数。打开ClassWizard,选中Message Maps页。在Class Name中选择CSnakeView,在Object ID中选择ID_GAME_ START,在Messages中选择COMMAND,添加消息处理函数。
(4)在ClassWizard中添加键盘消息处理函数。打开ClassWizard,选中Message Maps页。在Class Name中选择CSnakeView,在Object ID中选择CSnakeView,在Messages中选择WM_KeyDown,添加消息处理函数。
(5)在ClassWizard中定时器消息添加处理函数。打开ClassWizard,选中Message Maps页。在Class Name中选择CSnakeView,在Object ID中选择CSnakeView,在Messages中选择WM_Timer,添加消息处理函数。
(6)编辑生成的代码,完成程序。
4 源程序清单
(1) 选择ClassView窗口,双击CSnakeView类,添加如下成员变量。并添加头文件:
#include <Afxtemplh>
class CSnakeView : public CView
{
//此处略去若干行由系统生成的代码
private:
void ReDisplay(CPoint pPoint);
void IniGame();
void IniAim();
int m_nLeft, m_nTop, m_nWidth, m_nHeight, m_nSize; // 起始坐标,宽/高度(格数),每格大小
int m_nDirect; // 当前方向
// 1-右,2-左,3-下,4-上
CPoint m_pAim; // 当前目标坐标
CArray < CPoint, CPoint > m_aBody; // 蛇身
int m_nGameStatus; // 游戏状态:0-未开始,1-开始
int m_nCount; // 吃掉目标数
int m_nTime, m_nTime1; // 用时间
};
(2)在CSnakeView Cpp文件,添加3个成员函数IniAim、IniGame和ReDiaplay:
// 该函数随机产生一个供蛇吃的目标,如果该目标恰巧与蛇身重合,则重新产生一个
void CSnakeView::IniAim()
{
int uX, uY; // 目标位置
while (1)
{
uX=rand ( ) % m_nHeight;
uY=rand ( ) % m_nWidth;
int uTag = 0; // 0-不与蛇身重合,1-重合
for (int i=0;i <= m_aBody GetUpperBound ( );i++)
{
CPoint uPoint = m_aBody GetAt (i);
if (uPoint x == uX ||uPoint y == uY ) // 目标与蛇身重合
{
uTag = 1;
break;
}
}
if (uTag == 0)
break;
}
m_pAim = CPoint (uX, uY); // 产生的目标存放在成员变量中
}
// 该函数对游戏初始化,定义游戏的初始状态
void CSnakeView::IniGame()
{
// 游戏区域
m_nLeft = 20;
m_nTop = 20;
m_nWidth = 40;
m_nHeight = 30;
m_nSize = 10;
// 游初始状态
m_nGameStatus = 0;
m_nDirect = 1;
m_nCount = 0;
// 初始化蛇身
m_aBody RemoveAll ( );
m_aBody Add ( CPoint (2, 7) );
m_aBody Add ( CPoint (2, 6) );
m_aBody Add ( CPoint (2, 5) );
m_aBody Add ( CPoint (2, 4) );
// 计时器清零
m_nTime = 0;
m_nTime1 = 0;
// 初始化随机数发生器
srand ( (unsigned) time (NULL) );
// 产生一个目标
IniAim ( );
}
// 刷新游戏区域中pPoint处的一个小方格
void CSnakeView::ReDisplay(CPoint pPoint)
{
InvalidateRect (CRect (m_nLeft + pPoint y m_nSize, m_nTop + pPoint x m_nSize,
m_nLeft + (pPoint y + 1) m_nSize, m_nTop + (pPoint x + 1) m_nSize) );
}
(3)修改CSnakeView的构造函数,完成游戏的初始化。
CSnakeView::CSnakeView()
{
IniGame();
}
(4)在OnDraw中加入代码,显示游戏界面。
void CSnakeView::OnDraw(CDC pDC)
{
CSnakeDoc pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
// 画游戏区域
pDC -> SelectStockObject (WHITE_BRUSH);
pDC -> Rectangle (CRect (m_nLeft - 1, m_nTop - 1, m_nLeft + m_nWidth m_nSize + 1,
m_nTop + m_nHeight m_nSize + 1) );
// 显示当前用时
CString uStr;
uStr Format ("当前用时:% d", m_nTime);
pDC -> TextOut (m_nLeft + m_nWidth m_nSize + 30, 40, uStr);
// 显示当前得分
uStr Format ("当前得分: % d", m_nCount);
pDC -> TextOut (m_nLeft + m_nWidth m_nSize + 30, 140, uStr);
// 显示目标
pDC -> SelectStockObject (LTGRAY_BRUSH);
pDC -> Rectangle (CRect (m_nLeft + m_pAim y m_nSize, m_nTop + m_pAim x m_nSize,
m_nLeft + (m_pAim y + 1) m_nSize, m_nTop + (m_pAim x + 1 ) m_nSize ));
// 画蛇
for (int i=0; i<= m_aBody GetUpperBound (); i++)
{
CPoint uPoint = m_aBody GetAt (i);
pDC -> Rectangle (CRect (m_nLeft + uPoint y m_nSize, m_nTop + uPoint x m_nSize,
m_nLeft + (uPoint y + 1) m_nSize, m_nTop + (uPoint x + 1) m_nSize) );
}
}
(5)为游戏菜单下的开始项的消息映射函数添加代码。
void CSnakeView::OnGameStart()
{
// 启动游戏,启动定时器
IniGame ( );
m_nGameStatus = 1;
SetTimer (1, 100, NULL);
Invalidate ( );
}
(6)为键盘按键消息处理函数添加代码。
// 根据按下的方向键设置代表不同方向的值
void CSnakeView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
switch (nChar)
{
case 38:
m_nDirect = 4;
break;
case 40:
m_nDirect = 3;
break;
case 37:
m_nDirect = 2;
break;
case 39:
m_nDirect = 1;
break;
}
CView::OnKeyDown(nChar, nRepCnt, nFlags);
}
(7)为定时器消息处理函数添加代码。
void CSnakeView::OnTimer(UINT nIDEvent)
{
m_nTime1++; // 计时
if (m_nTime1 == 10) // 达到1秒
{
m_nTime++;
m_nTime1 = 0;
Invalidate ( );
}
CPoint uPoint = m_aBody GetAt (0); // 蛇头的位置
int uTag = 0; //是否失败
switch (m_nDirect) // 判断下一步蛇是否出界
{
case 1: // right
uPoint y++;
if (uPoint y >= m_nWidth)
uTag = 1;
break;
case 2: // left
uPoint y--;
if (uPoint y < 0)
uTag = 1;
break;
case 3: // down
uPoint x++;
if (uPoint x >= m_nHeight)
uTag = 1;
break;
case 4: // up
uPoint x--;
if (uPoint x < 0)
uTag = 1;
break;
}
if (uTag ==0) // 判断蛇是否碰到了自身
{
for (int i=0; i <= m_aBodyGetUpperBound(); i++)
{
CPoint uPoint1 = m_aBody GetAt (i);
if (uPoint1 x == uPoint x && uPoint1y == uPoint y)
{
uTag = 1;
break;
}
}
}
if (uTag == 0)
{
m_aBody InsertAt (0, uPoint); // 新的蛇头的位置
ReDisplay (uPoint);
if (uPoint x == m_pAim x && uPoint y == m_pAim y) // 碰上目标
{
m_nCount++;
IniAim ( );
Invalidate ( );
}
else
{
CPoint uPoint1 = m_aBody GetAt (m_aBodyGetUpperBound ( ) );
m_aBody RemoveAt (m_aBodyGetUpperBound ( ) );
ReDisplay (uPoint1);
}
}
else // 游戏结束
{
KillTimer(1);
AfxMessageBox("Fail!");
}
CView::OnTimer(nIDEvent);
}
以上就是关于谁有MFC编写软件的详细教程全部的内容,包括:谁有MFC编写软件的详细教程、请问申请软件著作权时 用MFC 编写的程序,编程语言写什么程序量是所有的.h和.cpp文件中行数、MFC编写简单程序时,能正确运行,但是却出现红色波浪线,怎么回事如下图等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)