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

Перемещение окон по часовой стрелке

03.05.2013, 17:22. Показов 3056. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Начали изучать WIN32 API преподаватель дал ргр:
Окно приложения занимает четверть экрана и расположено в левом верхнем углу. Создать временное окно такого же размера в правом нижнем углу экрана. Любое окно после нажатия левой клавиши мыши перемещается в свободный по часовой стрелки угол.
Возможно у кого то такое было, или хотя бы словами подскажите пошагово.

Добавлено через 19 часов 9 минут
Главный вопрос: Как организовать проверку расположения окон?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
03.05.2013, 17:22
Ответы с готовыми решениями:

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

Перемещение элементов массива по часовой стрелке
Всем привет, написал программу, которая должная делить массив, чётной размерности, на 4 части и перемещать по часовой стрелке на 1 шаг. Но...

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

8
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33395 / 21505 / 8236
Регистрация: 22.10.2011
Сообщений: 36,901
Записей в блоге: 12
03.05.2013, 17:35
GetWindowRect-ом получай координаты окна и проверяй, где оно находится.
1
0 / 0 / 0
Регистрация: 02.05.2013
Сообщений: 16
03.05.2013, 18:19  [ТС]
Вот в этом и суть проблемы, как делать проверку?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33395 / 21505 / 8236
Регистрация: 22.10.2011
Сообщений: 36,901
Записей в блоге: 12
03.05.2013, 20:36
Очень просто: rect.left = 0 - значит, левый, либо верхний, либо нижний угол. Какой именно - определяется по rect.top... Соответственно, если первое условие не выполняется - то угол правый, по содержимому rect.top точно так же определяешь, верхний или нижний. Всего 2 проверки, и ты точно знаешь, в каком углу находится окно. А дальше найти свободный по часовой стрелке угол - уже дело техники.

Добавлено через 1 час 54 минуты
Как вариант:
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
#include <windows.h>
 
/*  Declare Windows procedure  */
LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);
 
int Width = GetSystemMetrics(SM_CXSCREEN);
int Height = GetSystemMetrics(SM_CYSCREEN);
POINT coords[4] = {
    {0, 0},
    {Width / 2, 0},
    {Width / 2, Height / 2},
    {0, Height / 2}
};
 
 
HWND main_wnd, temp_wnd;
 
/*  Make the class name into a global variable  */
char szClassName[ ] = "CodeBlocksWindowsApp";
 
int WINAPI WinMain (HINSTANCE hThisInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR lpszArgument,
                     int nCmdShow)
{
 
    MSG messages;
    WNDCLASSEX wincl;
 
    /* The Window structure */
    wincl.hInstance = hThisInstance;
    wincl.lpszClassName = szClassName;
    wincl.lpfnWndProc = WindowProcedure;
    wincl.style = CS_DBLCLKS;
    wincl.cbSize = sizeof (WNDCLASSEX);
 
    /* Use default icon and mouse-pointer */
    wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
    wincl.lpszMenuName = NULL;
    wincl.cbClsExtra = 0;
    wincl.cbWndExtra = 0;
    wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;
 
    /* Register the window class, and if it fails quit the program */
    if (!RegisterClassEx (&wincl))
        return 0;
 
    main_wnd = CreateWindowEx (0, szClassName, "Main Window", WS_OVERLAPPEDWINDOW,
                               coords[0].x, coords[0].y, Width / 2, Height / 2,
                               HWND_DESKTOP, NULL, hThisInstance, NULL);
 
    /* The class is registered, let's create the program*/
    temp_wnd = CreateWindowEx (0, szClassName, "Additional Window", WS_OVERLAPPEDWINDOW,
                               coords[2].x, coords[2].y, Width / 2, Height / 2,
                               HWND_DESKTOP, NULL, hThisInstance, NULL);
 
    ShowWindow (main_wnd, nCmdShow);
    ShowWindow (temp_wnd, nCmdShow);
 
    while (GetMessage (&messages, NULL, 0, 0))
    {
        TranslateMessage(&messages);
        DispatchMessage(&messages);
    }
    return messages.wParam;
}
 
 
int GetQuarter(HWND hwnd)
{
    RECT r;
    ::GetWindowRect(hwnd, &r);
    if(!r.left)
        return (!r.top) ? 0 : 3;
    else
        return (!r.top) ? 1 : 2;
}
 
/*  This function is called by the Windows function DispatchMessage()  */
LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
        case WM_LBUTTONDOWN:
            {
                bool pos[4] = {false, false, false, false};
                int pos_main = GetQuarter(main_wnd);
                int pos_temp = GetQuarter(temp_wnd);
                pos[pos_main] = true;
                pos[pos_temp] = true;
 
                int start = (hwnd == main_wnd) ? pos_main : pos_temp;
                for(; pos[start]; ) start = (start + 1) % 4;
                SetWindowPos(hwnd, 0, coords[start].x, coords[start].y, 0, 0, SWP_NOSIZE | SWP_NOOWNERZORDER);
            }
            break;
        case WM_DESTROY:
            PostQuitMessage (0);
            break;
        default:
            return DefWindowProc (hwnd, message, wParam, lParam);
    }
 
    return 0;
}
1
0 / 0 / 0
Регистрация: 02.05.2013
Сообщений: 16
03.05.2013, 22:23  [ТС]
только возник вопрос что значит
C++
1
return (!r.top) ? 0 : 3;
если можно объяснить подробно
0
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,870
03.05.2013, 22:27
Цитата Сообщение от vadik_006 Посмотреть сообщение
return (!r.top) ? 0 : 3;
Цитата Сообщение от vadik_006 Посмотреть сообщение
если можно объяснить подробно
это тоже самое что
C++
1
2
3
4
if(r.top==0)
return 0;
else
return 3;
r.top это верх прямоугольника
1
0 / 0 / 0
Регистрация: 02.05.2013
Сообщений: 16
04.05.2013, 21:06  [ТС]
Цитата Сообщение от UI Посмотреть сообщение
start = (hwnd == main_wnd) ? pos_main : pos_temp;
а что это. все пытаюсь врубиться и не как.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33395 / 21505 / 8236
Регистрация: 22.10.2011
Сообщений: 36,901
Записей в блоге: 12
04.05.2013, 21:31
Смотри:
C++
1
int start = (hwnd == main_wnd) ? pos_main : pos_temp;
аналогично:

C++
1
2
3
int start;
if(hwnd == main_wnd) start = pos_main;
else start = pos_temp;
Теперь - как это работает. Поскольку оконная функция у обоих окон (и у основного и у временного) одинаковая, то и при клике на одно и при клике на другое выполняются одни и те же действия. А нам надо точно знать, на какое окно сейчас кликнули. Хэндл этого окна передается в оконную функцию первым параметром. Вот мы и сравниваем этот параметр с глобальной переменной, хранящей хэндл основного окна, чтобы точно выяснить, с чем нам придется иметь дело. И устанавливаем значение start соответственно.

Что такое массив pos, и как ищется следующий свободный угол по часовой стрелке - разобрался?
0
0 / 0 / 0
Регистрация: 08.04.2013
Сообщений: 31
01.03.2014, 16:48
C++
1
2
3
4
5
6
POINT coords[4] = {
    {0, 0},
    {Width / 2, 0},
    {Width / 2, Height / 2},
    {0, Height / 2}
};
Здравствуйте, подскажите пожалуйста эти координаты нужны для перемещения окна?

Добавлено через 16 минут
C++
1
2
3
4
5
6
7
8
9
10
11
  case WM_LBUTTONDOWN:
            {
                bool pos[4] = {false, false, false, false};
                int pos_main = GetQuarter(main_wnd);
               int pos_temp = GetQuarter(temp_wnd);
                pos[pos_main] = true;
            pos[pos_temp] = true;
 
                int start = (hwnd == main_wnd) ? pos_main : pos_temp;
                for(; pos[start]; ) start = (start + 1) % 4;
                SetWindowPos(hwnd, 0, coords[start].x, coords[start].y, 0, 0, SWP_NOSIZE | SWP_NOOWNERZORDER);
и не могли бы вы мне объяснить вот эту часть, а то я не совсем понимаю что здесь происходит
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
01.03.2014, 16:48
Помогаю со студенческими работами здесь

Угол часовой стрелке
Нужно определить под каким углом находится в данный момент часовая стрелка. На вход программе дается кол-во часов, минут и секунд,...

Движение фигуры по часовой стрелке
Ребят что сделать чтобы фигура делала движение по кругу по часовой стрелке?? Если можно с примером каким нибудь квадрат даже?

Повернуть массив на 90° по часовой стрелке
С помощью генератора случайных чисел заполните двумерный массив NxN числами в интервале 10-99, и выведете его на экран. Поверните массив на...

Поворот на 90 градусов по часовой стрелке
Всем привет!!! Народ, очень нужна ваша помощь, срочно!!! Очень срочно!!! Ситуация такая: есть код формы, необходимо повернуть Разъеденитель...

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


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru