Отображение строкового вывода в окне с помощью C (в WIN32 API)

Мне нужен правильный способ вывода строки символов и ее отображения в созданном окне. Я использовал функцию textout(), но поскольку она только рисует окно, после того как окно свернуто и восстановлено, данные, отображаемые в окне, исчезают. Кроме того, когда отображаемые данные превышают размер окна, отображаются только данные, равные размеру окна, а другие данные усекаются. Есть ли другой способ вывода данных в окне?

2 ответа

Решение

Вы можете положить Static или Edit контроль (метка и текстовое поле) в вашем окне, чтобы показать данные.

Позвоните одному из них во время WM_CREATE:

HWND hWndExample = CreateWindow("STATIC", "Text Goes Here", WS_VISIBLE | WS_CHILD | SS_LEFT, 10,10,100,100, hWnd, NULL, hInstance, NULL);

Или же

HWND hWndExample = CreateWindow("EDIT", "Text Goes Here", WS_VISIBLE | WS_CHILD | ES_LEFT, 10,10,100,100, hWnd, NULL, hInstance, NULL);

Если вы используете Edit тогда пользователь также сможет прокручивать, копировать и вставлять текст.

В обоих случаях текст может быть обновлен с помощью SetWindowText():

SetWindowText(hWndExample, TEXT("Control string"));

( Куртосий Дабойзук)

TextOut должен работать идеально, если это делается в WM_PAINT, его следует рисовать каждый раз. (в том числе по минимизации и изменению размеров)

LRESULT CALLBACK MyWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch(message)
    {
        case WM_PAINT:
            PAINTSTRUCT ps;
            HDC hdc = BeginPaint(hWnd, &ps);

            TextOut(hdc, 10, 10, TEXT("Text Out String"),strlen("Text Out String"));

            EndPaint(hWnd, &ps);
            ReleaseDC(hWnd, hdc);
            break;
        default:
            return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}

Вы также можете быть заинтересованы в DrawText

LRESULT CALLBACK MyWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch(message)
    {
        case WM_PAINT:
            PAINTSTRUCT ps;
            HDC hdc = BeginPaint(hWnd, &ps);

            RECT rec;
            //       SetRect(rect, x ,y ,width, height)
            SetRect(&rec,10,10,100,100);
            //       DrawText(HDC, text, text length, drawing area, parameters "DT_XXX")
            DrawText(hdc, TEXT("Text Out String"),strlen("Text Out String"), &rec, DT_TOP|DT_LEFT);

            EndPaint(hWnd, &ps);
            ReleaseDC(hWnd, hdc);
            break;
        default:
            return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}

Который будет рисовать текст в вашем окне в заданном прямоугольнике,


Рисование текста будет переносом слов внутри заданного прямоугольника.
Если вы хотите иметь все окно в качестве области рисования, вы можете использовать GetClientRect(hWnd, &rec); вместо SetRect(&rec,10,10,100,100);

Другие вопросы по тегам