0 / 0 / 0
Регистрация: 02.05.2013
Сообщений: 16
1

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

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

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

Добавлено через 19 часов 9 минут
Главный вопрос: Как организовать проверку расположения окон?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.05.2013, 17:22
Ответы с готовыми решениями:

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

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

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

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

8
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32628 / 21095 / 8139
Регистрация: 22.10.2011
Сообщений: 36,358
Записей в блоге: 8
03.05.2013, 17:35 2
GetWindowRect-ом получай координаты окна и проверяй, где оно находится.
1
0 / 0 / 0
Регистрация: 02.05.2013
Сообщений: 16
03.05.2013, 18:19  [ТС] 3
Вот в этом и суть проблемы, как делать проверку?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32628 / 21095 / 8139
Регистрация: 22.10.2011
Сообщений: 36,358
Записей в блоге: 8
03.05.2013, 20:36 4
Очень просто: 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  [ТС] 5
только возник вопрос что значит
C++
1
return (!r.top) ? 0 : 3;
если можно объяснить подробно
0
Модератор
Эксперт по электронике
8844 / 6624 / 902
Регистрация: 14.02.2011
Сообщений: 23,315
03.05.2013, 22:27 6
Цитата Сообщение от 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  [ТС] 7
Цитата Сообщение от UI Посмотреть сообщение
start = (hwnd == main_wnd) ? pos_main : pos_temp;
а что это. все пытаюсь врубиться и не как.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32628 / 21095 / 8139
Регистрация: 22.10.2011
Сообщений: 36,358
Записей в блоге: 8
04.05.2013, 21:31 8
Смотри:
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 9
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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.03.2014, 16:48
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru