Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Vano250696
0 / 0 / 2
Регистрация: 05.03.2014
Сообщений: 8
#1

Реализация графического интерфейса пользователя в приложениях WinAPI. Ошибка default - C++

30.11.2014, 13:05. Просмотров 562. Ответов 3
Метки нет (Все метки)

Сама программа:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
// фывфвфыв.cpp: определяет точку входа для приложения.
//
 
#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)
{
    PAINTSTRUCT ps;
    HDC hdc;
    if(message == WM_LBUTTONUP) message = WM_PAINT;
    // выборка и обработка сообщений
    switch (message)
    {
    case WM_LBUTTONUP:
        printf("WM_LBUTTONUP");
        break;
    case WM_DESTROY:
        PostQuitMessage(0);             // реакция на сообщение
        break;
case WM_PAINT:
        hdc = BeginPaint(hWnd, &ps);
setPoints(N);
        
HPEN Pen = CreatePen(PS_SOLID, 2, RGB(255, 255, 255));
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.
        
        EndPaint(hWnd, &ps);
 
        // все сообщения не обработанные обрабатывает Windows
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}
Выводит ошибку :
Ошибка 3 error C2361: пропуск инициализации "Pen" из-за метки "default"

Когда удаляю в конце
break;
default:
ошибка исчезает, но ничего не происходит при компиляции.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.11.2014, 13:05
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Реализация графического интерфейса пользователя в приложениях WinAPI. Ошибка default (C++):

Реализация графического интерфейса
Добрый день.Долгое время уже изучаю c++,сейчас надоели консольные...

Реализация графического интерфейса к программе
Допустим я написал код для калькулятора,теперь мне нужно это как то вывести,не...

Создание графического интерфейса
Дали задание написать матричный калькулятор.Я вроде с этим справился теперь...

Подключение графического интерфейса
Начал делать масштабный проект через консольное приложение, с мыслью &quot;вот...

Литература для графического интерфейса
Здравствуйте, у меня есть вопрос. Вот объясните, например я изучаю С++, но там...

Создание графического пользовательского интерфейса
Доброго времени суток всем! Хотел бы обратиться к вам за советом. Вот недавно...

3
zss
Модератор
Эксперт С++
6953 / 6515 / 4136
Регистрация: 18.12.2011
Сообщений: 17,201
Завершенные тесты: 1
30.11.2014, 13:23 #2
Лучший ответ Сообщение было отмечено Vano250696 как решение

Решение

Цитата Сообщение от Vano250696 Посмотреть сообщение
if(message == WM_LBUTTONUP) message = WM_PAINT;
Так нельзя.
В сообщении WM_LBUTTONUP указываем необходимость отрисовки контекста:
C++
1
2
3
 case WM_LBUTTONUP:
       // printf("WM_LBUTTONUP"); такое тоже не пойдет - куда вы принтуете?
    InvalidateRect(hwnd,NULL,TRUE);// означает, что все окно надо перерисовать
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
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;
    } 
  }// конец switch
        // все сообщения не обработанные обрабатывает Windows
        return DefWindowProc(hWnd, message, wParam, lParam);
}
1
mishelle92
67 / 66 / 36
Регистрация: 09.10.2012
Сообщений: 214
Завершенные тесты: 1
30.11.2014, 13:25 #3
Лучший ответ Сообщение было отмечено Vano250696 как решение

Решение

Не нашел в коде метку default, видимо удалена. Чтобы такой ошибки не было либо объявите HPEN Pen до switch-а, либо заключите в фигурные скобки код кейса WM_PAINT.
1
Vano250696
0 / 0 / 2
Регистрация: 05.03.2014
Сообщений: 8
30.11.2014, 14:26  [ТС] #4
Не доглядел, прислал код с удалённым default, вот из-за чего выводит ошибку.
C++
1
2
3
4
5
6
7
8
9
10
Polyline(hdc, p, 20);            // построение линий по точкам p.
        
        EndPaint(hWnd, &ps);
        break;
    default:
        // все сообщения не обработанные обрабатывает Windows
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}
Сейчас попробую, спасибо за советы.

Добавлено через 48 минут
Свои ошибки понял,спасибо. Не пойму почему выводит только оси координат, но не рисует график. Ведь расчёт верный, в предыдущий раз делал подобную программу которая выводила график в консоли, а не в окне.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.11.2014, 14:26
Привет! Вот еще темы с решениями:

Среда разработки под C++ с элементами графического интерфейса
Нужно решении, как Delphi, только там пишется языком Паскаль, мне нужно решение...

Подскажите библиотеку для создание графического интерфейса
Погуглил .. много разных библиотек нагуглил. Сам никогда не использовал ничего,...

Ищу книжки по файловым указателям и разработке графического интерфейса
-Нужно чтиво по файловым указателям... Какие-нибудь штуки по работе сосписком...

Посоветуйте новичку книжку или сайт, где описывается создание графического интерфейса в VC
Добрый вечер, подскажите пожалуйста какую нибудь книжку или сайт где...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru