Вывод форматированного текста в окно (C++, WinAPI)

726
06 февраля 2017, 16:50

В установщике пакета ПО нужно вывести длинный текст. Текст надо растянуть по ширине, разместить по центру заголовок "ПОЛЬЗОВАТЕЛЬСКОЕ СОГЛАШЕНИЕ", где-то выделить жирным, где-то наклонным, сделать отступы и навести прочую красоту.

Как это правильно сделать из кода? Или проще нарисовать в графическом редакторе, сохранить картину, и подгрузить её фоном (только её придётся как-то скролить - как?)?

PS: желательно конечно из кода, чтобы можно было подтянуть файл и текст встал на своё место.

Answer 1

Вот наброски того, как можно форматированый текст вывести в rtf + richedit под windows.

// Функция взять-отдать текст
int GetSetRtf(HWND Handle, char* data, int max){
DWORD st[5]; // можно использовать стандартную структуру это что б не искать библиотеки
st[0] = (DWORD)&st[3];
st[1] = 0 ;
st[2] = (DWORD)&EditStreamCallback;
st[3] = (DWORD)data;
st[4] = max;
if (max ==  0 ) {
   return ::SendMessageA(Handle,WM_USER + 73,2,(DWORD)&st); // EM_STREAMIN
   } else {
   ::SendMessageA(Handle,WM_USER + 74,2,(DWORD)&st);
   }
}
// Вспомагательный стрим
DWORD __stdcall EditStreamCallback(char ** cookie,LPBYTE pbBuff, LONG cb, LONG FAR * pcb){
int x = (int)cookie[1];
int j = 0;
if (x == 0 ) {
   while (*cookie[0] != 0 ) {
     pbBuff[x++] = *cookie[0]++;
     if (x>=cb) break;
   }
   if (x<cb)  pbBuff[x] = 0;
   *pcb = x;
  }
return 0;
}
// Как использовать
CoInitialize(0); // Надо
InitCommonControls(); // в msdn написано что надо в случае использования стилей окна, без работает
LoadLibraryA("riched20.dll"); // Тоже надо, новая библиотека называется Msftedit.dll можно её
HWND Edit1 =  CreateWindow("RichEdit20A","(info)",
   WS_VISIBLE  | WS_CHILD | ES_MULTILINE | ES_WANTRETURN  |ES_LEFT,
  151,32,600,200,w.Handle/*родительское окно*/,0,hInstance,0);
GetSetRtf(Edit1, "{\\rtf1\\ansi\\ansicpg1251\\deff0\\deflang1049{\\fonttbl{\\f0\\fswiss\\fcharset0 Courier New;}}\\f0 62452}" , 0);

Ссылка на msdn

Если вы хотите использовать картинки в rtf то вам нужно ещё в инициализацию подключить ещё один модуль. В большинстве случаев этих набросков хватит. Сделать текст не редактируемым и т д - установить стили ES_***.

Ещё нужно заметить что 20 - не самая последняя версия - но везде 98 XP 2008 рабоает. Для юникода нужна W-версия вместо А. Есть где-то описание какая версия что умеет. Думаю поддержку старых версий отключат не скоро. Уж очень много программ используют richedit.

Линковщику говорить ничего не нужно - т.к. доп-функции не используются. #include <richedit.h> не всегда хорошо работает, нужно или подправлять define, или #include <richedit20.h> подключать. Вторая версия (20) имеет достаточно хороший функционал, а компилятор его не всегда "подключает".

Пару слов по тегам. \ нужно экранировать \\ двумя (но в char* их четыре). \pard;-новая сторка (\r\n rtf игнорирует) \b \b0 поставить/убрать жирный. Ссылку на хороший хелп не подскажу, но найти не сложно.

READ ALSO
Как правильно записать функцию чтения в буффер на с, c++

Как правильно записать функцию чтения в буффер на с, c++

Считать конкретное количество данных проблем нетРазмер данных, которые могут прийти не может быть больше чем buf_len

453
Шаблонные класcы C++. C3203

Шаблонные класcы C++. C3203

Добрый день, возникла следующая проблема касающаяся шаблонных классов в C++

430
Ошибка Stack overflow, как избежать и что это?

Ошибка Stack overflow, как избежать и что это?

Можете объяснить, когда возникает эта ошибка и как от нее избавиться?

495