RichEdit pobieranie textu do zmiennej

0

Witam jak można pobrać text z kontrolki RichEdit do zmiennej tzn. chodzi mi żeby text był tak sformatowany jak w kontrolce (pogrubienie,podkreślenie,kolory itp). Wiem że można zapisać text do pliku, ale nie o to mi chodzi, chciałbym ten text przesłać w postaci zmiennej przez sieć i dalej na nim działać. No i oczywiście jak wczytać później taki text? (dodać fragment do kontrolki) Tzn. ściślej mówiąc taki chat oparty o richedit.

0

Poczytaj jeszcze: http://en.wikipedia.org/wiki/Rich_Text_Format
Znalazłem też dokumentację kontrolki na msdn'ie: http://msdn.microsoft.com/en-us/library/windows/desktop/bb787605(v=vs.85).aspx
Jest taka struktura CHARFORMAT i inne, któraś musi zawierać tekst w formacie RTF.

0
 
DWORD dlugoscR = GetWindowTextLength (MSG_S);
GETTEXTEX GTM;
GTM.cb=dlugoscR;
GTM.flags=GT_DEFAULT;
GTM.codepage=1200;
GTM.lpDefaultChar="\ ";;
TCHAR buff;
 SendMessage( MSG_S, EM_GETTEXTEX,( WPARAM )&GTM,( LPARAM )  buff);

zrobiłem tak, tylko dlaczego nie działa? nie zwraca mi nic do zmiennej,a jak użyję codepage ASCII to jeszcze crash programu do tego. dlaczego?

0

zrobiłem tak, tylko dlaczego nie działa?

O GetLastError Słyszał? No to użyje.

0

ERROR_INVALID_FUNCTION,to ja już nie wiem jak to można dobrze zrobić. Zrobiłem miej więcej tak jak pisało na MSN.

0

Nie wypełniłeś pola lpUsedDefChar struktury GETTEXTEX. Jeśli chcesz otrzymać Unicode to zarówno lpDefaultChar jak i lpUsedDefChar powinny być NULL.

0

'struct GETTEXTEX' has no member named 'lpUsedDefChar' . taki błąd mi wyskakuje gdy chce dodać GTM.lpUsedDefChar=NULL;

0

Aaaa, teraz widzę.
LPARAM to ma być wskaźnik do bufora. Teraz podajesz losową wartość niezainicjowanej zmiennej typu TCHAR.

A tak ogólnie to przed wypełnianiem struktur które używamy w WinAPI należy je wyzerować (ZeroMemory). Jeśli tego nie zrobimy, to kod skompilowany z użyciem nowszej wersji WinAPI może nie działać, gdyż w strukturze mogą pojawić się nowe pola. Bez wyzerowania całej struktury ów nowe pola będą posiadać wartości losowe.

0
 
DWORD dlugoscR = GetWindowTextLength (MSG_S);
GETTEXTEX GTM;
ZeroMemory(&GTM, sizeof(GTM));
GTM.cb=100;
GTM.flags=GT_DEFAULT;
GTM.codepage=CP_ACP ;
GTM.lpDefaultChar=NULL;;
TCHAR buff[500];
 SendMessage( MSG_S, EM_GETTEXTEX,( WPARAM )&GTM,( LPARAM )  buff);

Tutaj wstawianie textu.

SETTEXTEX st;
 ZeroMemory(&st, sizeof(st));
 st.flags=ST_DEFAULT;
 st.codepage=CP_ACP ;
  SendMessage( MSG_R, EM_SETTEXTEX,( WPARAM )&st,( LPARAM )  buff);
cout<<GetLastError<<endl;
cout<<buff<<endl;
 

text wstawia poprawnie, ale bez zmienionego koloru,podkreślenia,pogrubienia, czysty text po prostu.
lpUsedDefChar też nie wiem czemu mi zwraca że w strukturze taka zmienna nie istnieje.
GetLastError nadal zwraca wartość 1.struktura SETTEXTEX, musiałem ją wstawić do projektu ponieważ też nie została odnaleziona w żadnej dołączonej bibliotece.

Sciągnąłem Nowszą wersje biblioteki Win32Api do DEV-CPP, i lpUsedDefChar oraz settext już jest Ok., ale nadal efekt ten sam.

0
Software napisał(a)

text wstawia poprawnie, ale bez zmienionego koloru,podkreślenia,pogrubienia, czysty text po prostu

EM_SETTEXTEX (MSDN) napisał(a)

lParam

Pointer to the null-terminated text to insert. This text is an ANSI string, unless the code page is 1200 (Unicode). If lParam starts with a valid RTF ASCII sequence—for example, "{\rtf" or "{urtf"—the text is read in using the RTF reader.

Zadbałeś o to?

Generalnie przeglądnij sobie dział o kontrolkach RichEdit:
http://msdn.microsoft.com/en-us/library/windows/desktop/bb787605%28v=vs.85%29.aspx
Jest tam wszystko wytłumaczone, z przykładami. Wszystkiego nie pamiętam. Trzeba się wpierać dokumentacją.

0

Hmmm, ok, już wiem że prawidłowo sformatowany rtf musi zawierać np." {\rtf1{\fonttbl{\f0\fnil\fcharset0 Arial;}}\f0\fs12 text} " , tylko teraz mam pytanie jak można pobrać ten text z kontrolki z takim formatowaniem?, próbowałem ustawić
SendMessage( MSG_S, EM_SETTEXTMODE,( WPARAM )TM_RICHTEXT,0);, ale nic nie dało;

0

Zmajstrowałem coś takiego, działa ; trochę nieoptymalnie skontruowali to, ale..

 
char buffor[500];   // zmienna globalna
char* CALLBACK StreamOutProc(DWORD dwCookie, LPBYTE lpBuffer, LONG lSize, LONG * plRead)
{
if(!lSize)
return("1") ;

*plRead = 0 ;
wsprintf(buffor,"%s",lpBuffer); //wpisujemy strumień do buffora
//WriteFile((HANDLE) dwCookie, lpBuffer, lSize, (DWORD *) plRead, NULL ) ; //tutaj zapis do pliku, ale to nie potrzebne.
return((char*)lpBuffer) ;
}

HANDLE hPlik ;
    EDITSTREAM es ;
    LONG lOut ;
   
    es.dwCookie = 0 ;
    es.dwError = 0 ;
    es.pfnCallback = (EDITSTREAMCALLBACK)StreamOutProc ;

 SendMessage(hwnd, EM_STREAMOUT, SF_RTF, (LPARAM)&es) ;

//i tak w buforze mamy ładnie zformatowany Texcik z uchwytu hwnd;
//zamiast buffora możemy użyć (char*)es.dwError

Ehhh teraz nie wiem jak ten text przerobić tak, żeby można było go "sklejać" bo jak wstawie 2x {\rtf } to już mi to jako normalny text bierze...;X

1 użytkowników online, w tym zalogowanych: 0, gości: 1