HTML [44] |
Visual C++ и MFC [21] |
c++ [78] |
php [19] |
Javascript [15] |
C# [51] |
загрузки [0] |
XNA
[10]
создание игр с помощью xna
|
Главная » Статьи » Visual C++ и MFC |
Класс приложения CWinAppИтак, на первом занятии мы уже с Вами рассматривали вопрос связанный с WinMain(). Давайте вспомним о задачах, которые решает эта функция. Для этого рассмотрим упрощенную структуру данной функции: Все представленные на рисунке функции определены в классе CWinApp - базовом классе, от которого мы наследуем Windows-приложение. Без использования этого класса нельзя создать приложение на базе библиотеки MFC, поэтому мы рассмотрим основные функции, которые нам необходимо переопределить при создании конкретного приложения. Начнем, что естественно, с конструктора: CWinApp::CWinApp (LPCTSTR lpszAppName=NULL); Как видно из прототипа, конструктор принимает параметр lpszAppName - указатель на текстовую строку, которая содержит имя приложения, используемое системой Windows. Если аргумент отсутсвует (т.е lpszAppName равняется NULL), для формирования имени приложения конструктор использует строку из файла ресурсов с идентификатором AFX_IDS_APP_TITLE. Таким образом, при необходимости, возможно изменить имя главного окна приложения через данный идентификатор. Если указанный идентификатор не будет найден, имя главного окна приложения совпадет с именем исполняемого файла. В любой момент мы можем узнать значения этого параметра через поле класса m_pszAppName; С понятием виртуальных функций Вы уже знакомы (помните, механизм раннего и позднего связывания?..). В класса CWinApp есть целый ряд виртуальных функций. Мы рассмотрим следующие: virtual BOOL CWinApp::InitInstance(); Функция отвечает за инициализацию каждого нового экземпляра приложения. Если Вы внимательно разбирали код, сгенерированный MFC AppWizard, тогда Вы обязательно знакомы с этой функцией. Вот ее код в "первозданном" виде: BOOL CConvertApp::InitInstance() { // Standard initialization // If you are not using these features and wish to reduce the size // of your final executable, you should remove from the following // the specific initialization routines you do not need. #ifdef _AFXDLL Enable3dControls(); // Call this when using MFC in a shared DLL #else Enable3dControlsStatic(); // Call this when linking to MFC statically #endif CConvertDlg dlg; m_pMainWnd = &dlg; int nResponse = dlg.DoModal(); if (nResponse == IDOK) { // TODO: Place code here to handle when the dialog is // dismissed with OK } else if (nResponse == IDCANCEL) { // TODO: Place code here to handle when the dialog is // dismissed with Cancel } // Since the dialog has been closed, return FALSE so that we exit the // application, rather than start the application's message pump. return FALSE; } Обычно в данной функции конструируется объект "главное окно" приложения, загружаются настройки программы из реестра Windows. Также, в данной функции предоставляется удобный случай для обработки командной строки текущего экземпляра приложения. После создания главного окна, переменной m_pMainWnd, из класса CWinThread, присваивается указатель на текущее окно (m_pMainWnd = &dlg;). Если Вы хотите получить хоть какую-либо пользу от Вашего приложения, Вам необходимо обязательно перегрузить данную функцию. Уверены, Вы помните, что при программировании под Windows мы часто имеем дело с сообщениями. Так вот, функция virtual int CWinApp::Run(); запускает цикл обработки сообщений, в котором выбираются и распределяются сообщения Windows. Другими словами, из очереди сообщений выбираются сообщения, адресованные нашей программе, анализируются и обрабатываются соответствующими обработчиками. Еще одна функция, о которой мы не могли не вспомнить, это: virtual BOOL CWinApp::ExitInstance(); которая вызывается только из функции Run для завершения работы текущего экземпляра приложения. Если Вы хотите внести, к примеру, свои коррективы в процесс обработки завершения приложения, тогда перегрузите эту функцию. Мы с Вами рассмотрели лишь часть виртуальных функций класса CWinApp. Реально, их, естественно, гораздо большее количество. О многих из них мы будем говорить с Вами в процессе изучения увлекательного мира MFC. В завершении, рассмотрим следующую функцию: void CWinApp::SetDialogBkColor (COLORREF clrCtlBk = RGB(192, 192, 192), COLORREF clrCtlText = RGB(0, 0, 0) ); Вызвав данную функцию внутри функции InitInstance(), Вы можете изменить цвет фона диалогового окна (параметр clrCtlBk) и цвет элементов управления (параметр clrCtlText). Для задания цвета, используется макрос RGB, который возвращает значение типа COLORREF. Если Вы хотите задать цвет с помощью данного макроса, укажите числа для соответсвующих каналов красного, зеленого и синего. К примеру: RGB(0,0,0) -задает черный цвет, RGB(255,0,0) - красный, а RGB(255,255,255) - белый. Понятно, что функция SetDialogBkColor не может изменить цвет какого-то конкретного элемента управления. Красить так красить!.. | |
Просмотров: 2521 | Рейтинг: 0.0/0 |
Всего комментариев: 0 | |