Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/22: Рейтинг темы: голосов - 22, средняя оценка - 4.64
0 / 0 / 1
Регистрация: 06.11.2010
Сообщений: 125

При изменении окна- изменение контекста

29.11.2011, 00:48. Показов 4190. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет) Подскажите пожалуйста как при изменении окна сделать так, что бы изменялось содержимое (в моем случае эллипс с пятиугольником) ? Подскажите пож. функцию)

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
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
#include "stdafx.h"
#include "laba_2_spro.h"
 
#include <windows.h>       
 
// Глобальные переменные:
HINSTANCE hInst;    // Указатель приложения
LPCTSTR szTitle = "Вторая программа";
LPCTSTR szWindowClass = "QWERTY";
 
// Предварительное описание функций 
ATOM MyRegisterClass(HINSTANCE hInstance);
BOOL InitInstance(HINSTANCE, int);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK    About(HWND, UINT, WPARAM, LPARAM);
 
// Основная программа 
int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
    MSG msg;
 
    // Регистрация класса окна 
    MyRegisterClass(hInstance);
 
    // Создание окна приложения
    if (!InitInstance (hInstance, nCmdShow)) 
    {
        return FALSE;
    }
    // Цикл обработки сообщений
    while (GetMessage(&msg, NULL, 0, 0)) 
    {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
    }
    return msg.wParam;
}
 
//  FUNCTION: MyRegisterClass()
//  Регистрирует класс окна 
 
ATOM MyRegisterClass(HINSTANCE hInstance)
{
    WNDCLASSEX wcex; 
    wcex.cbSize = sizeof(WNDCLASSEX); 
    wcex.style          = CS_OWNDC | CS_HREDRAW | CS_VREDRAW;   // стиль окна
    wcex.lpfnWndProc    = (WNDPROC)WndProc; // оконная процедура
    wcex.cbClsExtra     = 0;                        
    wcex.cbWndExtra     = 0;
    wcex.hInstance      = hInstance;        // указатель приложения
    wcex.hIcon          = LoadIcon(NULL, IDI_HAND);     // опре-деление иконки
    wcex.hCursor        = LoadCursor(NULL, IDC_ARROW);    // опреде-ление курсора
    wcex.hbrBackground  = GetSysColorBrush(COLOR_BTNFACE);   // ус-тановка фона
    wcex.lpszMenuName   = MAKEINTRESOURCE(IDC_LABA_2_SPRO);     // определение меню
    wcex.lpszClassName  = szWindowClass;    // имя класса
    wcex.hIconSm        = NULL;
 
    return RegisterClassEx(&wcex); // регистрация класса окна
}
 
// FUNCTION: InitInstance(HANDLE, int)
// Создает окно приложения и сохраняет указатель приложения в переменной hInst
 
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
   HWND hWnd;
 
   hInst = hInstance; // сохраняет указатель приложения в переменной hInst
 
   hWnd=CreateWindow(szWindowClass, // имя класса окна
 szTitle,   // имя приложения
 WS_OVERLAPPEDWINDOW, // стиль окна
 600,   // положение по Х
 250,   // положение по Y
 600,    // размер по Х
 450,    // размер по Y
 NULL// описатель родительского окна
 NULL,       // описатель меню окна
 hInstance,  // указатель приложения
 NULL);     // параметры создания.
 
   if (!hWnd) // Если окно не создалось, функция возвращает FALSE
   {
      return FALSE;
   }
   ShowWindow(hWnd, nCmdShow);      // Показать окно
   
   UpdateWindow(hWnd); // Обновить окнj
   return TRUE;             //Успешное завершение функции
}
 
//  FUNCTION: WndProc(HWND, unsigned, WORD, LONG)
//  Оконная процедура. Принимает и обрабатывает все сообщения, прихо-дящие в приложение
 
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    PAINTSTRUCT ps; // структура для рисования
    HDC hdc; // Дексриптор контекста утройств
    RECT rt; // Структура для области рисования
    int wmId, wmEvent;
 
    switch (message) 
    {
        case WM_CREATE: // Сообщение приходит при создании окна
            break;
 
        case WM_COMMAND: 
            wmId    = LOWORD(wParam);
            wmEvent = HIWORD(wParam);
        // Разобрать выбор в меню:
        switch (wmId)
        { 
        case IDM_ABOUT:
            DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
            break;
        case IDM_EXIT:
            DestroyWindow(hWnd);
            break;
 
        default:
            return DefWindowProc(hWnd, message, wParam, lParam);
        }
        break;
 
 
        case WM_PAINT:
            InvalidateRect(hWnd,NULL,NULL);// Перерисовать окно
            hdc = BeginPaint(hWnd, &ps); // Начать графический вывод
            
            HBRUSH hB,hOldB;
            
            hB=CreateSolidBrush(RGB(0,0,255));
            hOldB=(HBRUSH)SelectObject(hdc,hB);
            
            
            Ellipse(hdc, 70,70,500,300); 
            
            SelectObject(hdc,hOldB);
            DeleteObject(hB);
 
            POINT p[6];
            p[0].x=70;
            p[0].y=60;
            p[1].x=500;
            p[1].y=60;
            p[2].x=500;
            p[2].y=290;
            p[3].x=285;
            p[3].y=340;
            p[4].x=70;
            p[4].y=290;
            p[5].x=70;
            p[5].y=60;
            Polyline(hdc,p,6);
            
            
            GetClientRect(hWnd, &rt); // Область окна для рисования (получаем координаты рабочей области окна)
 
            EndPaint(hWnd, &ps); // Закончить графический вывод
            break;
 
        case WM_DESTROY: // Завершение работы
             PostQuitMessage(0);
            break;
        default: 
// Обработка сообщений, которые не обработаны пользователем
            return DefWindowProc(hWnd, message, wParam, lParam); 
   }
return 0;
}
// Обработчик сообщений для окна "О программе".
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
    UNREFERENCED_PARAMETER(lParam);
    switch (message)
    {
    case WM_INITDIALOG:
        return (INT_PTR)TRUE;
 
    case WM_COMMAND:
        
        if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
        {
            EndDialog(hDlg, LOWORD(wParam));
            return (INT_PTR)TRUE;
        }
        break;
    }
    return (INT_PTR)FALSE;
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
29.11.2011, 00:48
Ответы с готовыми решениями:

Перерисовка внутри окна при изменении размера
Подскажите, когда начинаю менять размер окна с помощью мышки - тяну за угол, само окно становится белым цветом. Проблема знакомая но там я...

При изменении размеров окна выдержать квадратную форму
Приветствую. Создаю окно со стилем WS_OVERLAPPEDWINDOW, с равным соотношением горизонтали и вертикали (окно квадратное), при любых...

При изменении размера окна WM_PAINT рисуются лишние линии
Имеется вектор с координатами двух графиков, который устроен по принципу &quot;первое значение - общий для обоих графиков х, второе - y1, третье...

9
Brainsbreaker
 Аватар для Digit@ll
899 / 374 / 54
Регистрация: 01.02.2011
Сообщений: 1,608
29.11.2011, 06:39
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
static BOOL flag=FALSE;
 
case WM_SIZE:
    {
        if (flag==TRUE)
            flag=FALSE;
        else
            flag=TRUE;
    }
    break;
 
case WM_PAINT:
    {
        hdc = BeginPaint (hWnd, &ps);
        if (flag==FALSE)
        {
            HBRUSH hB, hOldB;
            
            hB = CreateSolidBrush (RGB(0,0,255));
            hOldB = (HBRUSH)SelectObject (hdc, hB);
            Ellipse (hdc, 70, 70, 500, 300);
            SelectObject (hdc, hOldB);
            DeleteObject (hB);
        }
        else
        {
            POINT p[6] = {70, 60, 500, 60, 500, 290, 285, 340, 70, 290, 70, 60};
            Polyline (hdc, p, 6);
        }
        EndPaint (hWnd, &ps);
    }
    break;
0
0 / 0 / 1
Регистрация: 06.11.2010
Сообщений: 125
29.11.2011, 11:13  [ТС]
Не работает.. когда, пропал эллипс, когда увеличиваю окно, появляется эллипс пропадает пятиугольник...
0
Brainsbreaker
 Аватар для Digit@ll
899 / 374 / 54
Регистрация: 01.02.2011
Сообщений: 1,608
29.11.2011, 11:59
Ну..?
Цитата Сообщение от leha-demi Посмотреть сообщение
при изменении окна сделать так, что бы изменялось содержимое (в моем случае эллипс с пятиугольником) ? Подскажите пож. функцию)
Какую еще функцию здесь подсказать?
0
0 / 0 / 1
Регистрация: 06.11.2010
Сообщений: 125
29.11.2011, 18:33  [ТС]
Я пробовал invalidaterect, ну почему то картинка мигает, и при изменении не масштаба окна, картинка не меняется( Даже не знаю(

Добавлено через 6 часов 30 минут
Помогите пожалуйста=((
0
0 / 0 / 1
Регистрация: 06.11.2010
Сообщений: 125
03.12.2011, 22:08  [ТС]
Никто не поможет?

Добавлено через 1 час 41 минуту
Цитата Сообщение от Digit@ll Посмотреть сообщение
Ну..?

Какую еще функцию здесь подсказать?
я имею ввиду что бы размер изменялся картинки, автоматически, с изменением размера окна....
0
Brainsbreaker
 Аватар для Digit@ll
899 / 374 / 54
Регистрация: 01.02.2011
Сообщений: 1,608
04.12.2011, 00:48
GetClientRect будет незаменима для дальнейшего творчества.
0
0 / 0 / 1
Регистрация: 06.11.2010
Сообщений: 125
04.12.2011, 12:48  [ТС]
Так я ее и использую..
0
Brainsbreaker
 Аватар для Digit@ll
899 / 374 / 54
Регистрация: 01.02.2011
Сообщений: 1,608
04.12.2011, 16:18
"Так" ты её можешь вообще не использовать.

Вот пример для окружности:

C++
1
2
3
4
5
case WM_SIZE:
    {
        GetClientRect (hWnd, &rect);
    }
    break;
и
C++
1
Ellipse (hdc, 70, 70, rect.right-92, rect.bottom-116);
С линиями будет немного сложней, но почти то же самое.
0
375 / 322 / 32
Регистрация: 24.02.2011
Сообщений: 1,512
Записей в блоге: 1
09.12.2011, 07:12
Цитата Сообщение от leha-demi Посмотреть сообщение
Я пробовал invalidaterect, ну почему то картинка мигает, и при изменении не масштаба окна, картинка не меняется( Даже не знаю(
После InvalidateRect нужно еще UpdateWindow, чтоб сразу менялось. Первая функция только указывает, что прямоугольнику требуется перерисовка, сама перерисовка будет выполнена только когда WM_PAINT придет. Вот вторая функция и отправляет окну WM_PAINT. Надеюсь, не требуется объяснять, что все это не нужно делать в обработчике сообщения WM_PAINT.
По поводу мигания. Используйте совместимый контекст в памяти, рисуйте в нем. А по сообщению WM_PAINT копируйте при помощи BitBlt.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
09.12.2011, 07:12
Помогаю со студенческими работами здесь

Графика: треугольник, изменяющий размеры при изменении размеров окна
Помогите разобраться в коде. Мне нужно привязать треугольник к основанию окна и чтобы по изменению окна он менялся(т.е при уменьшении окна...

Линия, нарисованная мышкой, перерисовывается при изменении размеров окна
подскажите пожалуйста, как сделать так, чтобы нарисованная мышкой линия не исчезала, а перерисовывалась при изменении размеров окна. ...

Как изменять размеры дочернего окна при изменении размеров родительского?
Есть главное окно и внутри него прорисовано дочернее(благодаря стилю WS_BORDER), которое разделяет клиентскую зону пополам. Но я столкнулся...

Как сделать чтобы при изменении размера окна разрешение не менялось (DirectX 11)?
Здравствуйте. Я изучаю DirectX 11 и хотел бы узнать как мне в моей программе сделать так, чтобы при растягивании окна разрешение не...

Изменение меню при изменении размера окна
Здравствуйте. Видел на одном из сайтов такой прием, когда окно во весь экран меню имеет обычный вид (как на рисунке 1), при уменьшении окна...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru