[VC++游戏开发]用C++来架构一个适合windows游戏编程的框架――取名为BCF(三)

2014-11-24 08:06:28 · 作者: · 浏览: 3
:处理消息================= // LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { /* 在这里添加消息映射代码(switch-case语句) 如: switch(msg) { case WM_CREATE: wnd.OnCreate(); //窗口建立消息:进行一些初始化操作 return 0; } */ return DefWindowProc(hwnd, msg, wParam, lParam); }

下面,我简单地介绍一下这个框架的使用方法:

1>创建一个空项目(我这里是VS2010)

2>将这3个头文件以及2个cpp源文件添加到创建好的项目中

3>在 CWindow.h中添加消息响应函数(CCWindow类的成员函数)的声明

如:(名称还是遵循MFC的命名方式)

//================消息响应函数================
public:
	//注:在这里添加需要响应的消息处理函数的声明
	void OnCreate();;
4>CWindow.cpp中实现这些消息响应函数

5>在Main.cpp的窗口过程函数中调用响应的消息响应函数

如:

switch(msg)
{
case WM_CREATE:
	wnd.OnCreate();	//窗口建立消息:进行一些初始化操作
	return 0;
}

我还是为这个框架取一个艺名儿,名为:BCF

BC:我的csdn博客ID缩写——BlueCoder

F:frame——框架的意思

合起来就是BlueCoder的框架,当然,大家都可以用,只要你愿意,我也乐意^_^

三、一个简单的实例,教你熟悉这个框架

我做了一个简单的实例,来帮助大家熟悉这个框架

这个实例呢,就是简单的贴图、贴文字,不过你会看到有趣的部分:我使用了诸如CPaintDC、CFont、CString、CImage、CRect等MFC类库。对,没错,这就是这个框架的一大特点:可以使用MFC类库,这就方便了我们写代码

由于没什么复杂的原理,我就按照步骤贴出核心代码哈:

(1)项目、头文件、源文件已经相继处理好了

data-cke-saved-src=https://www.cppentry.com/upload_files/article/49/1_u8xmy__.png

(2)在CCWindow类中添加如下的消息响应成员函数:

//================消息响应函数================
//注:在这里添加需要响应的消息处理函数
public:
	//处理WM_CREATE消息
	void OnCreate();

	//处理WM_SIZE消息
	void OnSize();
	
	//处理WM_PAINT消息
	void OnPaint();
	
	//处理WM_KEYDOWN消息
	void OnKeyDown(WPARAM);
	
	//处理WM_DESTROY消息
	void OnDestroy();

(3)这些消息响应函数的实现:

//----------------------------------------------------------
//						消息响应函数
//----------------------------------------------------------

//窗口建立消息:进行一些初始化操作
void CCWindow::OnCreate()
{
	m_img.Load(res\bg.jpg);

	if(m_img.IsNull())
	{
		AfxMessageBox(背景图片加载失败!);
		exit(0);
	}

	mciSendString(open res\bgm.mp3 alias bgm, 0, 0, 0);
	mciSendString(play bgm repeat, 0, 0, 0);
}

//窗口size消息:获取窗口大小
void CCWindow::OnSize()
{
	::GetClientRect(m_hwnd, m_rect);
}

//窗口Paint消息:绘制窗口客户区
void CCWindow::OnPaint()
{
	CPaintDC dc(CWnd::FromHandle(m_hwnd));

	//绘制背景图片
	dc.SetStretchBltMode(COLORONCOLOR);
	m_img.StretchBlt(dc, 0, 0, m_rect.Width(), m_rect.Height(),
		0, 0, m_img.GetWidth(), m_img.GetHeight(), SRCCOPY);

	//绘制文字
	CFont font;
	font.CreatePointFont(150, 微软雅黑);
	dc.SelectObject(font);

	CString str1 = 给自己的梦想一次破茧而出的机会,创造属于自己的幸福;
	CString str2 = BlueCoder(黎小华);

	dc.SetBkMode(TRANSPARENT);
	dc.SetTextColor(RGB(163, 21, 21));
	dc.TextOut(130, 220, str1);

	dc.SetTextColor(RGB(21, 155, 230));
	dc.TextOut(500, 300, str2);
}

//按键消息:按下Esc键退出程序
void CCWindow::OnKeyDown(WPARAM wParam)
{
	if(wParam == VK_ESCAPE)
	{
		DestroyWindow(m_hwnd);
	}
}

//窗口销毁消息:释放内存
void CCWindow::OnDestroy()
{
	m_img.Destroy();

	mciSendString(close bgm, 0, 0, 0);

	PostQuitMessage(0);
}

(4)在Main.cpp中的窗口过程中调用响应的消息成员函数:

//窗口过程:处理消息
LRESULT CALLBACK WndProc(
				HWND hwnd,
				UINT msg,
				WPARAM wParam,
				LPARAM lParam)
{
	switch(msg)
	{
	case WM_CREATE:
		wnd.OnCreate();	//窗口建立消息:进行一些初始化操作
		return 0;

	case WM_SIZE:
		wnd.OnSize();	//窗口size消息:获取窗口大小
		return 0;

	case W