windows - Tilføjelse af tekst til en Win32 EditBox i C ++

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har en EditBox HWND tbLog, og den følgende funktion (som ikke virker):


void appendLogText(char* newText)
{
  int len = GetWindowTextLength(tbLog);

  char* logText = new char[len + strlen(newText) + 1];
  GetWindowText(tbLog, logText, len);

  strcat(logText, newText);

  SendMessage(tbLog, WM\_SETTEXT, NULL, (LPARAM)TEXT(logText));

  delete[] logText;
}


og jeg kalder det sådan:


appendLogText("Put something in the Edit box.
");
appendLogText("Put something else in the Edit box.
");


Først og fremmest hvad gør TEXT() faktisk? Jeg har prøvet med/uden det: (LPARAM)logText og (LPARAM)TEXT(logText) og der er ingen forskel, så vidt jeg kan se.


For det andet, hvad gør jeg forkert i min tilføjelsesfunktion? Hvis jeg kommenterer min delete linje, så første gang jeg kører append-funktionen, får jeg skrald i mit Redigeringsboks efterfulgt af beskeden. Anden gang jeg kører det, kolliderer programmet. Hvis jeg ikke har kommenteret det, nedbryder den selv første gang.

Bedste reference


Jeg ville omskrive funktionen, i C, som denne:


void appendLogText(LPCTSTR newText)
{
  DWORD l,r;
  SendMessage(tbLog, EM\_GETSEL,(WPARAM)&l,(LPARAM)&r);
  SendMessage(tbLog, EM\_SETSEL, -1, -1);
  SendMessage(tbLog, EM\_REPLACESEL, 0, (LPARAM)newText);
  SendMessage(tbLog, EM\_SETSEL,l,r);
}


Det er vigtigt at gemme og gendanne det eksisterende valg eller kontrollen bliver meget irriterende for alle at bruge, der ønsker at vælge og kopiere nogle tekst ud af kontrollen.


Brugen af ​​LPCTSTR sikrer også, at funktionen kan kaldes, når du bygger med enten et multibyt eller unicode tegnsæt.


TEKST-makroen var ude af plads, og den skulle bruges til at indhente strengbogstaver:


LPCTSTR someString = TEXT("string literal");


Windows NT Operativsystemer er native unicode, så at bygge multibyte applikationer er ineffektive. Ved hjælp af TEXT () på string-bogstaver, og LPTSTR i stedet for 'char *' hjælper med denne konvertering til unicode. Men det ville virkelig være mest effektivt at bare skifte eksplicit til unicode programmering på windows: i stedet for char, strlen, std :: string, brug wchar\_t, std :: wstring, wsclen og L 'string literals'.


Hvis du skifter dine projekter, skal du oprette indstillinger til Unicode, så alle Windows API-funktioner forventer unicode-strenge.





Det er blevet bragt til min meget forsinkede opmærksomhed, at passerer -1 som WPARAM af EM\_SETSEL udelukker kun et valg, men flytter ikke indsættelsespunktet. Så svaret skal ændres til (også uprøvet):


void appendLogText(HWND hWndLog, LPCTSTR newText)
{
  int left,right;
  int len = GetWindowTextLength(hWndLog);
  SendMessage(hWndLog, EM\_GETSEL,(WPARAM)&left,(LPARAM)&right);
  SendMessage(hWndLog, EM\_SETSEL, len, len);
  SendMessage(hWndLog, EM\_REPLACESEL, 0, (LPARAM)newText);
  SendMessage(hWndLog, EM\_SETSEL,left,right);
}

Andre referencer 1


Forsøgte SetWindowText ()?


http://msdn.microsoft.com/en-us/library/ms633546(v=vs.85).aspx[11]