精华内容
下载资源
问答
  • d3d程序创建窗口失败的原因

    千次阅读 2018-09-04 08:16:08
    是用HWND窗口句柄创建窗口时,是用CreateWindow()函数,其中第一个参数对应你之前的 WNDCLASS类的类名,即 .lpszClassName=L"……" L与_T意义相同,只有填写对这个参数,才能找到对应的类完成窗口创建...

    是用HWND窗口句柄创建窗口时,是用CreateWindow()函数,其中第一个参数对应你之前的 WNDCLASS类的类名,即

    .lpszClassName=L"……"  L与_T意义相同,只有填写对这个参数,才能找到对应的类完成窗口的创建。

    展开全文
  • opengl 入门之创建窗口

    2019-04-22 17:21:09
    //创建窗口对象,第一个参数为窗口的宽;第二个参数为窗口的高;第三个为窗口的名称 GLFWwindow* window = glfwCreateWindow(800, 600, "LearnOpenGL", nullptr, nullptr); if (window == nullptr) { std::cout ...

    学了一个月的opengl,从入门到窒息。

    如果觉得本文写的看不懂,具体可以参考LearnOpengl

    1 opengl基础知识

       opengl ,并不是一个API,而是一个组织规范,由Khronos组织制定并维护的规范(Specification)。OpenGL规范严格规定了每个函数该如何执行,以及它们的输出值。至于内部具体每个函数是如何实现(Implement)的,将由OpenGL库的开发者自行决定(注:这里开发者是指编写OpenGL库的人)。因为OpenGL规范并没有规定实现的细节,具体的OpenGL库允许使用不同的实现,只要其功能和结果与规范相匹配(亦即,作为用户不会感受到功能上的差异)。

       OpenGL自身是一个巨大的状态机(State Machine):一系列的变量描述OpenGL此刻应当如何运行。OpenGL的状态通常被称为OpenGL上下文(Context)。我们通常使用如下途径去更改OpenGL状态:设置选项,操作缓冲。最后,我们使用当前OpenGL上下文来渲染。

       使用OpenGL时,建议使用OpenGL定义的基元类型。比如使用float时我们加上前缀GL(因此写作GLfloat)。int、uint、char、bool等等也类似。OpenGL定义的这些GL基元类型的内存布局是与平台无关的,而int等基元类型在不同操作系统上可能有不同的内存布局。使用GL基元类型可以保证你的程序在不同的平台上工作一致。

    C++基元类型 opengl基元类型
    int GLint
    float GLfloat
    unit GLuint
    char GLchar
    bool GLbool

    2 opengl的安装配置

    2.1依赖安装

    sudo apt-get install build-essential
    sudo apt-get install libgl1-mesa-dev
    sudo apt-get install libglu1-mesa-dev
    sudo apt-get install freeglut3-dev

    2.2GLFW安装配置

        GLFW是一个专门针对OpenGL的C语言库,它提供了一些渲染物体所需的最低限度的接口。它允许用户创建OpenGL上下文,定义窗口参数以及处理用户输入,这正是我们需要的。

    sudo apt-get install cmake xorg-dev libglu1-mesa-dev

    (1)下载GLFW的source package

    (2)编译

    cd glfw-3.2.1
    mkdir build
    cd build
    cmake ..
    make
    sudo make install

    2.3GLEW安装

    GLEW是OpenGL Extension Wrangler Library的缩写

    (1)下载GLEW并解压

    (2)编译

    cd glew-2.1.0
    make
    sudo make install

    2.3makefile配置

    CC=g++
    ELF=main
    SRC=$(shell find -name '*.cpp')
    OBJ=$(SRC:.cpp=.o)
    LIBS=-lGLEW -lglfw3 -lGL -lX11 -lXrandr -lXi -ldl -lpthread -lm -lrt -lXxf86vm -lXcursor -lXinerama
    $(ELF):$(OBJ)
    	$(CC) $(SRC) $(LIBS) -o $(ELF)
    $(OBJ):
    clean:
    	rm -f $(OBJ) $(ELF)

    3窗口

    3.1GLFW

    GLFW用来创建窗口

    使用前需要包含头文件

    // GLEW
    #define GLEW_STATIC
    #include <GL/glew.h>
    // GLFW
    #include <GLFW/glfw3.h>

    在包含GLFW的头文件之前需要先包含GLEW的头文件,否则会报错

    3.2GLEW

    GLEW是用来管理OpenGL的函数指针的,所以在调用任何OpenGL的函数之前我们需要初始化GLEW。

    glewExperimental = GL_TRUE;
    if (glewInit() != GLEW_OK)
    {
        std::cout << "Failed to initialize GLEW" << std::endl;
        return -1;
    }

    在初始化GLEW之前设置glewExperimental变量的值为GL_TRUE,这样做能让GLEW在管理OpenGL的函数指针时更多地使用现代化的技术,如果把它设置为GL_FALSE的话可能会在使用OpenGL的核心模式时出现一些问题。

    3.3视口

    在我们开始渲染之前还有一件重要的事情要做,我们必须告诉OpenGL渲染窗口的尺寸大小,这样OpenGL才只能知道怎样相对于窗口大小显示数据和坐标。我们可以通过调用glViewport函数来设置窗口的维度(Dimension):

    GLFWwindow* window = glfwCreateWindow(800, 600, "LearnOpenGL", nullptr, nullptr);
    if (window == nullptr)
    {
        std::cout << "Failed to create GLFW window" << std::endl;
        glfwTerminate();
        return -1;
    }
    glfwMakeContextCurrent(window);
    
    int width, height;
    glfwGetFramebufferSize(window, &width, &height);
    
    glViewport(0, 0, width, height);

    3.4游戏循环(Game Loop)

    在程序中添加一个while循环,在我们让GLFW退出前一直保持运行

    while(!glfwWindowShouldClose(window))
    {
        glfwPollEvents();
        glfwSwapBuffers(window);
    }
    • glfwWindowShouldClose函数在我们每次循环的开始前检查一次GLFW是否被要求退出,如果是的话该函数返回true然后游戏循环便结束了,之后为我们就可以关闭应用程序了。
    • glfwPollEvents函数检查有没有触发什么事件(比如键盘输入、鼠标移动等),然后调用对应的回调函数(可以通过回调方法手动设置)。我们一般在游戏循环的开始调用事件处理函数。
    • glfwSwapBuffers函数会交换颜色缓冲(它是一个储存着GLFW窗口每一个像素颜色的大缓冲),它在这一迭代中被用来绘制,并且将会作为输出显示在屏幕上。

    3.5释放资源

    当游戏循环结束后我们需要正确释放/删除之前的分配的所有资源。我们可以在main函数的最后调用glfwTerminate函数来释放GLFW分配的内存。

    glfwTerminate(); 
    return 0;

    3.6渲染

        我们要把所有的渲染(Rendering)操作放到游戏循环中,因为我们想让这些渲染指令在每次游戏循环迭代的时候都能被执行。在每个新的渲染迭代开始的时候我们总是希望清屏,否则我们仍能看见上一次迭代的渲染结果。

    glClearColor(0.2f, 0.3f, 0.3f, 1.0f); //设置清空屏幕所用的颜色 
    glClear(GL_COLOR_BUFFER_BIT);//清空颜色缓冲区GL_COLOR_BUFFER_BIT 
    //当调用glClear函数,清除颜色缓冲之后,整个颜色缓冲都会被填充为glClearColor里所设置的颜色

    调用glClear函数来清空屏幕的颜色缓冲,它接受一个缓冲位(Buffer Bit)来指定要清空的缓冲,可能的缓冲位有GL_COLOR_BUFFER_BIT,GL_DEPTH_BUFFER_BIT和GL_STENCIL_BUFFER_BIT。

    glClearColor函数是一个状态设置函数,而glClear函数则是一个状态应用的函数。

    3.7窗口代码

    / GLEW
    #define GLEW_STATIC
    #include <GL/glew.h>
    // GLFW
    #include <GLFW/glfw3.h>
    int main()
    {
        //初始化GLFW
        glfwInit();  //成功返回GLFW_TRUE(1);失败返回GLFW_FALSE(0)
        
        //配置GLFW窗口的hint(选项)。参数一是配置的hint名称,使用GLFW常量(以GLFW_开头)指定;第二个是我们要把该hint设置成的值,该值随要设置的hint而异。
        //在本PC机中配置的opengl为4.6.0 因此设定主版本号为4,副版本号为6,设置opengl模式为核心模式,且无法改变窗口大小
        glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4);                 //GLFW_CONTEXT_VERSION_MAJOR 主版本号
        glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 5;                 //GLFW_CONTEXT_VERSION_MINOR 副版本号
        glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); //GLFW_OPENGL_PROFILE OpenGL模式
        glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);                      //GLFW_RESIZABLE 窗口是否可调整大小
        
        //创建窗口对象,第一个参数为窗口的宽;第二个参数为窗口的高;第三个为窗口的名称
        GLFWwindow* window = glfwCreateWindow(800, 600, "LearnOpenGL", nullptr, nullptr);
        if (window == nullptr)
        {
            std::cout << "Failed to create GLFW window" << std::endl;
            glfwTerminate();
            return -1;
        }
        //通知GLFW将窗口的上下文设置为当前线程的主上下文。
        glfwMakeContextCurrent(window);
        
        //初始化GLEW
        glewExperimental = GL_TRUE;
        if (glewInit() != GLEW_OK)
        {
            std::cout << "Failed to initialize GLEW" << std::endl;
            return -1;
        }
        
        //视口设置
        int width, height;
        glfwGetFramebufferSize(window, &width, &height);  
        glViewport(0, 0, width, height);
        
        //Game loop
        while (!glfwWindowShouldClose(window))//检查一次GLFW是否被要求退出
        {
            //检查是否触发什么事件,有的话调用对应的回调函数
            glfwPollEvents();
            //clear
            glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
            glClear(GL_COLOR_BUFFER_BIT);
            // 渲染指令
             ...
            // 交换颜色缓冲
            glfwSwapBuffers(window);
        }
    
        return 0;
    }

     

     

     

    展开全文
  • //Windows窗口头文件 #include &lt;windows.h&gt; //PlaySound函数包含的头文件 #pragma comment(lib,"winmm.lib") //窗口宽度 #define WINDOW_WIDTH 1132 //窗口高度 #def...

    字体颜色对照表:https://www.sioe.cn/yingyong/yanse-rgb-16/

    //Windows窗口头文件
    #include <windows.h>
     
    //PlaySound函数包含的头文件
    #pragma comment(lib,"winmm.lib") 
     
    //窗口宽度
    #define WINDOW_WIDTH 1132	
     
    //窗口高度
    #define WINDOW_HEIGHT 708			
    				
    //窗口标题
    #define WINDOW_TITLE L"【游戏开发】自定义贴图"
     
    //全局环境设备和全局内存设备
    HDC	g_hdc=NULL,g_mdc=NULL; 
     
    //位图
    HBITMAP g_hBackGround; 
     
    //窗口过程函数
    LRESULT CALLBACK WndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam );
     
    //初始化
    BOOL Game_Init(HWND hwnd);		
     
    //绘图
    VOID Game_Paint( HWND hwnd);		
     
    //释放资源
    BOOL Game_CleanUp(HWND hwnd );
     
    //主函数
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nShowCmd)
    {
    	//定义窗口类
    	WNDCLASSEX wndClass = { 0 };
     
    	//结构体的字节数大小
    	wndClass.cbSize = sizeof( WNDCLASSEX ) ;	
     
    	//窗口的样式
    	wndClass.style = CS_HREDRAW | CS_VREDRAW;	
     
    	//指向窗口过程函数的指针
    	wndClass.lpfnWndProc = WndProc;		
     
    	//窗口类的附加内存,取0
    	wndClass.cbClsExtra		= 0;		
     
    	//窗口的附加内存,依然取0
    	wndClass.cbWndExtra		= 0;		
     
    	//窗口过程的程序的实例句柄
    	wndClass.hInstance = hInstance;						
     
    	//ico图标
    	wndClass.hIcon=(HICON)::LoadImage(NULL,L"天龙八部图标.ico",IMAGE_ICON,0,0,LR_DEFAULTSIZE|LR_LOADFROMFILE);
     
    	//光标句柄
    	wndClass.hCursor = LoadCursor( NULL, IDC_ARROW ); 
     
    	//画刷句柄
    	wndClass.hbrBackground=(HBRUSH)CreateSolidBrush(RGB(255,255,255));  
     
    	//指定菜单资源的名字
    	wndClass.lpszMenuName = NULL;					
     
    	//指定窗口类的名字
    	wndClass.lpszClassName = L"TWJDWQ";
     
    	//注册窗口类
    	if( !RegisterClassEx( &wndClass ) )			
    		return -1;		
     
    	//创建窗口
    	HWND hwnd = CreateWindow( L"TWJDWQ",WINDOW_TITLE,	
    		WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, WINDOW_WIDTH,
    		WINDOW_HEIGHT, NULL, NULL, hInstance, NULL );
     
    	//窗口显示的位置
    	MoveWindow(hwnd,250,80,WINDOW_WIDTH,WINDOW_HEIGHT,true);
    	
    	//显示窗口
    	ShowWindow( hwnd, nShowCmd );
     
    	//更新窗口
    	UpdateWindow(hwnd);	
     
    	//初始化
    	if (!Game_Init (hwnd)) 
    	{
    		//消息窗口
    		MessageBox(hwnd, L"资源初始化失败", L"消息窗口", 0);
    		return FALSE;
    	}
     
    	//循环播放背景音乐
    	PlaySound(L"我行即我道.wav", NULL, SND_FILENAME | SND_ASYNC|SND_LOOP); 
     
    	//定义并初始化msg
    	MSG msg = { 0 };			
     
    	//消息循环
    	while( msg.message != WM_QUIT )			
    	{
    		//查看并派发消息
    		if( PeekMessage( &msg, 0, 0, 0, PM_REMOVE ) )
    		{
    			//将虚拟键消息转换为字符消息
    			TranslateMessage( &msg );		
     
    			//捕捉消息给窗口
    			DispatchMessage( &msg );
    		}
    	}
     
    	//注销窗口类
    	UnregisterClass(L"TWJDWQ", wndClass.hInstance); 
     
    	return 0;  
    }
     
    //处理窗口消息
    LRESULT CALLBACK WndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam )      
    {
    	//记录绘制信息
    	PAINTSTRUCT paintStruct;			
     
    	switch( message )						
    	{
    	//绘制
    	case WM_PAINT:		
     
    		//指定窗口开始绘制(将和绘图有关的信息填充到paintStruct结构体中)
    		g_hdc = BeginPaint( hwnd, &paintStruct ); 
     
    		//调用绘制函数
    		Game_Paint( hwnd);
     
    		//结束绘制
    		EndPaint( hwnd, &paintStruct );			
     
    		//更新窗口
    		ValidateRect(hwnd, NULL);		
     
    		break;									
     
    	//按键
    	case WM_KEYDOWN:	
     
    		//按键为ESC,销毁窗口,并发送一条WM_DESTROY消息
    		if (wParam == VK_ESCAPE)    
    			DestroyWindow(hwnd);	
     
    		break;									
     
    	//销毁
    	case WM_DESTROY:
     
    		//清理资源
    		Game_CleanUp(hwnd);	
     
    		//请求终止,并发送一条WM_DESTROY消息
    		PostQuitMessage( 0 );			
     
    		break;									
     
    	//缺省
    	default:										
    		return DefWindowProc( hwnd, message, wParam, lParam );		
    	}
     
    	return 0;						
    }
     
    //初始化
    BOOL Game_Init( HWND hwnd )
    {
    	//环境设备
    	g_hdc = GetDC(hwnd); 
     
    	//加载1张位图
    	g_hBackGround = (HBITMAP)LoadImage(NULL,L"天龙八部壁纸.bmp",IMAGE_BITMAP,WINDOW_WIDTH,WINDOW_HEIGHT,LR_LOADFROMFILE);   
     
    	//内存设备
    	g_mdc = CreateCompatibleDC(g_hdc);  
     
    	//绘制
    	Game_Paint(hwnd);
     
    	//释放环境设备
    	ReleaseDC(hwnd,g_hdc);
     
    	return TRUE;
    }
     
    //绘制
    VOID Game_Paint( HWND hwnd )
    {
    	//选择图片
    	SelectObject(g_mdc,g_hBackGround);
     
    	//贴背景图
    	BitBlt(g_hdc,0,0,WINDOW_WIDTH,WINDOW_HEIGHT,g_mdc,0,0,SRCCOPY);  
    
    	//创建字体
    	HFONT hFont=CreateFont(30,0,0,0,0,0,0,0,GB2312_CHARSET,0,0,0,0,L"微软雅黑"); 
    
    	//在环境设备中选择字体
    	SelectObject(g_hdc,hFont); 
    
    	//设置文字背景为透明
    	SetBkMode(g_hdc, TRANSPARENT);  
    
    	//定义三段文字
    	wchar_t text1[]=L"新天龙八部:";
    	wchar_t text2[]=L"高山流水觅知音,画地为牢心无悔。 ";
    	wchar_t text3[]=L"--------逍遥派";
    
    	//设置文字颜色并输出第一段文字
    	SetTextColor(g_hdc,RGB(135,206,250));
    	TextOut(g_hdc,30,100,text1,wcslen(text1));
    
    	//设置文字颜色并输出第二段文字
    	SetTextColor(g_hdc,RGB(135,206,250));
    	TextOut(g_hdc,30,150,text2,wcslen(text2));
    
    	//设置文字颜色并输出第三段文字
    	SetTextColor(g_hdc,RGB(135,206,250));
    	TextOut(g_hdc,300,200,text3,wcslen(text3));
    
    	//释放字体对象
    	DeleteObject(hFont);
    }
     
    //清理资源
    BOOL Game_CleanUp( HWND hwnd )
    {
    	//释放位图
    	DeleteObject(g_hBackGround);
     
    	//释放内存设备
    	DeleteDC(g_mdc);
     
    	return TRUE;
    }
    

    展开全文
  • //Windows窗口头文件 #include &lt;windows.h&gt; //PlaySound函数包含的头文件 #pragma comment(lib,"winmm.lib") //窗口宽度 #define WINDOW_WIDTH 1132 //窗口高度 #define WINDOW_HEIGHT...
    //Windows窗口头文件
    #include <windows.h>
    
    //PlaySound函数包含的头文件
    #pragma comment(lib,"winmm.lib") 
    
    //窗口宽度
    #define WINDOW_WIDTH 1132	
    
    //窗口高度
    #define WINDOW_HEIGHT 708			
    				
    //窗口标题
    #define WINDOW_TITLE L"【游戏开发】自定义贴图"
    
    //全局环境设备和全局内存设备
    HDC	g_hdc=NULL,g_mdc=NULL; 
    
    //位图
    HBITMAP g_hBackGround; 
    
    //窗口过程函数
    LRESULT CALLBACK WndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam );
    
    //初始化
    BOOL Game_Init(HWND hwnd);		
    
    //绘图
    VOID Game_Paint( HWND hwnd);		
    
    //释放资源
    BOOL Game_CleanUp(HWND hwnd );
    
    //主函数
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nShowCmd)
    {
    	//定义窗口类
    	WNDCLASSEX wndClass = { 0 };
     
    	//结构体的字节数大小
    	wndClass.cbSize = sizeof( WNDCLASSEX ) ;	
     
    	//窗口的样式
    	wndClass.style = CS_HREDRAW | CS_VREDRAW;	
     
    	//指向窗口过程函数的指针
    	wndClass.lpfnWndProc = WndProc;		
     
    	//窗口类的附加内存,取0
    	wndClass.cbClsExtra		= 0;		
     
    	//窗口的附加内存,依然取0
    	wndClass.cbWndExtra		= 0;		
     
    	//窗口过程的程序的实例句柄
    	wndClass.hInstance = hInstance;						
     
    	//ico图标
    	wndClass.hIcon=(HICON)::LoadImage(NULL,L"天龙八部图标.ico",IMAGE_ICON,0,0,LR_DEFAULTSIZE|LR_LOADFROMFILE);
     
    	//光标句柄
    	wndClass.hCursor = LoadCursor( NULL, IDC_ARROW ); 
     
    	//画刷句柄
    	wndClass.hbrBackground=(HBRUSH)CreateSolidBrush(RGB(255,255,255));  
     
    	//指定菜单资源的名字
    	wndClass.lpszMenuName = NULL;					
     
    	//指定窗口类的名字
    	wndClass.lpszClassName = L"TWJDWQ";
     
    	//注册窗口类
    	if( !RegisterClassEx( &wndClass ) )			
    		return -1;		
     
    	//创建窗口
    	HWND hwnd = CreateWindow( L"TWJDWQ",WINDOW_TITLE,	
    		WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, WINDOW_WIDTH,
    		WINDOW_HEIGHT, NULL, NULL, hInstance, NULL );
     
    	//窗口显示的位置
    	MoveWindow(hwnd,250,80,WINDOW_WIDTH,WINDOW_HEIGHT,true);
    	
    	//显示窗口
    	ShowWindow( hwnd, nShowCmd );
     
    	//更新窗口
    	UpdateWindow(hwnd);	
    
    	//初始化
    	if (!Game_Init (hwnd)) 
    	{
    		//消息窗口
    		MessageBox(hwnd, L"资源初始化失败", L"消息窗口", 0);
    		return FALSE;
    	}
    
    	//循环播放背景音乐
    	PlaySound(L"我行即我道.wav", NULL, SND_FILENAME | SND_ASYNC|SND_LOOP); 
    
    	//定义并初始化msg
    	MSG msg = { 0 };			
    
    	//消息循环
    	while( msg.message != WM_QUIT )			
    	{
    		//查看并派发消息
    		if( PeekMessage( &msg, 0, 0, 0, PM_REMOVE ) )
    		{
    			//将虚拟键消息转换为字符消息
    			TranslateMessage( &msg );		
     
    			//捕捉消息给窗口
    			DispatchMessage( &msg );
    		}
    	}
     
    	//注销窗口类
    	UnregisterClass(L"TWJDWQ", wndClass.hInstance); 
    
    	return 0;  
    }
    
    //处理窗口消息
    LRESULT CALLBACK WndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam )      
    {
    	//记录绘制信息
    	PAINTSTRUCT paintStruct;			
    
    	switch( message )						
    	{
    	//绘制
    	case WM_PAINT:		
    
    		//指定窗口开始绘制(将和绘图有关的信息填充到paintStruct结构体中)
    		g_hdc = BeginPaint( hwnd, &paintStruct ); 
    
    		//调用绘制函数
    		Game_Paint( hwnd);
    
    		//结束绘制
    		EndPaint( hwnd, &paintStruct );			
    
    		//更新窗口
    		ValidateRect(hwnd, NULL);		
    
    		break;									
    
    	//按键
    	case WM_KEYDOWN:	
    
    		//按键为ESC,销毁窗口,并发送一条WM_DESTROY消息
    		if (wParam == VK_ESCAPE)    
    			DestroyWindow(hwnd);	
    
    		break;									
    
    	//销毁
    	case WM_DESTROY:
    
    		//清理资源
    		Game_CleanUp(hwnd);	
    
    		//请求终止,并发送一条WM_DESTROY消息
    		PostQuitMessage( 0 );			
    
    		break;									
    
    	//缺省
    	default:										
    		return DefWindowProc( hwnd, message, wParam, lParam );		
    	}
    
    	return 0;						
    }
    
    //初始化
    BOOL Game_Init( HWND hwnd )
    {
    	//环境设备
    	g_hdc = GetDC(hwnd); 
    
    	//加载1张位图
    	g_hBackGround = (HBITMAP)LoadImage(NULL,L"天龙八部壁纸.bmp",IMAGE_BITMAP,WINDOW_WIDTH,WINDOW_HEIGHT,LR_LOADFROMFILE);   
    
    	//内存设备
    	g_mdc = CreateCompatibleDC(g_hdc);  
    
    	//绘制
    	Game_Paint(hwnd);
    
    	//释放环境设备
    	ReleaseDC(hwnd,g_hdc);
    
    	return TRUE;
    }
    
    //绘制
    VOID Game_Paint( HWND hwnd )
    {
    	//选择图片
    	SelectObject(g_mdc,g_hBackGround);
    
    	//贴背景图
    	BitBlt(g_hdc,0,0,WINDOW_WIDTH,WINDOW_HEIGHT,g_mdc,0,0,SRCCOPY);  
    }
    
    //清理资源
    BOOL Game_CleanUp( HWND hwnd )
    {
    	//释放位图
    	DeleteObject(g_hBackGround);
    
    	//释放内存设备
    	DeleteDC(g_mdc);
    
    	return TRUE;
    }

    展开全文
  • 我们通过易语言调用大漠图色插件,进行后台对游戏窗口的绑是首要的事情,问题是,如何获得句柄,如何判断游戏是否开启,如何保证绑定万无一失,那就的写的逻辑性要强一点,判断要多一点,循环利于的要好一点,在判断...
  • 【Modern OpenGL】创建窗口

    千次阅读 2015-12-18 20:58:17
    需要注意的是,我们应该在创建窗口之后和游戏循环初始化之前注册这些回调函数。 渲染 我们想要将所有的渲染命令都放到游戏循环体中执行,因为我们想在每次while循环迭代的时候都执行一遍这些渲染指令。实现的...
  • Windows编程系列——第三讲:创建窗口 这里介绍的是典型的win32窗口应用程序结构,通常需要以下7个步骤: 程序入口点(WinMain函数) 注册窗口类(RegisterClass/EX) 创建窗口类(CreateWindow/ex) 显示主窗口...
  • //正式创建窗口 HWND hwnd = CreateWindow(L"ForTheDreamOfGameDevelop", WINDOW_TITLE, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, WINDOW_WIDTH, WINDOW_HEIGHT, NULL, NULL, hInstance, NULL); //...
  • 本文提供一个完整的游戏引擎代码,并有详细代码解析。后续将根据这个游戏引擎开发小游戏,逐渐完善该引擎并介绍游戏编程相关的知识。 假设你起码拥有C++的知识。以《游戏编程入门》 Micheal Morrison为基本教材,PDF...
  • 其中有一个屏幕启动全屏游戏应用,另一个屏幕有一个窗口调用UpdateLayeredWindow 更新窗口信息,当游戏应用为16位色时候失败。故需要修改设定参数。例子代码如下: HDC hdctemp = ::GetDC (m_hWnd); //GetDC()->m_...
  • 创建OpenGL上下文通常需要编写特定于平台的代码才能创建窗口。它还需要从该上下文手动加载OpenGL函数。这些工具在大多数情况下提供了跨平台的解决方案,极大地简化了这些任务。LearnOpenGL教程使用GLFW创建上下文和...
  • 版本:VS2015 语言:C++   本来想昨天写个消息窗口的内容,讲一些好玩的东西,不过没有时间了,就放到一起了。...题外话,这本书绝对神书,游戏编程者都应该去看看,仅仅两个章节我就对整个游戏的循环
  • 笔记一中我们介绍了如何用代码创建空的win32窗口,然而创建空的win32窗口只完成了一半的工作,接下来要做的工作是设置Direct3D,从而可以在屏幕上渲染图形。Direct3D要调用很多函数才能成功设置API。一旦完成设置,...
  • C#游戏编程之创建一个简单的卷轴射击游戏

    万次阅读 多人点赞 2013-01-14 09:05:10
    本篇文章是创建一个简单的卷轴射击游戏开发实例,内容比较完整,分享给大家,不过篇幅有些长,可以慢慢看哈!本文除CSDN博客外,任何媒体和出版物禁止转载和使用。 下面将介绍如何开发一个简单的游戏,首先设计一个...
  • 最近接触一个项目,vc中主窗口调用某个存在的EXE可执行文件在DOS(或者后台)执行,但是不想让用户看到这个执行文件,也就是不显示或者不创建窗口。从网上搜了很多总结了三种方法,希望对大家有用: 网上常见的两种...
  • 一、用Pycharm创建并编写贪吃蛇项目 1.打开Pycharm 2.新建Python项目tanchishe 1.>点击菜单File->New Project… 2.> 设置项目名称目录和运行环境 项目名称填写: tanchishe 运行环境使用:Conda (即 ...
  • 创建Unity新项目并编译成游戏程序

    千次阅读 2016-07-21 16:02:38
    注:本人所使用的Unity版本为:Unity...步骤一:启动Unity,在菜单栏选择【File】—>【New Project】打开工程向导窗口,选择【Browser】确定新工程的保存路径。 注意,第一次新建工程时,一定要点击Asset Packages
  • 本系列文章由zhmxy555(毛星云)编写...毛星云 邮箱: happylifemxy@163.com  这节笔记主要讨论DirectX 11现有的组件构成,随着DirectX各个版本的更新被时代抛弃的一些组件以及第一个围绕着DirectX 11 的Demo创建全过
  • Xcode与C++之游戏开发:创建环境

    千次阅读 2019-02-16 01:16:36
    在OSX上开发游戏的资料比较少,这个系列通过开源的第三方库在Xcode上的开发全过程,希望借此复习一下C++编程,并学习开发游戏的底层原理。
  • C++游戏创建第一个窗体程序(一)

    千次阅读 2015-03-13 18:25:03
    说起游戏,大家都不陌生,大家很快就能想到LOL,DNF,QQ炫舞啊等一系列热门网游,那么它们是如何开发出来的呢?不得不说,这里面涉及到的东西太多太多,其中有:计算机图形学,计算机物理,计算机碰撞检测,计算机...
  • 通过API(CreateProcessA)创建进程后,先暂停这个进程,然后申请内存空间,把我们注入DLL路径写入内存,再通过CreateRemoteThread创建远程线程调用LoadLibraryA函数,获取远程句柄,然后ResumeThread唤醒主线程,...
  • 要在一个特定的位置创建窗口,就要使用GLFW_VISIBLE窗口提示令它初始化时不可见,接着设置它的位置,然后显示它。(-。-事实上,我直接使用 glfwSetWindowPos(window, x, y) 就能改变位置了,也不懂官方文档中为啥搞...
  • OpenCV imread读取图片失败解决方法

    万次阅读 多人点赞 2019-02-26 12:20:34
    使用一下代码读取一张图片失败(不管是绝对路径还是相对路径,都失败),工程运行都没问题,就是图片读取失败。 // 读入一张图片(游戏原画) ... // 创建一个名为 "游戏原画"窗口 ...
  • 本节课我们要做的是将辅助的界面注入到游戏的进程中。 首先,我们需要新建一个MFC DLL,...然后在dll的InitInstance函数中创建一个线程,用来显示要注入的对话框窗口。 具体代码如下: // 唯一的一个 CMFC_DLLApp 对象

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 15,905
精华内容 6,362
关键字:

创建游戏窗口失败