c - DirectX 游戏的窗口 GUI 似乎有问题
问题描述
我想在 Windows10 中使用 DirectX 开发游戏。我用 CodeBlocks 编写代码。以下代码将抛出如下错误:
undefined reference to `GetStockObject@4'
这个 Windows 功能有什么问题?我不必单独初始化或编写此函数,不是吗?注释掉错误代码将编译代码,但没有 gui... 这是代码:
#include <windows.h>
#include"Frame.h"
//global definitions
BOOL done;
int Spiel_Zustand;
HWND hwnd;
//Function:CallBack
LRESULT CALLBACK WindowProc (HWND hwnd,UINT message, WPARAM wparam,LPARAM lparam)
{
switch(message)
{
case WM_DESTROY :
{
done=TRUE;
PostQuitMessage(0);
return 0;
}
break;
case WM_KEYDOWN:
switch(wparam)
{
case VK_ESCAPE:
{
PostMessage(hwnd,WM_CLOSE,0,0);
return 0;
}
break;
}
break;
default:
break;
}//End of switch
return DefWindowProc(hwnd,message,wparam,lparam);
}//End of CallBack
//Function:Start
int WINAPI WinMain(HINSTANCE hinst,HINSTANCE hprevinst,LPSTR lpcmdline,int ncmdshow)
{
WNDCLASSEX winclass;
MSG message;
const char szclassname[]="Klassenname";
DWORD loop_start_time;
winclass.cbSize=sizeof(WNDCLASSEX);
winclass.style=CS_HREDRAW|CS_VREDRAW;
winclass.lpfnWndProc=WindowProc;
winclass.cbClsExtra=0;
winclass.cbWndExtra=0;
winclass.hInstance=hinst;
winclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
winclass.hCursor=LoadCursor(NULL,IDC_ARROW);
winclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);//this will throw out error
winclass.lpszClassName=szclassname;
winclass.hIconSm=LoadIcon(NULL,IDI_APPLICATION);
if(!RegisterClassEx(&winclass))
return 0;
//Create handle of windows ans save it globally
if(!(hwnd=CreateWindowEx(NULL,szclassname,"3D Gameprograming - Title",WS_POPUPWINDOW|WS_VISIBLE,0,0,400,300,NULL,NULL,hinst,NULL)))
return 0;
done=FALSE;
Spiel_Zustand=SPIEL_AUSWAHL;
//Phase 1.1:
Spiel_Initialisieren();
//Phase 1.2:: Main Looping
while(!done)
{
//Any message to handle?
while(GetMessage(&message,NULL,0,0))
{
TranslateMessage(&message);
DispatchMessage(&message);
}
//Start time of Main Loop
loop_start_time=GetTickCount;
switch(Spiel_Zustand)
{
case SPIEL_AUSWAHL:
{
//[....]
Spiel_Zustand=SPIEL_START;
}
break;
case SPIEL_START:
{
//[...]
Spiel_Zustand=SPIEL_LAEUFT;
}
break;
case SPIEL_LAEUFT:
{
//waiting for User input
//Manage User input
//Artificial Intelligence and game logic
//Rendering Frame
} break;
case SPIEL_NEUSTART:
{
//[...]
Spiel_Zustand=SPIEL_START;
}
break;
default:
break;
}//End of switch
//Restricting Frame rate
while((GetTickCount()-loop_start_time)<40);
}//End of Main Looping
//Phase 1.3
Spiel_Beenden();
return message.wParam;
}//End of Start
//Phase 2.1
int Spiel_Initialisieren(void)
{
//ToDO:initializations etc..
return 1;
}
//Phase 2.2
int Spiel_Beenden(void)
{
//ToDO:Free Memory etc..
return 1;
}
解决方案
编译时需要链接gdi32.lib-lgdi32
推荐阅读
- java - Android SQLite rawQuery - 如何选择表的多行
- echarts - eCharts:dataZoom 只显示第一类的信息
- angular - 离子可选显示大量列表
- javascript - 使用没有 jquery 的事件侦听器触发按键事件
- python - Json 中包含的字符串的布尔语句
- c# - 没有并发数据访问的多线程环境下的数据一致性
- java - 数据源拒绝建立连接,来自服务器的消息:“连接太多”java
- javascript - 使用 Promise 等待 RabbitMQ 中的队列已满
- google-ads-api - 以编程方式获取 Google Adwords 开发者令牌
- azure - 隔离 Azure 中两个不同用户创建的资源