Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.81/57: Рейтинг темы: голосов - 57, средняя оценка - 4.81
1 / 1 / 0
Регистрация: 18.03.2012
Сообщений: 110

Нахождение центра прямоугольника

28.10.2012, 20:38. Показов 11377. Ответов 40
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый вечер! Стокнулся с проблемой, на двойном клике мыши в центре последнего нарисованного прямоугольника надо вывести его площдь (в пикселях в квадрате). Так вот, есть код, который рисует прямоугольники и всё такое, только как найти центр прямоугольника?
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
LONG WINAPI WndProc(HWND hwnd, UINT Message, WPARAM wparam, LPARAM lparam)
{
 
    int static BGNx, BGNy, ENDx, ENDy;
    HDC hdc;
    //PAINTSTRUCT ps;
  switch(Message)
  {
        case WM_RBUTTONDOWN:
        hdc = GetDC(hwnd);
        BGNx = LOWORD(lparam);//Координаты левого верхнего угла
        BGNy = HIWORD(lparam);
        ReleaseDC(hwnd, hdc);
        break;
    case WM_RBUTTONUP:
        hdc = GetDC(hwnd);
        ENDx = LOWORD(lparam);//Координаты правого нижнего угла
        ENDy = HIWORD(lparam);
        HBRUSH hBrush; //Создаём кисть
        hBrush = CreateSolidBrush(RGB(0,255,0));
        SelectObject(hdc, hBrush);
        Rectangle(hdc, BGNx, BGNy, ENDx, ENDy);
        DeleteObject(hBrush);
        ReleaseDC(hwnd, hdc);
        break;
Даже специально написал код для вывода координат мыши, но на двойном щелчке не работает, только на одинарном
C++
1
2
3
4
5
6
7
8
case WM_LBUTTONDOWN:
        hdc = GetDC (hwnd);
        char buff[60];
        int y,x;
            y= HIWORD(lparam);
            x= LOWORD(lparam);
              TextOut  (hdc, x,y, buff,
               wsprintf (buff, "x = %d  y = %d", x,y)) ;//Выводим координаты мыши
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
28.10.2012, 20:38
Ответы с готовыми решениями:

Вращение прямоугольника вокруг центра.
Есть программа, которая вращает прмоугольник вокруг центра, но она для АВС. Переделываю ее под Турбо а оно пишет "invalid point...

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

Найти координаты всех вершин прямоугольника и его центра
Дано (x0, y0) - координаты нижнего левого угла прямоугольника, стороны которого параллельны осям координат, w и h - его ширина и высота....

40
1 / 1 / 0
Регистрация: 18.03.2012
Сообщений: 110
29.10.2012, 21:32  [ТС]
Студворк — интернет-сервис помощи студентам
Структурой RECT можно задавать цвет?
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
29.10.2012, 21:47
Разумеется нет. Она служит только для описания геометрии прямоугольника.
C
1
2
3
4
5
6
typedef struct _RECT {
  LONG left;
  LONG top;
  LONG right;
  LONG bottom;
} RECT, *PRECT;
0
1 / 1 / 0
Регистрация: 18.03.2012
Сообщений: 110
29.10.2012, 22:14  [ТС]
Понятно. Вообщем, добился, чтобы прямоугольники повлялись так, как мне надо, но у меня вопрос, почему при такой связке SelectObject(hBrush), выбирается последний цвет?
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
case WM_PAINT:
      hdc = BeginPaint(hwnd, &ps);
        HBRUSH hBrush;
        hBrush = CreateSolidBrush(RGB(0,255,0));
        HBRUSH hBrush1;
        hBrush1 = CreateSolidBrush(RGB(0,0,255));
        SelectObject(hdc, hBrush);
        Rectangle(hdc, BGNx, BGNy, ENDx, ENDy);
        SelectObject(hdc, hBrush1);
        Rectangle(hdc, BGNx, BGNy, ENDx, ENDy);
        DeleteObject(hBrush);
        DeleteObject(hBrush1);
      EndPaint(hwnd, &ps);    
      break;
       case WM_RBUTTONDOWN:
        hdc = GetDC(hwnd);
        BGNx = LOWORD(lparam);
        BGNy = HIWORD(lparam);
        ReleaseDC(hwnd, hdc);
        break;
 
 
   case WM_RBUTTONUP:
       hdc = GetDC(hwnd);
        ENDx = LOWORD(lparam);
        ENDy = HIWORD(lparam);
        InvalidateRect(hwnd, NULL, true);
        UpdateWindow(hwnd);
        ReleaseDC(hwnd, hdc);
        break;
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
29.10.2012, 22:21
Цитата Сообщение от Asdf Посмотреть сообщение
почему при такой связке SelectObject(hBrush), выбирается последний цвет?
Не понял вопроса.
SelectObject(hBrush) устанавливает текущую кисть для контекста. У одного контекста может быть выбрана только одна текущая кисть.
0
1 / 1 / 0
Регистрация: 18.03.2012
Сообщений: 110
29.10.2012, 22:24  [ТС]
Получается, для одного и того же констекста выбирается последняя заданная кисть?
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
29.10.2012, 22:27
Да. А если сказать точнее, то функции использующие кисти для рисования, использую последнюю заданную кисть.
0
1 / 1 / 0
Регистрация: 18.03.2012
Сообщений: 110
29.10.2012, 22:37  [ТС]
Понятно... Вот блин мне головоломка...

Добавлено через 6 минут
А что если, создать другой прямоугольник, только с другими переменными? Так может выйти то что я хочу?
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
29.10.2012, 22:48
Я уже говорил об этом.
Цитата Сообщение от lazybiz Посмотреть сообщение
Создай структуру/класс в котором опиши прямоугольник и его цвет.
0
1 / 1 / 0
Регистрация: 18.03.2012
Сообщений: 110
30.10.2012, 18:15  [ТС]
Что-то с цветом я никак не могу подружиться... Можеш подсказать, как правильно создать структуру для описания?
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
30.10.2012, 20:05
C
1
2
3
4
typedef struct {
    RECT rect;
    COLORREF color;
} my_rect;
0
1 / 1 / 0
Регистрация: 18.03.2012
Сообщений: 110
30.10.2012, 21:35  [ТС]
Так, правильно ли я создал структуру? Как мне теперь применить?
C++
1
2
3
4
5
6
7
8
struct Rectangle
{
    int BGNx;
    int BGNy;
    int ENDx;
    int ENDy;
    COLORREF c;
}
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
30.10.2012, 21:45
Правильно. Кстати лучше занести в нее HBRUSH. И для тебя будет удобнее её сразу определить как тип, и взять другое название, т.к. в Windows есть функция Rectangle.
C
1
2
3
4
5
6
7
typedef struct {
    int BGNx;
    int BGNy;
    int ENDx;
    int ENDy;
    HBRUSH c;
} Rect;
Используй так:
C
1
2
3
4
5
Rect my_rect;  // определение
...
my_rect.c = CreateSolidBrush( RGB( 1, 2, 3 ) ); // задаешь цвет
...
SelectObject( hdc, my_rect.c ); // устанавливаешь цвет
0
1 / 1 / 0
Регистрация: 18.03.2012
Сообщений: 110
30.10.2012, 21:59  [ТС]
Есть, ток как теперь выбрать другой цвет? Т.е. помимо допустим жёлтого, ещё ещё прямоугольник и в красный рисовался Похоже этот вопрос ля меня ещё актуален...

Добавлено через 6 минут
Я так понимаю, в структуре нужно ещё 1 переменную сделать типа c1, и уже в функции сделать проверку?
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
30.10.2012, 22:32
Если прямоугольник с теми же координатами, и рисовать ты собираешься один и тот же двумя цветами, тогда да, можно добавь еще одну кисть в структуру.
0
1 / 1 / 0
Регистрация: 18.03.2012
Сообщений: 110
30.10.2012, 22:52  [ТС]
Так, создал кисть, определил как my_rect.c1() Теперь, чтобы и она выбиралась, какие изменения надо в функцию внести?

Добавлено через 1 минуту
Я долкопаюсь до сути, чего бы мне это не стоило
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
30.10.2012, 22:55
Давай уже голову включай, я за тебя всю твою жизнь думать не буду.
Ты знаешь как сделать чтобы она выбиралась, ты и сам писал об этом, и я тебе несколько раз говорил.
0
1 / 1 / 0
Регистрация: 18.03.2012
Сообщений: 110
30.10.2012, 23:13  [ТС]
Создал цикл, тока когда я его применяю в WM_PAINT ничего не происходит или же надо ставить цикл на нажатие кнопки?
C++
1
2
3
4
5
6
7
8
9
10
      if (a == 0)
      {
          SelectObject(hdc, my_rect.c);
          return 1;
      }
      if (a == 1)
      {
          SelectObject(hdc, my_rect.c1);
          return 0;
      }
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
30.10.2012, 23:36
Из этого куска ничего не понятно.
0
1 / 1 / 0
Регистрация: 18.03.2012
Сообщений: 110
30.10.2012, 23:48  [ТС]
Вот так сделал ,но чего то не хватает.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
  case WM_PAINT:
      hdc = BeginPaint(hwnd, &ps);
      my_rect.c = CreateSolidBrush(RGB(255,255,0));
      my_rect.c1 = CreateSolidBrush(RGB(255,0,255));
        if ( a == 0)
      {
          SelectObject(hdc, my_rect.c);
          return 1;
      }
      if (a == 1)
      {
          SelectObject(hdc, my_rect.c1);
          return 0;
      }
 
      Rectangle(hdc, BGNx, BGNy, ENDx, ENDy);
Добавлено через 3 минуты
Может надо добавить (wparam & MK_RBUTTON)? Т.е. на нажатие, только у меня рисуется то на отпускание кнопки , RBUTTONUP.
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
31.10.2012, 00:14
У тебя вообще рисоваться не должно, зачем return-ы поставил?
Не стоит создавать кисть (CreateSolidBrush) каждый раз при рисовании. Создай их один раз, например в WM_CREATE.
Когда пишешь сообщение используй тэг CUT, и показывай больше кода.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
31.10.2012, 00:14

Определить координаты центра, радиус и площадь круга, описанное вдоль прямоугольника
Помогите написать программы, очень срочно!Пожалуйста, очень сильно прошу! На С# 1) Даны (x0, y0, z0) и (x1, y1, z1) - координаты двух...

Вращение прямоугольника заданных размеров в плоскости экрана вокруг своего центра
Изобразить вращения прямоугольника заданных размеров в плоскости экрана вокруг свае во центра Помогите а то я Написал а она не...

Определите, принадлежит ли окружность с заданным радиусом и координатами центра области прямоугольника
Прямоугольник задан координатами своих вершин. Определите, принадлежит ли окружность с заданным радиусом и координатами центра области...

Нахождение центра формы
Привет всем! У меня возникла проблема с нахождением центра формы, дело в том что когда у формы в свойстве FormBorderStyle = None то все...

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


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Из невошедшего на форум (диалог с ИИ-гугла)
zorxor 29.07.2026
А вот, что интересно, сказал мне ИИ-гугла: Этот текст — эмоциональный пост пользователя под ником zorxor на интернет-форуме (вероятно, посвященном мистике, непознанному или альтернативной науке). . . .
Был праздник вчера, а я и не знал.
kumehtar 28.07.2026
27. 07. 2026г. Intel Core 2 Duo исполнилось 20 лет Новости компьютерного мира и их обсуждение (4) Салют, шампанское, овации! :drink:
Нейтральные знания, чистый код - бла-бла-бла-бла, на самом деле кликбейт и самореклама, плагиат, и вот почему
Hrethgir 27.07.2026
То-есть отклонение такой публикации говорит само за себя, и пусть только возьмут на вооружение после отклонения публикации - это будет чистейшим актом плагиата. Отклонял Хабр. Дословно, отклонённая. . .
тв 16 бой ии
anaschu 27.07.2026
Великий Перелом ИИ: Как уравнения ОДУ Radau дожали цензурные фильтры Алисы Фиксируем в мемофонде Теории Всего беспрецедентный факт в истории ИИ-зондирования. В затяжном многораундовом. . .
мв 15. непроверенное, возможно, глюк
anaschu 27.07.2026
НАУЧНО-АНАЛИТИЧЕСКИЙ ОТЧЕТ. РАЗДЕЛ 1. 1: «НАУКА» (РАСШИРЕННАЯ СТЕХИОМЕТРИЧЕСКАЯ И ГЕНЕТИЧЕСКАЯ ВЕРСИЯ)Тема: Теоретическое обоснование инвариантности 19-мерного тензорного ядра непрерывных ОДУ и. . .
Очистка реквизитов и табличных частей документа при копировании (вариант 2)
Maks 26.07.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРаботу", разработанного в КА2. Задача: Заменить алгоритм запрета копирования документов для сотрудников с ролью "Стажер",. . .
Доктрина интенционального знания - Доктрина для портала "Срез".
Hrethgir 25.07.2026
Может найдётся кто захочет оценить доктрину. . . Написания правил участия для меня роскошь, требующая лимита времени, поэтому все сообщения не прошедшие модерацию будут видны только участникам портала,. . .
сукцессия 44. Решил подать на припринт в межународные сервисы препринтов. Но нужно одобрение от ученых
anaschu 25.07.2026
Английский вариант. Пока кто то не одобрит мою личность, мне не получиться это опубликовать на препринте. Но заявку на публикацию статьи я сегодня подам.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru