当前位置:首页 >> 其它课程 >> Windows游戏编程复习资料For2014期末考试

Windows游戏编程复习资料For2014期末考试


?考试题型

1. 选择 20分 10个
2. 填空 20分 10个
3. 判断 10分 10个
4. 简答 20分 5个
5. 代码 30分 20个



选择题:

1. 系统消息与用户消息

系统消息:由

系统定义和使用的消息
用户消息:由应用程序定义和使用的消息

2. CxImage

CxImage类库是一个优秀的图像操作类库。它可以快捷地存取、显示、转换各种图像。

3. 定时器SetTimer()的参数

UINT_PTR SetTimer(
HWND hWnd, // 窗口句柄
UINT_PTR nIDEvent, // 定时器ID
UINT nElapse, // 时间间隔,单位为毫秒
TIMERPROC lpTimerFunc // 回调函数
);

回调函数void CALLBACK TimerProc();

举例 SetTimer(hWnd,1,500,NULL);

4. GDI

获取和释放设备相关函数:

GetDC(); ReleaseDC(); //可以在非WM_PAINT中

BeginPaint(); EndPaint(); //只能在WM_PAINT中

5. GetMessage 和 PeekMessage

PeekMessage(); //无论消息队列中是否有消息,都立即返回
GetMessage(); //如果程序没有收到任何输入或消息就不返回,程序无法继续执行下去

6. VC\DLL

Non-MFC DLL 非MFC动态库
MFC Regular DLL MFC规则DLL
MFC Extansion DLL MFC扩展DLL

7. DIB

DIB是设备无关位图(Device Independent Bitmap),这是一种文件格式,是为了保证由某个应用程序创建的位图图形可以被其它应用程序装载或显示。

DIB一般是以*.BMP文件的形式保存在磁盘中的

8. 键码表

虚拟键码保存在WM_KEYDOWN、WM_KEYUP、WM_SYSKEYDOWN和WM_SYSKEYUP讯息的wParam参数中。此代码标识按下或释放的键。P47

常见的:
VK_LBUTTON 1 鼠标左键
VK_RBUTTON 2 鼠标右键
VK_MBUTTON 4 鼠标中键  
VK_BACK 8 Backspace
VK_TAB 9 Tab
VK_RETURN 13 Enter
VK_SHIFT 16 Shift
VK_CONTROL 17 Ctrl
VK_MENU 18 Alt


填空题:

1. Windows基于【事件】的驱动系统

2. 常见的Windows消息

WM_CREATE 应用程序创建一个窗口

WM_DESTROY 一个窗口被销毁

WM_PAINT要求一个窗口重绘自己

WM_CLOSE 当一个窗口或应用程序要关闭时发送一个信号

WM_COMMAND 选择窗口菜单项或某个控件发送一条消息给它的父窗口或按下一个快捷键时产生此消息

WM_TIMER 发生了定时器事件

WM_CHAR 按下某键,当TranslateMessage()转发WM_KEYDOWN后发送本消息

WM_LBUTTONDOWN 按下鼠标左键时发送此消息

WM_LBUTTONUP 释放鼠标左键时发送此消息


3. 设备上下文(device context)包括【设备DC】和【内存DC】

4. CreateWindow()的参数填写:

hBtn = CreateWindow(
"button", //子窗口类
"创建的按钮", //标题
WS_CHILD|WS_VISIBLE, //风格
100,100,90,28, //坐标
m_hWnd, //父窗口句柄
NULL, //标识符
AfxGetInstanceHandle(), //当前的句柄
0); //传递窗口的参数值指针

5. 对话框分为【模态对话框】与【非模态对话框】

简答题:

1. 控件的创建方式有哪2种?

(1)资源窗口创建

(2)代码创建 hBtn = CreateWindow( //按钮创建
"button",
"创建的按钮",
WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON|BS_CENTER|BS_VCENTER,
100,100,90,28,
m_hWnd,
NULL,
AfxGetInstanceHandle(),
0);

2. GetDC、BeginPaint的区别的是什么?

答:
GetDC使用较为广泛,操作区域为整个客户区,由ReleaseDC释放。

BeginPaint只用于窗口重绘函数WM_PANIN当中,操作区域为无效区域,由EndPaint释放。

3. API的概念

答:
应用程序接口(Application Programming Interface)

所有win32的平台上运行的应用程序都可以调用这些API函数、结构、消息、宏和接口。

4. SDK的概念

答:
软件开发工具包(Software Development Kit)

提供了应用程序开发所需要的各种头文件、库文件、帮助文档、各种工具以及例程。

5. MFC的概念

答:
微软基础内裤(类库 Microsoft Foundation Classes)

以C++的形式对WindowsAPI的高级封装的应用程序框架,以减少应用程序开发人员的工作量。

6. 进队消息和非进队消息的区别

答:
进队消息(各种输入):由Windows放入程序消息队列,再发送给窗口函数。

非进队消息(特定API):在调用窗口函数时直接发送给窗口函数。

7. WM_PAINT()函数是什么

答:由于在图形环境下,需要保留的数据太多,WIndows不会保存整个客户区的内容。所以当客户区无效后并重新显示时,Windows会向该窗口发送WM_PAINT消息,使得程序猿有机会重新绘制窗口,以便和无效前的窗口一致。

其中包括窗口移动后的重绘\被覆盖区域的重绘\对象穿越后的重绘\强制重绘。

8. DC(设备上下文)是什么

答:设备上下文是WindowsGDI内部保存数据的一种数据结构,它定义了各种GDI函数在设备特定区域的工作方式,定义了一系列的图形对象、相关的属性及绘图模式等一些信息。


程序:

1. 打字文件保存程序参考代码
2. 涂鸦快捷切换程序参考代码


//打字保存程序参考代码

#include <Windows.h>
#include <tchar.h>
#include <string>
#include "resource.h"

using namespace std;

//声明回调函数
LRESULT CALLBACK WndProc(HWND hWnd,
UINT msg,
WPARAM wParam,
LPARAM lParam
);

//窗口类名和窗口标题
const TCHAR szWindowClass[] = "第一个窗口";
const TCHAR szWindowTitle[] = "主窗口标题";

//WinMain函数,入口点
int WINAPI _tWinMain (HINSTANCE hInstance,
HINSTANCE hPreInstance,
LPTSTR lpCmdLine,
int nCmdShow){

//注册窗口类
WNDCLASSEX wcex = {0};
//窗口结构体类
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = (WNDPROC)WndProc;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon(NULL,IDC_ARROW);//使用系统默认图标
wcex.hCursor = LoadCursor(NULL,IDC_ARROW);//使用系统默认光标
wcex.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);//灰色画刷
wcex.lpszClassName = szWindowClass;
wcex.lpszMenuName = MAKEINTRESOURCE(IDR_MENU1);

//创建窗口
RegisterClassEx(&wcex);

HWND hWnd = CreateWindow(
szWindowClass,//窗口类名
szWindowTitle,//窗口标题
WS_OVERLAPPEDWINDOW,//窗口风格
100,200,500,500,//左上角坐标以及宽度‘高度
HWND_DESKTOP,
NULL,
hInstance,
NULL
);

if (!hWnd)//如果窗口创建失败则退出
{
return FALSE;
}

//显示并更新窗口
ShowWindow(hWnd,nCmdShow);
UpdateWindow(hWnd);

//进入消息循环
MSG msg;
while(GetMessage(&msg,NULL,0,0)){
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;

}

//窗口函数,用于消息处理
LRESULT CALLBACK WndProc(HWND hWnd,
UINT msg,
WPARAM wParam,
LPARAM lParam){

static string str;

switch(msg){

case WM_CHAR:{
switch(wParam){
case 8:{//处理BackSpace
if (str.size() == 0){//如果字符串为空,则直接返回
return 0;
}
str.erase(str.size()-1,1);//删除string的最后一个字符
break;
}
default://把获取的字符直接添加到字符的最后
str+=TCHAR(wParam);
}
InvalidateRect(hWnd,NULL,TRUE);//刷新窗口
return 0;
}

case WM_PAINT:{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hWnd,&ps);
RECT r;
GetClientRect(hWnd,&r);
SetTextColor(hdc,RGB(255,0,0));//设置字体颜色
DrawText(hdc,str.c_str(),-1,&r,DT_WORDBREAK|DT_LEFT|DT_TOP);
EndPaint(hWnd,&ps);
return 0;
}

case WM_DESTROY:{
PostQuitMessage(0);
return 0;
}

case WM_COMMAND:{

static HINSTANCE hInst;

switch(LOWORD(wParam)){
case ID_ABOUT:{
MessageBox(NULL,"yeah!","恭喜",MB_OK);
return true;
}
case ID_MY_FILE_OPEN:{

TCHAR filename[MAX_PATH] = "";//要打开的文件名
OPENFILENAME of = {sizeof(OPENFILENAME)};
of.hwndOwner = hWnd;
of.hInstance = hInst;
of.lpstrFilter = "打字文件(*.txt)\0*.txt\0";//设计文件类型下拉列表
of.nFilterIndex = 1;//默认文件类型的序号
of.lpstrFile = filename;//指定用于保存文件名的缓冲区
of.nMaxFile = MAX_PATH;//最大的文件名长度
of.nMaxFileTitle = MAX_PATH;
of.Flags = OFN_PATHMUSTEXIST|
OFN_FILEMUSTEXIST|
OFN_EXPLORER|
OFN_HIDEREADONLY;

//使用系统提供的对话框样式,只能打开已存在的文件,隐藏只读选项
if(GetOpenFileName(&of)==TRUE){

//allScrawls.empty();//清空现有的图形

//用读取文件的方式打开文件
HANDLE hFile=CreateFile(filename,
GENERIC_READ,
0,NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL
);

while(TRUE)//将所有的数据读出
{
DWORD bytesRead;//定义文件读取游标
char m_ch[1000];//定义临时存放字符数组

ReadFile(hFile,&m_ch,1000,&bytesRead,NULL);//开始读取
m_ch[bytesRead]=0;//字符数组最后加文件结尾

if(bytesRead==0) break;//如果没有读到东西,就返回

//把读到的字符数组放置到全局变量str中
string m_str(m_ch);
str = m_str;
}
CloseHandle(hFile);
InvalidateRect(hWnd,NULL,TRUE);//刷新客户区
}
return TRUE;
}

case ID_MY_FILE_SAVE:{

TCHAR filename[MAX_PATH] = ""; //用于保存的文件名
TCHAR strDefExt[] = "bat"; //默认拓展名
OPENFILENAME of = {sizeof(OPENFILENAME)};
of.hwndOwner = hWnd;
of.hInstance = hInst;
of.lpstrFilter = "打字文件(*.txt)\0*.txt\0"; //设计文件类型下拉列表
of.nFilterIndex = 1; //默认文件类型的序号
of.lpstrFile = filename; //指定用于保存文件名的缓冲区
of.nMaxFile = MAX_PATH; //最大的文件名长度
of.lpstrDefExt = strDefExt; //指定默认拓展名
of.Flags = OFN_EXPLORER; //使用体统提供的样式

if(GetSaveFileName(&of)==TRUE){

HANDLE hFile=CreateFile(
filename,
GENERIC_WRITE,
0,
NULL,
CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
NULL
);

DWORD bytesToWrite;//定义文件写入游标

char m_ch[1000];//定义临时存放字符数组
strcpy(m_ch,str.c_str());//拷贝全局变量str到临时变量
m_ch[str.size()]=0;//字符数组最后加文件结尾

//把所有的字符串写入文件
WriteFile(hFile,&m_ch,1000,&bytesToWrite,NULL);
CloseHandle(hFile);
}
return TRUE;
}


}
return FALSE;

}

default:
return DefWindowProc(hWnd,msg,wParam,lParam);

}
}

//________________________________________________________________

// 涂鸦程序参考代码

//________________________________________________________________

//使用编程的方法在窗口绘制矩形要求红色

#include <Windows.h>
#include <tchar.h>
#include <string>
#include <math.h>
#include <vector>

using namespace std;

//声明回调函数
LRESULT CALLBACK WndProc(HWND hWnd,
UINT msg,
WPARAM wParam,
LPARAM lParam
);

//窗口类名和窗口标题
const TCHAR szWindowClass[] = "第一个窗口";
const TCHAR szWindowTitle[] = "主窗口标题";

//定义各种线条形状
enum SCRAWLTYPE{SCRAWLLINE,SCRAWLRECTANGLE,SCRAWLLIPSE,SCRAWLCIRCLE};
TCHAR typeText[SCRAWLCIRCLE+1][10]={"直线","矩形","椭圆","正圆"};

struct SCRAWL
{
POINTS begin;//起点的坐标
POINTS end;//终点的坐标
COLORREF color;//图形的颜色
SCRAWLTYPE type;//图形的类型
};

static vector<SCRAWL> allScrawls;//记录所有的图案

//WinMain函数,入口点
int WINAPI _tWinMain (HINSTANCE hInstance,
HINSTANCE hPreInstance,
LPTSTR lpCmdLine,
int nCmdShow){

//注册窗口类
WNDCLASSEX wcex = {0};
//窗口结构体类
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = (WNDPROC)WndProc;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon(NULL,IDC_ARROW);//使用系统默认图标
wcex.hCursor = LoadCursor(NULL,IDC_ARROW);//使用系统默认光标
wcex.hbrBackground = (HBRUSH)GetStockObject(DKGRAY_BRUSH);//白色画刷 WHITE_BRUSH
wcex.lpszClassName = szWindowClass;

//创建窗口
RegisterClassEx(&wcex);

HWND hWnd = CreateWindow(
szWindowClass,//窗口类名
szWindowTitle,//窗口标题
WS_OVERLAPPEDWINDOW,//窗口风格
100,200,500,500,//左上角坐标以及宽度‘高度
HWND_DESKTOP,
NULL,
hInstance,
NULL
);

if (!hWnd)//如果窗口创建失败则退出
{
return FALSE;
}

//显示并更新窗口
ShowWindow(hWnd,nCmdShow);
UpdateWindow(hWnd);

//进入消息循环
MSG msg;
while(GetMessage(&msg,NULL,0,0)){
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;

}



void Draw(HDC hdc,POINTS begin,POINTS end,COLORREF penColor,SCRAWLTYPE type){
HPEN pen = CreatePen(PS_SOLID,1,penColor);
HPEN oldPen = (HPEN)SelectObject(hdc,pen);

switch(type){
case SCRAWLLINE:
MoveToEx(hdc,begin.x,begin.y,NULL);
LineTo(hdc,end.x,end.y);
break;
case SCRAWLRECTANGLE:
Rectangle(hdc,begin.x,begin.y,end.x,end.y);
break;
case SCRAWLLIPSE:
Ellipse(hdc,begin.x,begin.y,end.x,end.y);
break;
case SCRAWLCIRCLE:
//计算半径
float r = sqrtf((end.x-begin.x)*(end.x-begin.x)+(end.y-begin.y)*(end.y-begin.y))/2;
//计算圆心
end.x = (begin.x+end.x)/2;
end.y = (begin.y+end.y)/2;

Ellipse(hdc,end.x - r,end.y - r,end.x + r,end.y + r);
break;
}
SelectObject(hdc,oldPen);
}

//窗口函数,用于消息处理
LRESULT CALLBACK WndProc(HWND hWnd,
UINT msg,
WPARAM wParam,
LPARAM lParam){

static string str;

static SCRAWLTYPE type = SCRAWLRECTANGLE;
static POINTS begin = {0,0};//起点
static POINTS end = {0,0};//终点
static COLORREF penColor = RGB(255,255,255);//默认颜色

switch(msg){

case WM_KEYDOWN:{
switch(wParam){
case 55://键盘7键,切换直线
type = SCRAWLLINE;
break;
case 56://键盘8键,切换矩形
type = SCRAWLRECTANGLE;
break;
case 57://键盘9键,切换椭圆
type = SCRAWLLIPSE;
break;
case 48://键盘0键,切换圆形
type = SCRAWLCIRCLE;
break;
case 0x52://键盘R键,切换红色
penColor = RGB(255,0,0);
break;
case 0x47://键盘G键,切换绿色
penColor = RGB(0,255,0);
break;
case 0x42://键盘B键,切换蓝色
penColor = RGB(0,0,255);
break;
case 0x4B://键盘K键,切换黑色
penColor = RGB(0,0,0);
break;
}

HDC hdc = GetDC(hWnd);

//--------------------
//按下任意非功能键,输出当前绘画的文字提示
//--------------------

TCHAR str[20];
_stprintf(str,"当前绘制的是:%s",typeText[type]);
SetTextColor(hdc,penColor);
TextOut(hdc,0,0,str,_tcslen(str));

ReleaseDC(hWnd,hdc);
return 0;
}

case WM_LBUTTONDOWN:{
begin = MAKEPOINTS(lParam);//获取起点坐标
return 0;
}

case WM_LBUTTONUP:{
end = MAKEPOINTS(lParam);//获取终点坐标

HDC hdc = GetDC(hWnd);

//--------------------
//鼠标点下和放开后,确定完起点终点,开始画图
//--------------------

HBRUSH brush = (HBRUSH)SelectObject(hdc,(HBRUSH)GetStockObject((HOLLOW_BRUSH)));
SetTextColor(hdc,penColor);
Draw(hdc,begin,end,penColor,type);//调用绘图函数
SelectObject(hdc,brush);//恢复画刷

ReleaseDC(hWnd,hdc);

//--------------------
//保存当前绘制的图形信息,为之后图形的变化重绘
//--------------------

SCRAWL markS;
markS.begin = begin;
markS.end = end;
markS.color = penColor;
markS.type = type;

allScrawls.push_back(markS);

return 0;
}

case WM_CHAR:{
switch(wParam){
case 8:{//处理BackSpace
if (str.size() == 0){//如果字符串为空,则直接返回
return 0;
}
str.erase(str.size()-1,1);//删除string的最后一个字符
break;
}
default://把获取的字符直接添加到字符的最后
str+=TCHAR(wParam);
}
InvalidateRect(hWnd,NULL,TRUE);//刷新窗口
return 0;
}

case WM_PAINT:{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hWnd,&ps);

HBRUSH oldBrush = (HBRUSH)SelectObject(hdc,(HBRUSH)GetStockObject((HOLLOW_BRUSH)));
SetTextColor(hdc,penColor);
// TextOut(hdc,0,0,str,(int)str.size());

for (int i = 0,size = allScrawls.size();i<size;i++){
Draw(hdc,allScrawls[i].begin,allScrawls[i].end,allScrawls[i].color,allScrawls[i].type);//调用绘图函数
}
SelectObject(hdc,oldBrush);//恢复画刷

EndPaint(hWnd,&ps);
return 0;
}

case WM_DESTROY:{
PostQuitMessage(0);
return 0;
}

default:
return DefWindowProc(hWnd,msg,wParam,lParam);

}
}

更多相关文档:

2014大学Windows网络程序设计 期末复习 试卷模拟习题1

2014大学Windows网络程序设计 期末复习 试卷模拟习题1_IT/计算机_专业资料。计算机 网络程序设计 期末 期中 考试 复习 资料 试卷 试题 习题 windows网络编程2014...

2014大学Windows网络程序设计 期末复习 试卷模拟习题3

2014大学Windows网络程序设计 期末复习 试卷模拟习题3_高等教育_教育专区。计算机 网络程序设计 期末 期中 考试 复习 资料 试卷 试题 习题 windows网络编程2014...

windows游戏编程大师技巧遇到问题详解

90份文档 2014年执业医师考试指导 口腔执业医师实践技能复习资料 中医护理学基础重点 执业医师实践技能考试模拟试题1028988份文档 教学总结精品范文...

Windows游戏编程 第二章

Windows游戏编程 第二章_IT/计算机_专业资料。Windows...2015国家公务员考试备战攻略 2015国考行测模拟试题及历年...2014全国高考状元联手分享状元笔记 衡水中学文科学霸...

Windows游戏编程大师技巧——翻译

Windows游戏编程大师技巧——翻译_计算机软件及应用_IT/计算机_专业资料。编程大师...2014年执业医师资格考试 口腔执业医师实践技能复习资料 中医护理学基础重点 执业医师...
更多相关标签:
网站地图

文档资料共享网 nexoncn.com copyright ©right 2010-2020。
文档资料共享网内容来自网络,如有侵犯请联系客服。email:zhit325@126.com