SendDlgItemMessage spricht Chinesisch



  • Hallo miteinander

    Ich möchte bei Mausklick die Position in eine ListBox schreiben.

    case WM_LBUTTONDOWN:
    {
         GetCursorPos(&mPos); // mPos = POINT
         string curX, curY, curXY;
         ostringstream strX, strY;
         string clX, clY;
         ostringstream sclX, sclY;
         strX << mPos.x;
         strY << mPos.y;
         curX = strX.str();
         curY = strY.str();
         curXY = "Current cursorPos( " + curX + " / " + curY + " )";
         SendDlgItemMessage(g_hDialog2, IDC_LIST1, LB_ADDSTRING, 0, (LPARAM)curXY);
    
    ...
    

    Nur wenn ich normale Strings verwende dann ist der output in der ListBox irgendwie japanisch oder chinesich. (Liegt vermutlich an ANSI / Unicode)
    Wie kann ich nun den String so umformen, dass ich den an die Listbox senden kann?
    Ich freue mich auf ein gute Antwort. Denn im Moment rauchts bei mir nur noch...

    vielen dank
    sikayak



  • Zuerst einmal der Hauptfehler:
    Die WinAPI kennt keine C++ Klassen, sondern arbeitet auf C Basis, d.h. mit Zeigern, d.h. du mußt als Parameter einen "const char *" übergeben.

    SendDlgItemMessage(g_hDialog2, IDC_LIST1, LB_ADDSTRING, 0, (LPARAM)curXY.str().c_str());
    

    Hast du denn in deinem Projekt ASCII oder Unicode aktiviert?
    Wenn du Unicode verwendest, dann mußt du die WideString-Varianten "wostringstream" (bzw. besser ist "wostrstream") verwenden.



  • Hey Cool!
    Vielen Dank für die Schnelle Antwort. Hab zuerst gedacht das mit .str().c_str() kann gar nicht funktinieren. wenn man wostringstream verwendet, dann funkts. Ohne Chinesisch 🙂

    Aber leider nur die einzelnen Koordinaten:
    sieht jetzt so aus

    GetCursorPos(&mPos);
    wostringstream strX, strY;
    strX << mPos.x;
    SendDlgItemMessage(g_hDialog2, IDC_LIST1, LB_ADDSTRING, 0, (LPARAM)strX.str().c_str());
    

    das geht. Aber wie kann ich nun eine ausgabe im Format curXY = "Cursor "+strX+" "+strY; machen?
    Ich arbeite zum ersten mal mit WinAPI und habe keine Ahnung wie ich auf ASCII oder UNICODE umstellen kann. Habe nur gemerkt, dass nicht alles im gleichen Format ist.

    lg.sikayak



  • setze einfach vor Literalstrings ein L,

    also:

    // ANSI
    char* text = "Hallo"
    
    // Unicode
    wchar_t* text = L"Hallo"
    

    ->

    case WM_LBUTTONDOWN:
    {
         GetCursorPos(&mPos); // mPos = POINT
         wstring curX, curY, curXY;
         wostringstream strX, strY;
         wstring clX, clY;
         wostringstream sclX, sclY;
         strX << mPos.x;
         strY << mPos.y;
         curX = strX.str();
         curY = strY.str();
         curXY = L"Current cursorPos( " + curX + L" / " + curY + L" )";
         SendDlgItemMessage(g_hDialog2, IDC_LIST1, LB_ADDSTRING, 0, (LPARAM)curXY);
    


  • Danke vielmals. Jetzt funkts. war noch ein kleiner fehler drin:
    (LPARAM) curXY.c_str() dann klappts 🙂

    case WM_LBUTTONDOWN:
    {
         GetCursorPos(&mPos); // mPos = POINT
         wstring curX, curY, curXY;
         wostringstream strX, strY;
         wstring clX, clY;
         wostringstream sclX, sclY;
         strX << mPos.x;
         strY << mPos.y;
         curX = strX.str();
         curY = strY.str();
         curXY = L"Current cursorPos( " + curX + L" / " + curY + L" )";
         SendDlgItemMessage(g_hDialog2, IDC_LIST1, LB_ADDSTRING, 0, (LPARAM)curXY.c_str());
    

    so klappts prima.
    vielen dank. ihr seid super 🙂

    lg.sikayak


Anmelden zum Antworten