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

Problem z dialogami w WinAPI

Ostatnio zmodyfikowano 2010-12-31 11:27
Autor Wiadomość
Mateusz124
Temat założony przez niniejszego użytkownika
Problem z dialogami w WinAPI
» 2010-12-30 10:38:29
Witam wszystkich,
Mam pewien problem z wywołaniem dialogu (Lekcja WinAPI okna dialogowe, cz.1).
Kod:
C/C++
//main.cpp
#include <windows.h>
#include "dialog.h"

LPSTR NazwaKlasy = "Klasa Okienka";
MSG msg;
// Prototypy funkcji obsługujących komunikaty.
// Sztuk dwie, jedna dla okna głównego, jedna dla dialogu ;-)

LRESULT CALLBACK WndProc( HWND, UINT, WPARAM, LPARAM );
BOOL CALLBACK DlgProc( HWND, UINT, WPARAM, LPARAM );

int WINAPI WinMain( HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument,
int nFunsterStil )
{
   
    // WYPEŁNIANIE STRUKTURY
    WNDCLASSEX wc;
   
    wc.cbSize = sizeof( WNDCLASSEX );
    wc.style = 0;
    wc.lpfnWndProc = WndProc;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hInstance = hThisInstance;
    wc.hIcon = LoadIcon( NULL, IDI_APPLICATION );
    wc.hCursor = LoadCursor( NULL, IDC_ARROW );
    wc.hbrBackground =( HBRUSH )( COLOR_WINDOW + 1 );
    wc.lpszMenuName = NULL;
    wc.lpszClassName = NazwaKlasy;
    wc.hIconSm = LoadIcon( NULL, IDI_APPLICATION );
   
    // REJESTROWANIE KLASY OKNA
    if( !RegisterClassEx( & wc ) )
    {
        MessageBox( NULL, "Wysoka Komisja odmawia rejestracji tego okna!", "Niestety...",
        MB_ICONEXCLAMATION | MB_OK );
        return 1;
    }
   
    // TWORZENIE OKNA
    HWND hwnd;
   
    hwnd = CreateWindowEx( WS_EX_CLIENTEDGE, NazwaKlasy, "Oto okienko", WS_OVERLAPPEDWINDOW,
    CW_USEDEFAULT, CW_USEDEFAULT, 240, 120, NULL, NULL, hThisInstance, NULL );
   
    if( hwnd == NULL )
    {
        MessageBox( NULL, "Okno odmówiło przyjścia na świat!", "Ale kicha...", MB_ICONEXCLAMATION );
        return 1;
    }
   
   
    // Tworzymy jakiś przycisk do wywołania dialogu
   
    HWND hPrzyc = CreateWindowEx( 0, "BUTTON", "Dialog", WS_CHILD | WS_VISIBLE,
    5, 5, 50, 25, hwnd, NULL, hThisInstance, NULL );
   
    // Pokazujemy główne okno
    ShowWindow( hwnd, nFunsterStil );
   
   
    // No i standardowo - pętelka
    while( GetMessage( & msg, NULL, 0, 0 ) )
    {
        TranslateMessage( & msg );
        DispatchMessage( & msg );
    }
   
    return msg.wParam;
}

// Procedura okna
LRESULT CALLBACK WndProc( HWND hwnd, UINT mesg, WPARAM wParam, LPARAM lParam )
{
    switch( mesg )
    {
    case WM_COMMAND:
        {
            // Tutaj wywołujemy nasz dialog
            int ret = DialogBox( GetModuleHandle( NULL ), MAKEINTRESOURCE( 200 ), hwnd, DlgProc );
            if( ret == IDOK )
                 MessageBox( hwnd, "Wybrałeś \'Fajnie\' w oknie dialogowym!", "Test", MB_ICONINFORMATION );
            else if( ret == IDCANCEL )
                 MessageBox( hwnd, "Wybrałeś \'Anuluj\' w oknie dialogowym!", "Test", MB_ICONINFORMATION );
           
        }
        break;
       
    case WM_DESTROY:
        PostQuitMessage( 0 );
        break;
       
        default:
        return DefWindowProc( hwnd, mesg, wParam, lParam );
    }
   
    return 0;
}

// Procedura dialogowa
BOOL CALLBACK DlgProc( HWND hwnd, UINT Msg, WPARAM wParam, LPARAM lParam )
{
    switch( Msg )
    {
    case WM_COMMAND:
        {
            // reakcja na przyciski
            switch( LOWORD( wParam ) )
            {
            case IDOK: EndDialog( hwnd, IDOK ); break;
            case IDCANCEL: EndDialog( hwnd, IDCANCEL ); break;
            }
        }
        break;
       
        default: return FALSE;
    }
   
    return TRUE;
}

C/C++
//zasoby.rc
#include <windows.h>
#include "dialog.h"

IDD_MOJDIALOG DIALOG DISCARDABLE 20, 20, 200, 66
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Mój własny dialog"
FONT 8, "MS Sans Serif"
{
    DEFPUSHBUTTON "&Fajnie!", IDOK, 124, 18, 50, 14
    PUSHBUTTON "&Anuluj", IDCANCEL, 124, 35, 50, 14
    LTEXT "To jest okno dialogowe", IDC_LABEL, 16, 18, 80, 33
}
C/C++
//dialog.h
#define IDD_MOJDIALOG 200
#define IDC_LABEL 201

Ten kod się kompiluje ale przycisk DIALOG nie wywołuje okna z dialogiem. Bardzo proszę o pomoc, gdyż sam nie umiem sobie z tym poradzić.

PS. Kod który podałem jest praktycznie w całości wzięty z 8 Lekcji WinAPI z tej strony.
Dodałem do niego jedynie tworzenie okna.

P-25927
DejaVu
» 2010-12-30 11:27:10
Skoro nie oprogramowałeś obsługi zdarzeń przycisku to i żadna akcja sama z siebie się nie wykona.
P-25929
Mateusz124
Temat założony przez niniejszego użytkownika
» 2010-12-30 11:46:11
Oprogramowałem ten przycisk tym fragmentem kodu:

C/C++
case WM_COMMAND:
{
    // Tutaj wywołujemy nasz dialog
    int ret = DialogBox( GetModuleHandle( NULL ), MAKEINTRESOURCE( 200 ), hwnd, DlgProc );
    if( ret == IDOK )
         MessageBox( hwnd, "Wybrałeś \'Fajnie\' w oknie dialogowym!", "Test", MB_ICONINFORMATION );
    else if( ret == IDCANCEL )
         MessageBox( hwnd, "Wybrałeś \'Anuluj\' w oknie dialogowym!", "Test", MB_ICONINFORMATION );
   
}
break;

Sprawdziłem to piszac to:

C/C++
case WM_COMMAND:
{
    MessageBox( hwnd, "Test", "Test", 0 );
}
break;
 
zamiast instrukcji która miała wywołać dialog. Okienko z informacja sie pojawilo co oznacza ze przycisk działa. Jeśli sie myle to poszę żeby ktoś wyprowadził mnie z błędu. Oczywiście wiem że takie sprawdzenie czy przycisk został wciśnięty nie zadziała kiedy przycisków było by więcej ale to jest tylko przykładowy kod z jednym przyciskiem.
P-25930
pekfos
» 2010-12-30 12:08:28
sprawdź GetLastError
P-25931
DejaVu
» 2010-12-30 13:52:51

Return Value


INT_PTR

If the function succeeds, the return value is the nResult parameter in the call to the EndDialog function used to terminate the dialog box.

If the function fails because the hWndParent parameter is invalid, the return value is zero. The function returns zero in this case for compatibility with previous versions of Windows. If the function fails for any other reason, the return value is –1. To get extended error information, call GetLastError.
Źródło: http://msdn.microsoft.com/en-us/library/ms645452(v=vs.85).aspx
P-25934
Mateusz124
Temat założony przez niniejszego użytkownika
» 2010-12-30 14:50:58
Przeczytałem to co mi dałeś DejaVu. Funkcja tworząca dialog rzeczywiście zwraca -1, ale co zrobić aby tego nie robiła i żeby dialog działał poprawnie?
P-25937
DejaVu
» 2010-12-30 14:52:17
Zapewne (strzelam) nieprawidłowy uchwyt okna dajesz (tj. NULL zamiast właściwego hWnd).
P-25938
Mateusz124
Temat założony przez niniejszego użytkownika
» 2010-12-30 15:52:47
Wydaje mi się że uchwyt okna w funkcji DialogBox(); daje poprawny (tzn. hwnd).
P-25945
« 1 » 2
  Strona 1 z 2 Następna strona