MSDN.WhiteKnight - Stack Overflow answers
Ответ на "С++ как начертить график в консольном приложении?"
Answer 1099561
То, что вы рисуете напрямую в окне консоли, затирается стандартным обработчиком отрисовки conhost при следующем обновлении окна (как при выводе нового текста в консоль, так и при изменении, например, размеров ее окна). Переопределить этот обработчик нельзя, но можно отобразить свое окно поверх консоли, как показано в примере ниже. Кроме того, код рисования графика в вопросе рисует график по отдельным точкам, я переделал его с SetPixel на MoveTo/LineTo, чтобы он выглядел непрерывным.
#define _USE_MATH_DEFINES #define _CRT_SECURE_NO_WARNINGS #include <math.h> #include <windows.h> #include <conio.h> #include <stdio.h> #include <string> #include <clocale> #include <iostream> WCHAR szTitle[] = L"Conhoid"; WCHAR szWindowClass[] = L"ConhoidWndClass"; //координаты окна const int WND_X = 300; const int WND_Y = 50; const int WND_W = 400; const int WND_H = 400; ATOM MyRegisterClass(HINSTANCE hInstance); LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); DWORD WINAPI Draw(HDC hdc); DWORD WINAPI Run(LPVOID lpThreadParameter) { HINSTANCE hInstance = GetModuleHandle(NULL); HWND hCon = GetConsoleWindow(); RECT rc; MSG msg; MyRegisterClass(hInstance); //инициализация класса окна GetWindowRect(hCon, &rc); //получаем положение окна консоли //создаем окно HWND hWnd = CreateWindowW(szWindowClass, szTitle, WS_BORDER, rc.left + WND_X, rc.top + WND_Y, WND_W, WND_H, hCon, nullptr, hInstance, nullptr); SetWindowLong(hWnd, GWL_STYLE, 0); //убираем строку заголовка if (hWnd == nullptr) { printf("Error CreateWindow\n"); return 0; } ShowWindow(hWnd, SW_SHOW); UpdateWindow(hWnd); //запуск цикла обработки сообщений while (GetMessage(&msg, nullptr, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return 0; } ATOM MyRegisterClass(HINSTANCE hInstance) { WNDCLASSEXW wcex; wcex.cbSize = sizeof(WNDCLASSEX); wcex.style = CS_HREDRAW | CS_VREDRAW; wcex.lpfnWndProc = WndProc; wcex.cbClsExtra = 0; wcex.cbWndExtra = 0; wcex.hInstance = hInstance; wcex.hIcon = LoadIcon(nullptr, IDI_APPLICATION); wcex.hCursor = LoadCursor(nullptr, IDC_ARROW); wcex.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH); wcex.lpszMenuName = NULL; wcex.lpszClassName = szWindowClass; wcex.hIconSm = LoadIcon(nullptr, IDI_APPLICATION); return RegisterClassExW(&wcex); } LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { HDC hdc; switch (message) { case WM_PAINT: PAINTSTRUCT ps; hdc = BeginPaint(hWnd, &ps); Draw(hdc); EndPaint(hWnd, &ps); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0; } void Conhoid(void) { float h = M_PI / 180, x, y, a = 20, r = 40; float f = -3; while (f <= 3) { x = a + r * cos(f); y = a * sin(f) / cos(f) + r * sin(f); printf("x = %f y = %f\n", x, y); f += h; } } DWORD WINAPI Stream(LPVOID lparoun) { Conhoid(); return 0; } DWORD WINAPI Draw(HDC hdc) { float h = M_PI / 180, x, y, a = 20, r = 40; float x0, y0; float f = -3; x = a + r * cos(f); y = a * sin(f) / cos(f) + r * sin(f); x0 = x; y0 = y; SelectObject(hdc, GetStockObject(WHITE_PEN)); MoveToEx(hdc, 300 + x, 50 + y, nullptr); while (f <= 3) { x = a + r * cos(f); y = a * sin(f) / cos(f) + r * sin(f); if (abs(y - y0) < 1000) { LineTo(hdc, 300 + x, 50 + y); } else { MoveToEx(hdc, 300 + x, 50 + y, nullptr); } f += h; x0 = x; y0 = y; } return 0; } int main() { setlocale(LC_ALL, "RUSSIAN"); DWORD dwStream = 1; HANDLE hStream, drawStream; hStream = CreateThread(NULL, 0, Stream, &dwStream, 0, &dwStream); drawStream = CreateThread(NULL, 0, Run, &dwStream, 0, &dwStream); if (hStream == NULL) printf("Поток не запущен\n"); else { printf("Поток завершился\n"); printf("\n"); CloseHandle(hStream); } _getch(); return 0; }
Content is retrieved from StackExchange API.
Auto-generated by ruso-archive tools.