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

WinApi - problem z pobraniem zawartości "EDIT"

Ostatnio zmodyfikowano 2011-12-22 22:11
Autor Wiadomość
bari
Temat założony przez niniejszego użytkownika
WinApi - problem z pobraniem zawartości "EDIT"
» 2011-12-20 17:45:31
Witam.
Od wczoraj bawię się z WinApi i chciałem zrobić prosty kalkulator. Z tego co zrobiłem to teoretycznie wszystko działa ale tylko dla pojedynczych cyfr. Otóż kiedy klikam np na przycisk "1" a następnie przycisk "2" (bez wybrania tego co ma zrobić, np przycisku sumy) w polu, które nazwałem hKalkulator wartość "1" jest zamieniana na wartość "2" zamiast "12". Wymyśliłem (możliwe, że błędnie), że aby rozwiązać ten problem polecenie kliknięcia danego buttona powinno wyglądać następująco :

1. Pobranie wartości, która do tej pory znajdowała się w polu "hKalkulator"
2. Jeżeli to nie było zero dopisujemy tą cyfrę, którą reprezentuje dany button (jeżeli jest zerem to po prostu nadpisuje)
3. Wstawienie całości z powrotem do pola hKalkulator

Przejrzałem kurs na tej stronie oraz dokumentację funkcji "GetWindowText" na MSDNA i udało mi się napisać coś takiego (na razie bez sprawdzenia czy to zero):
C/C++
case ID_PRZYCISK1:
Memory =( LPSTR ) VirtualAlloc(( LPVOID ) NULL,( DWORD )( textLenght + 1 ), MEM_COMMIT, PAGE_READWRITE );
GetWindowText( hKalkulator, Memory, textLenght + 1 );
Memory =+ "1";
SetWindowText( hKalkulator, Memory );
if( a == FLT_MAX ) a = 1;
else b = 1;

break;
Problem w tym, że "Memory" jest puste, a zatem w polu hKalkulator ląduje po prostu "1".
Czy mógłby mi ktoś dokładniej wyjaśnić jak pobrać tą wartość albo podesłać link do jakiegoś opisu jak to zrobić, bo przeszukałem google, ale nigdzie nie znalazłem tego wystarczająco jasno wyjaśnionego.
Pozdrawiam i z góry dziękuję za pomoc :)
P-45949
pekfos
» 2011-12-20 21:45:55
Memory =+ "1";
Co to?
P-45975
bari
Temat założony przez niniejszego użytkownika
» 2011-12-21 21:50:53
Literówka (+=). No nie ważne, po zlikwidowaniu tej linijki po wciśnięciu "1" powinna zostać pobrana zawartość pola i wstawiona z powrotem, a tutaj kiedy mam w polu domyślną wartość "0" i klikam na "1" pole się czyści. Po prostu nie pobiera tej wartości poprawnie.
P-46020
Mrovqa
» 2011-12-22 15:28:53
textLenght + 1

A gdzie pobierasz długość stringu i zapisujesz do zmiennej textLenght? Jakoś nie widzę :P

/edit: chwilka... o co Ci chodzi? Jeśli to jest procedura obsługi przycisku no to powinieneś pobrać aktualny tekst, dopisać jedynkę i ustawić od nowa. SetWindowText ustawia ci nowy tekst, a nie dopisuje do końca.
P-46077
bari
Temat założony przez niniejszego użytkownika
» 2011-12-22 16:17:38
GetWindowText( hKalkulator, Memory, textLenght + 1 );
Pobieram tekst i zapisuje jako "Memory"
Memory += "1";
Łączy pobrany string ze stringiem "1"
SetWindowText( hKalkulator, Memory );
Wstawia połączony string do pola tekstowego.

zmienna textLenght jest zadeklarowana przed int WINAPI
P-46081
malan
» 2011-12-22 16:48:19
C/C++
case ID_PRZYCISK1:
textLenght = GetWindowTextLength( hKalkulator );
//...
strcat( Memory, "1" );
SetWindowText( hKalkulator, Memory );
break;

Dokumentacja
strcatScala dwa łańcuchy znaków w jeden. (funkcja)
P-46086
bari
Temat założony przez niniejszego użytkownika
» 2011-12-22 22:11:16
Ok, tylko chyba nie rozumiecie mojego problemu. Usuwam tą linijkę "Memory += "1";"  - w ten sposób program powinien zadziałać następująco:
-pobiera zawartość pola hKalkulator
-przypisuje go do zmiennej Memory
-wstawia zmienną Memory do pola hKalkulator - czyli jeżeli miałem wcześniej w polu hKalkulator cyfrę "521" to po naciśnieciu buttona powinna zostać pobrana ta liczba i wstawiona z powrotem (dla zwykłego użytkownika teoretycznie nic się nie dzieje, ale chodzi mi o to pobranie). Problem w tym ŻE NIE POBIERA prawidłowo zawartości hKalkualtor i zamiast wstawić znajdującą się tam wcześniej liczbę, wstawia puste pole (czy jak kto woli NULL - oczywiście napis null się nie pojawia :P).

Chodzi mi o samo pobranie zawartości pola po naciśnięciu na button, z resztą chyba sobie już poradzę ;)

UPDATE:

Udało mi się to zrobić w formie takiej funkcji:
C/C++
void PrzyciskLiczby( int x ) {
    Length = GetWindowTextLength( hKalkulator );
    Memory =( LPSTR ) GlobalAlloc( GPTR, Length );
    GetWindowText( hKalkulator, Memory, Length + 1 );
    char cyfra[ 32 ];
    sprintf( cyfra, "%u", x );
    if( strcmp( Memory, "0" ) != 0 ) {
        strcat( Memory, cyfra );
        SetWindowText( hKalkulator, Memory );
    }
    else {
        Memory = cyfra;
        SetWindowText( hKalkulator, Memory );
    }
    if( dzialanie < 1 || dzialanie > 4 ) a = atoi( Memory );
    else b = atoi( Memory );
   
    GlobalFree( Memory );
}

Później tylko wywołanie dla odpowiedniej cyfry, np dla zera:
case ID_PRZYCISK0: PrzyciskLiczby(0); break;

Nie uwzględniłem jeszcze liczb zmiennoprzecinkowych i pobrania w drugiej kolejności (np mamy już obliczoną jakąś wartość i chcemy ją np. podzielić przez dwa. Mam jednak nadzieję, że komuś przyda się ta zapewne banalna funkcja ;)

Pozdrawiam
P-46115
« 1 »
  Strona 1 z 1