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

Problem z aplikacją winapi - błąd przy sprawdzaniu funkcją bool.

Ostatnio zmodyfikowano 2013-12-01 18:12
Autor Wiadomość
Soberowy
Temat założony przez niniejszego użytkownika
» 2013-11-27 14:26:15
Ok popracuję teraz nad nim i dam znać czy wszystko działa. Dzięki za pomoc :)
P-97653
Soberowy
Temat założony przez niniejszego użytkownika
» 2013-11-27 16:38:48
Uporządkowałem go i już wiem gdzie leży problem natomiast nie wiem jak sobie z nim poradzić
C/C++
GetWindowText( hText[ ile_okien ], Bufor, dlugosc + 1 );
co = atoi( Bufor );
Otóż obojętnie jaką liczbę nie prowadzę do edita zmienna
int co
 jest zawsze równa 0. Dlatego funkcja sprawdzająca zawsze daje fałsz, ponieważ za każdym razem do sprawdzenia otrzymuje tą samą liczbę równą zero. Wychodzi na to, że problem jest w konwersji LPSTR do int, ale ze wszystkich sposobów jakie znalazłem żaden nie działał poprawnie w moim przypadku ;/
P-97675
pekfos
» 2013-11-27 17:05:13
Zmienne mają dobre wartości? Co zwraca GetWindowText()?
P-97676
Soberowy
Temat założony przez niniejszego użytkownika
» 2013-11-27 17:48:21
Tak mają dobre wartości. GetWindowText zwraca int no ale to mnie przecież chyba nie interesuje nie?
P-97682
pekfos
» 2013-11-27 20:56:08
GetWindowText zwraca int no ale to mnie przecież chyba nie interesuje nie?
A wartość..?
P-97698
Soberowy
Temat założony przez niniejszego użytkownika
» 2013-11-29 16:03:17
aaa sory nie ogarnąłem o co chodzi. Noo zwraca 0..
P-97842
Adik80
» 2013-11-29 18:48:30
w petli while(GetMessage())  nie powinno byc niczego oprocz Translate/Dispatch
tworzenie kontrolek powinno byc w obsludze WM_CREATE (albo przynajmniej po UpdateWindow, ktore wyzwala kolejke komunikatow)
edytki powinny miec falge ES_NUMBEr, to powinno zabezpieczyc program przed zlymi znakami
Mozesz ograniczyc wprowadzany text do 2 znakow (42 sie zmiesci) i uzyc char Bufor[3]

Spradziles co zwraca GetWindowTextLength, GlobalAlloc, GetWIndowText  i co jest w Buforze?
P-97867
Soberowy
Temat założony przez niniejszego użytkownika
» 2013-12-01 18:12:06
Dobra dzięki bardzo poradziłem już sobie. Problem tkwił tylko z pobieraniem danych z EDIT'a poszukałem jeszcze trochę w necie i znalazłem bardzo fajną funkcję pobierającą int'a z EDIT'a. Dodałem jeszcze setfocusa i wszystko śmiga :)
Oto kod:

C/C++
#include <windows.h>
#include<iostream>
#include<cstdlib>
#include<ctime>
#include<sstream>
#include<string>
using namespace std;
LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam );
LPSTR NazwaKlasy = "Klasa Okienka";
MSG Komunikat;
HWND Przycisk, Przycisk_zamknij, hText[ 6 ], Wyniki;
int los[ 6 ];
string ile_traf, czybyla_str;
int GetIntFromEdit( HWND hEdit )
{
    int textLength = GetWindowTextLength( hEdit ) + 1;
   
    char * textBuffer = new char[ textLength ];
   
    GetWindowText( hEdit, textBuffer, textLength );
   
    return atoi( textBuffer );
}
bool CzyBylaLosowana( int Liczba, int tab[], int ile )
{
    if( ile <= 0 ) { return false; }
    int i = 0;
   
    do
    {
        if( Liczba == tab[ i ] ) { return true; }
        i++;
       
    } while( i < ile );
   
    return false;
}
INT WINAPI WinMain( HINSTANCE hInstance, /*uchwyt do naszej aplikacji*/
HINSTANCE hPrevInstance, /*Argument hPrevInstance powinien zawieraæ uchwyt poprzedniego
                                                      wyst¹pienia aplikacji, ale od wersji systemu Windows 95 wynosi on zawsze NULL.*/
LPSTR lpCmdLine, /*zawiera liniê poleceñ, z jakiej zosta³ uruchomiony nasz program.   COKOLWIEK TO ZNACZY*/
int nCmdShow ) /* To ju¿ wiem, typ okna w jakim otwieramy nasza aplikacje*/
{
    srand( time( 0 ) );
    int liczba;
    int ile = 0;
    do
    {
        liczba =( rand() % 42 ) + 1;
        if( CzyBylaLosowana( liczba, los, ile ) == false )
        {
            los[ ile ] = liczba;
            ile++;
           
           
        }
    } while( ile < 6 );
   
    ile = 0;
    stringstream przel[ 6 ];
    string chwila[ 6 ];
    ile_traf = "Moje liczby to:  ";
    do
    {
        przel[ ile ] << los[ ile ];
        przel[ ile ] >> chwila[ ile ];
        ile_traf = ile_traf + chwila[ ile ] + ",  ";
        ile++;
    } while( ile < 6 );
   
   
    MessageBox( 0, /* hWnd - uchwyt naszego okna aplikacji z ktorej jest wywolany komunikat, jezeli nie mamy to 0 czyli z pulpitu*/
    "Witaj w lotto! \nZeby wygrac trzeba grac!", /* lpText - tekst wyswietlany w komunikacie*/
    "Zagraj w lotto.", /* lpCaption - tytul komunikatu*/
    MB_OK | MB_ICONINFORMATION ); /* uType - style naszego komunikatu*/
   
   
   
   
    WNDCLASSEX wc;
   
    wc.cbSize = sizeof( WNDCLASSEX ); /*Rozmiar struktury w bajtach. Należy tu wpisać sizeof (WINDOWCLASSEX).*/
    wc.style = 0; /*Style klasy - NIE okna. Zazwyczaj 0*/
    wc.lpfnWndProc = WndProc; /*Wskaźnik do procedury obsługującej okno*/
    wc.cbClsExtra = 0; /*Dodatkowe bajty pamięci dla klasy - zazwyczaj 0*/
    wc.cbWndExtra = 0;
    wc.hInstance = hInstance; /*Identyfikator aplikacji, która ma być właścicielem okna*/
    wc.hIcon = LoadIcon( NULL, IDI_APPLICATION ); /*Ikona aplikacji*/
    wc.hCursor = LoadCursor( NULL, IDC_ARROW ); /*Kursor aplikacji*/
    wc.hbrBackground =( HBRUSH )( COLOR_WINDOW ); /*Kolor tla okna*/
    wc.lpszMenuName = NULL; /*Identyfikator menu aplikacji*/
    wc.lpszClassName = NazwaKlasy; /*Nazwa klasy, którą tworzymy. Możesz wpisać, co chcesz (prawie ;-)).*/
    wc.hIconSm = LoadIcon( NULL, IDI_APPLICATION ); /*Mala ikonka*/
   
    if( !RegisterClassEx( & wc ) )
    {
        MessageBox( NULL, "Wysoka Komisja odmawia rejestracji tego okna!", "Niestety...",
        MB_ICONEXCLAMATION | MB_OK );
        return 1;
    }
    HWND hwnd;
    hwnd = CreateWindowEx( WS_EX_CLIENTEDGE, /*dwExStyle - Rozszerzone parametry stylu okna*/
    NazwaKlasy, /*lpClassName - Nazwa klasy okna, którą właśnie zarejestrowaliśmy*/
    "Zagraj w lotto", /*lpWindowName - Napis na pasku tytułowym okienka*/
    WS_OVERLAPPEDWINDOW, /*dwStyle - "Zwykłe" style okienka*/
    CW_USEDEFAULT, /*x,y - Pozycja okna. Można ustawić na CW_USEDEFAULT, czyli na domyślną pozycję*/
    CW_USEDEFAULT,
    640, /*nWidth - Szerokosc okna*/
    200, /*nHeight - Wysokosc okna*/
    0, /*hWndParent - Uchwyt okna rodzicielskiego - zazwyczaj 0*/
    0, /*hMenu - Uchwyt menu dla naszego okna. Na razie żadnego nie mamy, więc NULL*/
    hInstance, /*hInstance - Uchwyt aplikacji, której przypisujemy okienko*/
    0 ); /*lpParam - Teoretycznie jest to wskaźnik do dodatkowych parametrów, ale jeszcze nie wiem co to do konca*/
   
    HWND hStatic = CreateWindowEx( 0, "STATIC", NULL, WS_CHILD | WS_VISIBLE |
    SS_LEFT, 50, 20, 350, 50, hwnd, NULL, hInstance, NULL );
    Wyniki = CreateWindowEx( 0, "STATIC", NULL, WS_CHILD | WS_VISIBLE |
    SS_LEFT, 50, 110, 350, 50, hwnd, NULL, hInstance, NULL );
   
    SetWindowText( hStatic, "Program wylosowal 6 liczb z 42. Sprobuj trafic w te liczby :)" );
   
    if( hwnd == NULL )
    {
        MessageBox( NULL, "Okno odmówiło przyjścia na świat!", "Ale kicha...", MB_ICONEXCLAMATION );
        return 1;
    }
   
    ShowWindow( hwnd, nCmdShow );
    UpdateWindow( hwnd );
   
    int gdzie = 50;
    Przycisk = CreateWindowEx( 0, "BUTTON", "Porownaj", WS_CHILD | WS_VISIBLE,
    450, 10, 150, 30, hwnd, NULL, hInstance, NULL );
    Przycisk_zamknij = CreateWindowEx( 0, "BUTTON", "Zamknij", WS_CHILD | WS_VISIBLE,
    450, 120, 150, 30, hwnd, NULL, hInstance, NULL );
    int ile_okien = 0;
    do
    {
        hText[ ile_okien ] = CreateWindowEx( WS_EX_CLIENTEDGE, "EDIT", NULL, WS_CHILD | WS_VISIBLE | WS_BORDER | ES_NUMBER,
        gdzie += 30, 80, 25, 25, hwnd, NULL, hInstance, NULL );
        SendMessage( hText[ ile_okien ], EM_SETLIMITTEXT, 2, 0 );
        ile_okien++;
    } while( ile_okien < 6 );
   
    SetFocus( hText[ 0 ] );
   
   
   
   
    while( GetMessage( & Komunikat, NULL, 0, 0 ) )
    {
        TranslateMessage( & Komunikat );
        DispatchMessage( & Komunikat );
    }
   
    return Komunikat.wParam;
   
    return 0;
}
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;
       
    case WM_COMMAND:
        {
            int ile_okien = 0;
           
            if(( HWND ) lParam == Przycisk )
            {
                LPSTR Bufor, Wynik;
                DWORD dlugosc;
                int czybyla = 0;
                stringstream strim;
                int co;
                do
                {
                    co = GetIntFromEdit( hText[ ile_okien ] );
                    if( CzyBylaLosowana( co, los, 6 ) ) { czybyla++; }
                   
                    ile_okien++;
                    GlobalFree( Bufor );
                } while( ile_okien < 6 );
               
               
                if( czybyla_str.empty() )
                {
                    strim << czybyla;
                    strim >> czybyla_str;
                    ile_traf += "\nTrafiles " + czybyla_str + " razy.";
                }
               
                Wynik = const_cast < char *>( ile_traf.c_str() );
                SetWindowText( Wyniki, Wynik );
               
            }
            ile_okien = 0;
            do
            {
                if( HIWORD( wParam ) == EN_MAXTEXT &&( HWND ) lParam == hText[ ile_okien ] )
                {
                   
                    SetFocus( hText[ ile_okien + 1 ] );
                }
                ile_okien++;
            } while( ile_okien < 6 );
           
            if(( HWND ) lParam == Przycisk_zamknij )
                 DestroyWindow( hwnd );
           
            break;
        }
       
       
        default:
        return DefWindowProc( hwnd, msg, wParam, lParam );
    }
   
    return 0;
}

P-98044
1 « 2 »
Poprzednia strona Strona 2 z 2