Форум программистов, компьютерный форум, киберфорум
Assembler: Windows/protected mode
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
67 / 24 / 6
Регистрация: 13.01.2014
Сообщений: 103
1

Как программно рисовать и делать из этого битмапы?

18.09.2016, 12:31. Показов 1310. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Когда на заводе обновляли парк компьютеров
мы себе ради интереса взяли один старый комьютер
На нём стоит Windows 98 и он без портов - USB
Внешняя загрузка только через дискету формата - 3.5

Для набора определённого опыта в программировании
я решил реализовать небольшой проект карточной игры которая могла
бы работать на этой старой операционной системе
Для этого мне пришлось отказатся от библиотеки - GDI+
но с этим проблем не было так как я пользовался старыми функциями

Первый тест проект:

Написал програмные алгоритмы к этой игре
Потом в специализированных программах
нарисовал 52 карты (для меньшего обьёма) в формате - GIF
для последующей загрузки их в программу через сегмент ресурсов
размер ресурса с этими картами составил - 50 кб

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

Второй тест прект:

В ресурсы я загужаю не 52 полновесные карты а только фрагменты к ним
1 картинку - фон карты
4 картинки - валет,дама,король,туз (общие для всех мастей)
и по 3 картинки разных размеров мастей (и того еще плюс - 12)
всего 17 файлов и размер ресурса составил теперь - 10 кб

Раньше при загрузке программы я первым делом создавал - 52 битмапа
то есть брал из ресурсов файл карты
создавал поток и делал из него битмап
ну и потом в процессе игры мои алгоритмы использовали эти битмапы

Теперь чтобы создать эти битмапы мне нужно сначала
программно нарисовать будущую карту а потом сделать из неё битмап
Я конечно понимаю что алгоритмы создания образа карты добавят
относительный вес к байт-коду программы но меня уже заинтересовал
сам процесс а точнее программная реализация этого алгоритма

Сейчас в тестовом режиме у меня это реализованно так:

Я написал 13 функций для рисования в контексте
каждая функция рисует свою карту (от двойки до туза)
пользуются эти функции битмапами фрагментов из ресурсов
и в зависимости от указанных параметров
рисуют эти битмапы в определённом месте и с указанной мастью

При загрузке основного окна в определённом месте
создаётся дочернее окно с размерами игральной карты
Дальше по умолчанию обычным способом
из потока создаются битмапы моих фрагментов из ресурсов
Потом при наступлении определённого события (например нажатия кнопки)
В действие вступает алгоритм который в этом дочернем окне
создаёт контекст функцией - GetDC
и временный DC функцией - CreateCompatibleDC
потом по порядку для каждой из четырёх мастей
отрабатывают эти 13 функций и того 4х13=52 процедуры
И в каждой процедуре создаётся свой битмап карты
После создания битмапов контекст и временный DC закрываются
функциями - DeleteDC и ReleaseDC
Дальше это дочернее окно уничтожается за ненадобностью

Каждая процедура для рисования выглядит примерно так:
функцией - SelectObject
присоединяется определённый битмап к временному DC
а функция - BitBlt
из этого временного DC перерисовывает этот битмап
на контекст в указанном месте
название карты (2,3,4,5,6,7,8,9,10,В,Д,К,Т)
рисуется при помощи функции - TextOut
которая рисует непосредственно на самом контесте в указанном месте
Цвет,шрифт и прозрачность фона текста в контексте
формируют функции - SetTextColor, SelectObject, SetBkMode
которые устанавливают в контексте нужные атрибуты
в сущности через мгновение нарисованная карта
появляется в нашем дочернем окне
и после того как она нарисовалась
у меня вызывается функция - CreateDIBSection
которая создаёт обьект - DIB
этот обьект подсоединяется к временному DC функцией - SelectObject
и функцией - BitBlt уже наоборот происходит запись
из основного контекста во временный контекст потока данных
после этого обьект - DIB становится полноценным битмапом карты

Эта процедура в дочернем окне происходит 52 раза
по числу игральных карт соответственно
По времени это происходит почти мгновенно
но всё же визуально это можно принять как некие мерцания в окне

Можно конечно из этого сделать слайд-шоу
после каждой процедуры поставить - Sleep (с определённым зачением)
и тогда загрузка битмапов игральных карт
будет смотрется относительно оригинально

Но меня интересует вопрос а можно ли это сделать скрытно
то есть где то под капотом рисовать карты
и получать потом из нарисованного битмапы

Первое что я попробывал сделать
так это скрыть или сделать невидимым дочернее окно
но битмапы таким способом не получаются
из этого я сделал вывод что для моего алгоритма создания битмапов
видимость окна должна быть обязательным условием

Если кто разобрался то о чём я изложил
и кто может что ни будь посоветовать
по поводу битмапов под капотом
Подскажите пожалуйста

Век живи век учись

Если кому интересно выкладываю тест образец исполняющего файла
для наглядного визуального просмотра загрузки битмапов
в режиме слайд шоу с интервалом в 10 милисекунд
потом четыре битмапа показываются для наглядности
чтобы по дороге файл не зацепил что нибудь лишнее
я для надёжности файл заархивировал поролем - wasm
Вложения
Тип файла: rar Test-Bitmap.rar (35.6 Кб, 5 просмотров)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.09.2016, 12:31
Ответы с готовыми решениями:

Как рисовать программно в MVVM?
Здравствуйте. Мне необходимо рисовать программно на Canvas. Проблема только в том, что паттерн MVVM...

Как рисовать линии и делать заливку по частям на форме?
как нарисовать линию не через програмный код, а визуально? например мне надо разделить форму на 2...

Что делать, если клиент не заплатил и как этого избежать
Господа опытные фрилансеры! Обращаюсь к вам с просьбой рассказать о том, что вы делаете (и что...

Надо программно рисовать картинку, что то типа чертежа, но в масштабе
Помогите!!! Такая задача надо программно рисовать картинку, что то типа чертежа, но в масштабе и...

4
197 / 89 / 15
Регистрация: 10.07.2016
Сообщений: 146
18.09.2016, 16:14 2
Можно получив хэндл контекста экрана, сделать нужное количество совместимых битмапов, рисовать на них что вздумается и вообще делать с ними всё что угодно. Выводить в любой удобный момент времени либо сразу на экран, либо в окно.
0
67 / 24 / 6
Регистрация: 13.01.2014
Сообщений: 103
19.09.2016, 21:07  [ТС] 3
Спасибо за совет
Попробую
0
0 / 0 / 0
Регистрация: 08.01.2017
Сообщений: 1
08.01.2017, 23:06 4
assch1, ты делал ту прогу ... прост очень нужно такой код.
Если сбросишь то буду очень благодарен
0
67 / 24 / 6
Регистрация: 13.01.2014
Сообщений: 103
09.01.2017, 03:13  [ТС] 5
Эту карточную игру "Восьмёрка" я всё таки сделал под Win 98
ради интереса попробывал на десятке тоже вроде бы нормально
программа на старте визуально и очень быстро
собирает из фрагментов ресурса битмапы
и запускает основное окно программы

Я могу скинуть ссылку
архив заархивирован паролем - wasm

https://cloud.mail.ru/public/B3wP/wNYpUWj5z

Проект сделан Ассемблером на платформе - wasm32
но есть одно но
для избавления от определённых рутинных кусков кода
я уже давно пользуюсь своими макросами
под капотами которых и находится эта однообразная рутина
и соответственно проект написан в этом стиле
в котором разобратся мягко говоря будет не тривиально

Добавлено через 6 минут
Если есть сомнения после закачки и разархивации можно проверить антивирусом
0
09.01.2017, 03:13
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.01.2017, 03:13
Помогаю со студенческими работами здесь

Как программно протянуть ВПР по столбцу, чтобы высота этого столбца равнялась высоте другого?
Всем привет! Опять у меня возник затык... суть в том что нужно сделать две переменные, но одна...

Toolbar как установить свои, созданые в редакторе ресурсов visual studio битмапы на кнопки?
На сайте MSDN есть пример создания toolbar. Там для кнопок используют стандартные изображения...

Неужто этого с почтой никому не приходилось делать ????
Привет всем ситуация такова Поручили мне на работе обрабатывать почту поступающую к нам и отсылать...

Программно делать ScreenShot рабочего стола.
Добрый день, собс-но задача - нужно програмно делать ScreenShot рабочего стола на С#. Когдато еще...

Какова стоимость всего этого и что мне делать?
Я школьница старших классов, мне скоро поступать в ВУЗ, хочу на программиста. Проходит конкурс, где...

Помогите решить задачу // обработка битмапы.
Помогите, пожалуйста, решить задачу по обработке фотографий с помощью С++ Изначально есть...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru