@gena_vit

Что добавить в код, чтобы текстовая строка прорисовывалась в окне с дополнительным эффектами(Указано ниже с какими, Win 32 C++)?

Что нужно добавить в код, чтобы текстовая строка прорисовывалась в окне с дополнительным эффектами: вывод вдоль кривой
линии, переменный размер символа, изменяющийся угол наклона? Помогите пожалуйста!!!

#include <Windows.h>
 
 
 
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR args, int ncmdshow)
{
    WNDCLASS SoftwareMainClass = NewWindowClass((HBRUSH)COLOR_WINDOW, LoadCursor(NULL, IDC_ARROW), hInst, LoadIcon(NULL, IDI_QUESTION), L"MainWndClass", SoftwareMainProcedure);
    if (!RegisterClassW(&SoftwareMainClass)) { return -1; }
    MSG SoftwareMainMessage = { 0 };
    CreateWindow(L"MainWndClass", L"First c++ window", WS_OVERLAPPEDWINDOW | WS_VISIBLE, 100, 100, 500, 250, NULL, NULL, NULL, NULL);
    while (GetMessage(&SoftwareMainMessage, NULL, NULL, NULL))
    {
        TranslateMessage(&SoftwareMainMessage);
        DispatchMessage(&SoftwareMainMessage);
    }
    return 0;
}
 
WNDCLASS NewWindowClass(HBRUSH BGColor, HCURSOR Cursor, HINSTANCE hInst, HICON Icon, LPCWSTR Name, WNDPROC Procedure)
{
    WNDCLASS NWC = { 0 };
    NWC.hIcon = Icon;
    NWC.hCursor = Cursor;
    NWC.hInstance = hInst;
    NWC.lpszClassName = Name;
    NWC.hbrBackground = BGColor;
    NWC.lpfnWndProc = Procedure;
 
    return NWC;
}
void MainWndAddWidgets(HWND hWnd)
{
    CreateWindowEx(WS_EX_STATICEDGE, L"edit", NULL, WS_CHILD | WS_VISIBLE | WS_VSCROLL | ES_MULTILINE | ES_AUTOVSCROLL, 5, 5, 200, 150, hWnd, (HMENU)1001, NULL, NULL);
 
}
 
LRESULT CALLBACK SoftwareMainProcedure(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
{
    switch (msg)
    {
    case WM_CREATE:
        MainWndAddWidgets(hWnd);
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    
 
    default: return DefWindowProc(hWnd, msg, wp, lp);
 
    }
  • Вопрос задан
  • 91 просмотр
Пригласить эксперта
Ответы на вопрос 2
mayton2019
@mayton2019
Bigdata Engineer
Тяжелую задачку ты зацепил. Я не знаю есть ли в классическом Win32GDI такие функции чтоб вдоль curve печатать текст.

Но вот есть пример с печатью под произвольным углом. Попробуй ее приспособить.

https://learn.microsoft.com/en-us/windows/win32/gd...
Ответ написан
@Quark_Hell
C++ программист
На счёт рисовки вдоль кривой, была в универе недавно похожая задача, только там нужно было нарисовать график функции на промежутке.
Вот можешь глянуть код:

define SCREENW 119
#define SCREENH 30

void DrawFunction(FILE* fout, double a, double b, double (*f)
    (double))
{
    char screen[SCREENW][SCREENH];
    double x, y[SCREENW];
    double ymin = 0, ymax = 0;
    double hx, hy;
    int i, j;
    int xz, yz;

    hx = (b - a) / (SCREENW - 1);
    for (i = 0, x = a; i < SCREENW; ++i, x += hx) {

        y[i] = f(x);

        if (y[i] < ymin) ymin = y[i];
        if (y[i] > ymax) ymax = y[i];
    }
    hy = (ymax - ymin) / (SCREENH - 1);
    yz = (int)floor(ymax / hy + 0.5);
    xz = (int)floor(-a / hx + 0.5);

    for (j = 0; j < SCREENH; ++j) {
        for (i = 0; i < SCREENW; ++i) {
            if (j == yz && i == xz)
                screen[i][j] = '+';
            else if (j == yz)
                screen[i][j] = '-';
            else if (i == xz)
                screen[i][j] = '|';
            else
                screen[i][j] = ' ';

        }
    }
    for (i = 0; i < SCREENW; ++i) {
        j = (int)floor((ymax - y[i]) / hy + 0.5);
        screen[i][j] = '.';
    }

    for (j = 0; j < SCREENH; ++j) {
        for (i = 0; i < SCREENW; ++i)
            fputc(screen[i][j], fout);
        fprintf(fout, "\n");
    }
}

double FirstFunct(double x)
{
    return pow(log10(sin(4 * x) + 1), 2);
}

void A1() {
//Промежуток тут от 0 до 2
//Уравнение функции записано в FirstFunct
    DrawFunction(stdout, 0, 2.0, FirstFunct);
}

Вот вывод в консоли и в гугл таблицах соответственно:
63bc27aeb6da1944780971.jpeg

Однако учти, что символ в консоли имеет четкую ЦЕЛОЧИСЛЕННУЮ позицию (COORD)

Получается делаем вывод, что символ не может находиться где-то посередине
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы