Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.79/19: Рейтинг темы: голосов - 19, средняя оценка - 4.79
28 / 3 / 1
Регистрация: 12.05.2011
Сообщений: 60

В центре рабочей области окна отображено дочернее окно

12.11.2011, 12:02. Показов 3951. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем добрый.
Есть задание

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

Также есть соседняя похожая
тема с заданием

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

И его
решением
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
#include <windows.h>
#include <tchar.h>
 
LPCTSTR lpClassName = _T("MainClass");
LPCTSTR lpChildClassName = _T("ChildClass");
HINSTANCE g_hInstance = NULL;
HWND hwndMainForm = NULL;
HWND hwndChildForm = NULL;
LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
LRESULT CALLBACK ChildWindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
 
/*******************************************************************************
 * Description: Заполняем данные класса главного окна и регистрируем его в системе
 ******************************************************************************/
void
InitMainClass()
{
    WNDCLASS wc;
 
    // регистрируем класс главного окна
    ZeroMemory(&wc, sizeof(WNDCLASS));
    wc.hInstance = g_hInstance;
    wc.lpszClassName = lpClassName;
    wc.lpfnWndProc = WindowProc;
    wc.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1);
    wc.hIcon = LoadIcon((HINSTANCE)NULL, IDI_APPLICATION);
    wc.hCursor = LoadCursor((HINSTANCE)NULL, IDC_ARROW);
    RegisterClass(&wc);
 
    // регистрируем класс дочернего окна
    ZeroMemory(&wc, sizeof(WNDCLASS));
    wc.hInstance = g_hInstance;
    wc.lpszClassName = lpChildClassName;
    wc.lpfnWndProc = ChildWindowProc;
    wc.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1);
    wc.hIcon = LoadIcon((HINSTANCE)NULL, IDI_APPLICATION);
    wc.hCursor = LoadCursor((HINSTANCE)NULL, IDC_ARROW);
    RegisterClass(&wc);
}
 
/*******************************************************************************
 * Description: Создаем главное окно и дочернее окно
 ******************************************************************************/
int
CreateMainForm()
{
    DWORD dwExStyle = 0;
    DWORD dwStyle = WS_OVERLAPPEDWINDOW;
    // создаем главное окно
    hwndMainForm = CreateWindowEx(dwExStyle, lpClassName, _T("Main window"), dwStyle, CW_USEDEFAULT, CW_USEDEFAULT, 600, 600, (HWND)NULL, (HMENU)NULL, g_hInstance, (LPVOID)NULL);
    if(hwndMainForm == NULL) return 1001;
    ShowWindow(hwndMainForm, SW_NORMAL);
    UpdateWindow(hwndMainForm);
 
    // получаем координаты клиентской области главного окна
    // для вычисления размеров дочернего окна
    RECT rc;
    GetClientRect(hwndMainForm, &rc);
 
    // создаем дочернее окно размером в 1/16 главного окна
    dwExStyle = WS_EX_TOOLWINDOW;
    dwStyle = WS_CHILDWINDOW|WS_OVERLAPPED|WS_CAPTION;
    hwndChildForm = CreateWindowEx(dwExStyle, lpChildClassName, _T("do4ernee"), dwStyle, 0, 0, rc.right / 4, rc.bottom / 4, hwndMainForm, (HMENU)NULL, g_hInstance, (LPVOID)NULL);
    if(hwndChildForm == NULL) return 1002;
    ShowWindow(hwndChildForm, SW_NORMAL);
    UpdateWindow(hwndChildForm);
 
    return 0;
}
 
/*******************************************************************************
 * Description: Обработка сообщений главного окна
 ******************************************************************************/
LRESULT CALLBACK
WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch(uMsg)
    {
    case WM_CLOSE: // Закрытие основного окна
        SendMessage(hwndChildForm, WM_CLOSE, 0, 0); // уничтожаем дочернее окно
        DestroyWindow(hWnd); // уничтожаем главное
        UnregisterClass(lpClassName, g_hInstance); // разрегистрируем класс главного окна
        PostQuitMessage(0); // прерываем цикл выборки сообщений
        break;
    } // switch(uMsg)
 
    return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
 
/*******************************************************************************
 * Description: Обработка сообщений главного окна
 ******************************************************************************/
LRESULT CALLBACK
ChildWindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
static unsigned short index = 1;// сюда
        switch(uMsg)
        {
                case WM_LBUTTONDOWN:
                                   //отсюда переставить вверх
                         // переменная для определения в каком углу сейчас находится окно
                        RECT rcOwner, rcChild, rcTemp;
                        GetClientRect(hwndMainForm, &rcOwner); // получаем координаты клиентской области главного окна
                        GetWindowRect(hWnd, &rcChild); // получаем координаты дочернего окна
                        CopyRect(&rcTemp, &rcOwner); // копируем координаты главного окна в буфер
                        OffsetRect(&rcChild, -rcChild.left, -rcChild.top); // "перемещаем" для простоты дочернее окно в координаты 0,0
                        OffsetRect(&rcTemp, -rcTemp.left, -rcTemp.top); // "перемещаем" для простоты главное окно в координаты 0,0
                        switch(index)
                        {
                                case 1:
                                        // вычисляем новые координаты дочернего окна
                                        OffsetRect(&rcTemp, -rcChild.right, -rcChild.bottom);
                                        rcTemp.bottom = 0;
                                        index++; // "увеличиваем" угол
                                        break;
                                case 2:
                                        // вычисляем новые координаты дочернего окна
                                        OffsetRect(&rcTemp, -rcChild.right, -rcChild.bottom);
                                        index++;
                                        break;
                                case 3:
                                        // вычисляем новые координаты дочернего окна
                                        OffsetRect(&rcTemp, -rcChild.right, -rcChild.bottom);
                                        rcTemp.right = 0;
                                        index++;
                                        break;
                                case 4:
                                        // вычисляем новые координаты дочернего окна
                                        OffsetRect(&rcTemp, -rcChild.right, -rcChild.bottom);
                                        rcTemp.right = 0;
                                        rcTemp.bottom = 0;
                                        index = 1; // следующий угол - левый верхний
                                        break;
                        } // switch(index)
 
                        // действительно перемещаем дочернее окно без изменения его размера
                        SetWindowPos(hwndChildForm, HWND_TOP, rcOwner.left + rcTemp.right, rcOwner.top + rcTemp.bottom, 0, 0, SWP_NOSIZE);
                        break;
                case WM_CLOSE: // Закрытие дочернего окна
                        DestroyWindow(hwndChildForm);
                        UnregisterClass(lpChildClassName, g_hInstance);
                        break;
        } // switch(uMsg)
 
        return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
 
/*******************************************************************************
 * Description: Основная функция приложения (стартовая точка)
 ******************************************************************************/
int WINAPI
WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    // копируем указатель приложения в глобальную переменную
    g_hInstance = hInstance;
 
    // Регистрируем классы, создаем окна
    InitMainClass();
    CreateMainForm();
 
    // Запускаем цикл обработки сообщений
    MSG Msg;
    while(GetMessage(&Msg, (HWND)NULL, 0, 0))
    {
        TranslateMessage(&Msg);
        DispatchMessage(&Msg);
    } // while(GetMessage(&Msg, (HWND)NULL, 0, 0))
 
    return Msg.wParam;
}


Помогите переделать воторое под первое.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
12.11.2011, 12:02
Ответы с готовыми решениями:

Создать дочернее окно из программы (окно внутри окна)
Люди, помогите плиз!!!!!!!!!!!!! Подскажите, как в Lazaruse создать дочернее окно из программы (окно в нути окна ), в Делфи нет...

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

Окно: создать 4 окна, в центре каждого из окон вывести номер окна в порядке создания(1-4)
Не могу справиться с программой, Нужно создать 4 окна. В центре каждого из окон вывести номер окна в порядке создания(1-4). При нажатии...

12
 Аватар для programina
2062 / 619 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
12.11.2011, 14:54
Посмотри вот здесь:
помогите составить программу
0
Исследователь
 Аватар для GrayWolf
318 / 317 / 24
Регистрация: 06.04.2011
Сообщений: 872
12.11.2011, 15:44
Корректировка, если я правильно понял задание, небольшая. Требуется при помощи GetCursorPos получить координаты курсора, GetClientRect вернет нам координаты клиентской области окна. Математически вычисляем к какому углу ближе всего курсор и перемещаем дочернее окно в тот угол. И вся корректировка...
0
28 / 3 / 1
Регистрация: 12.05.2011
Сообщений: 60
12.11.2011, 19:52  [ТС]
Цитата Сообщение от programina Посмотреть сообщение
Посмотри вот здесь:
помогите составить программу
Я оттуда и брал исходный код.

Добавлено через 47 секунд
Что такое полосы просмотра?
0
Исследователь
 Аватар для GrayWolf
318 / 317 / 24
Регистрация: 06.04.2011
Сообщений: 872
12.11.2011, 20:11
Полосы прокрутки (scroll bars) внизу и в правой части окна при помощи можно "прокрутить" его содержимое.
1
28 / 3 / 1
Регистрация: 12.05.2011
Сообщений: 60
14.11.2011, 06:20  [ТС]
Цитата Сообщение от GrayWolf Посмотреть сообщение
Корректировка, если я правильно понял задание, небольшая. Требуется при помощи GetCursorPos получить координаты курсора, GetClientRect вернет нам координаты клиентской области окна. Математически вычисляем к какому углу ближе всего курсор и перемещаем дочернее окно в тот угол. И вся корректировка...
Помоги мне с решением, о великий мастер WinApi
0
28 / 3 / 1
Регистрация: 12.05.2011
Сообщений: 60
23.11.2011, 09:08  [ТС]
Срочно нужна помошь АП
0
28 / 3 / 1
Регистрация: 12.05.2011
Сообщений: 60
26.11.2011, 01:51  [ТС]
Актуально
0
Исследователь
 Аватар для GrayWolf
318 / 317 / 24
Регистрация: 06.04.2011
Сообщений: 872
26.11.2011, 19:23
Неужели до сих пор не решено??? Хм... Завтра код набросаю
1
28 / 3 / 1
Регистрация: 12.05.2011
Сообщений: 60
26.11.2011, 20:17  [ТС]
Цитата Сообщение от GrayWolf Посмотреть сообщение
Неужели до сих пор не решено??? Хм... Завтра код набросаю
К сожелению небыло возможности посещать оссо.

Буду признателен вам.
0
28 / 3 / 1
Регистрация: 12.05.2011
Сообщений: 60
04.12.2011, 02:50  [ТС]
Актуально
0
28 / 3 / 1
Регистрация: 12.05.2011
Сообщений: 60
19.12.2011, 11:36  [ТС]
актуально
0
 Аватар для programina
2062 / 619 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
19.12.2011, 16:59
Не актуально

PS: в разделе WinAPI можно найти и то, и другое, если не ошибаюсь, сама где-то здесь делала окно со скролом..
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
19.12.2011, 16:59
Помогаю со студенческими работами здесь

Создать дочернее окно дочернего окна
Проблема такая. Нужно создать дочернее окно дочернего окна. Вот тут создается одно дочернее окно от главного, а по логике еще должно...

Размеры рабочей области окна
здравствуйте, друзья! w.setSize(); задаёт размеры окна (с бордюром, меню и другими элементами. например задав w.setSize(400, 400)...

Центрировать окно по середине рабочей области
Как центрировать окно по середине рабочей области экрана?

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

Получение размера рабочей области окна
Подскажите, как получить размер рабочей области окна? К примеру создавая окно 750 по Y, в Windows 7 рабочая область 711 пикселей. ...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
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 Использованы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru