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.
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.
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 )>M,( 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?
zrobiłem tak, tylko dlaczego nie działa?
O GetLastError
Słyszał? No to użyje.
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.
Nie wypełniłeś pola lpUsedDefChar
struktury GETTEXTEX
. Jeśli chcesz otrzymać Unicode to zarówno lpDefaultChar
jak i lpUsedDefChar
powinny być NULL.
'struct GETTEXTEX' has no member named 'lpUsedDefChar' . taki błąd mi wyskakuje gdy chce dodać GTM.lpUsedDefChar=NULL;
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.
DWORD dlugoscR = GetWindowTextLength (MSG_S);
GETTEXTEX GTM;
ZeroMemory(>M, 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 )>M,( 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.
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ą.
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;
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