Где я могу добавить свою реальную программу после того, как я установил Window с помощью WinMain () и WindowProc ()?(C ++) - PullRequest
2 голосов
/ 31 декабря 2011

Прежде всего, извините за незнание процесса создания окна. Сегодня первый день моих экспериментов с ним.

Я начал кодировать текстовую игру несколько дней назад, и у меня есть главное меню и 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 ]

2 голосов
/ 31 декабря 2011

Ваш код является стандартным шаблоном для создания окна с использованием функций API c и win32.Я рекомендую вам изменить насос сообщений (это цикл while в середине, вызывающий GetMessage).Вместо этого сделайте следующее:

  1. Запустите бесконечный цикл
  2. Просмотр сообщения
  3. Если сообщения нет, выполните код
  4. Иначе процесссообщения, включая сообщение о выходе

Вот как должен выглядеть код:

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

2 голосов
/ 31 декабря 2011

Если ваша оригинальная программа была консольным приложением, которое считывало ввод и печатал вывод, то вы, вероятно, захотите получить ввод из своего окна для реализации своей игры.

Вместо того, чтобы смотреть на это с точки зрениячитать пользовательский ввод из stdin, а затем генерировать вывод в stdout, вы должны думать об этом с точки зрения обмена сообщениями в окне.Поэтому вам нужно обработать сообщения WM_KEYDOWN, затем вы можете использовать DrawText (), чтобы показать пользовательский ввод в вашей клиентской области, или вы можете использовать элемент управления RichEdit c ++.После того, как вы обработаете сообщения WM_KEYDOWN, вы знаете, что пользователь нажал, и тогда ваша программа сможет это сделать (возможно, будет запущена обработка накапливаемого буфера символов всякий раз, когда клавиша WM_KEYDOWN равна клавише ввода?) И записывает вывод в свой файл.клиентская область с помощью DrawText () или отправка сообщений WM_KEYDOWN в ваше окно richedit с помощью SendMessage ().

Я думаю, это то, что вы имели в виду под текстовой игрой, в любом случае, вам просто нужно подумать о том, чтобы делать все помониторинг окон сообщений.Все, что пользователь делает с вашим окном, Windows отправит ему сообщение, чтобы сообщить ему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...