首先,对于我对窗口创建过程的无知感到抱歉。今天实际上是我试验它的第一天。
我几天前开始编写基于文本的游戏代码,我有主菜单,还有3到4个不同的功能,用文本控制各种事物。然后我被建议查看Windows API并为该程序创建一个窗口。我创建了一个可以在这里看到的窗口:
#include <Windows.h>
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, PWSTR nCmdLine, int nCmdShow)
{
const wchar_t CLASS_NAME[] = L"WindowClass";
WNDCLASS wc = { };
wc.lpfnWndProc = WindowProc;
wc.lpszClassName = CLASS_NAME;
wc.hInstance = hInstance;
RegisterClass(&wc);
HWND hwnd = CreateWindowEx( //This creats a new instance of a window
0,
CLASS_NAME,
L"MyFirstWindow",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
500,
500,
NULL,
NULL,
hInstance,
NULL);
if(hwnd == 0)
return 0;
ShowWindow(hwnd,nCmdShow);
nCmdShow = 1;
MSG msg = { };
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch(uMsg)
{
case WM_DESTROY:PostQuitMessage(0); return 0;
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hwnd,&ps);
FillRect(hdc,&ps.rcPaint,(HBRUSH)(COLOR_WINDOW+5));
EndPaint(hwnd, &ps);
}return 0;
case WM_CLOSE:
{
if(MessageBox(hwnd,L"Do you want to exit?",L"Exit",MB_OKCANCEL)==IDOK)
DestroyWindow(hwnd);
} return 0;
}
return DefWindowProc(hwnd,uMsg,wParam,lParam);
}
这看起来有些混乱,但无论如何你可能都不需要它。
所以在这一点上我有我的原始程序和这个程序创建一个窗口。我的问题是我是如何,甚至在哪里放置原始程序的代码,以便将其合并到窗口中。
如果你正在阅读这篇文章并且认为我是这样做的完全白痴,我会接受比我现在正在做的事情简单得多的想法。
答案 0 :(得分:2)
如果您的原始程序是一个控制台应用程序,读取输入和打印输出,那么您可能希望从窗口获取输入以实现您的游戏。
不是从stdin的读取用户输入的角度来看它,而是生成输出到stdout,你必须从窗口消息的角度来考虑它。因此,您需要处理WM_KEYDOWN消息,然后可以使用DrawText()在客户区显示用户输入,或者您可以使用c ++ RichEdit控件。一旦你处理了WM_KEYDOWN消息,你知道用户按下了什么,然后你的程序可以做到这一点(当WM_KEYDOWN键等于回车键时,可能被触发处理一个准确的字符缓冲区?)并将输出写入你的客户区使用DrawText()或使用SendMessage()将WM_KEYDOWN消息发送到您的richedit窗口。
我认为这就是基于文本的游戏的意思,无论如何,你只需要开始考虑通过监控Windows消息来做所有事情。用户对你的窗口做的任何事情,Windows都会向它发送一条消息让它知道。
答案 1 :(得分:2)
您的代码是使用c和win32 API函数创建窗口的标准样板。我建议您修改消息泵(它是中间调用GetMessage的while循环)。而是这样做:
以下是代码的样子:
while (1)
{
if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
if (msg.message == WM_QUIT)
break;
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
{
//Your game code
}
}
我还想指出,虽然使用C学习游戏编程并调用Win32 API是一个有价值的目标,但您可能想看一下XNA游戏工作室。
我推荐它的原因是因为它更容易学习,你可以更快地制作更有趣的游戏。如果您有兴趣,这里有一些链接可以帮助您入门。
http://joshua-w-wise78.livejournal.com/
http://www.krissteele.net/blogdetails.aspx?id=72