在使用WinMain()和WindowProc()建立窗口后,在哪里添加实际程序? (C ++)

时间:2011-12-31 02:26:12

标签: c api winapi window location

首先,对于我对窗口创建过程的无知感到抱歉。今天实际上是我试验它的第一天。

我几天前开始编写基于文本的游戏代码,我有主菜单,还有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); 
}

这看起来有些混乱,但无论如何你可能都不需要它。

所以在这一点上我有我的原始程序和这个程序创建一个窗口。我的问题是我是如何,甚至在哪里放置原始程序的代码,以便将其合并到窗口中。

如果你正在阅读这篇文章并且认为我是这样做的完全白痴,我会接受比我现在正在做的事情简单得多的想法。

2 个答案:

答案 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循环)。而是这样做:

  1. 运行无限循环
  2. 查看消息
  3. 如果消息不存在,请执行您的代码
  4. 其他处理消息,包括退出消息
  5. 以下是代码的样子:

    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

    http://www.codeproject.com/KB/game/xna1.aspx

    http://msdn.microsoft.com/en-us/library/bb203894.aspx