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. 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. |
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. #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 , 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. |