Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

WinAPI nie tworzy okna w Visual Studio Express 2013

Ostatnio zmodyfikowano 2015-02-08 21:10
Autor Wiadomość
carlosmay
Temat założony przez niniejszego użytkownika
WinAPI nie tworzy okna w Visual Studio Express 2013
» 2015-02-07 23:34:53
Jak w temacie. Cały kod.
C/C++
#include <windows.h>
#include <tchar.h>

static TCHAR KlasaOkna[] = _T( "Okno z przyciskiem" );
MSG Kom;
HWND g_hPrzycisk;
LRESULT CALLBACK WndProc( HWND okno_glowne, UINT msg, WPARAM wParam, LPARAM lParam );

int WINAPI WinMain( HINSTANCE hPierwsze_wywolanie, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
    WNDCLASSEX winkl;
    winkl.cbSize = sizeof( WNDCLASSEX );
    winkl.style = 0;
    winkl.lpfnWndProc = WndProc;
    winkl.cbClsExtra = 0;
    winkl.cbWndExtra = 0;
    winkl.hInstance = hPierwsze_wywolanie;
    winkl.hIcon = LoadIcon( NULL, IDI_APPLICATION );
    winkl.hCursor = LoadCursor( NULL, IDC_ARROW );
    winkl.hbrBackground =( HBRUSH )( COLOR_WINDOW + 1 );
    winkl.lpszMenuName = NULL;
    winkl.lpszClassName = KlasaOkna;
    winkl.hIconSm = LoadIcon( NULL, IDI_APPLICATION );
   
    if( !RegisterClassEx( & winkl ) )
    {
        MessageBox( NULL, _T( "Nieudana!" ), _T( "Rejestrowanie okan" ), MB_ICONEXCLAMATION | MB_OK );
        return 1;
    }
    HWND okno_glowne;
    okno_glowne = CreateWindowEx( WS_EX_CLIENTEDGE, KlasaOkna, _T( "Pierwsze okno" ), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 500, 300, NULL, NULL, hPierwsze_wywolanie, NULL );
    if( okno_glowne == NULL )
    {
        MessageBox( NULL, _T( "Nieudane!" ), _T( "Status tworzenia okna" ), MB_ICONEXCLAMATION | MB_OK );
        return 1;
    }
    g_hPrzycisk = CreateWindowEx( WS_EX_WINDOWEDGE, _T( "BUTTON" ), _T( "Przycisk1" ), WS_CHILD | WS_VISIBLE, 190, 240, 120, 30, okno_glowne, NULL, hPierwsze_wywolanie, NULL );
    if( g_hPrzycisk == NULL )
    {
        MessageBox( NULL, _T( "Nieudane!" ), _T( "Status tworzenia Przycisk1" ), MB_ICONEXCLAMATION | MB_OK );
        return 1;
    }
    ShowWindow( okno_glowne, nCmdShow );
    UpdateWindow( okno_glowne );
   
    while( GetMessage( & Kom, NULL, 0, 0 ) )
    {
        TranslateMessage( & Kom );
        DispatchMessage( & Kom );
    };
    return Kom.wParam;
}

LRESULT CALLBACK WndProc( HWND okno_glowne, UINT msg, WPARAM wParam, LPARAM lParam )
{
    switch( msg )
    {
    case WM_CLOSE:
        DestroyWindow( okno_glowne );
        break;
    case WM_DESTROY:
        PostQuitMessage( 0 );
        break;
    case WM_COMMAND:
        MessageBox( NULL, _T( "Nacisnieto Przycisk1" ), _T( "Informacja o stanie Przycisk1" ), MB_ICONINFORMATION );
        break;
        default:
        DefWindowProc( okno_glowne, msg, wParam, lParam );
    }
    return 0;
}[ cpp / ]
Co robi ę nie tak ?

Długo kombinowałem i pomyliłem się w pisaniu kodu.
Tam ma być
C/C++
if( !RegisterClassEx( & winkl ) )
{
    MessageBox( NULL, _T( "Nieudana!" ), _T( "Rejestrowanie okan" ), MB_ICONEXCLAMATION | MB_OK );
    return 1;
}
HWND okno_glowne;
okno_glowne = CreateWindowEx( WS_EX_CLIENTEDGE, KlasaOkna, _T( "Pierwsze okno" ), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 500, 300, NULL, NULL, hPierwsze_wywolanie, NULL );
if( okno_glowne == NULL )
{
    MessageBox( NULL, _T( "Nieudane!" ), _T( "Status tworzenia okna" ), MB_ICONEXCLAMATION | MB_OK );
    return 1;
}
Kod kompiluje się bez błędów. Debuger rusza i nic się nie pojawia.
Gdy dopisałem warunki sprawdzające to wywala że tworzenie okna nieudane.
Potem dopisałem tem nieprawidłowy fragment i pomyłka w temacie powstała.
Porównywałem kod z działający i nie widzę błędu.

Szukałem w złym miejscu, dziękuję za pomoc.
Jeszcze pytanie o tego returna.
1.Jeśli funkcja nasłuchu nie zwraca wartości a powinna, to program powinien dać znać?
2.Czy brak zwróconej wartości powoduje nie tworzenie się okna czy jeszcze ma wpływ na inne elementy kodu
(np. nie tworzy się przycisk lub pole testowe?
3.WndProc powinien zwrócić 0. Jeśli zwróci inną wartość lub wcale to efektem będzie brak okna?
P-126174
Monika90
» 2015-02-08 10:42:43
C/C++
if( !RegisterClassEx( & winkl ) == NULL )
Po co ten operator negacji?
P-126178
Monika90
» 2015-02-08 20:03:31
C/C++
DefWindowProc( okno_glowne, msg, wParam, lParam );
brakuje return, powino być
C/C++
return DefWindowProc( okno_glowne, msg, wParam, lParam );
P-126210
carlosmay
Temat założony przez niniejszego użytkownika
» 2015-02-08 20:53:43
Szukałem w złym miejscu, dziękuję za pomoc.
Jeszcze pytanie o tego returna.
1.Jeśli funkcja nasłuchu nie zwraca wartości a powinna, to program powinien dać znać?
2.Czy brak zwróconej wartości powoduje nie tworzenie się okna czy jeszcze ma wpływ na inne elementy kodu
(np. nie tworzy się przycisk lub pole testowe?
3.WndProc powinien zwrócić 0. Jeśli zwróci inną wartość lub wcale to efektem będzie brak okna?
P-126212
Monika90
» 2015-02-08 20:56:21
Bez tego return za każdym razem wykona się
return 0;
 które jest na końcu funkcji. Podczas tworzenia okna windows wysyła komunika WM_NCCREATE, jeżeli obsługa tego komunikatu zwróci 0, to tworzenie okna jest przerywane i CreateWindowEx zwraca NULL.
P-126213
carlosmay
Temat założony przez niniejszego użytkownika
» 2015-02-08 21:10:18
Okaże się w praniu czy połapałem problem. Źle zrozumiałem lekcję.
Jeszcze raz dziękuję.
P-126216
« 1 »
  Strona 1 z 1