Новичок
Профиль
Группа: Участник
Сообщений: 9
Регистрация: 29.11.2014
Репутация: нет Всего: нет
|
Реализация графического интерфейса пользователя в приложениях WinAPI Не выводит график, рисует только оси координат. Подскажите пожалуйста в чём проблема. Сама программа: Код |
#include "stdafx.h" #include <windows.h> #include <conio.h> #include <math.h> #include <stdio.h> #define N 20 #define M_PI 3.14159265358979323846 #define CENTER_X 100 #define CENTER_Y 100
// глобальные переменные POINT p[N];
// объявление функций LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); ATOM RegMyWindowClass(HINSTANCE, LPCTSTR); void setPoints(int n) { int A = 2; // значение А int B = 10; // значение В int w = 5; // коэффициент масштабирования. double fi = 0; // начальное значение fi double fiMax = 2 * M_PI; // максимальное значение fi double fiAdd = fiMax / N; // увеличение fi при каждом шаге double x = 0, y = 0; // начальые значения х, у int i; for(i = 0; i < N; i++){ x = (B - A)*cos(fi) + A*cos((B - A)*(fi / A)); y = (B - A)*sin(fi) + A*sin((B - A)*(fi / A));
p[i].x = x*w + CENTER_X; p[i].y = y*w + CENTER_Y; }
}
// функция вхождений программы WinMain int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
// имя класса LPCTSTR lpzClass = TEXT("My Window Class!"); LPCTSTR lpzClassName = lpzClass;
// регистрация класса if (!RegMyWindowClass(hInstance, lpzClass)) return 1;
// вычисление координат центра экрана RECT screen_rect; GetWindowRect(GetDesktopWindow(), &screen_rect); // разрешение экрана int x = screen_rect.right / 2 - 150; int y = screen_rect.bottom / 2 - 75;
// создание диалогового окна HWND hWnd = CreateWindow(lpzClass, TEXT("Schedule Window"), WS_OVERLAPPEDWINDOW | WS_VISIBLE, x, y, 300, 300, NULL, NULL, hInstance, NULL);
// если окно не создано, описатель равен 0 if (!hWnd) return 2;
// цикл сообщений приложения MSG msg = { 0 }; // структура сообщения int iGetOk = 0; // переменная состояния while ((iGetOk = GetMessage(&msg, NULL, 0, 0)) != 0) // цикл сообщений { if (iGetOk == -1) return 3; // если GetMessage вернул ошибку - выход TranslateMessage(&msg); DispatchMessage(&msg); }
return msg.wParam; // возвращаем код завершения программы }
// функция регистрации класса окон ATOM RegMyWindowClass(HINSTANCE hInst, LPCTSTR lpzClassName) { WNDCLASS wcWindowClass = { 0 }; // адрес ф-ции обработки сообщений wcWindowClass.lpfnWndProc = (WNDPROC)WndProc; // стиль окна wcWindowClass.style = CS_HREDRAW | CS_VREDRAW; // дискриптор экземпляра приложения wcWindowClass.hInstance = hInst; // название класса wcWindowClass.lpszClassName = lpzClassName; // загрузка курсора wcWindowClass.hCursor = LoadCursor(NULL, IDC_ARROW); // загрузка цвета окон wcWindowClass.hbrBackground = (HBRUSH)COLOR_BACKGROUND; return RegisterClass(&wcWindowClass); // регистрация класса }
// функция обработки сообщений LRESULT CALLBACK WndProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_LBUTTONUP: InvalidateRect(hWnd,NULL,TRUE); break; case WM_DESTROY: PostQuitMessage(0); // реакция на сообщение break; case WM_PAINT: { PAINTSTRUCT ps; HDC hdc; hdc = BeginPaint(hWnd, &ps); setPoints(N); HPEN Pen = CreatePen(PS_SOLID, 2, RGB(255, 255, 255)); HPEN PenOld=(HPEN)SelectObject(hdc, Pen); MoveToEx(hdc, 0, CENTER_Y, NULL); // текущая позиция точки. LineTo(hdc, 2 * CENTER_X, CENTER_Y); // построение прямой линии (оси). MoveToEx(hdc, CENTER_X, 0, NULL); LineTo(hdc, CENTER_X, 2 * CENTER_Y); Polyline(hdc, p, 20); // построение линий по точкам p. SelectObject(hdc, PenOld); DeleteObject(Pen); EndPaint(hWnd, &ps); break; } } return DefWindowProc(hWnd, message, wParam, lParam); }
|
Это сообщение отредактировал(а) AndreyGers - 30.11.2014, 14:23
|