2013-02-26 2 views
0

хорошо, поэтому я потратил время, чтобы изучить, но из Win32 API, чтобы делать с открытием окон, и код, который я придумал, в конце концов, я думаю, будет работать, но не делает. Я зарегистрировал класс окна, сделал все, что мне нужно, но когда я его запускаю, ничего не происходит ... Было бы очень полезно, если бы кто-то мог указать, что я делаю неправильно/отсутствует.Окно API Win32 не открывается

#include <stdlib.h> 
#include <iostream> 
#include <Windows.h> 
#pragma comment (lib, "wsock32.lib") 
#define WNDCLASSNAME "wndclass" 

bool quit = false; 

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) 
{ 
    switch(msg) 
    { 
     case WM_CLOSE: 
      DestroyWindow(hwnd); 
      break; 

     case WM_DESTROY: 
      PostQuitMessage(0); 
      break; 

     default: 
      return DefWindowProc(hwnd, msg, wParam, lParam); 
    } 
    return 0; 
} 

int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE hprevinstance, LPSTR lpcmdline, int nshowcmd) 
{ 
    WNDCLASSEX WCE; 
    WCE.cbSize = sizeof(WNDCLASSEX); 
    WCE.style = CS_HREDRAW|CS_VREDRAW|CS_OWNDC|CS_DBLCLKS; 
    WCE.lpfnWndProc = WndProc; 
    WCE.cbClsExtra = 0; 
    WCE.cbWndExtra = 0; 
    WCE.hInstance = hinstance; 
    WCE.hIcon = NULL;//LoadImage() 
    WCE.hCursor = NULL;//LoadCursor(NULL, IDC_CROSS); 
    WCE.hbrBackground = (HBRUSH) COLOR_BACKGROUND; 
    WCE.lpszMenuName = NULL; 
    WCE.lpszClassName = "KyleWindow"; 
    WCE.hIconSm = NULL; 

    RegisterClassEx(&WCE); 

    HWND WindowHandle; 

    WindowHandle = CreateWindowEx(WS_OVERLAPPEDWINDOW, "KyleWindow", "Xerus", WS_OVERLAPPEDWINDOW, 0, 0, 500, 500, NULL, NULL, hinstance, NULL); 

    ShowWindow(WindowHandle, SW_SHOWNORMAL); 
    UpdateWindow(WindowHandle); 

    std::cout<<"'Opened' Window"<<std::endl; 

    MSG msg; 

    while(!quit) 
    { 
     if(PeekMessage(&msg, NULL, NULL, NULL, PM_REMOVE)) 
     { 
      if(msg.message == WM_QUIT) 
       quit = true; 
      TranslateMessage(&msg); 
      DispatchMessage(&msg); 
     } 
    } 
    return msg.lParam; 
} 
+3

Ум, можете ли вы хотя бы сказать, успешно ли выполняются все вызовы функций? Какие сообщения получает ваша оконная процедура? Мы не экстрасенс. –

+0

@RaymondChen Извините, да, это так; вызов функции выполняется успешно. –

+0

Вы передаете 'WS_OVERLAPPEDWINDOW' для расширенных стилей окна, я думаю, вы имеете в виду' WS_EX_OVERLAPPEDWINDOW'. –

ответ

3

Использование WS_EX_OVERLAPPEDWINDOW в качестве первого параметра вашей CreateWindowEx функции (вместо WS_OVERLAPPEDWINDOW, который не является допустимым продлен стиль окна).

+0

Большое вам спасибо! Теперь это работает! –

-2

Функция int WINAPI WinMain должна быть перед функцией LRESULT CALLBACK WndProc. Компиляторы читаются в порядке.

+0

Собственно, это неправильно - у вас есть это назад. Поскольку указатель на функцию WndProc используется при инициализации структуры WNDCLASSEX внутри метода WinMain, компилятору действительно нужно увидеть объявление для функции WndProc * перед * 'WinMain'. Таким образом, вы можете использовать форвардную декларацию или оставить их в том порядке, в котором они есть. –

-1

вместо использования WNDCLASSEX использование WNDCLASS

изменение:

WNDCLASSEX WCE; к WNDCLASS WCE;

удалить линии:

WCE.cbSize = sizeof(WNDCLASSEX); 

изменение:

RegisterClassEx(&WCE); до RegisterClass(&WCE);

+0

Зачем это решить проблему? Что у вас против расширенных оконных классов? –

Смежные вопросы