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

WinApi, ListBox, SendMessage

Ostatnio zmodyfikowano 2009-09-28 19:16
Autor Wiadomość
steckel
Temat założony przez niniejszego użytkownika
WinApi, ListBox, SendMessage
» 2009-09-28 16:43:23
Mój problem polega na tym, że lista nie wczytuje tekstu.
C/C++
HWND hLista = CreateWindowEx( WS_EX_CLIENTEDGE, "LISTBOX", NULL, WS_CHILD | WS_VISIBLE | WS_BORDER, MARGINES, PRZYCISK_H + 2 * MARGINES, OKNO_LOGOWANIA_W - 2 * MARGINES, OKNO_LOGOWANIA_H - 2 * PRZYCISK_H - 3 * MARGINES - PASEK_TYTULOWY, hWnd, NULL, hProg, NULL );
//----
SendMessage( hLista, LB_ADDSTRING, 0,( LPARAM ) nickTym.c_str() );
Program na pewno dochodzi do tej istrukcji, a nickTym nie jest puste.
P-10523
steckel
Temat założony przez niniejszego użytkownika
» 2009-09-28 17:56:50
Nie wiem co zwraca ta funkcja. O to cały kod, który ma dodać nick do pliku lista, a następnie wczytać całą listę do ListBox'a.
C/C++
#include <string>
#include <cctype>
#include <vector>
#include <windows.h>

string nick;
string lista;

HWND hWnd;
HWND hPrzyciskNick;
HWND hPrzyciskLista;
HWND hText;
HWND hLista;

void Logowanie();
void OknoLogowania();
void WczytajListe();
void WprowadzNick();
void UsunNick();

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

void LoadFile( string pathOfFile, string & text );
void SaveFile( string pathOfFile, string txt );


const int OKNO_LOGOWANIA_W = 300;
const int OKNO_LOGOWANIA_H = 300;

const int PRZYCISK_H = 20;
const int PRZYCISK_W = 30;

const int PASEK_TYTULOWY = 30;

const char LISTA_PLIK[] = "lista.txt";



int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
    Logowanie();
}


void Logowanie() {
    OknoLogowania();
    MSG message;
    while( GetMessage( & message, NULL, 0, 0 ) )
    {
        TranslateMessage( & message );
        DispatchMessage( & message );
    }
}

void OknoLogowania() {
    HINSTANCE hProg = GetModuleHandle( 0 );
    WNDCLASSEX wc;
    wc.cbSize = sizeof( WNDCLASSEX );
    wc.style = 0;
    wc.lpfnWndProc = WndProc;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hInstance = hProg;
    wc.hIcon = LoadIcon( NULL, IDI_APPLICATION );
    wc.hCursor = LoadCursor( NULL, IDC_ARROW );
    wc.hbrBackground =( HBRUSH )( COLOR_WINDOW + 1 );
    wc.lpszMenuName = NULL;
    wc.lpszClassName = "WndClass";
    wc.hIconSm = LoadIcon( NULL, IDI_APPLICATION );
    RegisterClassEx( & wc );
    hWnd = CreateWindowEx( 0, "WndClass", "Lista gier", WS_OVERLAPPEDWINDOW, 0, 0, OKNO_LOGOWANIA_W, OKNO_LOGOWANIA_H, 0, 0, hProg, 0 );
    hPrzyciskNick = CreateWindowEx( 0, "BUTTON", "OK", WS_CHILD | WS_VISIBLE, OKNO_LOGOWANIA_W - PRZYCISK_W - MARGINES, MARGINES, PRZYCISK_W, PRZYCISK_H, hWnd, NULL, hProg, NULL );
    hText = CreateWindowEx( 0, "EDIT", NULL, WS_CHILD | WS_VISIBLE | WS_BORDER, MARGINES, MARGINES, OKNO_LOGOWANIA_W - PRZYCISK_W - 2 * MARGINES, PRZYCISK_H, hWnd, NULL, hProg, NULL );
    SetWindowText( hText, "Nick" );
    hLista = CreateWindowEx( WS_EX_CLIENTEDGE, "LISTBOX", NULL, WS_CHILD | WS_VISIBLE | WS_BORDER | LBS_SORT, MARGINES, PRZYCISK_H + 2 * MARGINES, OKNO_LOGOWANIA_W - 2 * MARGINES, OKNO_LOGOWANIA_H - 2 * PRZYCISK_H - 3 * MARGINES - PASEK_TYTULOWY, hWnd, NULL, hProg, NULL );
    hPrzyciskLista = CreateWindowEx( 0, "BUTTON", "START", WS_CHILD | WS_VISIBLE, MARGINES, OKNO_LOGOWANIA_H - PRZYCISK_H - MARGINES - PASEK_TYTULOWY, OKNO_LOGOWANIA_W - 2 * MARGINES, PRZYCISK_H, hWnd, NULL, hProg, NULL );
    ShowWindow( hWnd, 5 );
    UpdateWindow( hWnd );
}

LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
    WczytajListe();
    switch( msg )
    {
    case WM_COMMAND:
        if(( HWND ) lParam == hPrzyciskNick ) {
            WprowadzNick();
        }
        break;
    case WM_CLOSE:
        DestroyWindow( hwnd );
        break;
    case WM_DESTROY:
        UsunNick();
        PostQuitMessage( 0 );
        break;
        default:
        return DefWindowProc( hwnd, msg, wParam, lParam );
    }
}

void WczytajListe() {
    string listaTym;
    LoadFile( LISTA_PLIK, listaTym );
    string listaTymA = "";
    for( int a = 0; a < listaTym.size(); a++ ) {
        if( listaTym[ a ] == '\n' ) {
            listaTymA += "\r\n";
        }
        else {
            listaTymA += listaTym[ a ];
        }
    }
    if( listaTymA != lista ) {
        lista = listaTymA;
        string nickTym = "";
        for( int index = 0; index < lista.size(); index++ ) {
            if( isalnum( lista[ index ] ) ) {
                nickTym += lista[ index ];
            }
            else if( nickTym != "" ) {
                SendMessage( hLista, LB_ADDSTRING, 0,( LPARAM ) nickTym.c_str() );
                nickTym = "";
            }
        }
    }
}

void WprowadzNick() {
    if( nick != "" ) {
        UsunNick();
    }
    DWORD dlugosc = GetWindowTextLength( hText );
    LPSTR Bufor =( LPSTR ) GlobalAlloc( GPTR, dlugosc + 1 );
    GetWindowText( hText, Bufor, dlugosc + 1 );
    string nickTym = Bufor;
    nick = "";
    for( int a = 0; a < nickTym.size(); a++ ) {
        if( isalnum( nickTym[ a ] ) ) {
            nick += nickTym[ a ];
        }
    }
    if( nick != "" ) {
        SetWindowText( hText, nick.c_str() );
        LoadFile( LISTA_PLIK, lista );
        lista += nick + "\r\n";
        SaveFile( LISTA_PLIK, lista );
    }
}

void UsunNick() {
    string listaTym = "";
    string nickTym = "";
    for( int index = 0; index < lista.size(); index++ ) {
        if( isalnum( lista[ index ] ) ) {
            nickTym += lista[ index ];
        }
        else {
            if( nickTym != "" && nick != nickTym ) {
                listaTym += nickTym;
            }
            nickTym = "";
        }
    }
    lista = listaTym;
    SaveFile( LISTA_PLIK, lista );
}

void LoadFile( string pathOfFile, string & text ) {
    LPSTR Bufor;
    DWORD dwRozmiar, dwPrzeczyt;
    HANDLE hPlik;
    hPlik = CreateFile( pathOfFile.c_str(), GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_ALWAYS, 0, NULL );
    dwRozmiar = GetFileSize( hPlik, NULL );
    Bufor =( LPSTR ) GlobalAlloc( GPTR, dwRozmiar + 1 );
    ReadFile( hPlik, Bufor, dwRozmiar, & dwPrzeczyt, NULL );
    Bufor[ dwRozmiar ] = 0;
    text = Bufor;
    GlobalFree( Bufor );
    CloseHandle( hPlik );
}

void SaveFile( string pathOfFile, string txt ) {
    LPSTR Bufor;
    DWORD dwRozmiar = txt.length();
    Bufor =( LPSTR ) GlobalAlloc( GPTR, dwRozmiar + 1 );
    Bufor =( LPSTR ) txt.c_str();
    DWORD dwZapisane;
    HANDLE hPlik;
    hPlik = CreateFile( pathOfFile.c_str(), GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_ALWAYS, 0, NULL );
    WriteFile( hPlik, Bufor, dwRozmiar, & dwZapisane, NULL );
    CloseHandle( hPlik );
}

//edit Problemem był błąd kosmetyczny:'=' zamiast '==' we warunku porównania. Teraz mam problem z zapisywaniem, bo znowu program nie zapisuje prawidłowo znaku końca linii. Gdy wczytuje plik do zmiennej typu string to od razu zamieniam
C/C++
'\n'
//na
"\r\n"
, dodając nick do listy robię w ten sposób:
lista += nick + "\r\n"
, a następnie zapisuję.

//edit2 Poszedłem na łatwiznę i zamiast znaku końca wiersza wstawiłem spację i działa. Pozostaje problem czyszczenia ListBox'a.
P-10524
steckel
Temat założony przez niniejszego użytkownika
» 2009-09-28 19:03:27
Nie jest to opisane na DarcKult, a Google też nie pomogło. Do tego nie trzeba przecież programu uruchamiać.
P-10527
malan
» 2009-09-28 19:14:30
P-10528
steckel
Temat założony przez niniejszego użytkownika
» 2009-09-28 19:38:00
@Ten zuy - Myślałem, że chodzi ci o ListBox.
@Malan - Tam też nic nie znalazłem.

Wie ktoś może jak wyłączyć daną kontrolkę?
P-10529
DejaVu
» 2009-09-28 20:19:11
Pozostaje problem czyszczenia ListBox'a.
Po prostu za mały obrazek jest na końcu linka, który dostałeś...

/edit:
brak opisu
brak opisu

/edit2:
A nad tym obrazkiem jest kod tego programu...
P-10530
steckel
Temat założony przez niniejszego użytkownika
» 2009-09-28 20:41:41
To jest przecież dla pól tekstowych, bo w listach to nie działa:
C/C++
SetWindowText( hLista, "" );
Chyba, że mówicie o czymś innym?

Odpowiedź z innego forum:

SendMessage(hLista, LB_RESETCONTENT, 0, 0);
P-10532
manfred
» 2009-09-28 17:26:49
Co zwraca SendMessage? Jaki jest last error? Tak ogólnie to u mnie działa...
P-19389
« 1 » 2
  Strona 1 z 2 Następna strona