?

Log in

No account? Create an account
About,,,
C++, уроки, Программирование
a_1a
Map

www.reliablecounter.com Дополнительная информация о сайте...
Нужно руководство для быстрого и результативного старта – “Если я прочитаю это, то у меня точно получится”.
Я искренне надеюсь, что этот сайт поможет вам сделать больше, чем первый успешный шаг в программировании. Несмотря на неизбежную субъективность точки зрения на некоторые вопросы, в том числе при выборе языка программирования C++, мы должны добиться желаемого результата.
Сразу отмечу, что не ставлю своей целью составить справочник или полное руководство по предмету. А намерен создать условия для преодоления психологического барьера перед началом изучения программирования для новичка. Так же постараюсь рассмотреть некоторые интересные решения для стандартных задач в программировании.
Ещё один важный момент – это не отрываться от сути процессов, которыми собираемся программно управлять. То есть не просто – “держи руль и едь хорошо”, а на чём рули хорошо? На самолёте, мотоцикле или подводной лодке? Обязательно нужно видеть программирование с точки зрения архитектуры компьютера.
Случай самовнушения. "У меня нет способностей к языкам программирования" - самый распространённый его вариант. Но фокус в том, что такой самообман разрушается всего одним фактом. Любой, кто в состоянии осознанно установить время срабатывания будильника или пользоваться "микроволновкой", может научиться программировать.
Что является самым сложным для того, кто собрался сделать первый шаг в программировании?
Правильно, вы не угадаете!
Самым сложным шагом является первое впечатление (через него многим не удаётся переступить) от среды разработки - интерфейса компилятора или IDE. Назовите это как угодно, но суть не изменится.
Все эти кнопки, надписи (термины) и главное, почему первый и якобы самый простой пример программы состоит из множества файлов?
На этом, как правило, и заканчивается знакомство с программированием для большинства решившихся.
В лучшем случае человек забрасывает мысли о программировании на несколько лет.
В самой выгодной ситуации окажется тот, у кого есть рядом программист или энтузиаст,
который уже сделал первый шаг и готов порадоваться тому, как всё просто, вместе с Вами.
Если Вы читаете эти строки, то значит проходите первый этап без проблем!
https://a-1a.livejournal.com/21961.html
Оглавление:
Показать оглавление...Collapse )

WinLego - 12
C++, уроки, Программирование
a_1a
Добавлена панель инструментов (ToolBar), строка состояния (StatusBar), ещё одна заставка и нужные исправления (улучшения).
Время крмпиляции проекта около 1 секунды. Исполняемый Exe-файл занимает 42 килобайта. Можете делать свой проект на основе WinLego или принять участие в его улучшении.

Скачать проект можно по этой ссылке
Tags:

Делаем приемлемый генератор случайных чисел.
C++, уроки, Программирование
a_1a
Для сброса генератора воспользуемся функцией GetTickCount(). Она возвращает время (в тактах), прошедшее с момента запуска OS.
После первого вызова функции RND() можно будет вызывать только библиотечную функцию rand(). Алгоритм генератора уже проинициализирован случайным кол-вом тактов после запуска OS ( функцией GetTickCount() ) и последовательность RND должна быть условно случайной.



Код функции RND() мы можем сделать частью проекта и пространста имён Lego,
P.S. Уже добавил в проект (WinLego-12).

Рисуем игровое поле.
C++, уроки, Программирование
a_1a
Используя механизм проекта WinLego, описанный здесь нарисуем поле 10 х 10 клеток.



Код этого примера выглядит так:



Цвет пера для рисования можно изменить функцией  PenStyle (int w, int c); где w - толщина пера (линии), c - цвет в формате int c = RGB(R, G, B);

Все методы, которые относятся к рисованию можно увидеть в файле NewPrint.h



Почти все методы возвращают указатель на объект очереди, про которую сказано здесь...
Такие объекты уничтожаются в момент завершения работы программы в функции деинициализации.
Но можно сохранить указатель на нужный Вам объект (линию, точку, перо и т.д.) и уничтожить избирательно. Например, стереть отделиную линию, с помощью void DelPaintEl(paintComm*);


P.S. Можно нарисовать тоже самое стандартными средствами WinAPI. Но тогда Вам придётся добавлять код в обработчик WM_PAINT. Изменится структура проекта WinLego - Ваш проект станет несовместим с будущими версиями WinLego. Либо искать другую альтернативу. Но лучше подобный энтузиазм направить на совершенствовние кода, который мы только что использовали в этом примере. Этот код расположен в файлах: NewPrint.h  и NewPrint.cpp.
Именно этот пример здесь.

Начало работы с WinLego
C++, уроки, Программирование
a_1a
Если Вы уже скачали среду разработки Dev-C++ по этой ссылке...   ( более подробно, как скачать написано здесь ).

То осталось выполнить 2 пункта:

1. Положите эту папку dllBridge на диск "C:/"   ( в корень диска "C:/" ), как паказано на рисунке ниже...



2. Скачайте нужную версию проекта WinLego, например, по этой ссылке.    И откройте из этой папки (с помощью Dev-C++) файл проекта с расширением dev  ( WinLego.dev ) Примерно так, как показано на рисунке ниже...




P.S.  В папке dllBridge лежат картинки, звуковые фрагменты, dll для связи с проектом и дополнительные (необязательные) программы. Например UniMons.exe и Colobok.exe. Без неё (без папки dllBridge) у Вас не будут доступны некоторые дополнительные возможности. Проект WinLego ищет эту папку по заранее прописанному пути: C:/dllBridge И если Вы (случайно) изменили путь, то проект WinLego не сможет её (эту папку) найти.

Новый минимальный проект под Windows
C++, уроки, Программирование
a_1a
В процессе совершенствования WinLego стало очевидно, что есть такие механизмы в любом приложении от которых "не убежать".
1. Это, к примеру, таймер, который будет периодически вызывать Вашу функцию. В таком случае пусть таймер станет частью минимального проекта для Windows.
2. Все сообщения и опросы кнопок не обработать в оконной процедуре (с помощью одного оператора switch) - она превратится в помойку. Будет правильно создать отдельные функции для опроса нажатия кнопок на клавиатуре, кнопок Buttons, выбор пунктов меню и т.д.
3. Глобальные переменные однозначно нужны, пусть и в отдельном пространстве имён. И их не нужно втискивать между WinMain и WndProc. Можно и нужно создать отдельный файл реализации для объявления и подробного описания этих переменных. Функционально, обособлено и хорошо документировано.
Всё это и многое другое я попытаюсь реализовать в так называемом "новом минимальном проекте под Windows".



Для пущей убедительности попытаюсь пристыковать любой Lego-модуль к такому проекту. На данный момент присоединил экранную-заставку (ScreenSaver).

Скачать проект.

Как управлять Колобком
C++, уроки, Программирование
a_1a
На этом примере можно увидеть, как получить доступ к зрению и управлять Колобком.





Зрительная картинка соответствует положению Колобка на нижнем рисунке. 64 - это камень, 32 - это пустая клетка по которой можно перемещаться.



Скачать именно этот пример.

Использование OpenGL (двумерная графика)
C++, уроки, Программирование
a_1a
В проекте WinLego можно использовать графическую библиотеку OpenGL.
Во всех версиях Windows (нас интересуют от Win2k и новее) она присутствует в составе opengl32.dll и glu32.dll
Таким образом, не выходя за рамки стандарта и не раздувая объём проекта мы можем воспользоваться дополнительными (огромными) возможностями.




Само рисование происходит во время вызова DrawMyExampleOpenGL_1();



Посмотреть код функции DrawMyExampleOpenGL_1() и проверить в работе этот пример можно, скачав проект.

Клавиатура. Опрос нажатых клавиш.
C++, уроки, Программирование
a_1a
Для этой цели в проекте есть две (глобальные, целочисленные ) переменные: Key_Pressed и Key_Counter .
Код последней нажатой кнопки (клавиатуры) хранится в переменной Key_Pressed.
Чтобы не запутаться в количестве нажатий одной или нескольких разных кнопок используется переменная Key_Counter .
Каждое новое нажатие увеличивает на 1 содержимое переменной Key_Counter .

Демонстрационный пример опроса нажатых кнопок клавиатуры выглядит так:





Проверить правильность кодов можно по этой таблице:



Дополнительная информация:
----------------------------------------------------
Внутри проекта WinLego оконная процедура WndProc() получает сообщения от OS Windows. В числе прочих и сообщения от клавиатуры.
Можно залезть внутрь проекта, вооружившись гаечными ключами, кусачками и изолентой и всё там переделать. Но лучше, с моей точки зрения, воспользоваться заранее приготовленными переменными, не меняя устройство проекта для каждой задачи. Таким образом, переменные Key_Pressed и Key_Counter становятся стандартным решением для задач, связанных с опросом клавиатуры.

Именно этот пример можно скачать по ссылке.

Картинки и звук в проекте WinLego.
C++, уроки, Программирование
a_1a
Проще чем в консоли и почти так же круто, как на ZX-Spectrum :) В приведённом примере легко разобраться самостоятельно и теперь мы слышим и видим!



В этом примере произведение IRONMAN(а) конвертировано в WAV-файл и следовательно вместо 2-5 килобайт занимает более 5 МЕГА-байт !!! ( в 1000 раз больше).
Было бы здорово найти функцию, которая воспроизводит "родные" AY-композиции (AY-8910, YM2149F и т.д.). Тогда тысячи шедевров (и их лучших фрагментов) было бы доступно в проекте WinLego и не только.


#include       "Lego.h"
using namespace Lego;


HBITMAP Bit;
void ShowBitmap(int x, int y, HBITMAP Bit); 


void INIT()
{       
     PlaySound("C:\\dllBridge\\mus\\Spectrum\\IRON1.wav", NULL, SND_FILENAME | SND_ASYNC);
}


void START()
{  
    switch(Timer_CLK)
    {
       case  30: Bit = (HBITMAP) LoadImage(NULL, "C:\\dllBridge\\Pictures\\Spectrum\\SP00.bmp", IMAGE_BITMAP, 0, 0,                                   
                                                                              LR_LOADFROMFILE | LR_CREATEDIBSECTION);                                                               
                 ShowBitmap(40, 35, Bit);   
                 break;
                 
       case  60: Bit = (HBITMAP) LoadImage(NULL, "C:\\dllBridge\\Pictures\\Spectrum\\SP01.bmp", IMAGE_BITMAP, 0, 0, 
                                                                              LR_LOADFROMFILE | LR_CREATEDIBSECTION);                                                                           
                 ShowBitmap(345, 35, Bit);  
                 break;                  
                 
       case  92: Bit = (HBITMAP) LoadImage(NULL, "C:\\dllBridge\\Pictures\\Spectrum\\SP04.bmp", IMAGE_BITMAP, 0, 0, 
                                                                              LR_LOADFROMFILE | LR_CREATEDIBSECTION);                                                               
                 ShowBitmap(345, 255, Bit); 
                 break; 
                 
       case 123: Bit = (HBITMAP) LoadImage(NULL, "C:\\dllBridge\\Pictures\\Spectrum\\SP05.bmp", IMAGE_BITMAP, 0, 0, 
                                                                              LR_LOADFROMFILE | LR_CREATEDIBSECTION);                                                               
                 ShowBitmap(40, 255, Bit);  
                 break;                              
    }
}


////////////////////////////////////////////////////////////////
void ShowBitmap(int x, int y, HBITMAP Bit)                    //
{
    BITMAP BitMap;
    ///////////////////////////////////////

    GetObject(Bit, sizeof(BITMAP), &BitMap);

    int Height = BitMap.bmHeight;
    int Width  = BitMap.bmWidth;
    
    hdc = GetDC(hWnd);
    
    HDC memDC = CreateCompatibleDC(hdc);
    
    HBITMAP OldBitmap = (HBITMAP)SelectObject(memDC, Bit);
    
    BitBlt(hdc, x, y, Width, Height, memDC, 0, 0, SRCCOPY);
    
    SelectObject(memDC, OldBitmap); 
    DeleteDC(memDC);
    ReleaseDC(hWnd,hdc);        
}






Из приведённого кода понятно, что звуковой файл и картинки расположены в папке dllBridge на диске C:/
Обновлённая папка dllBridge (dllBridge.rar), содержащая всё необходимое, лежит здесь: https://yadi.sk/d/nAn4uBNB3VMzjF/WinLego
Кстати, функция ShowBitmap() самостоятельно определяет размеры рисунка.
Скорее всего, этот пример займёт дополнительный пункт меню проекта в качестве ещё одной демки.
UPD (31_07_18): Перенёс демку в проект. Код расположен в файле demo_1.cpp
Функция ShowBitmap() доступна для использования и находится в пространсве имён Lego