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

Перемещение окна и получение координат центра окна

15.01.2017, 15:53. Показов 9679. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем доброго времени суток.

у меня есть два заданя

1.Написать программу, используя средства Win32 API. Программа

должна содержать функцию WinMain() и оконную процедуру. В функции

WinMain() выполнить регистрацию оконного класса, создание окна и запуск

цикла обработки сообщений. В оконной процедуре обработать сообщения от

окна. Главное окно приложения должно быть размером в одну двадцатую

площади экрана с заголовком «Форматирование диска» без кнопок

максимизации и минимизации, системного меню и возможности изменения

размеров. При перемещении курсора мыши над клиентской областью окно

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

пределах экрана.


2. Написать программу, используя средства Win32 API. Программа

должна содержать функцию WinMain() и оконную процедуру. В функции

WinMain() выполнить регистрацию оконного класса, создание окна и запуск

цикла обработки сообщений. В оконной процедуре обработать сообщения от

окна. Окно должно быть в четверть площади экрана. При щелчке на нем

левой кнопкой мыши окно перемещается так, чтобы его центр совпал с

координатами курсора мыши в момент щелчка.


В чем проблема : Проблема первого задания заключается в том,что я не могу понять как сделать так,чтобы окно не выходил за рамки экрана и как сделать так,чтобы оно двигалось рандомно ? Проблема второго задания заключается в то,что я не могу понять как сделать так,чтобы получить координаты центра окна и переместить его на клик курсора. Я только начала учить winAPI ,поэтому пока не совсем понимаю что к чему. Заранее благодарю

КОД:

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
#include "windows.h"
LONG WinProcMain(HWND,UINT,WPARAM,LPARAM);
BOOL RegWinClass(WNDPROC, LPCTSTR, UINT);
 
HINSTANCE hInst;
wchar_t ClassNameMain[] = L"Disc Format";
int height = 100, width = 200;
int Horres, Vertress;
 
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrervInstance, LPSTR lpCmdLine, int nCmdShow)
{
    HWND hWnd;
    MSG msg;
    hInst = hInstance;
 
    if (!RegWinClass((WNDPROC)WinProcMain, ClassNameMain, COLOR_WINDOW)) return false;
 
    HDC hDCScreen = GetDC(NULL);
    Horres = GetDeviceCaps(hDCScreen, HORZRES) / 4;
    Vertress = GetDeviceCaps(hDCScreen, VERTRES) / 5;
 
    hWnd = CreateWindow(ClassNameMain,L"Disc Format",WS_OVERLAPPEDWINDOW|WS_VISIBLE,CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT
        , CW_USEDEFAULT,NULL,NULL,hInstance,NULL);
    
    while (GetMessage(&msg, NULL, 0, 0))
        DispatchMessage(&msg);
    return int(msg.wParam);
}
 
BOOL RegWinClass(WNDPROC proc, LPCTSTR lpszClassName, UINT hrBackGround)
{
    WNDCLASS w;
    w.lpszClassName = lpszClassName;
    w.hInstance = hInst;
    w.lpfnWndProc = proc;
    w.hCursor = LoadCursor(NULL, IDC_ARROW);
    w.hIcon = LoadIcon(NULL, lpszClassName);
    w.lpszMenuName = NULL;
    w.hbrBackground = (HBRUSH)(hrBackGround + 1);
    w.style = CS_HREDRAW | CS_VREDRAW;
    w.cbClsExtra = 0;
    w.cbWndExtra = 0;
    return (RegisterClass(&w) != 0);
}
 
LONG WinProcMain(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    RECT rct;
    switch (msg)
    {
    case WM_MOUSEMOVE:
        POINT p;
        GetCursorPos(&p);
        MoveWindow(hWnd,p.x,p.y,width,height,TRUE);
        break;
    case WM_LBUTTONDOWN:
        POINT cp;
        if (GetWindowRect(hWnd, &rct) == GetCursorPos(&cp))
        {
            MoveWindow(hWnd, cp.x, cp.y, width, height, TRUE);
        }
        break;
    case WM_DESTROY:
            PostQuitMessage(0);
            break;
    default:
        return LONG(DefWindowProc(hWnd, msg, wParam, lParam));
    }
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
15.01.2017, 15:53
Ответы с готовыми решениями:

Получение координат дочернего окна
Подскажите пожалуйста как узнать координаты дочернего окна? пробовал применить GetClientRect(childwnd, &rect), но rect.left и...

перемещение окна
господа как програмно поставить windows окно в нужные мне координаты x,y. и ещё вопрос можно ли в windows окне как то убрать шапку окна?

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

1
116 / 106 / 51
Регистрация: 29.03.2016
Сообщений: 480
17.01.2017, 11: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
///////////////////////////////////////////////////////////
// Использование функции int GetSystemMetrics(int nIndex);
///////////////////////////////////////////////////////////
 
#include <windows.h>
#include <iostream>
 
using namespace std;
 
int main()
{
    setlocale(LC_ALL, "Russian");
    
    cout << "Размеры экрана: " << GetSystemMetrics(SM_CXSCREEN) << " x " << GetSystemMetrics(SM_CYSCREEN) << endl;
                // SM_CXSCREEN и SM_CYSCREEN - ширина и высота экрана в пикселях
    cout << "Размеры виртувльного экрана: " << GetSystemMetrics(SM_CXVIRTUALSCREEN) << " x " << GetSystemMetrics(SM_CYVIRTUALSCREEN) << endl;
                // SM_CXVIRTUALSCREEN и SM_CYVIRTUALSCREEN - ширина и высота виртуального экрана в пикселях
                // Виртуальный экран - это ограничительный прямоугольник всех мониторов дисплея
    cout << "Левый верхний угол виртуального экрана: (" << GetSystemMetrics(SM_XVIRTUALSCREEN) << "; " << GetSystemMetrics(SM_YVIRTUALSCREEN) << ")" << endl;
    return 0;
}
 
 
 
///////////////////////////////////////////////////////////
// Использование функции int GetDeviceCaps(HDC hdc, int nIndex);    // для одного экрана
// с использованием библиотеки GDI32.LIB
///////////////////////////////////////////////////////////
 
#include <windows.h>
#include <iostream>
 
using namespace std;
 
int main()
{
    setlocale(LC_ALL, "Russian");
    
    HDC screenDC;
    screenDC = GetDC(0);
    
    int screenX, screenY;
    screenX = GetDeviceCaps(screenDC, HORZSIZE);
    screenY = GetDeviceCaps(screenDC, VERTSIZE);
    
    cout << "Размеры экрана в миллиметрах: " << screenX << " x " << screenY << endl;
    
    screenX = GetDeviceCaps(screenDC, HORZRES);
    screenY = GetDeviceCaps(screenDC, VERTRES);
    
    cout << "Размеры экрана в пикселях: " << screenX << " x " << screenY << endl;
 
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
17.01.2017, 11:54
Помогаю со студенческими работами здесь

Ограничить перемещение окна
Можно ли ограничить перемещение окна, чтобы оно не двигалось дальше указанного диапазона

Перемещение окна за любую точку
Всем привет! Такой вопрос, как сделать окно которое можно перемещать за любую точку?

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

Перемещение активного окна, MoveWindow()
Нужно переместить активное окно (окно браузера, программы, что угодно) в левый верхний угол экрана. К сожалению не выходит, мои попытки: ...

Определение координат дочернего окна
Здравствуйте! Создал массив из 16 дочерних окно. Как узнать их координаты относительно родительского окна?Я так думаю... case...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
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 —. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru