char konvertierung



  • hi forum,
    ich hab mich jetzt ein bisschen in Winapi eingearbeitet, allerdings fehlt mir noch das Knowhow zur konvertierung von char zu LPCSTR um aus einer Textdatei datensätze zu lesen und diese dann in einem Fenster auszugeben..

    Es soll einfach nur mit fgets zeilenweise eine datei ausgelesen werden, und dieser string dann mit TextOut() o.Ä. ausgegeben werden.

    Ich arbeite ohne unicode, und bei allen meinen Versuchen erscheinen nur chinesische Schriftzeichen 😞

    ich weis, dass ich diese mit L('text') oder TEXT("quote") umwandeln kann, aber ich habe ja eine Variable, und das ist ein const char* und kein quote..

    Wäre für eure Hilfe sehr dankbar, habe nichts für mich verständliches bisher gefunden...

    mein zweites problem, was ich aber hinten anstelle, ist, dass mein Childfenster sich nur einmal öffnen lässt. Schließe ich es, kann es nicht mehr geöffnet werden.. Es soll nur bei case WM_COMMAND bei betätigen eines menuitems geöffnet werden, also sichtbar werden. Das Fenster ist global angelegt und hat eine eigene Proc(...) hab ich da was falsch gemacht? Braucht ihr Code oder fällt euch gleich was ein dazu?

    Danke für eure Hilfe



  • Hi

    #include <stdio.h>
    #include <windows.h>
    
    int main()
    {
    
    	HDC hDC;
    	char str[] = {"LOWBYTE"};
    
    	hDC = GetDC(NULL);
    
    	TextOut(hDC,4,1030,str,strlen(str));
    
    	ReleaseDC(NULL,hDC);
    
    	getchar();
    
    	return 0;
    
    }
    

    So kannst du mit TextOut was ausgeben, ohne Unicode

    lowbyte



  • Hi

    LPCSTR ist glaube ich ein überbleibsel aus 16bit Zeiten. Die kleinen Präfixe L bzw. N stehen für NEAR und LONG und signalisieren in den 16Bit Versionen von WIndows unterschiedliche Zeigergrössen. In den 32Bit Versionen gibt es diese Unterschiede nicht mehr. Dort haben Zeiger grunsätzlich 32Bit.

    lowbyte



  • @lowbyte

    also bei mir erscheint da nur chinesisches wirr warr..

    FILE * datei;
    HDC          hDC;
    
    hDC = GetDC(NULL); 
    
    datei = fopen("textdatei.txt","r");
    
    while (fgets(Zeile, sizeof(Zeile), high) != 0)
    {
    	TextOut(hDC,4,10,Zeile,strlen(Zeile));
    }
    
    ReleaseDC(NULL,hDC);
    

    hab es auch so ähnlich mit einer listbox versucht, nur eben so:

    SendMessage(Listbox,LB_ADDSTRING, 0, Zeile);
    

    oder so:

    SendMessage(Listbox,LB_ADDSTRING, 0, (LPARAM)Zeile);
    

    Alles führt zu den unerwünschten chinesischen Zeichen



  • MultiByteToWideChar

    Dein Beispiel-Quellcode da ist aber irgendwie unvollständig oder schnell zusammengefuscht oder?
    "sizeof(Zeile)" kommt mir an der Stelle falsch vor, anstelle von "high" sollte da wahrscheinlich "datei" stehen...



  • spaxx999
    löst das deine Problem:
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-269141.html

    Wenn nicht, versuche den Quelltext mit deinem Problem auf etwa 30 bis max.50 Zeilen als komplette Demo hier rein zu stellen.

    Bei solchen Themen bitte auch kurz den Compiler angeben.

    MfG f.-th.



  • spaxx999 schrieb:

    while (fgets(Zeile, sizeof(Zeile), high) != 0)

    Was soll den <high> sein?
    Da sollte <datei> stehen!



  • sorry 'high' hat da naütrlich nix verloren, da muss datei stehen.. hab paar sachen umgeändert bzw. verallgemeinert, da ich an einem highscore fenster arbeite..

    warum sollte sizeof(Zeile) falsch sein?? da muss ein parameter 't_size' oder so hin, also die anzahl bytes, die eingelesen werden.. Zeile ist als char Zeile[40] deklariert, also 40*2bytes glaube ich..

    #include <windows.h>
    // ....
    
    HWND Highscore, Highbox;
    
    LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {	
    case WM_CREATE:  
    	 {
    // ...
    // ...
    // ...
    
    Highscore = CreateWindow(  "Highscore",
                                     NULL,
                                     /*WS_CHILD,*/ WS_OVERLAPPEDWINDOW | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX ,
                                     100,
                                     100,
                                     500,
                                     500,
                                     hwnd,
                                     NULL,
                                     (HINSTANCE) GetWindowLong(hwnd, GWL_HINSTANCE),
                                     NULL);
    
    Highbox = CreateWindow( _T("listbox"), _T(""),
                            WS_CHILD | WS_TABSTOP | WS_VISIBLE | WS_BORDER ,
                            50, 50, 400, 600, Highscore, (HMENU)100, 
                            ((LPCREATESTRUCT) lParam)->hInstance, NULL);
    
     }
              return 0 ;
    
     case WM_COMMAND:
     switch(LOWORD(wParam))
    {
    
    // ...
    // ...
    
    case ID_DATEI_HIGHSCORE:
    
    		   			ShowWindow(Highscore, SW_SHOW);
    
    // ...
    
    }
    
    LRESULT CALLBACK HighscoreProc (HWND hwnd, UINT uiMessage, WPARAM wParam, LPARAM lParam)
    {
    
    	FILE * high;
    	char Zeile [40];
    	LPSTR       Buffer;
    	LPSTR	 pszBuffer;
    	HWND Highbox;
    
    	switch(uiMessage)
    	{
    
    	case WM_PAINT:
    		{
    			HDC          hDC;
    
    	        hDC = GetDC(NULL); 
    			high = fopen("highscore.txt","r");
    
    						while (fgets(Zeile, sizeof(Zeile), high) != 0)
    						{
    							TextOut(hDC,4,10,Zeile,strlen(Zeile));
    						}
    
    						ReleaseDC(NULL,hDC);
    
    							 getchar(); 
    			 return 0;
    		 }
    
    	default: 
    		return DefWindowProc (hwnd, uiMessage,
    			wParam, lParam);
    	}
    }
    


  • spaxx999 schrieb:

    warum sollte sizeof(Zeile) falsch sein?? da muss ein parameter 't_size' oder so hin, also die anzahl bytes, die eingelesen werden..

    In deinem Falle ist es nicht falsch 😉
    Oft sieht man allerdings sowas: char Zeile=malloc(40);*
    In dem Falle wäre sizeof(Zeile)=4 (falls man ne 32Bit-binary baut)

    spaxx999 schrieb:

    Zeile ist als char Zeile[40] deklariert, also 40*2bytes glaube ich..

    Ein "char" ist "normalerweise" 1 Byte groß.
    wchar_t (WideChar/Unicode) wäre 2 Bytes groß.

    Dein WM_PAINT solltest Du überdenken:
    In WM_PAINT solltest Du besser nicht GetDC() / ReleaseDC() sondern BeginPaint() und EndPaint() benutzen.
    Bei BeginPaint/EndPaint wird für das Fenster nämlich markiert dass es neugezeichnet wurde, bei GetDC/ReleaseDC nicht. D.h. Windows wird dein Fenster andauernd mit WM_PAINT Nachrichten befeuern damit es sich neu zeichnet, obwohl es das eigentlich schon getan hat.

    Woher das "chinesiche-Zeichen-Problem" kommt sehe ich allerdings nicht auf Anhieb ;/
    Wenn Du nen TextOut() mit festem String machst ist alles korrekt? Hast du via Debugger mal kontrolliert ob in Zeile auch was gescheites eingelesen wird und ob es am auslesen der Datei oder an TextOut() liegt?



  • Der Rückgabewert von fopen wird nicht geprüft.
    fclose wird nicht aufgerufen.



  • @geeky

    ich hab kein malloc drin, sondern "char Zeile[40]" deklariert...
    also bin ich doch mit sizeof(Zeile) auf der sicheren seite oder?

    okay hab nun hdc = beginpaint(...) und endpaint(...) drin..

    ja, bei konstantem string ist alles okay, sofern ich da TEXT("blabla") angeb..
    aber ich kann in TEXT(...) ja keine variable reinschreiben..

    und ja, ich habe das gedebugged, und ja es wird genau das eingelesen wie es sein soll.. es muss am textout() liegen

    @Wutz

    das stimmt, beim debuggen läuft aber alles gut beim fopen, also es gibt eine korrekte adresse zurück.. fclose mach ich noch rein, danke, aber das ändert nicht mein problem

    Danke für die Antworten bis jetzt..



  • Ersetz mal testweise TextOut durch TextOutA



  • YEEEEEEES, BINGO, JACKPOT, des hats rausgehauen.. vielen vielen dank, würd ich dich kennen, würd ich dir jetzt ne schachtel kippen kaufen 😉 oder ne tüte haribo



  • Wenn das geholfen hat, müsste in deinem Projekt aber Unicode eigentlich noch an sein...
    ...allerdings hätte der Compiler dann eigentlich z.B. bei CreateWindow( "Highscore" oder bei TextOut() meckern müssen...
    ...sehr seltsam!


Log in to reply