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

[WinAPI] Kilka okienek w jednym programie

Ostatnio zmodyfikowano 2011-10-13 21:07
Autor Wiadomość
Trix
Temat założony przez niniejszego użytkownika
[WinAPI] Kilka okienek w jednym programie
» 2011-10-08 20:17:37
Nie chcę czytać tutoriali, gdyż jest to bez sensu, szukam tylko te inf. które są mi na chwilę obecną potrzebne, tak było z wieloma językami, dzięki temu umiem je na "stałe" :)

A więc teraz chciałbym dowiedzieć się jak zrobić kilka okienek tzn.
Po uruchomieniu aplikacji wyświetla się okienko dialogowe (» Kurs WinAPI, C++ » PodstawyOkna dialogowe, cz. 1 lekcja)
Proszące nas o np. podanie danych konta (login, hasło).

Jeśli hasło i login jest poprawne okienko pierwsze znika i pojawia się właściwa część programu(okienko drugie).

Jak usunąć to pierwsze okienko?
Mógłbym tu skorzystać z innych języków lecz chcę się nauczyć tego,a przy okazji napiszę potrzebny mi program :)
P-41865
malan
» 2011-10-08 20:51:37
Rozumiem, że chcesz to napisać w WinAPI? Nie wiem tylko z czym masz problem.
C/C++
int ShowLoginDialog()
{
    // Wyświetlasz dialog
    return DialogBox(...);
}

int main()
{
    if( ShowLoginDialog() != USER_LOG_ON )
         return 1;
   
    // Dalsza część programu...
}
EndDialog function (msdn)

P-41867
Trix
Temat założony przez niniejszego użytkownika
» 2011-10-12 20:50:47
No dobra a jak mam kilka okienek (WinApi)
To jak zakończyć załóżmy z uchwytem hwnds?
P-42002
DejaVu
» 2011-10-12 20:52:42
Wysyłasz komunikat WM_CLOSE do każdego okna za pomocą funkcji PostMessage lub SendMessage.
P-42003
Trix
Temat założony przez niniejszego użytkownika
» 2011-10-12 21:08:19
A może jakiś przykład? :)
P-42004
SeaMonster131
» 2011-10-12 21:23:56
P-42005
Trix
Temat założony przez niniejszego użytkownika
» 2011-10-13 16:41:13
To mi zbyt nie ułatwiło, gdyż wiem jaki komunikat i jaka struktur jest tej funcji lecz nie wiem jak wybrnąć z problemu, wyrzuca mi błąd, w sumie to się nie dziwię, sami zonaczcie kod:

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


LPSTR NazwaKlasy = "Klasa Okienka";
MSG Komunikat;

LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam );


//Przykładowy button- deklaracja zmiennej
HWND g_hPrzycisk;
HWND g_hPrzycisk2;
LPSTR Bufor;
DWORD dlugosc;
HWND hText;



int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
   
    // WYPEŁNIANIE STRUKTURY
    WNDCLASSEX wc;
   
    wc.cbSize = sizeof( WNDCLASSEX );
    wc.style = 0;
    wc.lpfnWndProc = WndProc;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hInstance = hInstance;
    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 );
    //size okienka
    int size_x = 1024;
    int size_y = 768;
   
   
   
    // REJESTROWANIE KLASY OKNA
    if( !RegisterClassEx( & wc ) )
    {
        MessageBox( NULL, "Błąd podczas rejestracji okna! Błąd nr.1a", "Error...",
        MB_ICONEXCLAMATION | MB_OK );
        return 1;
    }
   
    // TWORZENIE OKNA
    HWND hwndA;
    hwndA = CreateWindowEx( WS_EX_CLIENTEDGE, NazwaKlasy, "Title", WS_OVERLAPPEDWINDOW,
    CW_USEDEFAULT, CW_USEDEFAULT, size_x, size_y, NULL, NULL, hInstance, NULL );
    HWND hwnds;
    hwnds = CreateWindowEx( WS_EX_CLIENTEDGE, NazwaKlasy, "Title", WS_OVERLAPPEDWINDOW,
    CW_USEDEFAULT, CW_USEDEFAULT, size_x, size_y, NULL, NULL, hInstance, NULL );
   
   
    //Tworzenie buttonów
    g_hPrzycisk = CreateWindowEx( 0, "BUTTON", "Pokaż błąd", WS_CHILD | WS_VISIBLE,
    100, 100, 150, 30, hwndA, NULL, hInstance, NULL );
    g_hPrzycisk2 = CreateWindowEx( 0, "BUTTON", "Pokaż tekst", WS_CHILD | WS_VISIBLE,
    100, 135, 150, 30, hwndA, NULL, hInstance, NULL );
   
    //pole tekstowe
    hText = CreateWindowEx( WS_EX_CLIENTEDGE, "EDIT", NULL, WS_CHILD | WS_VISIBLE | WS_BORDER, 50, 50, 150, 20,
    hwndA, NULL, hInstance, NULL );
    SetWindowText( hText, "Wpisz tu coś" );
    dlugosc = GetWindowTextLength( hText );
    Bufor =( LPSTR ) GlobalAlloc( GPTR, dlugosc + 1 );
   
    //przykład wypisywania tekstu w okienku
    HWND hStatic = CreateWindowEx( 0, "STATIC", NULL, WS_CHILD | WS_VISIBLE |
    SS_LEFT, 50, 250, 150, 50, hwndA, NULL, hInstance, NULL );
    SetWindowText( hStatic, "Napis" );
   
    //zmiana czcionki
    HFONT hNormalFont =( HFONT ) GetStockObject( DEFAULT_GUI_FONT );
    SendMessage( hStatic, WM_SETFONT,( WPARAM ) hNormalFont, 0 );
   
   
   
   
   
    if( hwndA == NULL )
    {
        MessageBox( NULL, "Błąd podczas uruchamiania aplikacji! Błąd nr.1b!", "Error...", MB_ICONEXCLAMATION );
        return 1;
    }
   
    ShowWindow( hwnds, nCmdShow );
    ShowWindow( hwndA, nCmdShow ); // Pokaż okienko...
    UpdateWindow( hwndA );
   
    // Pętla komunikatów
    while( GetMessage( & Komunikat, NULL, 0, 0 ) )
    {
        TranslateMessage( & Komunikat );
        DispatchMessage( & Komunikat );
    }
    return Komunikat.wParam;
}

// OBSŁUGA ZDARZEŃ
LRESULT CALLBACK WndProc( HWND hwndA, UINT msg, WPARAM wParam, LPARAM lParam )
{
    switch( msg )
    {
    case WM_COMMAND:
        //Nasłuchiwacz, który button został kliknięty...
        if(( HWND ) lParam == g_hPrzycisk )
        {
            SendMessage( hwnds, WM_DESTROY,( WPARAM ) 0,( LPARAM ) 0 );
        }
        else if(( HWND ) lParam == g_hPrzycisk2 )
        {
            GetWindowText( hText, Bufor, dlugosc + 1 );
            MessageBox( NULL, Bufor, "NO-Error...", MB_ICONEXCLAMATION );
        }
        break;
        //end
    case WM_CLOSE:
        CloseWindow( hwndA );
        break;
       
    case WM_DESTROY:
        DestroyWindow( hwndA );
        break;
       
        default:
        return DefWindowProc( hwndA, msg, wParam, lParam );
    }
   
    return 0;
}

(linijka nr. 25 od końca),
mam 2 okienka i nie wiem w jaki sposób za pomocą przycisku (jest on w 1 okienku) zamknąć 2 okienko.


Może i zadaję głupie pytania ale muszę się jakoś tego nauczyć :)


@EDIT
Jak użyję zamiast
SendMessage( hwnds, WM_DESTROY,( WPARAM ) 0,( LPARAM ) 0 );
to
SendMessage( hwndA, WM_DESTROY,( WPARAM ) 0,( LPARAM ) 0 );
to poprawnie zamyka 1 okienko ale ja chcę zamknąć to 2 :)
P-42036
SeaMonster131
» 2011-10-13 17:23:06
SendMessage( hwndA, WM_DESTROY,( WPARAM ) 0,( LPARAM ) 0 );
to poprawnie zamyka 1 okienko ale ja chcę zamknąć to 2 :)
Masz hwnds i hwndA, czym się różnią ? :)
Czyli wnioskuję, że zamykasz "hwndA" zamiast "hwnds" ;p
P-42037
« 1 » 2
  Strona 1 z 2 Następna strona