Несколько дней назад я похвастался, что завел блог на wordpress.com, чтобы проверить, подходит ли его движок начинающему шароварщику для организации своего сайта. А сегодня подвернулась возможность заняться его настройкой. Осуществляется она из страницы консоли, на которую попадаешь сразу после входа на WordPress-овский сайт.
Первым делом рука потянулась к кнопке "Изменить тему", расположенной в нижней части панельки "Прямо сейчас". Визуальное представление блога меня устраивало, поэтому я сразу нажал на ссылку "Виджеты". Тут все очень просто: чтобы добавить виджет в блог достаточно перетащить его на боковую колонку, после чего может понадобиться ввести значения параметров конкретного виджета. Чтобы удалить - перетащить из боковой колонки в область доступных виджетов.
Для начала я добавил отображение статистики блога (хотя и знал, что счетчик посещений еще долго будет показывать нолик :-), модного ныне облака категорий (есть еще и облако меток) и списка страниц, поскольку собирался их добавлять. Виджет "RSS" позволил мне увидеть на странице тест-блога сообщения, автоматически получаемые из этого ("Flag 3D for You") блога, а виджет "Текст" - добавить произвольный текст, который может быть и HTML-кодом.
Для добавления страниц можно воспользоваться консолью (слева :-), щелкнув на ссылке "Добавить новую" под заголовком "Страницы" или выпадающим меню "Новая запись" (сверху :-), в котором есть аналогичный пункт.
Все очень просто, интуитивно понятно и способствует дальнейшим экспериментам...
среда, 12 августа 2009 г.
вторник, 11 августа 2009 г.
Без вины виноватые
Допустим, купил пользователь наш скринсейвер, установил, и разрешил ему раз в неделю проверять наш сайт, чтобы загружать новые флаги.
А потом поселился на его компьютере злобный вирус. Сидит он тихонько, никак себя не проявляя, и наблюдает, каким программам разрешен доступ в Интернет. Потом, выбрав "козлом отпущения" наш скринсейвер, начинает от его имени (для этого достаточно "позаимствовать" из exe-файла version information) отправлять спам или "сливать" пароли и тому подобную конфиденциальную информацию.
Бдительный файервол, заметив повышенную сетевую активность, рапортует, что скринсейвер (наш безобидный скринсейвер! :-) черт знает что вытворяет. Пользователь хватается за голову и предъявляет нам - авторскому коллективу - кучу претензий морального и материального характера.
Скверная ситуация, и, честно говоря, не вполне вымышленная...
Тут, наверное, не поможет даже цифровая подпись, которой, пойдя на существенные для стартапа расходы, мы могли бы гарантировать подлинность исполняемого файла. Файервол ее не проверяет и вирусу, пожелавшему украсть наш version information, она - не помеха.
Нужно будет, пожалуй, творчески подойти к написанию лицензионного соглашения к программе (большой их выбор есть на сайте http://contracts.onecle.com/type/32.shtml), чтобы подстраховаться от подобных неприятных неожиданностей.
А потом поселился на его компьютере злобный вирус. Сидит он тихонько, никак себя не проявляя, и наблюдает, каким программам разрешен доступ в Интернет. Потом, выбрав "козлом отпущения" наш скринсейвер, начинает от его имени (для этого достаточно "позаимствовать" из exe-файла version information) отправлять спам или "сливать" пароли и тому подобную конфиденциальную информацию.
Бдительный файервол, заметив повышенную сетевую активность, рапортует, что скринсейвер (наш безобидный скринсейвер! :-) черт знает что вытворяет. Пользователь хватается за голову и предъявляет нам - авторскому коллективу - кучу претензий морального и материального характера.
Скверная ситуация, и, честно говоря, не вполне вымышленная...
Тут, наверное, не поможет даже цифровая подпись, которой, пойдя на существенные для стартапа расходы, мы могли бы гарантировать подлинность исполняемого файла. Файервол ее не проверяет и вирусу, пожелавшему украсть наш version information, она - не помеха.
Нужно будет, пожалуй, творчески подойти к написанию лицензионного соглашения к программе (большой их выбор есть на сайте http://contracts.onecle.com/type/32.shtml), чтобы подстраховаться от подобных неприятных неожиданностей.
понедельник, 10 августа 2009 г.
Текстовые вариации
Надпись «Незарегистрированная версия!» (nag-screen) может появиться на экране как часть развевающегося флага (на некоторые его полигоны можно накладывать другую текстуру) или в виде самостоятельного текста, сопровождающегося какими-нибудь эффектами. В первом случае буквы могут искажаться (например, на широкоэкранном мониторе), поскольку растровая текстура будет растягиваться сильнее, чем ожидали разработчики. А второй вариант предоставляет им кое-какие дополнительные возможности.
Допустим, пользователь зарегистрировал программу — надпись нужно с экрана убрать. Но, программная реализация вывода текста никуда ведь не делась! Можно с ее помощью показывать пользователю что-нибудь полезное.
Первая мысль: вместо надписи «Незарегистрированная версия!» показывать регистрационный номер. Правда, пользователю после регистрации он не очень интересен — разве что нужно будет назвать его, обращаясь с вопросами к разработчикам скринсейвера.
Вторая идея: показывать счетчик fps. Уже лучше: бесплатный встроенный OpenGL бенчмарк :-)
Третий вариант: часы. Ну, это — классика... Не нужно только показывать секунды — их мелькание будет отвлекать взгляд пользователя от самого флага. Часы могут работать и в countdown-режиме, показывая, сколько дней осталось до какой-то знаменательной для пользователя даты.
А самым мощным, похоже, будет простейший вариант: пусть пользователь сам введет строку, которая будет висеть на экране. Тут он может написать и название страны, флаг которой он видит, и рекламный слоган, если флаг корпоративный, и «Спартак — чемпион!» для спортивного флага.
И, естественно, у пользователя должна быть возможность полностью отключить отображение текста. Чем больше возможностей настройки (только — не переборщить! :-), тем более приятное впечатление должно сложиться о программе.
Допустим, пользователь зарегистрировал программу — надпись нужно с экрана убрать. Но, программная реализация вывода текста никуда ведь не делась! Можно с ее помощью показывать пользователю что-нибудь полезное.
Первая мысль: вместо надписи «Незарегистрированная версия!» показывать регистрационный номер. Правда, пользователю после регистрации он не очень интересен — разве что нужно будет назвать его, обращаясь с вопросами к разработчикам скринсейвера.
Вторая идея: показывать счетчик fps. Уже лучше: бесплатный встроенный OpenGL бенчмарк :-)
Третий вариант: часы. Ну, это — классика... Не нужно только показывать секунды — их мелькание будет отвлекать взгляд пользователя от самого флага. Часы могут работать и в countdown-режиме, показывая, сколько дней осталось до какой-то знаменательной для пользователя даты.
А самым мощным, похоже, будет простейший вариант: пусть пользователь сам введет строку, которая будет висеть на экране. Тут он может написать и название страны, флаг которой он видит, и рекламный слоган, если флаг корпоративный, и «Спартак — чемпион!» для спортивного флага.
И, естественно, у пользователя должна быть возможность полностью отключить отображение текста. Чем больше возможностей настройки (только — не переборщить! :-), тем более приятное впечатление должно сложиться о программе.
воскресенье, 9 августа 2009 г.
Словопечатник
Примерно так можно перевести с английского слово «WordPress», которое с 2003 года означает не только сервис размещения блогов, но и движок, с помощью которого, владея лишь базовыми знаниями HTML и веб-дизайна, можно придать своему сайту профессиональный облик.
Для шароварщика WordPress интересен не только как инструмент ведения блога, «раскручивающего» продаваемую им программу. Чтобы сотрудничать с регистратором (об этом речь шла в предыдущих заметках), нужно иметь свой сайт. Можно ли построить его на движке WordPress? Чтобы ответить на этот вопрос, стоит поближе познакомиться с этой платформой.
Зарегистрировавшись на сайте wordpress.com (на wordpress.org можно найти много полезной информации, но завести свой блог не получится :-), я получил письмо со ссылкой, переход по которой автоматически создал мой блог с именем <не_скажу_как_назвал>.wordpress.com. Выбранный при этом шаблон, неплохо подходит для ведения онлайн-дневника. Но, сайт для продажи ПО должен, пожалуй, выглядеть несколько иначе. Посмотрим, сложно ли настроить WordPress по своему вкусу...
Для шароварщика WordPress интересен не только как инструмент ведения блога, «раскручивающего» продаваемую им программу. Чтобы сотрудничать с регистратором (об этом речь шла в предыдущих заметках), нужно иметь свой сайт. Можно ли построить его на движке WordPress? Чтобы ответить на этот вопрос, стоит поближе познакомиться с этой платформой.
Зарегистрировавшись на сайте wordpress.com (на wordpress.org можно найти много полезной информации, но завести свой блог не получится :-), я получил письмо со ссылкой, переход по которой автоматически создал мой блог с именем <не_скажу_как_назвал>.wordpress.com. Выбранный при этом шаблон, неплохо подходит для ведения онлайн-дневника. Но, сайт для продажи ПО должен, пожалуй, выглядеть несколько иначе. Посмотрим, сложно ли настроить WordPress по своему вкусу...
суббота, 8 августа 2009 г.
Взаимные обязательства
Продажа программы через регистратора (о них я писал 5 августа) осуществляется, естественно, после подписания соответствующих документов. На что нужно обратить внимание, заключая договор, например, с компанией ShareIt?
- договор заключается относительно программных продуктов, перечисленных на сайте разработчика;
- к программному продукту прилагается документация и лицензионное соглашение (EULA), в электронном формате;
- регистратор обязуется разместить продукт в виртуальном каталоге, предоставить покупателю форму для безопасного заказа, доставить покупку клиенту, а также - собирать все необходимые платежи и информацию о Клиентах;
- разработчик предоставляет сами продукты (либо в форме программного обеспечения как такового, либо в форме лицензионного или регистрационного ключа) и дополнительную информацию, необходимую для их продажи;
- если продукт предоставлен только в форме лицензионного или регистрационного ключа, оплата услуг регистратора возрастает, примерно на 2 %;
- разработчик информирует регистратора о рекомендуемых розничных ценах, а регистратор устанавливает конечную цену;
- разработчик подтверждает, что является автором и владельцем авторских прав на продаваемые продукты, или что он уполномочен автором на их распространение;
- разработчик гарантирует, что ни его продукт ни его сайт не содержат запрещенных законом материалов;
- разработчик гарантирует, что предоставленный продукт не содержит вирусов, «троянских коней», шпионского, рекламного, вредоносного, деструктивного программного кода;
- разработчик гарантирует, что его продукт не осуществляет несанкционированных действий в компьютерной системе пользователя или передачу данных из нее без предварительного уведомления пользователя и его согласия на это;
- разработчик предоставляет регистратору список ключей или генератор ключей, соответствующий его требованиям;
- разработчик обязуется оказывать на своем сайте (или другими надлежащими способами) техническую поддержку продаваемого продукта.
Это, разумеется, только небольшая часть взаимных обязательств разработчика и регистратора. Но и она позволяет сделать вывод: к продаже продукта нужно серьезно готовиться...
- договор заключается относительно программных продуктов, перечисленных на сайте разработчика;
- к программному продукту прилагается документация и лицензионное соглашение (EULA), в электронном формате;
- регистратор обязуется разместить продукт в виртуальном каталоге, предоставить покупателю форму для безопасного заказа, доставить покупку клиенту, а также - собирать все необходимые платежи и информацию о Клиентах;
- разработчик предоставляет сами продукты (либо в форме программного обеспечения как такового, либо в форме лицензионного или регистрационного ключа) и дополнительную информацию, необходимую для их продажи;
- если продукт предоставлен только в форме лицензионного или регистрационного ключа, оплата услуг регистратора возрастает, примерно на 2 %;
- разработчик информирует регистратора о рекомендуемых розничных ценах, а регистратор устанавливает конечную цену;
- разработчик подтверждает, что является автором и владельцем авторских прав на продаваемые продукты, или что он уполномочен автором на их распространение;
- разработчик гарантирует, что ни его продукт ни его сайт не содержат запрещенных законом материалов;
- разработчик гарантирует, что предоставленный продукт не содержит вирусов, «троянских коней», шпионского, рекламного, вредоносного, деструктивного программного кода;
- разработчик гарантирует, что его продукт не осуществляет несанкционированных действий в компьютерной системе пользователя или передачу данных из нее без предварительного уведомления пользователя и его согласия на это;
- разработчик предоставляет регистратору список ключей или генератор ключей, соответствующий его требованиям;
- разработчик обязуется оказывать на своем сайте (или другими надлежащими способами) техническую поддержку продаваемого продукта.
Это, разумеется, только небольшая часть взаимных обязательств разработчика и регистратора. Но и она позволяет сделать вывод: к продаже продукта нужно серьезно готовиться...
пятница, 7 августа 2009 г.
Словарь для параметров
С появлением в Windows-95 системного реестра, он стал наиболее популярным хранилищем параметров для разных программ. Но, для небольшого скринсейвера можно хранить настройки и в ini-файле, который обладает по сравнению с реестром одним преимуществом - читабельностью. Объяснить неопытному пользователю, как Regedit-ом заменить в нужной ветке реестра "0" на "1", может оказаться нелегко. А, открыв Блокнотом ini-файл, он внесет нужные исправления без труда. Это может упростить поддержку продукта, которая (особенно - при англоязычных пользователях) способна стать для разработчика нетривиальной задачей.
Среди многообразия классов NET Framework есть коллекция StringDictionary, которая заметно облегчает программисту работу с ini-файлом.
Мы считываем очередную строку из текстового файла функцией ReadLine(...) и находим в ней символ "=" функцией IndexOf(...). То, что слева от него - название параметра (ключ), справа - значение параметра. Можно добавить их в StringDictionary функцией Add(...), а потом - обращаться к значению параметра обычным индексированием: [] (как для массива).
Сохранение ini-файла тоже не представляет труда. Получаем итератор для коллекции функцией GetEnumerator(...) и преобразуем функцией dynamic_cast<...> очередной (Current) элемент словаря к типу DictionaryEntry. Для него уже определены свойства Key и Value, которые мы и сохраняем в файл функцией WriteLine(...).
Вывод: старые идеи можно сочетать с новыми технологиями
Среди многообразия классов NET Framework есть коллекция StringDictionary, которая заметно облегчает программисту работу с ini-файлом.
Мы считываем очередную строку из текстового файла функцией ReadLine(...) и находим в ней символ "=" функцией IndexOf(...). То, что слева от него - название параметра (ключ), справа - значение параметра. Можно добавить их в StringDictionary функцией Add(...), а потом - обращаться к значению параметра обычным индексированием: [] (как для массива).
Сохранение ini-файла тоже не представляет труда. Получаем итератор для коллекции функцией GetEnumerator(...) и преобразуем функцией dynamic_cast<...> очередной (Current) элемент словаря к типу DictionaryEntry. Для него уже определены свойства Key и Value, которые мы и сохраняем в файл функцией WriteLine(...).
Вывод: старые идеи можно сочетать с новыми технологиями
четверг, 6 августа 2009 г.
Загрузка bmp, gif, jpg изображений
Программисту, привыкшему решать проблемы "в лоб", трудно поверить в то, что для загрузки в свою программу изображений из файлов популярных графических форматов (bmp, gif, jpg), совсем необязательно знать их структуру!
Для начала, нужно имя требуемого файла преобразовать в Юникод с помощью функции MultiByteToWideChar(...). Передав Юникодовское имя в функцию OleLoadPicturePath(...), можно получить указатель на интерфейс IPicture, который позволит единообразно обращаться к разным свойствам и методам объекта-изображения независимо от его формата.
Нам понадобятся методы, возвращающие ширину: get_Width(...) и высоту: get_Height(...) картинки. Полученные значения будут в сотых долях миллиметра, поэтому для пересчета их в пикселы нужно функцией GetDeviceCaps(...) узнать количество пикселов на дюйм экрана и, чтобы вычисления были точными, применить функцию MulDiv(...) для получения высоты и ширины в пикселах.
<Пикселы> = MulDiv(<сотые доли миллиметра>, <пикселов на дюйм>, (2,54*100*10))
Полученные ширину и высоту заносим в структуру BITMAPINFO и, передав ее функции CreateDIBSection(...), строим HBITMAP нужного размера.
Теперь можно вызвать метод Render интерфейса IPicture, чтобы отрисовать в созданный HBITMAP хранящуюся в файле картинку. Мы не знаем (и знать не хотим :-) ни степени сжатия (для jpg) ни используемой палитры (для gif) — метод Render выполняет за нас всю тяжелую работу по интерпретации соответствующего формата!
Получив в HBITMAP попиксельное представление изображения, можно передать его одной из OpenGL функций генерации текстуры, например, gluBuild2DMipmaps(...) и увидеть на экране прочитанное из файла изображение.
Вывод: прежде чем писать свою функцию, стоит поискать в MSDN похожую.
Для начала, нужно имя требуемого файла преобразовать в Юникод с помощью функции MultiByteToWideChar(...). Передав Юникодовское имя в функцию OleLoadPicturePath(...), можно получить указатель на интерфейс IPicture, который позволит единообразно обращаться к разным свойствам и методам объекта-изображения независимо от его формата.
Нам понадобятся методы, возвращающие ширину: get_Width(...) и высоту: get_Height(...) картинки. Полученные значения будут в сотых долях миллиметра, поэтому для пересчета их в пикселы нужно функцией GetDeviceCaps(...) узнать количество пикселов на дюйм экрана и, чтобы вычисления были точными, применить функцию MulDiv(...) для получения высоты и ширины в пикселах.
<Пикселы> = MulDiv(<сотые доли миллиметра>, <пикселов на дюйм>, (2,54*100*10))
Полученные ширину и высоту заносим в структуру BITMAPINFO и, передав ее функции CreateDIBSection(...), строим HBITMAP нужного размера.
Теперь можно вызвать метод Render интерфейса IPicture, чтобы отрисовать в созданный HBITMAP хранящуюся в файле картинку. Мы не знаем (и знать не хотим :-) ни степени сжатия (для jpg) ни используемой палитры (для gif) — метод Render выполняет за нас всю тяжелую работу по интерпретации соответствующего формата!
Получив в HBITMAP попиксельное представление изображения, можно передать его одной из OpenGL функций генерации текстуры, например, gluBuild2DMipmaps(...) и увидеть на экране прочитанное из файла изображение.
Вывод: прежде чем писать свою функцию, стоит поискать в MSDN похожую.
среда, 5 августа 2009 г.
Между продавцом и покупателем
Если верить Википедии, были в царской России мелкие чиновники (вроде гоголевского Хлестакова :-), которых называли "коллежский регистратор". А в 21-м веке слово "регистратор" приобрело для шароварщиков совсем иной смысл.
Каждый разработчик хочет продать свою программу как можно большему числу покупателей, но не имеет возможности принимать оплату, например, в японских иенах, несмотря на безусловную конвертируемость и мировой авторитет этой валюты.
Каждый пользователь, покупая shareware-программу, хочет сделать это быстро, безопасно и расплатиться наиболее удобным для себя способом (для одного покупателя это - кредитка, для другого - банковский перевод). Тут то и выходит на сцену регистратор, при посредничестве которого совершается сделка. Он принимает платеж и передает пользователю регистрационный ключ программы (или информирует разработчика, который делает это сам). Платежи аккумулируются на аккаунте продавца, который получает деньги по согласованному с регистратором графику. Хороший регистратор оказывает продавцу дополнительные услуги и берет за это не такой уж высокий процент. Посмотреть список наиболее известных регистраторов можно в базе знаний сообщества swrus.
Можно, конечно, пытаться продавать свою программу и без посредников, но, во-первых, есть сложности с получением денег из-за границы (например, применяемая на eBay система PayPal позволяет гражданам постсоветских стран только отправлять деньги, но не получать их). А, во-вторых, незначительные затраты на сотрудничество с регистратором обычно окупаются предоставляемым им сервисом.
Каждый разработчик хочет продать свою программу как можно большему числу покупателей, но не имеет возможности принимать оплату, например, в японских иенах, несмотря на безусловную конвертируемость и мировой авторитет этой валюты.
Каждый пользователь, покупая shareware-программу, хочет сделать это быстро, безопасно и расплатиться наиболее удобным для себя способом (для одного покупателя это - кредитка, для другого - банковский перевод). Тут то и выходит на сцену регистратор, при посредничестве которого совершается сделка. Он принимает платеж и передает пользователю регистрационный ключ программы (или информирует разработчика, который делает это сам). Платежи аккумулируются на аккаунте продавца, который получает деньги по согласованному с регистратором графику. Хороший регистратор оказывает продавцу дополнительные услуги и берет за это не такой уж высокий процент. Посмотреть список наиболее известных регистраторов можно в базе знаний сообщества swrus.
Можно, конечно, пытаться продавать свою программу и без посредников, но, во-первых, есть сложности с получением денег из-за границы (например, применяемая на eBay система PayPal позволяет гражданам постсоветских стран только отправлять деньги, но не получать их). А, во-вторых, незначительные затраты на сотрудничество с регистратором обычно окупаются предоставляемым им сервисом.
вторник, 4 августа 2009 г.
Инсталлятор для дистрибутива
Давно прошли времена когда установка программы на компьютер состояла из создания папки в корне диска C: и копировании в нее всех файлов с 5-дюймовой дискеты. Рост сложности и самих программ и операционной системы привел к появлению дистрибутивов. Это — своего рода интеллектуальный саморазворачивающийся архив, который не только распаковывает программные файлы в нужные папки, но и выполняет дополнительные действия: создает или модифицирует ключи реестра, создает ярлыки для запуска программы и т. д.
Создать дистрибутив можно не только средствами самой среды разработки (например, Visual Studio), но и с помощью программ-инсталляторов, например — Inno Setup.
На сайте swrus, этот инструмент пользуется хорошей репутацией. Скачал я его с сайта разработчика (меньше 2 Мб), установил и запустил. Честно говоря, ожидал увидеть среду, в которой компоновка дистрибутива выполняется в привычном wysiwyg-стиле. А получил в свое распоряжение компилятор мощного скриптового языка + прекрасный help к нему + полтора десятка скриптов-примеров, иллюстрирующих наиболее востребованные функции Inno Setup. Думаю, самый простой из них вполне подойдет для нашего скринсейвера — будем пробовать...
Если пользователь, устанавливая программу, сталкивается с какими-нибудь неприятными сюрпризами, впечатление от самой программы (а значит и вероятность ее приобретения), как мне кажется — снижается. Поэтому, создание удобного и надежного дистрибутива — задача немаловажная.
Создать дистрибутив можно не только средствами самой среды разработки (например, Visual Studio), но и с помощью программ-инсталляторов, например — Inno Setup.
На сайте swrus, этот инструмент пользуется хорошей репутацией. Скачал я его с сайта разработчика (меньше 2 Мб), установил и запустил. Честно говоря, ожидал увидеть среду, в которой компоновка дистрибутива выполняется в привычном wysiwyg-стиле. А получил в свое распоряжение компилятор мощного скриптового языка + прекрасный help к нему + полтора десятка скриптов-примеров, иллюстрирующих наиболее востребованные функции Inno Setup. Думаю, самый простой из них вполне подойдет для нашего скринсейвера — будем пробовать...
Если пользователь, устанавливая программу, сталкивается с какими-нибудь неприятными сюрпризами, впечатление от самой программы (а значит и вероятность ее приобретения), как мне кажется — снижается. Поэтому, создание удобного и надежного дистрибутива — задача немаловажная.
понедельник, 3 августа 2009 г.
Полноэкранный режим
Динамичные компьютерные игры используют пространство экрана по максимуму. Не отстают от них и скринсейверы. Организация полноэкранного отображения имеет свои особенности, но отнюдь не так сложна, как может показаться программисту, привыкшему, что Delphi или Visual Basic сами создают готовые к употреблению окошки.
Жидкокристаллические мониторы, в отличие от своих ЭЛТ собратьев, имеют «родное» разрешение экрана, обусловленное параметрами используемой матрицы. Обычно именно это разрешение и установлено по умолчанию. Чтобы использовать его параметры и в полноэкранном режиме, нужно получить контекст устройства для экрана:
HDC ScreenDC = GetDC(NULL);
Для него узнать ширину и высоту экрана в пикселах, а глубину цвета - в битах на пиксел:
int hr = GetDeviceCaps(ScreenDC, HORZRES );
int vr = GetDeviceCaps(ScreenDC, VERTRES );
int bp = GetDeviceCaps(ScreenDC, BITSPIXEL);
Эти параметры нужно поместить в структуру:
DEVMODE dmScrMode;
dmScrMode.dmPelsWidth = hr;
dmScrMode.dmPelsHeight = vr;
dmScrMode.dmBitsPerPel = bp;
Структуру передать в фунцию, которая должна установить полноэкранный режим:
LONG rezult = ChangeDisplaySettings(&dmScrMode, CDS_FULLSCREEN);
И обработать ситуацию, когда ей это не удалось:
if(rezult != DISP_CHANGE_SUCCESSFUL)
{
...
}
Вывод: чтобы переключиться в полноэкранный режим, не обязательно менять разрешение экрана.
Жидкокристаллические мониторы, в отличие от своих ЭЛТ собратьев, имеют «родное» разрешение экрана, обусловленное параметрами используемой матрицы. Обычно именно это разрешение и установлено по умолчанию. Чтобы использовать его параметры и в полноэкранном режиме, нужно получить контекст устройства для экрана:
HDC ScreenDC = GetDC(NULL);
Для него узнать ширину и высоту экрана в пикселах, а глубину цвета - в битах на пиксел:
int hr = GetDeviceCaps(ScreenDC, HORZRES );
int vr = GetDeviceCaps(ScreenDC, VERTRES );
int bp = GetDeviceCaps(ScreenDC, BITSPIXEL);
Эти параметры нужно поместить в структуру:
DEVMODE dmScrMode;
dmScrMode.dmPelsWidth = hr;
dmScrMode.dmPelsHeight = vr;
dmScrMode.dmBitsPerPel = bp;
Структуру передать в фунцию, которая должна установить полноэкранный режим:
LONG rezult = ChangeDisplaySettings(&dmScrMode, CDS_FULLSCREEN);
И обработать ситуацию, когда ей это не удалось:
if(rezult != DISP_CHANGE_SUCCESSFUL)
{
...
}
Вывод: чтобы переключиться в полноэкранный режим, не обязательно менять разрешение экрана.
воскресенье, 2 августа 2009 г.
Текстовые эффекты в OpenGL
Если бы я заглянул в MSDN до того как написать о выводе текста в OpenGL, непонимание особенностей функций CreateFont и wglUseFontOutlines рассеялось бы гораздо раньше :-(

Богатство их параметров позволяет "легким движением пера" менять визуальное представление текста на экране. Например, чтобы текст располагался не горизонтально, а по диагонали, нужно указать угол ее наклона в параметре nEscapement функции CreateFont.
А, меняя значение параметра format для wglUseFontOutlines (он может иметь только два значения: WGL_FONT_LINES или WGL_FONT_POLYGONS) можно рисовать контур текста, через который будет виден фон сцены (такая вот псевдопрозрачность ;-) или сплошные буквы, которые можно закрасить или текстурировать.
Широкое поле для творчества: нужно только не переборщить с эффектами и подобрать такое представление текста, которое наиболее гармонично впишется в сцену.
Вывод: любите MSDN - источник знаний

Богатство их параметров позволяет "легким движением пера" менять визуальное представление текста на экране. Например, чтобы текст располагался не горизонтально, а по диагонали, нужно указать угол ее наклона в параметре nEscapement функции CreateFont.
А, меняя значение параметра format для wglUseFontOutlines (он может иметь только два значения: WGL_FONT_LINES или WGL_FONT_POLYGONS) можно рисовать контур текста, через который будет виден фон сцены (такая вот псевдопрозрачность ;-) или сплошные буквы, которые можно закрасить или текстурировать.Широкое поле для творчества: нужно только не переборщить с эффектами и подобрать такое представление текста, которое наиболее гармонично впишется в сцену.
Вывод: любите MSDN - источник знаний
суббота, 1 августа 2009 г.
От новостей к сайтам
Разместив свою программу (или ее URL) на солидном сайте (это я продолжаю тему, начатую несколько ранее), нужно позаботиться о том, чтобы пользователи узнали о ее появлении. Наиболее популярным средством для этого являются, конечно, RSS, поддерживаемые многими сайтами. Но, много ли подписчиков у этих новостных лент? Попробуем пойти обратным путем: от популярной ленты к раскрученному сайту, на котором можно разместить свою программу.
Немного поколдовав на страничке Google Reader, можно увидеть все 449 рекомендуемых наборов RSS, в каждом из которых будет от 4 до 10 лент. Выбор комплекта "Software" оформляет подписку на девять лент. Три из них, к сожалению, неактивны. Одна - чисто новостная - никак не связана с загрузкой программ. Еще одна - посвящена portable-приложениям. Оставшиеся четыре ведут к сайтам, которые заслуживают дополнительного исследования:
Немного поколдовав на страничке Google Reader, можно увидеть все 449 рекомендуемых наборов RSS, в каждом из которых будет от 4 до 10 лент. Выбор комплекта "Software" оформляет подписку на девять лент. Три из них, к сожалению, неактивны. Одна - чисто новостная - никак не связана с загрузкой программ. Еще одна - посвящена portable-приложениям. Оставшиеся четыре ведут к сайтам, которые заслуживают дополнительного исследования:
- FileHippo - 23.3 сообщений в неделю; 10,500 подписчиков
- GiveawayOfTheDay - 7.7 сообщений в неделю; 23,327 подписчиков
- MajorGeeks - 59.7 сообщений в неделю; 20,519 подписчиков
- SnapFiles - 9.6 сообщений в неделю; 5,819 подписчиков
Подписаться на:
Комментарии (Atom)