`

DirectX 之 Hello

    博客分类:
  • VC
阅读更多

#include <windows.h>
#include <windowsx.h>
#include <ddraw.h>
#include <atlstr.h>

LPDIRECTDRAW lpDD = NULL;//direct draw object
LPDIRECTDRAWSURFACE lpDDSPrimary = NULL;//direct draw main page

char* lpszMsg1 = "Hello, andylin! I love my baby so much!";
char* lpszMsg2 = "press esc exit";

LRESULT CALLBACK WinProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
BOOL InitWindow(HINSTANCE hInst, int nCmdShow);
BOOL InitDDraw();
void FreeDDraw();

void PrintMsg(HWND hWnd = NULL, LPCTSTR lpszInfo = NULL, LPCTSTR lpszTitle = NULL, int nStyle = MB_OK)
{
	CString strInfo = lpszInfo;
	CString strTitle = lpszTitle;

	if (NULL == lpszInfo)
	{
		strInfo = "test info";
	}

	if (NULL == lpszTitle)
	{
		strTitle = "my direct test";
	}

	MessageBox(hWnd, strInfo, strTitle, nStyle);
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
	MSG	msg = {0};

	if (!InitWindow(hInstance, nCmdShow))
	{
		PrintMsg(NULL, "InitWindow Failed!");
		return -1;
	}

	HWND hWnd = GetActiveWindow();

	//init direct draw
	if (!InitDDraw())
	{
		PrintMsg(hWnd, "init DirectDraw failed!");
		DestroyWindow(hWnd);

		return -1;
	}


	while (::GetMessage(&msg, NULL, 0, 0))
	{
		::TranslateMessage(&msg);
		::DispatchMessage(&msg);
	}

	return (int)msg.wParam;
}

BOOL InitWindow( HINSTANCE hInstance, int nCmdShow )
{
	HWND		hWnd	= NULL;
	WNDCLASS	ws		= {0};
	char		szClassName[] = _T("test dx");

	//int window class
	ws.cbClsExtra		= 0;
	ws.cbWndExtra		= 0;
	ws.hbrBackground	= (HBRUSH)::GetStockObject(BLACK_BRUSH);
	ws.hCursor			= ::LoadCursor(NULL, IDC_ARROW);
	ws.hIcon			= ::LoadIcon(NULL, IDI_APPLICATION);
	ws.hInstance		= hInstance;
	ws.lpfnWndProc		= WinProc;
	ws.lpszClassName	= szClassName;
	ws.lpszMenuName		= NULL;
	ws.style			= CS_HREDRAW | CS_VREDRAW;

	//register window class
	::RegisterClass(&ws);

	hWnd = ::CreateWindowEx(0, szClassName, _T("test for diectx"), WS_OVERLAPPED, CW_USEDEFAULT, CW_USEDEFAULT, 
		CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, 0);

	if (!hWnd)
	{
		return FALSE;
	}

	//show and update
	ShowWindow(hWnd, nCmdShow);
	UpdateWindow(hWnd);

	return TRUE;
}

LRESULT CALLBACK WinProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
	switch (uMsg)
	{
	case WM_KEYDOWN:
		{
			switch (wParam)
			{
			case VK_ESCAPE:
				::PostMessage(hwnd, WM_CLOSE, 0, 0);
				break;
			}
		}
		break;

	case WM_DESTROY:
		{
			FreeDDraw();
			PostQuitMessage(0);
		}
		break;

	default:
		break;
	}

	return DefWindowProc(hwnd, uMsg, wParam, lParam);
}

BOOL InitDDraw()
{
	DDSURFACEDESC	ddsd = {0}; //page descripe
	HDC hdc = NULL;

	if (DD_OK != ::DirectDrawCreate(NULL, &lpDD, NULL))
	{
		return FALSE;
	}

	//取得独占和全屏模式
	if (DD_OK != lpDD->SetCooperativeLevel(GetActiveWindow(), DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN))
	{
		return FALSE;
	}

	//set show mode
	if (DD_OK != lpDD->SetDisplayMode(640, 480, 8))
	{
		return FALSE;
	}

	//set main page
	ddsd.dwSize = sizeof(ddsd);
	ddsd.dwFlags = DDSD_CAPS;
	ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;

	//create main page object
	if (DD_OK != lpDD->CreateSurface(&ddsd, &lpDDSPrimary, NULL))
	{
		return FALSE;
	}

	//print text
	if (DD_OK != lpDDSPrimary->GetDC(&hdc))
	{
		return FALSE;
	}

	SetBkColor(hdc, RGB(0, 0, 255));
	SetTextColor(hdc, RGB(255, 255, 0));

	TextOut(hdc, 0, 20, lpszMsg1, lstrlen(lpszMsg1));
	TextOut(hdc, 0, 40, lpszMsg2, lstrlen(lpszMsg2));

	lpDDSPrimary->ReleaseDC(hdc);

	return TRUE;
}

void FreeDDraw()
{
	if (NULL != lpDDSPrimary)
	{
		lpDDSPrimary->Release();
		lpDDSPrimary = NULL;
	}

	if (NULL != lpDD)
	{
		lpDD->Release();
		lpDD = NULL;
	}
}
 
分享到:
评论

相关推荐

    Hello DirectX12

    2. DirectX-Headers-main是DirectX12帮助类文件源码 3. HelloTriangle.pdf 是HelloTriangle工程 流程结构图 HelloTriangle工程: CD3D12Triangle类对DirectX12创建三角形做了封装。 HelloTexture工程: CD3D12...

    从头学习DirectX 9

    3. **Hello, World!**:编写第一个Direct3D程序,显示一个简单的几何形状,如立方体或球体。 4. **渲染管线**:学习Direct3D的渲染管线,了解从顶点数据到屏幕像素的过程,包括顶点处理、像素着色、深度缓冲等。 5...

    Directx9 3D 游戏编程 实例

    在DirectX9中,"Hello World"程序通常会展示如何初始化DirectX设备,设置窗口,并绘制一个简单的几何图形,如一个三角形。这不仅帮助开发者了解DirectX的基本工作流程,还涉及到设备创建、上下文管理以及基本的渲染...

    DirectX11-With-Windows-SDK-master.zip

    文件"DirectX11-With-Windows-SDK-master"可能包含了所有这些步骤的示例代码,从简单的“Hello Triangle”到复杂的场景渲染,帮助初学者逐步掌握DirectX 11编程。 总之,"DirectX11-With-Windows-SDK-master.zip"的...

    DirectX 11 入门(Tutorials)

    - **Hello Triangle**:最基础的3D图形绘制,展示Direct3D的基本用法。 - **颜色变换**:演示如何使用矩阵变换对物体进行平移、旋转和缩放。 - **纹理映射**:在物体表面应用纹理,增加视觉效果。 - **光照效果*...

    DirectX游戏开发终极指南Projects(1).rar

    可能会讲解如何设置开发环境,安装DirectX SDK,并创建第一个Hello World级别的DirectX程序。 2. **Chapter 2**: 可能会讲解Direct3D的基础概念,如渲染管线、顶点和索引缓冲区、纹理贴图等。开发者将学习如何绘制...

    DIRECTX9编程入门

    文档可能涵盖从安装DirectX SDK到编写第一个“Hello, Triangle”程序的全过程。同时,你还需要学习相关的数学知识,如向量、矩阵运算,这些是理解和实现3D图形的基础。 总之,DirectX9编程是一门涵盖广泛的技术,...

    Directx8_DrawText

    这个例子中,我们创建了一个红色的居中对齐的文本“Hello, DirectX!”,位置在屏幕的(10, 10)坐标,宽度到(200, 50)。 在项目`Project1`中,可能包含了`frmMain.frm`和`Project1.vbp`两个文件。`frmMain.frm`是窗体...

    Advanced 3D Game Programming with DirectX 10

    - **创建简单的Windows应用程序**:本书可能会介绍如何创建一个简单的“Hello World”风格的Windows程序,通过这个例子学习基本的窗口创建、消息处理等概念。 ### 4. 3D图形编程 - **3D模型加载与渲染**:本书将...

    Advanced 3D Game Programming Using DirectX® 9.0

    DirectX 9.0版本在当时是最新的版本之一,它包含了多项改进,如硬件加速、纹理管理、顶点和像素着色器等功能。 #### Windows编程基础 本书的第一章介绍了Windows编程的基本概念。首先解释了匈牙利命名法,这是一种...

    Advanced 3D Game Programming with DirectX 8.0

    - **“Hello World”示例**:通过一个简单的“Hello World”程序示例来展示如何创建和注册一个Windows应用程序窗口。 - **消息泵**:指明了消息处理的核心机制——消息泵(Message Pump),它是Windows应用程序的...

    Advanced 3D Game Programming with DirectX 10.0.pdf

    通过一个简单的“Hello World”示例,作者逐步引导读者理解如何在Windows环境中构建应用程序。 2. **DirectX 10.0概述**:本书深入讲解了DirectX 10.0的核心组件,包括Direct3D、DirectInput、DirectSound等。通过...

    Advanced 3D Game Programming with DirectX 10.0

    - **消息循环**:这是Windows程序的核心机制之一,通过不断循环检查是否有新的消息到来,并根据消息的类型调用相应的处理函数。 - **处理消息**:本书提供了具体的示例代码,演示了如何编写消息处理器函数来响应...

    directX游戏编程实验.docx

    - 茶壶和立方体被放置在地形之上,显示了正确的高度和位置。 - 光照效果使得地形和物体看起来更加逼真。 通过以上步骤,学生不仅能够加深对DirectX编程的理解,还能掌握三维场景构建的具体方法和技术细节。

    D3DXCreateText.rar_ D3DXCreateText_D3DXCreateText_Directx3d

    DirectX 3D 是微软开发的一套用于游戏和图形密集型应用程序的 API(应用程序接口),它提供了丰富的功能,包括3D图形渲染、音频处理、输入设备管理等。在DirectX 3D中,`D3DXCreateText`是一个非常实用的函数,用于...

    directx实例解析

    在提供的代码示例中,我们看到`hello.cpp`文件包含了创建第一个DirectDraw应用程序的基本步骤。 代码中定义了两个全局变量,`LPDIRECTDRAW lpDD`代表DirectDraw对象,`LPDIRECTDRAWSURFACE lpDDSPrimary`则是Direct...

    3D图形Demo示例Hello3DWorld源代码

    《3D图形编程之旅:Hello3DWorld源代码解析》 3D图形编程是一门深奥而富有挑战性的技术,它赋予了计算机视觉无限的可能性,让数字世界充满生动与真实感。在本篇文章中,我们将深入探讨一个名为“Hello3DWorld”的3D...

    DirectX三维文字及地形场景实验-.pdf

    例如,"Hello World"字符串可以在指定位置以特定颜色和格式输出。 三维地形的创建通常基于高度图,这是一个表示地形起伏的数据矩阵。你可以从图像文件中读取高度数据,或者通过算法自动生成。为了模拟真实地形,...

    DirectX三维文字及地形场景实验-归纳.pdf

    "Hello World", // 待输出字符串 -1, // NULL 结束的字符串 &rect, // 输出位置 DT_TOP | DT_LEFT, // 输出选项 0xff000000 // 文字颜色:黑色 ); ``` 2. 地形模拟与纹理应用: 地形模拟基于高度图,高度图是...

    三维交互开发(2)-DxStudio的hello world

    在本篇中,我们将深入探讨三维交互开发的第二个部分,主要关注DxStudio这一工具的“Hello World”项目。DxStudio是一款强大的实时三维场景编辑器,它允许开发者创建、编辑并导出交互式3D内容,广泛应用于游戏开发、...

Global site tag (gtag.js) - Google Analytics