OpenGL(一) 使用Win API 建立黑色窗口

先来创建一个黑色的窗口吧,作为GL的容器。

Light3dWinAPP 这个类来处理窗口的创建和销毁以及分发 系统事件。

/**********************
*File:Light3dWinAPP.h;
*Author:chenpeng
*Data:2015/07/21;
*/

#include<Windows.h>
#include<tchar.h>

namespace Light3d
{
	class Light3dWinAPP
	{
	public :
		HINSTANCE m_hInstance;	//实例句柄;

		HWND m_hWnd;	//窗口句柄;

		int m_width;	//宽度;

		int m_height;	//高度;

	public:
		Light3dWinAPP(HINSTANCE hInstance) :m_hInstance(hInstance)
		{
			//想要建立一个窗口,必须有一个窗口类;
			WNDCLASSEX winClass;
			//窗口类名;
			winClass.lpszClassName = _T("Light3dWinAPP");
			winClass.cbSize = sizeof(winClass);

			//当H 水平方向,V 竖直方向 大小变化或移动时,重绘窗口,
			//为该类中的每一个窗口分配一个唯一的设备上下文;
			winClass.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;

			//指向函数的长指针lp,处理窗口的消息循环;
			winClass.lpfnWndProc = wndProc;

			//实例句柄;
			winClass.hInstance = hInstance;
			//窗口最小化图标;
			winClass.hIcon = 0;
			winClass.hIconSm = 0;
			//鼠标光标;
			winClass.hCursor = LoadCursor(hInstance, IDC_ARROW);
			//窗口背景色;
			winClass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
			//窗口菜单;
			winClass.lpszMenuName = nullptr;
			winClass.cbClsExtra = 0;
			winClass.cbWndExtra = 0;
			RegisterClassEx(&winClass);
		}

		virtual ~Light3dWinAPP()
		{
			UnregisterClass(_T("CELLWinAPP"), m_hInstance);
		}

	protected:
		static LRESULT CALLBACK wndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
		{
			Light3dWinAPP* pThis = (Light3dWinAPP*)GetWindowLong(hWnd, GWL_USERDATA);
			if (pThis)
			{
				return pThis->onEvent(hWnd, msg, wParam, lParam);
			}
			if (WM_CREATE == msg)
			{
				CREATESTRUCT* pCreate = (CREATESTRUCT*)lParam;
				SetWindowLong(hWnd, GWL_USERDATA,(DWORD_PTR)pCreate->lpCreateParams);

			}
			return DefWindowProc(hWnd, msg, wParam, lParam);
		}

	public:
		//窗口事件;
		virtual LRESULT onEvent(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
		{
			switch (msg)
			{
			case WM_CLOSE:
			case WM_DESTROY:
			{
							   ::PostQuitMessage(0);
			}
				break;
			case WM_MOUSEMOVE:
				break;
			case WM_LBUTTONDOWN:
				break;
			case WM_LBUTTONUP:
				break;
			case WM_RBUTTONDOWN:
				break;
			case WM_RBUTTONUP:
				break;
			case WM_KEYDOWN:
				{
							   switch (wParam)
								{
							   case VK_LEFT:
							   {

							   }
										break;
							   case VK_RIGHT:
								   break;
							   case VK_UP:
								   break;
									default:
										break;
								}

				}
				break;
			case WM_KEYUP:
				break;
			default:
				return DefWindowProc(hWnd, msg, wParam, lParam);
			}

			return S_OK;
		}

		//主函数;
		int main(int width, int height)
		{
			//创建窗口;
			m_hWnd = CreateWindowEx(NULL,
				_T("Light3dWinAPP"),
				_T("Light3D"),
				WS_OVERLAPPEDWINDOW,
				CW_USEDEFAULT,
				CW_USEDEFAULT,
				width,
				height,
				NULL,
				NULL,
				m_hInstance,
				this
				);

			if (m_hWnd == 0)
			{
				return -1;
			}

			ShowWindow(m_hWnd, SW_SHOW);
			MSG msg = { 0 };
			while (msg.message!=WM_QUIT)
			{
				if (msg.message == WM_DESTROY || msg.message == WM_CLOSE)
				{
					//跳出,退出;
					break;
				}

				//有消息的时候处理消息,没有消息的时候进行渲染绘制;
				if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
				{
					TranslateMessage(&msg);
					DispatchMessage(&msg);
				}
				else
				{
					//渲染;
					Sleep(1);
				}
			}
			return 0;
		}

	};
}

main.cpp 中处理Win的入口函数

/**********************
*File:main.cpp;
*Author:chenpeng
*Data:2015/07/21;
*/

#include "Light3dWinAPP.h"

int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
{
	UNREFERENCED_PARAMETER(hInstance);
	UNREFERENCED_PARAMETER(hPrevInstance);
	UNREFERENCED_PARAMETER(lpCmdLine);
	UNREFERENCED_PARAMETER(nCmdShow);

	Light3d::Light3dWinAPP app(hInstance);
	app.main(800, 600);
}

示例下载:

http://pan.baidu.com/s/1c0EtfR6

版权声明:本文转自http://blog.csdn.net/huutu 转载请带上 http://www.thisisgame.com.cn

时间: 2024-12-04 12:44:38

OpenGL(一) 使用Win API 建立黑色窗口的相关文章

vc建立一个窗口的流程

上一篇中我给各位说了一般人认为C++中较为难的东西——指针.其实对于C++,难点当然不局限在指针这玩意儿上,还有一些有趣的概念,如模板类.虚基类.纯虚函数等,这些都是概念性的东西,几乎每一本C++书上都会介绍,而平时我们除了会接触到纯虚函数外,其他的不多用.纯虚函数,你可以认为与C#中的抽象方法或接口中的方法类似,即只定义,不实现.好处就是多态,发何处理,由派生类来决定. 在开始吹牛之前,我先推荐一套视频教程,孙鑫老师的C++教程,共20课,我不是帮他老人家打广告,而是因为孙老师讲的课是我听过的

WIN API 擦除所绘图像

COLORREF circle_color = RGB(0, 105, 255); //获取窗口DC HDC hdc = GetDC(hWnd_); //背景色透明 SetBkMode(hdc, TRANSPARENT); // 这里的像素是相对窗体来说的, 而不是屏幕坐标, HPEN pen = CreatePen(PS_SOLID, 3, circle_color); SelectObject(hdc, pen); //Ellipse(hdc, center_x_in_form - CIRC

win api 实现 base64编码、解码

最近在写小玩意,用到了base64编码,但是考虑到体积大小,网上的多种实现都是利用开源的代码,这就增加了其大小.我想win api能不能实现base64编码.解码.通过一通乱搜,还有收获.就有了以下代码 #pragma comment(lib,"crypt32.lib") LPSTR Base64Encode(LPBYTE lpBuffer,DWORD dwLen) { DWORD dwNeed; LPSTR lpBase64Str ; DWORD dwIndex ; DWORD dw

使用SetWindowPos API函数移动窗口后,还需修改Delphi的属性值,以备下次使用,否则就会出问题(不是API不起作用,而是使用了错误的坐标值)

单独改变坐标的代码如下,可不断左移: procedure TForm1.Button1Click(Sender: TObject); begin SetWindowPos(panel1.Handle, 0, panel1.Left-10, panel1.Top, panel1.Width, panel1.Height, SWP_NOZORDER + SWP_NOACTIVATE); end; 照理每次改变坐标,都会调用SetBounds,都会调用SetWindowPos函数,可是一旦我屏蔽Upd

(转)使用openGL显示图像(一)建立OpenGL ES的环境

编写:jdneo - 原文:http://developer.android.com/training/graphics/opengl/environment.html 要在应用中使用OpenGL ES绘制图像,我们必须为它们创建一个View容器.一种比较直接的方法是实现GLSurfaceView类和GLSurfaceView.Renderer类.其中,GLSurfaceView是一个View容器,它用来存放使用OpenGL绘制的图形,而GLSurfaceView.Renderer则用来控制在该

MFC--串口编程---WIN API的方式将串扣操作封装在线程类中

串口采集数据 本文档介绍的是如何获取串口原始数据并将原始数据解析成可处理或可展示的数据. 一.串口采集有很多方式: 1).MFC有一个专门的控件,直接编程采集,一个控件只能采集一个串口,而且串口名字比如是COM20可能就打不开(这里我没有实践,师兄给这样说的),波特率太高读数会出错. 2).利用Windows API通信函数(该工程里面就采用的这种方式) 3).利用Visual C++的标准通信函数_inp._inpw._inpd._outp等直接对串口进行操作. 4).第三方编写的通信类. 二

用C#调用Windows API向指定窗口发送按键消息

一.调用Windows API. C#下调用Windows API方法如下: 1.引入命名空间:using System.Runtime.InteropServices; 2.引用需要使用的方法,格式:[DllImport("DLL文件")]方法的声明; [DllImport("user32.dll")]private static extern bool ShowWindow(IntPtr hWnd, int nCmdShow); [DllImport("

Vb.net/VB 声明API功能父窗口功能

回想第一次敲房费,他说自己是api函数实现父窗口及其子窗口最小化的功能.现在再次遇到,自己就在思考,能不能继续使用API函数呢?答案当然是Of Course! 事实上细致看两者并没有多大的差别,先看看在vb.net中怎样调用: 首先加入一个类模块.来封装此API函数: <span style="font-size:14px;"> Public Declare Function SetParent Lib "<span style="color:#f

关于c#winform用sharpGL(OpenGL)绘制不出图形,绘制窗口是个黑框的坑

原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/11790309.html 在c++的opengl中可能是因为是最基本的库,很多东西都把你做好了 转到c#下用大牛们对opengl的支持库,比如sharpGL,使用起来需要非常的严谨 就比如: gl.Color(0.0f, 0.0f, 1.0f);这个设置颜色的代码 在c++下不管是0.0f也好还是0也好都可以,而在c#下sharpGL没有写0.0f的这种格式 图像就完全绘制不出来.让你完全找不