Что
нужно знать для создания DirectX-приложений на C++ в среде
|
||
Урок
4 Создание Win32-приложений. Стандартные диалоги. Изучение сопутствующих конструкций языка. Консольные Win32-приложения. Указатели. Ссылочный тип. Массивы. |
||
Данный урок является введением в программирование на C++ в MSVS 2008 Вам нужно иметь установленную среду Microsoft Visual Studio 2005 или 2008 (можно триал), и DirectX SDK 9 версии, или лучше самой последней - DirectX SDK August 2008. |
||
[назад] [далее] [к содержанию] | ||
Мы рассматриваем основы программирования на C++ в среде программирования MSVS 2008 | ||
25/11/2008, 27/11/2008 Общие окна диалога для открытия и сохранения файла при использовании обработки пунктов меню Save и Load Работа с общими диалогами в Win32-приложениях описана в разделе MSVS 2008 > Help > Contents > Win32 and COM Development > User Interface > Windows User Experience > Windows Management > Windows User Interface > User Input > Common Dialog Box Library |
||
//++ Учебное задание: использование общего диалога для выбора цвета Работа с общим диалогом выбора цвета описана в разделе MSVS 2008 > Help > Contents > Win32 and COM Development > User Interface > Windows User Experience > Windows Management > Windows User Interface > User Input > Common Dialog Box Library > Common Dialog Box Library Overviews > Color Dialog Box Сопутствующие необходимые знания chcol.lpCustColors - использование массивов Требуется указатель на массив из 16-ти элементов типа COLORREF (статичный или локальный) Работа с массивами в приложениях Win32 (Native Development) описана в разделе справки - MSVS 2008 > Help > Contents > Development Tools and Languages > Visual Studio > Visual C++ > Reference > C/C++ Languages > Declarators > Arrays |
||
Работа с примерами кода в консольных приложениях для лучшего уяснения отдельных элементов Visual C++ Работа с консольными приложениями позволит Вам освоить наиболее общие конструкции языка Visual C++ не вдаваясь в детали создания интерфейса пользователя. Для создания консольного приложения Win32 нужно закрыть текущий солюшн (Close solution) с которым Вы работали и выбрать File > New > Project > Win32 > Win32 Console Application, указать имя и папку для создаваемого проекта. Добавить в файл с исходным кодом необходимый код, выполнить сборку Build, а для просмотра результатов работы такого приложения выполнять запуск из командной строки Пуск > Все программы > Стандартные > Командная строка |
||
Например Ваш скомпилированный файл находится в папке H:\Andrew\work\gamecre\DXSDK_Aug2008\MyWorks\NuPogodiFull\NuPogodiFull_vs2008\ training\LearnPointers\Debug |
||
Тогда, в окне Коммандной строки набираем H: и нажимаем Enter. Тем самым переходим на диск H. копируем нужный путь прямо из проводника. в коммандной строке набираем cd и правой клавишей мыши вызываем контекстное меню и вставляем скопированный путь получается cd H:\Andrew\work\gamecre\DXSDK_Aug2008\MyWorks\NuPogodiFull\NuPogodiFull_vs2008\ training\LearnPointers\Debug нажимаем Enter. Теперь мы находимся в этой папке. Можете применить команду dir и вы увидите содержимое этого каталога. Для очистки экрана консоли удобно использовать команду очистки экрана cls Теперь Вам остается только набрать имя нужного exe-файла любыми буквами (хоть большими, хоть маленькими, хоть вразнобой - никакой разницы, т.к. консоль запускает файлы по именам без учета регистра (заглавные/строчные) Далее нажать Enter и увидеть результат работы Вашего консольного приложения. |
||
Далее остается только экспериментировать - изменять код, выполнять новую сборку и запускать созданное из консоли наблюдая и анализируя полученные результаты. |
||
Пример кода для понимания указателей (Pointers) - пример взят из MSVS Documentation Для проверки и экспериментов с кодом используйте консольное приложение Win32 |
||
//
pointer.cpp // compile with: /EHsc #include <iostream> int main() { int i = 1, j = 2; // локальные переменные, размещаются в стеке int *p; // указатель на целое (int)
// a pointer may be assigned to "point to" the value of //
указателю может быть присвоен адрес переменной
// since j was on the stack, this address will be somewhere //
поскольку j размещено в стеке, адрес будет представлять
с использованием
// The * (indirection operator) can be read as "the value //
Оператор * (оператор разыменования) может быть читаем как "указатель
на значение"
// changing j will change the result of the indirection //
изменение j изменит результат применения оператора разыменования
// The value of j can also be changed through the pointer //
значение j может быть также изменено посредством указателя
// allocate memory on the heap for an integer, //
выделение памяти на куче (heap) для целого и,
// print the pointer and the object pointed to //
печать указателя и объекта на который указывает адрес // free the memory pointed to by p //
освобождение памяти на которую указывает p
// At this point, dereferencing p with *p would trigger // ошибку нарушения прав доступа к памяти во время выполнения программы //
Pointer arithmetic may be done with an array declared //
Вычисления с указателями могут выполняться для массива объявленного
// A common expression seen is dereferencing in combination //
Часто встречаемое выражение разыменования в комбинации // the following is a string copy operation //
операция копирования строки выглядит так - // s2 was copied into s1, so now they are both equal to "dog" //
s2 копируется в s1, так что теперь обе строки содержат слово "dog" |
||
А вот пример демонстрирующий использование указателей в структурах данных, в данном случае это связанный список. Пример также взят из MSVS Documentation |
||
//
pointer_linkedlist.cpp // compile with: /EHsc #include <iostream> using namespace std; struct
NewNode { void
WalkList(NewNode * ptr) { void
AddNode(NewNode ** ptr) {
if (*ptr == 0)
walker->node = MyNewNode; int
main() { |
||
примеры ссылочных (reference) типов - int
&i; |
||
читается как ссылка (адрес) на объект i. Синтаксически работа со ссылками полностью аналогична работе с объектами - //
references.cpp int
main() {
printf_s("%d\n", s.i);
SRef.i = 4; |
||
Определение массивов, работа с массивами объявление массива и работа с массивом времени выполнения - //
arrays.cpp int
main() { int* myarr = new int[size]; //объявляем массив из size элементов с типом int и выделяем ему память на куче (heap)
for (i = 0 ; i < size ; i++)
for (i = 0 ; i < size ; i++)
delete [] myarr; //освобождаем
память |
||
После получения необходимой информации из документации и экспериментов с учебными примерами кода возвращаемся к нашей задаче - //++ Учебное задание: использование общего диалога для выбора цвета Работа с общим диалогом выбора цвета описана в разделе MSVS 2008 > Help > Contents > Win32 and COM Development > User Interface > Windows User Experience > Windows Management > Windows User Interface > User Input > Common Dialog Box Library > Common Dialog Box Library Overviews > Color Dialog Box Сопутствующие необходимые знания chcol.lpCustColors - использование массивов Требуется указатель на массив из 16-ти элементов типа COLORREF (статичный или локальный) Реализация данной задачи - вывод диалога выбора цвета например при нажатии пункта меню Save будет выглядеть так (код нужно добавить в функцию WndProc) - показана в следующем уроке |
||
в следующем уроке показана реализация выбора цвета из окна диалога цвета (Color Dialog) и смена фона окна приложения в соответствии с выбранным цветом |
||
[назад] [далее] [к содержанию] |