Реклама i
Стань нашим партнером - зарабатывай с нами!
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Почему функция CreatePen (Lib "gdi32.dll") создает сетку разных цветов?

Почему функция CreatePen (Lib "gdi32.dll") создает сетку разных цветов?

Ответ
Поиск в этой теме
Непрочитано 07.03.2023, 16:20 #1
Почему функция CreatePen (Lib "gdi32.dll") создает сетку разных цветов?
МишаИнженер
 
Регистрация: 14.12.2008
Сообщений: 1,079

Почему функция CreatePen из библиотеки "gdi32.dll" создает сетку разных цветов?
Для запуска программы нажмите кнопку "Чертить нормально"

Миниатюры
Нажмите на изображение для увеличения
Название: Сетка 1.png
Просмотров: 43
Размер:	44.2 Кб
ID:	253957  Нажмите на изображение для увеличения
Название: Сетка 2.png
Просмотров: 42
Размер:	41.3 Кб
ID:	253958  Нажмите на изображение для увеличения
Название: Сетка 3.png
Просмотров: 40
Размер:	76.8 Кб
ID:	253959  

Вложения
Тип файла: zip Матрицы_GDI.zip (91.9 Кб, 20 просмотров)

Просмотров: 1476
 
Непрочитано 07.03.2023, 17:02
1 | #2
Нубий-IV

Инженер-философ
 
Регистрация: 24.04.2019
Хабаровск
Сообщений: 1,874


Потому что в функцию CreatePen надо передавать целочисленный цвет, а не дескриптор кисти.

Неправильно: hPen = CreatePen(PS_SOLID, 1, CreateSolidBrush(IЦветДопЛин))
Правильно: hPen = CreatePen(PS_SOLID, 1, IЦветДопЛин)

Когда создается новая кисть, она получает новый незанятый дескриптор. В результате у двух кистей одного цвета дескрипторы разные. При передаче в CreatePen они преобразуются в разные целые числа, что и дает разные цвета.

В WinApi специально создали пачку разных типов данных, чтобы компилятор ловил такие глюки. Не зря там все дескрипторы hBrush, hFont и т.п. - указатели. Есть даже режим компиляции, в котором дескрипторы разных видов объектов становятся разными типами, чтобы еще и кисти со шрифтами не путать. В бейсике тоже стоит как минимум объявлять дескрипторы как LongPtr, а не Long, чтобы потом не терять время на подобные ошибки.

Заодно тут утечка памяти, потому что созданные кисти и перья не освобождаются. И освобождать память надо всегда, даже при досрочных выходах из функций. Вот как развлекаются сишники в такой ситуации: О вреде GOTO-фобии (с примерами на C).
Нубий-IV вне форума  
 
Автор темы   Непрочитано 08.03.2023, 13:17
#3
МишаИнженер


 
Регистрация: 14.12.2008
Сообщений: 1,079


Спасибо Нубий-IV! Действительно в этом была проблема. Теперь все работает.
Код просто нашел подходящий, думал там все правильно, а оказалось с особенностями.
Теперь все нормально.
Там в коде функции активации формы есть отключенные строки кода:
Код:
[Выделить все]
'Настроим систему координат
'   retVal = SetMapMode(hdc, MM_ISOTROPIC)
'   retVal = SetWindowExtEx(hdc, CLng(mdWidth), CLng(mdHeight), OldSWd)
'   retVal = SetViewportExtEx(hdc, mdWidth, mdHeight, OldSVp)
'   retVal = SetViewportOrgEx(hdc, 0, mdHeight, OldP)
В этом коде задача настроить оси ситемы координат "как обычно": ось X слева направо, ось Y снизу вверх. Точка начала координат в левом нижнем углу. Но если включить эти строки, то форма вообще ничего не чертит.
Почему так происходит?
Миниатюры
Нажмите на изображение для увеличения
Название: 2023-03-08_17-07-58.png
Просмотров: 16
Размер:	45.3 Кб
ID:	253966  
МишаИнженер вне форума  
 
Непрочитано 08.03.2023, 14:34
1 | #4
Нубий-IV

Инженер-философ
 
Регистрация: 24.04.2019
Хабаровск
Сообщений: 1,874


Цитата:
Сообщение от МишаИнженер Посмотреть сообщение
Почему так происхо
Опять ошибки в объявлениях. Местами пропущены ByVal, местами вместо Long стоит Double. Это уже 1001 случай ошибок в объявлениях. Видимо, это будет универсальный ответ на все вопросы дальше .
Нубий-IV вне форума  
 
Автор темы   Непрочитано 08.03.2023, 17:24
#5
МишаИнженер


 
Регистрация: 14.12.2008
Сообщений: 1,079


Спасибо! Попробую исправить!
Методику настройки системы координат взял с этого сайта: https://frolov-lib.ru/books/bsp/v14/ch2_2.htm
Миниатюры
Нажмите на изображение для увеличения
Название: 2023-03-08_21-27-09.png
Просмотров: 22
Размер:	41.3 Кб
ID:	253974  

Последний раз редактировалось МишаИнженер, 08.03.2023 в 17:29.
МишаИнженер вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Почему функция CreatePen (Lib "gdi32.dll") создает сетку разных цветов?

Размещение рекламы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Почему дорожные люки круглые? (стресс-собеседование) smile157 Разное 403 14.12.2015 09:06
Почему направление результатов между Лира 9.6 и САПР 2013 отличается? ander Лира / Лира-САПР 11 12.11.2015 04:47
Civil 3D 2015 rus создает over9000 копий подшивок при работе в облаке (яндекс диск). почему? ripeinik Вертикальные решения на базе AutoCAD 7 12.10.2015 13:04
Почему не активна функция ветер/снег 2Д/3Д в нагрузках? ФАХВЕРК Robot 6 02.10.2015 10:06
Civil 3D 2014 Работа на разных компьютерах. Serghei Вертикальные решения на базе AutoCAD 9 24.09.2014 11:00