67 / 24 / 6
Регистрация: 13.01.2014
Сообщений: 103
|
|
1 | |
Как программно рисовать и делать из этого битмапы?18.09.2016, 12:31. Показов 1310. Ответов 4
Метки нет (Все метки)
Когда на заводе обновляли парк компьютеров
мы себе ради интереса взяли один старый комьютер На нём стоит 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
0
|
18.09.2016, 12:31 | |
Ответы с готовыми решениями:
4
Как рисовать программно в MVVM? Как рисовать линии и делать заливку по частям на форме? Что делать, если клиент не заплатил и как этого избежать Надо программно рисовать картинку, что то типа чертежа, но в масштабе |
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 | |
09.01.2017, 03:13 | |
Помогаю со студенческими работами здесь
5
Как программно протянуть ВПР по столбцу, чтобы высота этого столбца равнялась высоте другого? Toolbar как установить свои, созданые в редакторе ресурсов visual studio битмапы на кнопки? Неужто этого с почтой никому не приходилось делать ???? Программно делать ScreenShot рабочего стола. Какова стоимость всего этого и что мне делать? Помогите решить задачу // обработка битмапы. Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |