Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.85/13: Рейтинг темы: голосов - 13, средняя оценка - 4.85
0 / 0 / 0
Регистрация: 05.03.2014
Сообщений: 8

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

30.11.2014, 13:05. Показов 2648. Ответов 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
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
30.11.2014, 13:05
Ответы с готовыми решениями:

WinAPI, Qt, MFC для создания графического интерфейса программы ?
WinAPI - как я понимаю, это более &quot;низкоуровневый&quot; вариант, имеющий свою нишу, служащий в некотором основной для остальных. MFC -...

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

Создание графического интерфейса пользователя
Язык форума - русский, оформите сообщение в соответствии с требованями. Вложения загружайте на форум - Расширенный режим-Управление...

3
Модератор
Эксперт С++
 Аватар для zss
13771 / 10964 / 6491
Регистрация: 18.12.2011
Сообщений: 29,241
30.11.2014, 13:23
Лучший ответ Сообщение было отмечено 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
73 / 69 / 38
Регистрация: 09.10.2012
Сообщений: 238
30.11.2014, 13:25
Лучший ответ Сообщение было отмечено Vano250696 как решение

Решение

Не нашел в коде метку default, видимо удалена. Чтобы такой ошибки не было либо объявите HPEN Pen до switch-а, либо заключите в фигурные скобки код кейса WM_PAINT.
1
0 / 0 / 0
Регистрация: 05.03.2014
Сообщений: 8
30.11.2014, 14:26  [ТС]
Не доглядел, прислал код с удалённым 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
30.11.2014, 14:26
Помогаю со студенческими работами здесь

Создание графического интерфейса пользователя
Здравствуйте. Столкнулся с тяжелой проблемой(( Я ничего не понимаю в VBA, но задание сделать нужно. Работа должна быть выполнена в...

Реализация графического интерфейса в windows
Прошу прощения возможно за тупой вопрос. Имеется программа-сервер, которая висит в качестве демона на линуксовом сервере, и которая при...

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

Теория по созданию графического интерфейса пользователя
Подскажите, где найти информацию по этой теме: как правильно разрабатывать, что считается хорошим интуитивным интерфейсом и т.д. Книги,...

Разработать приложение под Win32 с использование графического интерфейса пользователя
Разработать приложение под Win32 с использование графического интерфейса пользователя, программируемого с помощью API – функций Windows....


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru