45 / 48 / 5
Регистрация: 24.06.2013
Сообщений: 677
1

DRAWTEXT(DT_CALCRECT)

17.12.2014, 11:20. Показов 6746. Ответов 10
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток. Пытаюсь создать окно "static" с определённой шириной и высотой, в зависимости от текста окна(чтобы высоты хватало на все символы). Нашёл
C++
1
DrawTextW(NULL,text,-1,&rect,DT_CALCRECT);
Но почему-то в rect остаются те же значения, которыми инициализировал. Подскажите что не так?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    HWND hw(wchar_t*text)
    {
        RECT rect;
        rect.top=0;
        rect.bottom=0;
        rect.left=0;
        rect.right=266;
 
        DrawTextW(NULL,text,-1,&rect,DT_CALCRECT);
 
        hwnd=CreateWindowW(L"static",text,WS_CHILD|WS_VISIBLE,rect.left,rect.top,
        rect.right-rect.left,rect.bottom-rect.top,hMainWnd,NULL,NULL,NULL);
 
        return hwnd;
    }
По прочитанному в сети я так понял, что флаг DT_CALCRECT заставляет пересчитать rect без вывода на экран - то, что нужно, но значения rect до и после вызова DrawText одинаково не правильные - текст мягко говоря не влазит

Добавлено через 13 минут
Сроки горят, а я на такой мелочи завис...печалька гнобит
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.12.2014, 11:20
Ответы с готовыми решениями:

DrawText
как при пощи DrawText сделать надпись в окне , если можно простенький исходник. Заранее всем...

( ? ) DrawText + очистка
Здравствуйте написал такой код,для того,чтобы вывести текст на экран: ... hDC =...

Ошибка в DrawText()
expected primary-expression before ',' token в строчке DrawText(hwnd, str, WORD, &rect,...

Не работает DrawText()
Здравствуйте! Может мне хоть кто-то подскажет почему данная функция ничего не рисует в окне (нужно,...

10
567 / 198 / 70
Регистрация: 25.05.2012
Сообщений: 816
17.12.2014, 11:24 2
DrawText нельзя для этого использовать, забудь.

Для определения ширины и высоты текста используется функция GetTextExtentPoint32. Важно, чтобы в dc, для которого определяются параметры был выбран нужный шрифт.
1
45 / 48 / 5
Регистрация: 24.06.2013
Сообщений: 677
17.12.2014, 14:19  [ТС] 3
Цитата Сообщение от dmitry94 Посмотреть сообщение
Для определения ширины и высоты текста используется функция GetTextExtentPoint32. Важно, чтобы в dc, для которого определяются параметры был выбран нужный шрифт.
Спасибо! Только не пойму как рассчитывать только высоту? Дело в том, что ширина окна всегда должна быть оинаковой, а при необходимости переноситься, и с учётом переносов нужно вычислить с какой высотой создавать окно?

Добавлено через 9 минут
Нельзя ли пример с установкой текущего шрифта в DC? Я не наглый, просто реально не успеваю это разгрызть, а сроки поджимают =(

Добавлено через 10 минут
Может получить размер символов шрифта + математика и двоичная логика? Скорее всего велосипед, но не могу найти то что мне нужно...времени жаль мало =/

Добавлено через 28 минут
Плохая идея...wchar_t.
0
567 / 198 / 70
Регистрация: 25.05.2012
Сообщений: 816
17.12.2014, 15:10 4
Примерно так (не проверял, так что могут быть ошибки/опечатки, но принцип должен быть понятен):

C++
1
2
3
4
5
6
7
8
9
10
SIZE size ={0,0};
wchar_t *text = L"text";
HDC dc = GetDC(hwnd);
HFONT font = CreateFont(-12,0,0,0,FW_NORMAL,0,0,0,DEFAULT_CHARSET,OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,DEFAULT_PITCH|FF_DONTCARE, L"Segoe UI");
SelectObject(dc, font);
GetTextExtentPoint32(dc, text, wcslen(text), &size);
int width = size.cx;
int height = size.cy;
ReleaseDC(hwnd, dc);
DeleteDC(dc);
Добавлено через 8 минут
Цитата Сообщение от Retyrn0 Посмотреть сообщение
как рассчитывать только высоту?
Только высоту можно узнать проще:
C++
1
2
3
4
TEXTMETRIC tm;
SelectObject(dc, font);
GetTextMetrics(dc,&tm);
int height  = tm.tmHeight;
1
45 / 48 / 5
Регистрация: 24.06.2013
Сообщений: 677
17.12.2014, 15:47  [ТС] 5
Цитата Сообщение от dmitry94 Посмотреть сообщение
Только высоту можно узнать проще:
Спасибище! Сейчас посмотрю та ли высота или автоперенос строк не учитывается
0
567 / 198 / 70
Регистрация: 25.05.2012
Сообщений: 816
17.12.2014, 17:46 6
Цитата Сообщение от Retyrn0 Посмотреть сообщение
автоперенос строк не учитывается
Автоперенос строк учитываться и не будет, все нужно считать вручную. Только зачем такие сложности? Не проще создать окно фиксированных размеров и туда помещать текст.

К тому же, чтобы не возникала неопределенность, изначально хотя бы один параметр (ширина или высота) в любом случае должен быть задан, чтобы исходить из него при расчете второго параметра.
0
45 / 48 / 5
Регистрация: 24.06.2013
Сообщений: 677
17.12.2014, 18:27  [ТС] 7
Цитата Сообщение от dmitry94 Посмотреть сообщение
зачем такие сложности?
Цитата Сообщение от dmitry94 Посмотреть сообщение
чтобы не возникала неопределенность, изначально хотя бы один параметр (ширина или высота) в любом случае должен быть задан, чтобы исходить из него при расчете второго параметра
Может не правильно вопрос поставлен...программа для отправки сообщений - количество символов заранее не известны, для каждого сообщения создаётся своё окно - здесь фиксированные размеры не подойдут, разве что с запасом по высоте - но это же не по-мужски) Кроме того, на счёт одного фиксированного параметра - ширина как раз фиксирована. Нужно из ширины, текста и шрифта каким-то образом рассчитать высоту для создаваемого окна, чтобы туда поместился весь текст с учётом автопереносов.

Для большей наглядности, интерфейс вибера или другого приложения обмена сообщений - там ширина окна постоянна, а вот высота зависит от количества символов текста.
0
567 / 198 / 70
Регистрация: 25.05.2012
Сообщений: 816
17.12.2014, 19:29 8
Цитата Сообщение от Retyrn0 Посмотреть сообщение
Нужно из ширины, текста и шрифта каким-то образом рассчитать высоту для создаваемого окна, чтобы туда поместился весь текст с учётом автопереносов.
Тогда только вручную разбивать текст на строки, проверяя, чтобы каждая строка поместилась в экран, и пересчитывать высоту получившегося текста исходя из количества строк. DrawText использовать для автопереноса тоже здесь не очень правильно, потому что можно только предполагать как будет отформатирован текст. Текст нужно формировать вручную и выводить построчно.

Других способов я навскидку не знаю, может кто еще подскажет.
0
45 / 48 / 5
Регистрация: 24.06.2013
Сообщений: 677
17.12.2014, 19:45  [ТС] 9
Цитата Сообщение от dmitry94 Посмотреть сообщение
вручную разбивать текст на строки, проверяя, чтобы каждая строка поместилась в экран, и пересчитывать высоту получившегося текста исходя из количества строк
Плохо. Рассчитывал на велосипед) Странно, что в винапи такую фичу не внедрили, вроде довольно нужная хрень..
Спасибо и на том)
0
567 / 198 / 70
Регистрация: 25.05.2012
Сообщений: 816
17.12.2014, 20:00 10
Лучший ответ Сообщение было отмечено Retyrn0 как решение

Решение

Все проще оказалось. Делается через DrawText, просто никогда не доводилось использовать. Вот решение:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
 
    wchar_t *text = L"Determines the width and height of the rectangle. \
        If there are multiple lines of text, DrawText uses the width of the \
        rectangle pointed to by the lpRect parameter and extends the base \
        of the rectangle to bound the last line of text. If the largest word \
        is wider than the rectangle, the width is expanded. If the text is less \
        than the width of the rectangle, the width is reduced. If there is only \
        one line of text, DrawText modifies the right side of the rectangle so that \
        it bounds the last character in the line. In either case, DrawText returns \
        the height of the formatted text but does not draw the text.";
 
    int MenuAndWndFrameHeight = 100;
 
    int wmId, wmEvent;
    PAINTSTRUCT ps;
    HDC hdc;
 
    switch (message)
    {
    case WM_COMMAND:
        wmId    = LOWORD(wParam);
        wmEvent = HIWORD(wParam);
        // Разобрать выбор в меню:
        switch (wmId)
        {
        case IDM_ABOUT:
            DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
            break;
        case IDM_EXIT:
            DestroyWindow(hWnd);
            break;
        default:
            return DefWindowProc(hWnd, message, wParam, lParam);
        }
        break;
    case WM_PAINT:
        hdc = BeginPaint(hWnd, &ps);
        // TODO: добавьте любой код отрисовки...
        RECT r;
        r.left = 0;
        r.right = 100;
        r.bottom = 0;
        r.top = 0;
 
        DrawText(hdc, text, wcslen(text), &r, DT_CALCRECT|DT_WORDBREAK|DT_WORD_ELLIPSIS|DT_NOPREFIX);
        DrawText(hdc, text, wcslen(text), &r, DT_LEFT|DT_WORDBREAK|DT_WORD_ELLIPSIS|DT_NOPREFIX);
 
        SetWindowPos(hWnd, NULL, r.left, r.top, r.right-r.left, r.bottom-r.top+MenuAndWndFrameHeight, 0);
 
        EndPaint(hWnd, &ps);
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}
Извиняюсь за дезинформацию, просто сразу не вник в задание.

DRAWTEXT(DT_CALCRECT)
1
45 / 48 / 5
Регистрация: 24.06.2013
Сообщений: 677
17.12.2014, 20:48  [ТС] 11
Цитата Сообщение от dmitry94 Посмотреть сообщение
Извиняюсь за дезинформацию
Не страшно, главное результат - огромное спасибо! Сейчас попробую)
0
17.12.2014, 20:48
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.12.2014, 20:48
Помогаю со студенческими работами здесь

функция DrawText()
Здравствуйте! Помогите пожалуйста, как вывести текст с помощью функции DrawText(), предварительно...

DrawText, TextOut
i - глобальная case WM_PAINT: { i++; wchar_t s; hdc=BeginPaint(hwnd,&ps);...

Местоположение текста (DrawText)
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { int wmId,...

Есть ли у DrawText уникодовая версия?
И как её зовут? Или надо обязательно преобразовывать строку в Ansi?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru