visual C++, создание диалоговых окон.

Рубрика: Visual Studio, Дата: 13 December, 2013, Автор:

Рассмотрим сегодня такой тип приложений приложения win32 на диалоговых окнах, visual C++, создание диалоговых окон. Приложения для windows делятся на три вида: 1. консольные – это самый простой тип приложений, 2.win32 приложения на диалоговых окнах – это самый простой тип win32 приложений и 3.просто приложения win32 это такие, где создаются дочерние окна, множество окон. Третий тип приложений считается самым сложным типом, консольные самый простой тип. Консольные приложения мы умеем создавать, а от увы win32 приложения нет.

Зачем нужно visual C++, создание диалоговых окон

Как правило все коммерческие программы содержать сильный GUI, который довольно тяжело создавать, можно например посмотреть такие программы как microsoft word или exel да и много других. Там программируются множество дочерних окон, создается множество элементов управления там сотни окон, я хз. как такие приложения создавать, они так сложновато устроены. Мы рассмотрим и будем создавать приложения которые будут состоять всего навсего из одного окошка с набором элементов. Сам я недавно с ними познакомился. Будем создавать диалоговые окна.

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

visual C++, создание диалоговых окон

Нажимаем Ок, затем появится окошко жмем кнопку Далее и мы попадаем в окошко в котором ставим галочку на “пустой проект”visual C++, создание диалоговых окон

жмем готово и у нас создался новый пустой проект.

Создание файла main.cpp

Дальше создадим файл main.cpp со следующим кодом:

Показать »

#include <Windows.h>
#include "resource.h"

//собственная процедура для обработки
BOOL CALLBACK DlgProc(HWND, UINT, WPARAM, LPARAM);

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE
	hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
	int ret=DialogBox(hInstance,MAKEINTRESOURCE(IDD_DIALOG1),
					NULL,(DLGPROC)DlgProc);
	if (ret == 0)
	{
		//Если была нажата кнопка Отмена или крестик
		MessageBox(NULL,(LPCTSTR)"Отмена","Inform",
				   MB_OK|MB_ICONINFORMATION);
	}
	else if (ret == 1)
	{
		//Если была нажата кнопка Ок
		MessageBox(NULL,(LPCTSTR)"Ок","Inform",
				   MB_OK|MB_ICONINFORMATION);
	}

	return ret;
}

BOOL CALLBACK DlgProc(HWND hwnd, UINT msg, WPARAM wParam,
	LPARAM lParam)
{
	switch (msg)
	{
		case WM_INITDIALOG:
		{
			return FALSE;
		}
		case WM_COMMAND:
		{
			switch (LOWORD(wParam))
			{
				case IDOK:
					EndDialog(hwnd,1);
					return TRUE;
				case IDCANCEL:
					EndDialog(hwnd,0);
					return TRUE;
			}
		}
		case WM_CLOSE:
		{
			EndDialog(hwnd,0);
			return FALSE;
		}
	}
	return FALSE;//нужно что бы вызвать функцию для прорисовки окда
	//return TRUE;//не будет вызыватся функция протисовки окна
}

Короче вызывается просто функция DialogBox() которой передается в качестве параметра собственная процедура DlgProc() в которой мы обрабатываем 3 вида событий: WM_INITDIALOG, WM_COMMAND,  WM_CLOSE. Ну в первый WM_INITDIALOG мы попадаем сразу при создании программы когда производится инициализация окна, в третий WM_CLOSE  попадаем когда закрываем окно (нажимем крестик), ну и во втором параметре WM_COMMAND мы уже обрабатываем собственные события. Как видно наша процедура возвращает либо FALSE либо TRUE,  если мы возвращаем FALSE, то у нас вызывается процедура которая вырисовывает окно, если мы вернем TRUE, то это означает что функция стандартная для прорисовки окна не вызовется. Это так небольшой ликбез по теории

visual C++, создание диалоговых окон, создание самого окна в редакторе

Идем дальше, а дальше нам нужно создать само окно в визуальном редакторе, так называемый файл ресурсов, все создается автоматически, нам не нужно ничего в ручную создавать просто нажимаем в обозревателе решений правую клавишу на проекте и выбираем добавить ресурсvisual C++, создание диалоговых окон

выбираем и мы попадаем в окно “Добавление ресурса”

visual C++, создание диалоговых окон

Выбираем Dialog и нажимаем создать

5

Все диалог создан, в “Панель элементов” мы видим какие элементы мы можем добавлять, а в “Свойства” мы можем изменять свойства каждого элемента. Дальше компилируем проект, нажимаем Ctrl+F5 и у нас создается окошко с кнопкой ок и отмена

visual C++, создание диалоговых окон.

По нажатию на кнопку Ок у нас вызывается окошко

visual C++, создание диалоговых окон.

А по нажатии на кнопку отмена вызывается другое информационное окошко

visual C++, создание диалоговых окон.

Что происходит

Это все происходит потому что наша функция DialogBox() при завершении функцией EndDialog(hwnd,1); возвращает второй ее параметр поэтому в WinMain() у нас ret принимает либо 1 либо 0 смотря как была завершена функция DialogBox(), это нужно для того что б в приложениях в которых много окон, что б можно было определять какая кнопка была нажата, Ок или Отмена, это мы будем просто понимать, если Ок, то нужно применить изменения, а если Отмена то ничего не делать. Так как у нас одно оконное приложение, то нам это не нужно разбирать visual C++, создание диалоговых окон.

Это короче основа visual C++, создание диалоговых окон, от как из всего выше видно что наше приложение на диалоговых окнах очень просто создается, мы дальше разберем код как можно ввести текст через editbox и вывести на экран, а так же разберем список. Неахота сильно описывать, я просто покажу скрин проги и ниже код ее, ну а дальше опишу немножко как она работает, и так приступим, начнем со Edit Control и Button

 

Edit Control и Button

И так это просто поле для ввода текста и кнопка. И так создаем в визуальном редакторе для нашего прооекта visual C++, создание диалоговых окон следующий каркас:

visual C++, создание диалоговых окон.

Ну и код для работы с каркасом:

Показать »

#include <Windows.h>
#include "resource.h"

//собственная процедура для обработки
BOOL CALLBACK DlgProc(HWND, UINT, WPARAM, LPARAM);

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE
	hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
	int ret=DialogBox(hInstance,MAKEINTRESOURCE(IDD_DIALOG1),
					NULL,(DLGPROC)DlgProc);
	if (ret == 0)
	{
		//Если была нажата кнопка Отмена или крестик
	/*	MessageBox(NULL,(LPCTSTR)"Отмена","Inform",
				   MB_OK|MB_ICONINFORMATION);*/
	}
	else if (ret == 1)
	{
		//Если была нажата кнопка Ок
	/*	MessageBox(NULL,(LPCTSTR)"Ок","Inform",
				   MB_OK|MB_ICONINFORMATION);*/
	}

	return ret;
}

BOOL CALLBACK DlgProc(HWND hwnd, UINT msg, WPARAM wParam,
	LPARAM lParam)
{
	switch (msg)
	{
		case WM_INITDIALOG:
		{
			return FALSE;
		}
		case WM_COMMAND:
		{
			switch (LOWORD(wParam))
			{
				case IDC_BUTTON1:
				{
					char buf[250];
					//получаем данные из поля IDC_EDIT1
					GetDlgItemText(hwnd,IDC_EDIT1,buf,sizeof(buf));
					//отправляем данные в IDC_EDIT2
					SetDlgItemText(hwnd,IDC_EDIT2,buf);
					//очищаем само поле
					SetDlgItemText(hwnd,IDC_EDIT1,"");
					//дальше прорисовывается окно
					return FALSE;
				}
				case IDC_BUTTON2:
				{
					SetDlgItemText(hwnd,IDC_EDIT1,"Hellow world!!!");
					SetDlgItemText(hwnd,IDC_EDIT2,"Hellow world!!!");
					return FALSE;
				}
				case IDC_BUTTON3:
				{
					SetDlgItemText(hwnd,IDC_EDIT1,"");
					SetDlgItemText(hwnd,IDC_EDIT2,"");
					return FALSE;
				}
				case IDC_EDIT1:
				{
					return FALSE;
				}
				case IDC_EDIT2:
				{
					return FALSE;
				}
			}
		}
		case WM_CLOSE:
		{
			EndDialog(hwnd,0);
			return FALSE;
		}
	}
	return FALSE;//нужно что бы вызвать функцию для прорисовки окда
	//return TRUE;//не будет вызыватся функция протисовки окна
}

Лень описывать что нить, просто пошарте в коде, попробуйте что нить поменять, мы тут используем функцию для получения содержимого поля функции

GetDlgItemText(hwnd,IDC_EDIT1,buf,sizeof(buf));

Ну а для того что б данные вывести в поле мы используем функцию

SetDlgItemText(hwnd,IDC_EDIT2,buf);

Тут ничего не могу сказать, сам не сильно знаю, нужно читать дополнительную литературу или МСДН, но лучше конечно Питзольда.

Дальше рассмотрим программу для работы с List Box

 

List Box.

Это элемент список, вы должны снова создать каркас программы.

visual C++, создание диалоговых окон.

Ну и код к этому диалоговому окну:

Показать »

#include <Windows.h>
#include "resource.h"

//собственная процедура для обработки
BOOL CALLBACK DlgProc(HWND, UINT, WPARAM, LPARAM);

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE
	hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
	int ret=DialogBox(hInstance,MAKEINTRESOURCE(IDD_DIALOG1),
					NULL,(DLGPROC)DlgProc);
	if (ret == 0)
	{
		//Если была нажата кнопка Отмена или крестик
	/*	MessageBox(NULL,(LPCTSTR)"Отмена","Inform",
				   MB_OK|MB_ICONINFORMATION);*/
	}
	else if (ret == 1)
	{
		//Если была нажата кнопка Ок
	/*	MessageBox(NULL,(LPCTSTR)"Ок","Inform",
				   MB_OK|MB_ICONINFORMATION);*/
	}

	return ret;
}

BOOL CALLBACK DlgProc(HWND hwnd, UINT msg, WPARAM wParam,
	LPARAM lParam)
{
	switch (msg)
	{
		case WM_INITDIALOG:
		{
			//SendDlgItemMessage(hwnd,IDC_LIST1,LB_RESETCONTENT,0,0);
			SendDlgItemMessage(hwnd,IDC_LIST1,LB_ADDSTRING,0,(LPARAM)"ONE");
			SendDlgItemMessage(hwnd,IDC_LIST1,LB_ADDSTRING,0,(LPARAM)"TWO");
			SendDlgItemMessage(hwnd,IDC_LIST1,LB_ADDSTRING,0,(LPARAM)"THREE");
			return FALSE;
		}
		case WM_COMMAND:
		{
			switch (LOWORD(wParam))
			{
				case IDC_BUTTON1:
				{
					//1.получаем данные из поля IDC_EDIT1
					char buf[100];
					memset(buf,0,sizeof(buf));
					GetDlgItemText(hwnd,IDC_EDIT2,buf,sizeof(buf));
					//2.добавляем строку в список
					SendDlgItemMessage(hwnd,IDC_LIST1,LB_ADDSTRING,0,(LPARAM)buf);
					//3.очищаем само поле
					SetDlgItemText(hwnd,IDC_EDIT2,"");
					return FALSE;
				}
				case IDC_BUTTON2:
				{
					//получение сообщения по фокусу
					char name[70];
					int num=SendDlgItemMessage(hwnd,IDC_LIST1,LB_GETCURSEL,0,0);
					//удаление элемента
					SendDlgItemMessage(hwnd,IDC_LIST1,LB_DELETESTRING,(WPARAM)num,0);
					return FALSE;
				}
				/*case IDC_EDIT1:
				{
					return FALSE;
				}
				case IDC_EDIT2:
				{
					return FALSE;
				}*/
				case IDC_LIST1:
				{
					switch (HIWORD(wParam))
					{
						case LBN_SELCHANGE:
						{
							char name[100];
							memset(name,0,sizeof(name));
							//1.узнаем позицию выделеного элемента в списке
							int num=SendDlgItemMessage(hwnd,IDC_LIST1,LB_GETCURSEL,0,0);
							//2.считываем этот элемент списка
							SendDlgItemMessage(hwnd,IDC_LIST1,LB_GETTEXT,(LPARAM)num,(WPARAM)name);
							//3.записывваем элемент в поле IDC_EDIT1
							SetDlgItemText(hwnd,IDC_EDIT1,name);
							return FALSE;
						}
					}
				}
			}
			return FALSE;
		}
		case WM_CLOSE:
		{
			EndDialog(hwnd,0);
			return FALSE;
		}
	}
	return FALSE;//нужно что бы вызвать функцию для прорисовки окда
	//return TRUE;//не будет вызыватся функция протисовки окна
}

Описание проги

В этой так сказать проге можно дабавлять в список элементы, можно удалять элементы из списка, при наведении курсора мышки на элемент и нажатии левой кнопки мыши выделеный элемент попадает в тикстовое поле ниже над списком.

Рассмотрим используемые функции, тут немного функций использовано. При выделении элемента из списка у нас отправляется в наше приложение команда и мы ее можем выловить в case IDC_LIST1: , там создается оператор switch (HIWORD(wParam)) и мы ловим параметр case LBN_SELCHANGE: он будет передан при выделении списка. Мы в общем создали обработчик этого события, для того что бы определить какой элемент был выделен, получить его порядковый номер мы используем функцию

int num=SendDlgItemMessage(hwnd,IDC_LIST1,LB_GETCURSEL,0,0);

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

SendDlgItemMessage(hwnd,IDC_LIST1,LB_GETTEXT,(LPARAM)num,(WPARAM)name);

для удаления элемента используем функцию

SendDlgItemMessage(hwnd,IDC_LIST1,LB_DELETESTRING,(WPARAM)num,0);

для добавление элемента в список юзаем функцию

SendDlgItemMessage(hwnd,IDC_LIST1,LB_ADDSTRING,0,(LPARAM)buf);

Создание диалоговых окон – ИТОГИ

Что еще сказать? Наша процедура для обработки событий состоит из трех частей. В первой части инициализируется наше приложение. Там мы инициализировали наш список тремя значениями. Пожалуй это и все. Я сам с этими функциями и возможностями недавно познакомился. Для меня это все новенькое, но уже с данными знаниями мы можем создавать какие нить приложения.

Это вообще то мелочь что мы изучили, если посмотреть визуальный редактор, то там очень много элементов и каждый элемент имеет различные свойства. То что мы рассмотрели сейчас это мелочь “ПУЗАТАЯ”. Будем дальше конечно пополнять свой запас знаний, но с этими знаниями мы уже можем создавать более менее нормальные приложения. Ну от например у меня дальше по учебнику идет приложение простая база данных, от я думаю что ж сделать создать ее свою все полностью или использовать тот код что в приложении. Там библиотека dll используется. Я беспокоюсь что ее на моем компе нету. Наверно попытаюсь все таки запустить то приложение что в книге, а затем уже свое приложение создам, где я все напишу на С++ без использования либы БД.

Мне несложно записать в текстовый файл данные, а затем их оттуда извлечь, это так сказать приложение база данных телефонных номеров. Нам уже эти знания по ВИНАПИ дают возможность создавать такие приложения плюс мы будем конечно пополнять свой запас знаний по созданию ГУИ. После этой простой БД мы создадим так же простой текстовый редактор, который будет сохранять файл, открывать файл, создавать файл и все это легко делается на ВИНАПИ. Ладно приступим, хватит писать пора дело делать 🙂 . ГУИ наконец то, аж не верится, что я дошол до его изучения.

Visual C++, создание диалоговых окон это легко для новичков с моим мега про гайдом, сможет это сделать любой школьник 🙂

 

Комментарии:


Оставить комментарий

Your email address will not be published. Required fields are marked *