Как изменить цвет и размер текста, используя WIN32 API для C ++? - PullRequest
1 голос
/ 04 апреля 2020

Я несколько дней искал ответ на свой вопрос, но, похоже, я не могу найти какое-либо решение, которое работает для меня ... Возможно, потому что я могу думать, что все это неправильно.

Я пытаюсь создать базовое окно c, которое выскакивает строку текста крупным красным шрифтом, используя WIN32 API в C ++.

Я пытался использовать элемент управления WM_CTLCOLORSTATI C в моей WindowProcedure, но я не могу заставить текст изменить цвет. Тем не менее, я могу создавать текст с помощью WM_CREATE, поэтому я не понимаю, что я делаю неправильно ...

Вот что я написал до сих пор.

#include <iostream>
#include <windows.h>

LRESULT CALLBACK WindowProcedure(HWND, UINT, WPARAM, LPARAM);

HWND textfield;
HDC hdc;

int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR args, int nccmdshow) {

    WNDCLASSW wc = { 0 };

    wc.hbrBackground =  (HBRUSH)COLOR_WINDOW;
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    wc.hInstance = hInst;
    wc.lpszClassName = L"myWindowClass";
    wc.lpfnWndProc = WindowProcedure;

    if (!RegisterClassW(&wc))
        return -1;

    CreateWindowW(L"myWindowClass", L"My Window", WS_OVERLAPPEDWINDOW | WS_VISIBLE, 500, 200, 1000, 500,
        NULL, NULL, NULL, NULL);

    MSG msg = {0};

    while (GetMessage(&msg, NULL, NULL, NULL)) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return 0;

}

LRESULT CALLBACK WindowProcedure(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) {


    switch (msg) {
    case WM_CREATE:
        textfield = CreateWindow(L"STATIC", L"DEBOODAH!", WS_VISIBLE | WS_CHILD , 500, 100, 300, 25, hWnd, NULL, NULL, NULL);
        break;

    case WM_CTLCOLORSTATIC:

    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProcW(hWnd, msg, wp, lp);
    }

}

Любой помощь будет принята с благодарностью!

Ответы [ 2 ]

2 голосов
/ 04 апреля 2020

Сообщение WM_CTLCOLORSTATI C получает дескриптор контекста устройства (HDC) в wParam. Вот как вы его используете:

case WM_CTLCOLORSTATIC:
    SetTextColor((HDC)wp, RGB(255, 0, 0));
    return DefWindowProcW(hWnd, msg, wp, lp);

Размер текста - это совсем другая история. После того, как вы создадите окно stati c, вы должны создать шрифт и передать его в stati c:

case WM_CREATE:
    textfield = CreateWindow(/*...*/);
    HFONT hf = CreateFont(/*size=*/-12, 0, 0, 0, FW_NORMAL, 0, 0, 0, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH, L"MS Sans Serif");
    SendMessage(textfield, WM_SETFONT, (WPARAM)hf, 0);
    break;

Также возможно рисование собственного текста, как предполагает Себастьян.

1 голос
/ 04 апреля 2020

Вы можете прочитать о рисовании внутри окна.

Обычно можно поместить следующий код в регистр WM_PAINT:

case WM_PAINT:
    PAINTSRUCT ps;
    HDC hdc = BeginPaint(hwnd, ps);
    // draw here
    EndPaint(hwnd, &ps);

С помощью ручки hd c вы можете вызывать такие функции, как TextOutA / TextOutW, SetTextColors и другие

Вы создаете 2-е меньшее окно внутри, когда создается родительское окно (WM_CREATE). Это меньшее окно может быть задано только элементарно. Попытайтесь оставить это, когда рисуете с WM_PAINT.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...