Войти
Sergei ShaykinСтатьи

Работаем с MS Visual Studio. (3 стр)

Автор:

Код пустого выполняемого приложения.

Ниже представлен работающий код пустого приложения, в котором создаётся окно, и ведётся минимальная обработка сообщений.

// main.cpp
// http://www.gamedev.ru
// Пустое выполняемое приложение
// Создание главного окна, обработка сообщений
// Урок: http://www.gamedev.ru/users/wat/articles/MSVS
// Sergey Watkin 

#include <windows.h>

// Объявление функций
int Init(HWND hWndMain);
void ReleaseAll();
void OnIdle();
int Run();
HWND CreateMainWindow(LPCSTR pWindowName, int nWidth, int nHeight,
                      int nCmdShow=SW_NORMAL, bool bIsOpenGL=false);

namespace{
  // глобальные переменные
  HINSTANCE hInstance;
  HWND hWndMain;

  // устанавливаемые глобальные переменные
  const char * szAppName = "Demo";
}

// WinMain
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInstance,
                   LPSTR lpCmdLine, int nCmdShow)
{
  hInstance = hInst;
  // Создаем окно главного приложения
  hWndMain = CreateMainWindow("My Demo",640,480);
  if(!hWndMain)
    return 0;
  // Инициализация
  if(!Init(hWndMain))
    return 0;
  // Запускаем цикл обработки сообщений
  int nRet = Run();
  // Освобождение ресурсов
  ReleaseAll();
  return nRet;
}

// Инициализация
int Init(HWND hWndMain)
{

  return 1;
}

// Освобождение занятых ресурсов
void ReleaseAll()
{

}

// Функция, вызывающаяся при пустой очереди сообщений
void OnIdle()
{

}


// Обработка сообщений главного окна приложения
LRESULT WINAPI MainWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
  switch( msg )
  {
    case WM_LBUTTONDOWN:
      break;
    case WM_SIZE:
      break;
    case WM_DESTROY:
      PostQuitMessage( 0 );
      return 0;
  }
  return CallWindowProc( (WNDPROC)DefWindowProc, hWnd, msg, wParam, lParam );
}

// Создание главного окна приложения.
HWND CreateMainWindow(LPCSTR pWindowName, int nWidth, int nHeight,
                      int nCmdShow, bool bIsOpenGL)
{
  WNDCLASS wndclass;
  // регистрируем класс окна
  wndclass.style         = 0;
  wndclass.lpfnWndProc   = (WNDPROC)MainWndProc;
  wndclass.cbClsExtra    = 0;
  wndclass.cbWndExtra    = 0;
  wndclass.hInstance     = hInstance;
  wndclass.hIcon         = LoadIcon (hInstance, szAppName);
  wndclass.hCursor       = LoadCursor (NULL,IDC_ARROW);
  wndclass.hbrBackground = (HBRUSH)(COLOR_WINDOW);
  wndclass.lpszMenuName  = szAppName;
  wndclass.lpszClassName = szAppName;

  if(!RegisterClass(&wndclass))
    return 0;

  DWORD dwStyle = WS_OVERLAPPEDWINDOW;
  if(bIsOpenGL)
    dwStyle |= WS_CLIPSIBLINGS | WS_CLIPCHILDREN;

  // Создаем окно
  HWND hWnd = CreateWindow(szAppName, pWindowName, dwStyle,
                      (GetSystemMetrics(SM_CXSCREEN)-nWidth)/2,
                      (GetSystemMetrics(SM_CYSCREEN)-nHeight)/2,
                      nWidth, nHeight,
                      0, 0, hInstance, NULL);
  if(hWnd)
  {
    // делаем окно видимым
    ShowWindow(hWnd, nCmdShow);
    UpdateWindow(hWnd);
  }
  return hWnd;
}

// Обработчик сообщений
int Run()
{
  MSG msg={0};

  while(msg.message!=WM_QUIT)
  {
    if(PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE))
    {
      if(GetMessage(&msg, NULL, 0, 0))
      {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
      }
    }
    else
      OnIdle();
  }
  return msg.wParam;
}
Страницы: 1 2 3

#Visual Studio, #основы

19 ноября 2001 (Обновление: 5 мар. 2006)

Комментарии [19]