Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.08.2012, 11:51   #1
Qwe1
Пользователь
 
Регистрация: 15.05.2009
Сообщений: 29
По умолчанию Узнать сколько строк займет текст

В диалоговом окне есть статик-текст определенной ширины и высоты, я передаю строку с текстом (где могут быть "\n") и этот текст отправляю статику. Как узнать на сколько надо увеличить/уменьшить высоту статика и диалогового окна, чтобы весть текст был виден? Как во всплывающих подсказках, где размер окошка зависит от текста... Спасибо )
Qwe1 вне форума Ответить с цитированием
Старый 12.08.2012, 12:00   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Можно воспользоваться DrawText() с флагом DT_CALCRECT.
Не забудьте также и про WM_GETFONT
waleri вне форума Ответить с цитированием
Старый 12.08.2012, 18:48   #3
Qwe1
Пользователь
 
Регистрация: 15.05.2009
Сообщений: 29
По умолчанию

А как связать hFont после WM_GETFONT и DrawText(<...>)?
Qwe1 вне форума Ответить с цитированием
Старый 12.08.2012, 19:20   #4
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

SelectObject(hDC, hFont)
waleri вне форума Ответить с цитированием
Старый 12.08.2012, 21:34   #5
Qwe1
Пользователь
 
Регистрация: 15.05.2009
Сообщений: 29
По умолчанию

Частично получилось: высоту определять в зависимости от размера шрифта получилось, но теперь почему-то фон текста не прозрачный и 2 раза выводится...
Код:
  case WM_CREATE:
	  GetWindowRect(hWnd, &r);
	  CreateWindow("static", "-", WS_CHILD | WS_VISIBLE | SS_LEFT, 10, 30, r.right - r.left - 20, 5, hWnd, (HMENU)ID_STATIC_2, g_hInstance, NULL);
	  break;
  
  case WM_CTLCOLORSTATIC:
	  if((HWND)lParam == GetDlgItem(hWnd, ID_STATIC_2))
	  {
		  char s[1024];
		  wsprintf(s, "Текст\nкоторый содержит строки\nкоторые нужно\nвывести...");
		  
		  GetWindowRect(hWnd, &r);
		  HFONT hFont;
		  hFont = CreateFont(25, 0, 0, 0, 400, 0, 0, 0, RUSSIAN_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, CLEARTYPE_QUALITY, DEFAULT_PITCH, "Tahoma");
		  SelectFont((HDC)wParam, hFont);
		  SetTextColor((HDC)wParam, RGB(0, 255, 0));
		  SelectObject((HDC)wParam, hFont);
		  int a;
		  RECT rr;
		  GetWindowRect(GetDlgItem(hWnd, ID_STATIC_2), &rr);
		  a = DrawTextEx((HDC)wParam, s, strlen(s), &rr, DT_CALCRECT | DT_WORDBREAK | DT_LEFT | DT_EDITCONTROL, NULL);
		  SetWindowPos(GetDlgItem(hWnd, ID_STATIC_2), NULL, 10, 30, r.right - r.left - 20, a, 0);
		  SetWindowText(GetDlgItem(hWnd, ID_STATIC_2), s);
		  SetBkMode((HDC)wParam, TRANSPARENT);
		  return (LRESULT)GetStockObject(HOLLOW_BRUSH);
	  }
	  break;
Скриншот
Qwe1 вне форума Ответить с цитированием
Старый 12.08.2012, 23:14   #6
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

А у вас больше нигде нет вызова DrawText?
waleri вне форума Ответить с цитированием
Старый 12.08.2012, 23:44   #7
Qwe1
Пользователь
 
Регистрация: 15.05.2009
Сообщений: 29
По умолчанию

Более менее разобрался, только не получается увеличивать само диалоговое окно: когда я вызываю SetWindowPos(hWnd, <...>) из "case WM_CTLCOLORSTATIC:" то все подвисает...

Код:
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	RECT r;
	int i;
	char s[1024];
	  wsprintf(s, "Текст");

  switch (message)
  {
  case WM_CREATE:
	  GetWindowRect(hWnd, &r);
	  CreateWindow("static", "", WS_CHILD | WS_VISIBLE | SS_LEFT, 10, 30, r.right - r.left - 120, 1, hWnd, (HMENU)ID_STATIC_2, g_hInstance, NULL);
	  SetWindowText(GetDlgItem(hWnd, ID_STATIC_2), s);
	  break;
  
  case WM_CTLCOLORSTATIC:
	  HFONT hFont;
	  if((HWND)lParam == GetDlgItem(hWnd, ID_STATIC_2))
	  {  
		  GetWindowRect(hWnd, &r);
		  SetBkMode((HDC)wParam, TRANSPARENT);
		  hFont = CreateFont(14, 0, 0, 0, 400, 0, 0, 0, RUSSIAN_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, CLEARTYPE_QUALITY, DEFAULT_PITCH, "Tahoma");
		  SetTextColor((HDC)wParam, RGB(0, 0, 0));
		  SelectObject((HDC)wParam, hFont);
		  
		  int a;
		  RECT rr;
		  GetWindowRect(GetDlgItem(hWnd, ID_STATIC_2), &rr);
		  a = DrawTextEx((HDC)wParam, s, strlen(s), &rr, DT_CALCRECT | DT_WORDBREAK | DT_LEFT | DT_EDITCONTROL, NULL);
		  SetWindowPos(GetDlgItem(hWnd, ID_STATIC_2), NULL, 10, 30, r.right - r.left - 120, a, 0); 
		  bool d;
		  //d = SetWindowPos(hWnd, NULL, NULL, NULL, r.right, 150 /*a + 100*/, SWP_NOMOVE); <--- !!!
		  return (LRESULT)GetStockObject(HOLLOW_BRUSH);
	  }
	  break;
Qwe1 вне форума Ответить с цитированием
Старый 12.08.2012, 23:52   #8
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Конечно, потому что WM_CTLCOLORSTATIC вызывается во время отрисовки а когда меняется размера начинается отрисовка. Сделайте все подсчеты из WM_CREATE например.
waleri вне форума Ответить с цитированием
Старый 13.08.2012, 13:24   #9
Qwe1
Пользователь
 
Регистрация: 15.05.2009
Сообщений: 29
По умолчанию

Спасибо, перенес все в WM_CREATE, кроме цвета текста и установки прозрачности фона текста. Работает. А как можно текст выровнять по ширине?
И еще такой вопрос: как сделать фон у иконки прозрачным? Иконку добавляю так:
Код:
HWND h = CreateWindow("static", "", WS_CHILD | WS_VISIBLE | SS_ICON, 0, 0, 0, 0, hWnd, (HMENU)ID_STATIC_3, g_hInstance, NULL);
SendMessage(h, STM_SETICON, (WPARAM)(HICON)LoadImage(g_hInstance, MAKEINTRESOURCE(IDI_ICON1), IMAGE_ICON, 48, 48, LR_SHARED), 0);
Qwe1 вне форума Ответить с цитированием
Старый 13.08.2012, 14:01   #10
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Иконки вроде должны сами иметь прозрачность, т.е. если она есть, все будет рисоваться прозрачно - проверьте иконку.

Вырванивать текст по ширине - никак, покрайней мере средствами static окна.
Выход - рисовать текст самому, слово за слово.
waleri вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как узнать сколько раз просматривался файл vovanblch Безопасность, Шифрование 15 02.05.2011 01:15
Как узнать сколько RAM хавает процесс WOWka777 Общие вопросы C/C++ 5 01.02.2011 17:02
Узнать на сколько загружает процессор какая-то программа.. Человек_Борща Общие вопросы Delphi 7 19.09.2010 13:30
как при импорте из Excel в delphi узнать сколько заполненных строк в книге Excel?чтобы организовать цикл betirsolt БД в Delphi 1 17.01.2010 18:51
Как узнать какой текст выделен в текст поле mogul82 JavaScript, Ajax 2 02.11.2008 16:32