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

Изменение дочернего окна

10.12.2019, 14:40. Показов 1099. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!
Пишу программу, но возникла проблема.
Есть главное окно hWnd, в которое через формы был добавлен Combo-box и три кнопки. Также программно создается дочернее окно внутри главного - hChild. Мне нужно, чтобы по нажатию на одну кнопку hWnd, внутри hChild рисовался круг - это и не получается осуществить.
В чем может быть ошибка? Заранее спасибо.
Кликните здесь для просмотра всего текста
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
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
#include <windows.h>
#include "resource.h"
#include "windowsx.h"
 
#define ID_FIRSTCHILD   100
 
HINSTANCE       ghInstance;   // Переменная для хранения хендела процесса                      
 
HWND    hList1, hCombo1;
HWND hWnd, hChild;
BOOL CALLBACK   PviewDlgProc(HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam);
LRESULT CALLBACK ChildProc(HWND, UINT, WPARAM, LPARAM);
 
char szListText[256];
bool comboModeAuto = false;
int mode;
 
HBRUSH rndBrush;
TCHAR ChildName[] = ("ChildFrame");
 
 
// Главное приложение программы
int WINAPI    WinMain(HINSTANCE   hInstance,
    HINSTANCE   hPrevInstance,
    LPSTR       lpCmdLine,
    int         nCmdShow)
{
    
    MSG     msg;
    szListText[0] = 128;
 
    ghInstance = hInstance;
    // Создание  диалогового окна
    hWnd = CreateDialogParam(hInstance,
        MAKEINTRESOURCE(PVIEW_DLG),
        NULL,
        (DLGPROC)PviewDlgProc,
        (LONG)0);
    
    WNDCLASS wch;
    // Определение класса окна
    wch.hInstance = hInstance;
    wch.lpszClassName = ChildName;
    wch.lpfnWndProc = ChildProc;
    wch.style = CS_HREDRAW | CS_VREDRAW;
    wch.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    wch.hCursor = LoadCursor(NULL, IDC_ARROW);
    wch.lpszMenuName = NULL;
    wch.cbClsExtra = 0;
    wch.cbWndExtra = 0;
    wch.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
    if (!RegisterClass(&wch)) return 0;
 
    hChild = CreateWindow(ChildName, NULL, WS_CHILD | WS_VISIBLE | WS_BORDER, 15, 15, 250, 175, hWnd, 0, ghInstance, 0);
 
 
 
    // Стандартный цикл обработки сообщений приложения
    while (GetMessage(&msg, NULL, 0, 0))
        if (!IsDialogMessage(hWnd, &msg))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    DestroyWindow(hWnd);
    return 0;
}
 
//Процедура обработки сообщений диалогового окна
BOOL CALLBACK   PviewDlgProc(HWND    hWnd,
    UINT    wMsg,
    WPARAM  wParam,
    LPARAM  lParam)
{
 
    int randomNumber = rand() % 100 + 40;
    int rndR = rand() % 255 + 1;
    int rndG = rand() % 255 + 1;
    int rndB = rand() % 255 + 1;
 
    static bool paint = false;
    static RECT r = {};
 
    switch (wMsg)
    {
        // Сообщение о инициализации диалогового окна
    case WM_INITDIALOG:
        hCombo1 = GetDlgItem(hWnd, IDC_COMBO1);
        
        ListIndex = SendMessage(hCombo1, CB_ADDSTRING, 0, (DWORD)TEXT("Автомат"));
        SendMessage(hCombo1, CB_SETITEMDATA, ListIndex, 0);
        ListIndex = SendMessage(hCombo1, CB_ADDSTRING, 1, (DWORD)TEXT("Ручной"));
        SendMessage(hCombo1, CB_SETITEMDATA, ListIndex, 1);
        // Перерисовываем список
        SendMessage(hCombo1, WM_SETREDRAW, TRUE, 0);
        // и выводим в его поле нулевой элемент списка
        SendMessage(hCombo1, CB_SETCURSEL, 0, 0);
 
        break;
        // Сообщение о закрытии диалогового окна
    case WM_CLOSE:
        PostQuitMessage(0);
        break;
 
        // Сообщение от элементов диалогового окна
    case WM_COMMAND:
        switch (LOWORD(wParam))
        {
        case IDC_COMBO1:
            mode = SendMessage(hCombo1, CB_GETCURSEL, 0, 0);
            if (mode == 1) {
                comboModeAuto = false;
                
            }
            if (mode == 0) {
                comboModeAuto = true;
                
            }
        
            break;
            
    
        
        case IDCIRCLE:
            if (comboModeAuto == false) {
                //MessageBox(hWnd, "РучнойКруг", "ЗАГОЛОВОК", MB_OK);
                r.left = 0; r.top = 0; r.right = randomNumber; r.bottom = randomNumber;
                paint = true;
                InvalidateRect(hChild, &r, 0);
 
 
            }
            if (comboModeAuto == true) {
                MessageBox(hWnd, "АвтоКруг", "ЗАГОЛОВОК", MB_OK);
 
            }
            break;
 
        case IDRECTANGLE:
            if (comboModeAuto == false) {
                MessageBox(hWnd, "РучнойПрям", "ЗАГОЛОВОК", MB_OK);
 
            }
            if (comboModeAuto == true) {
                MessageBox(hWnd, "АвтоПрям", "ЗАГОЛОВОК", MB_OK);
 
            }
            break;
 
        case IDLINE:
            if (comboModeAuto == false) {
                MessageBox(hWnd, "РучнойЛин", "ЗАГОЛОВОК", MB_OK);
 
            }
            if (comboModeAuto == true) {
                MessageBox(hWnd, "АвтоЛин", "ЗАГОЛОВОК", MB_OK);
 
            }
            break;
        
        case WM_PAINT:
        {
            PAINTSTRUCT ps;
            HDC hdc = BeginPaint(hWnd, &ps);
 
            if (paint)
            {
                // Cоздать кисть сплошного тона
                rndBrush = CreateSolidBrush(RGB(rndR, rndG, rndB));
                // Выбрать кисть в контекст устройства
                SelectObject(hdc, rndBrush);
 
                Ellipse(hdc,0, 0, 40, 40);
            }
 
            EndPaint(hWnd, &ps);
        }
        break;
 
        default:
            return FALSE;
        }
        break;
 
    
 
    default:
        return FALSE;
    }
 
    return TRUE;
}
 
 
LRESULT CALLBACK ChildProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{   
 
 
    int randomNumber = rand() % 100 + 40;
    int rndR = rand() % 255 + 1;
    int rndG = rand() % 255 + 1;
    int rndB = rand() % 255 + 1;
 
    static bool paint = false;
    switch (message)
    {
    case WM_DESTROY: PostQuitMessage(0);
        break; 
    case WM_PAINT:
    {
        PAINTSTRUCT ps;
        HDC hdc = BeginPaint(hChild, &ps);
 
        if (paint)
        {
            // Cоздать кисть сплошного тона
            rndBrush = CreateSolidBrush(RGB(rndR, rndG, rndB));
            // Выбрать кисть в контекст устройства
            SelectObject(hdc, rndBrush);
 
            Ellipse(hdc, 0, 0, 40, 40);
        }
 
        EndPaint(hChild, &ps);
    }
    break;
    default: return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
10.12.2019, 14:40
Ответы с готовыми решениями:

Как получить размеры клиентской области окна-родителя в функции дочернего окна?
задание такое: имеется дочернее окно,которое &quot;убегает&quot; от курсора мыши в пределах родительского окна. я создала главное окно,и дочернее,...

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

Закрытие дочернего окна
Привет всем !!! Есть программа на WinApi состоящая из родительского и дочернего окон (hWnd и hWnd1 ). Когда мы открываем это дочернее окно...

3
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
11.12.2019, 09:44
Цитата Сообщение от EleanorCoul Посмотреть сообщение
В чем может быть ошибка? Заранее спасибо.
Сейчас, я так понимаю, круг рисуется всегда?
0
0 / 0 / 0
Регистрация: 20.12.2017
Сообщений: 5
11.12.2019, 13:01  [ТС]
Нет, он вообще не рисуется.
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
11.12.2019, 13:36
Цитата Сообщение от EleanorCoul Посмотреть сообщение
Нет, он вообще не рисуется.
Потому что у тебя две разных переменных paint в разных функциях. Сделай
C++
1
2
3
4
5
char szListText[256];
bool comboModeAuto = false;
int mode;
 
static bool paint = false;
А из функций окна убери.

Добавлено через 40 секунд
И randomNumber тоже - она у тебя будет изментяся при любых сообщениях
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
11.12.2019, 13:36
Помогаю со студенческими работами здесь

Отображение дочернего окна
При нажатии лкм должно создаваться дочернее окно, но открывается только главное окно и не реагирует на клики. #include...

Меню у дочернего окна
Всем привет.Помогите пожалуйста,у меня есть два окна:родительское и дочернее. При создании родительского окна я также создаю для него меню....

Открытие дочернего окна
Здрасьте. Подскажите что я не так делаю. Хочу открыть окно по нажатию кнопки. Я открывал, просто создавая его по нажатию. А как его...

Масштабирование дочернего окна
Всем доброе время суток Вот создаю дочернее окно, а как сделать так, что бы при изменение рабочеuо окна так же менялось и дочернее. ...

Передвижение дочернего окна
Всем привет!!! Это моя первая работа по созданию программ с использованием Win32 API. Помогите мне, пожалуйста, с программой. Осталось...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru