Po 2 dniach eksperymentów z kodem, przekopywania MSDN, czytania ze zrozumieniem poradnika : odpuściłem. Możecie mi pomóc w tej sprawie?
#define WIN32_LEAN_AND_MEAN
#define WINAPI __stdcall
#include
#include
std::string g_strKlasaOkna;
LRESULT CALLBACK WindowProc(HWND hOkno, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_DESTROY:
// kończymy program
PostQuitMessage (0);
return 0;
}
return DefWindowProc(hOkno, uMsg, wParam, lParam);
}
int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/gotoBEGINNING:/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/
UINT uDecyzja = MessageBox(NULL, (LPCTSTR)"Chcesz sie nauczyc programować?", (LPCTSTR)"Pytanie", MB_TOPMOST | MB_YESNO | MB_ICONQUESTION | MB_SYSTEMMODAL);
switch(uDecyzja)
{
case IDYES:{MessageBox(NULL, (LPCTSTR)"No to ok, jedziemy dalej!", (LPCTSTR)"Komunikat", MB_OK | MB_ICONINFORMATION);};
goto gotoREALWND;
case IDNO:{UINT MsgIDNO = MessageBox(NULL, (LPCTSTR)"Więc nie zrozumiesz nigdy PC buahahaha", (LPCTSTR)"Error", MB_ABORTRETRYIGNORE | MB_ICONERROR);
switch (MsgIDNO)
{
case IDABORT:
break;
case IDRETRY:{goto gotoBEGINNING;}
break;
case IDIGNORE:{MessageBox(NULL, (LPCTSTR)"Powrót", (LPCTSTR)"Powrót", MB_OK | MB_ICONEXCLAMATION);};
goto gotoBEGINNING;
}
};
}
/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/gotoREALWND:/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/
WNDCLASSEX hOknoc;
ZeroMemory(&hOknoc, sizeof(WNDCLASSEX));
hOknoc.cbSize = sizeof(WNDCLASSEX);
hOknoc.style = CS_DROPSHADOW;
hOknoc.lpfnWndProc = WindowProc;
hOknoc.cbClsExtra = NULL;
hOknoc.cbWndExtra = NULL;
hOknoc.hInstance = hinstance;
hOknoc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
hOknoc.hCursor = LoadCursor(NULL, IDC_ARROW);
hOknoc.hbrBackground = (HBRUSH) COLOR_WINDOW;
hOknoc.lpszMenuName = NULL;
hOknoc.lpszClassName = g_strKlasaOkna.c_str();
hOknoc.hIconSm = NULL;
// rejestrujemy klasę okna
RegisterClassEx (&hOknoc);
/* tworzymy okno */
// tworzymy okno funkcją CreateWindowEx
HWND hOkno;
hOkno = CreateWindowEx(NULL, // rozszerzony styl
g_strKlasaOkna.c_str(), // klasa okna
"REALWND", // tekst na p. tytułu
WS_OVERLAPPEDWINDOW, // styl okna
CW_USEDEFAULT, // współrzędna X
CW_USEDEFAULT, // współrzędna Y
CW_USEDEFAULT, // szerokość
CW_USEDEFAULT, // wysokość
NULL, // okno nadrzędne
NULL, // menu
hinstance, // instancja aplikacji
NULL); // dodatkowe dane
///////////////////////////////////////// pokazujemy nasze okno /////////////////////////////////////////////
ShowWindow (hOkno, nCmdShow);
/* pętla komunikatów */
uDecyzja = MessageBox(NULL, (LPCTSTR)"Naciśnij ok aby zakończyc program", (LPCTSTR)"Komunikat", MB_OK);
MSG uMsg;
if (uDecyzja = IDOK)
{
TranslateMessage(&uMsg);
DispatchMessage(&uMsg);
}
while(GetMessage(&uMsg, NULL, 0, 0) > 0)
{
TranslateMessage(&uMsg);
DispatchMessage(&uMsg);
}
return uMsg.wParam;
// zwracamy kod wyjścia
}
Program nie wyświetla okna, przy kompilacji w krokach (F11/F10) kompilator po prostu “prześlizguje” się po funkcji ShowWindow nie wywołując okna, a następnie wchodzi w pętlę wiadomości i… trzeba wyłączyć sam proces w menedżerze. Win7 x64, VS C++ 2010 Express. Warunek if przed pętlą while na końcu to tylko mój manualny sposób WM_DESTROY. Aha, MessageBox’y to tylko takie małe “ćwiczenie” logiczne Korzystam z megatutoriala Xion’a tylko że nawet jego kod po kompilacji ma błędy o.0 Wyczyszczony kod:
#define WIN32_LEAN_AND_MEAN
#define WINAPI __stdcall
#include
const char* WndClass;
LRESULT CALLBACK WindowProc(HWND hOkno, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_DESTROY:
// kończymy program
PostQuitMessage (0);
return 0;
}
return DefWindowProc(hOkno, uMsg, wParam, lParam);
}
int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
WNDCLASSEX hOknoc;
ZeroMemory(&hOknoc, sizeof(WNDCLASSEX));
hOknoc.cbSize = sizeof(WNDCLASSEX);
hOknoc.style = CS_DROPSHADOW;
hOknoc.lpfnWndProc = WindowProc;
hOknoc.cbClsExtra = NULL;
hOknoc.cbWndExtra = NULL;
hOknoc.hInstance = hinstance;
hOknoc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
hOknoc.hCursor = LoadCursor(NULL, IDC_ARROW);
hOknoc.hbrBackground = (HBRUSH) COLOR_WINDOW;
hOknoc.lpszMenuName = NULL;
hOknoc.lpszClassName = WndClass;
hOknoc.hIconSm = NULL;
// RegisterClassEx
RegisterClassEx (&hOknoc);
/* tworzymy okno */
// CreateWindowEx
HWND hOkno;
hOkno = CreateWindowEx(NULL, // rozszerzony styl
WndClass, // klasa okna
"Main_Window", // tekst na p. tytułu
WS_VISIBLE, // styl okna
CW_USEDEFAULT, // współrzędna X
CW_USEDEFAULT, // współrzędna Y
CW_USEDEFAULT, // szerokość
CW_USEDEFAULT, // wysokość
NULL, // okno nadrzędne
NULL, // menu
hinstance, // instancja aplikacji
NULL); // dodatkowe dane
///////////////////////////////////////// ShowWindow /////////////////////////////////////////////
ShowWindow (hOkno, nCmdShow);
/* pętla komunikatów */
MSG uMsg;
while(GetMessage(&uMsg, NULL, 0, 0))
{
TranslateMessage(&uMsg);
DispatchMessage(&uMsg);
}
return uMsg.wParam;
}
Próbowałem też nadać wartość ShowWindow(hOkno, nCmdShow == SW_SHOW) oraz SW_SHOWNORMAL i nic…