Если вы знакомы со структурой приложения Win32,
то можете безболезненно пропустить несколько
параграфов и перейти к параграфу с заголовком
«Развитие начальной заготовки».
Рассмотрим более подробно структуру
традиционного Windows-приложения, представленную
нам мастером Win32 Application Wizard Studio.Net.
Программа спроектирована как шаблон (стартовая
заготовка), который можно развивать, внося в
него желаемую разработчиком функциональность.
Создайте новый проект приложения Win32. Для
этого:
-
В меню File > New выберите команду Project.
-
В появившемся диалоге New Project, в окне
Project Type раскройте узел дерева под
именем Visual C++ Projects и выберите узел
Win32 Projects.
-
В окне Templates выберите тип проекта Win32
Project.
-
В окне Name
задайте имя проекта: API. В окне Location
задайте или оставьте без изменения
местоположений новой папки с файлами
решения (solution).
-
Нажмите ОК и проанализируйте предлагаемые по
умолчанию мастером Win32 Application Wizard
настройки проекта.
-
Нажмите кнопку Finish.
Запустите стартовую
заготовку и убедитесь, что она создает окно с
планкой меню и реагирует на shortcut-комбинацию
Alt+? или Alt+/, создавая диалог About.
Раскройте дерево в окне Class View студии и
щелкните два раза имя глобальной переменной
hlnst. Курсор переходит в окно редактора, где вы
видите заготовку традиционного приложения Win32.
Надо отметить, что она богаче оснащена, чем
аналогичные заготовки предыдущих версий Visual
C++. Кроме пяти функций здесь содержатся ресурсы
(меню, диалог, значок, строки текста, и
клавиатурный ускоритель). Вы можете убедиться в
этом, раскрыв дерево ресурсов в окне Resource
View, которое входит в блок страниц вместе с
окном Class View. Анализ и развитие этой
заготовки мы произведем немного позже, а сейчас
приведем листинг, который создал мастер Win32
Application Wizard.1
// API.cpp : Определяет точку входа приложения
//
#include
"stdafx.h"
#include
"API.h"
#define
MAX_LOADSTRING 100
//======== Глобальные переменные:
HINSTANCE hlnst;
//
Текущий экземпляр
TCHAR
szTitle[MAX_LOADSTRING];
//
Текст заголовка окна
TCHAR
szWindowClass[MAX_LOADSTRING];
// Текст регистрации
//======== Прототипы функций, входящих в данный
модуль
ATOM MyRegisterClass(HINSTANCE hlnstance);
BOOL
Initlnstance(HINSTANCE, int);
LRESULT CALLBACK
WndProc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK
About(HWND, UINT, WPARAM, LPARAM);
int
APIENTRY WinMain(HINSTANCE hlnstance,
HINSTANCE
hPrevInstance,
LPSTR IpCmdLine,
int
nCmdShow)
{
//======= TODO: Помещайте код здесь
MSG msg;
HACCEL hAccelTable;
//======= Инициализация глобальных строк текста
LoadString(hlnstance, IDS_APP_TITLE, szTitle,
MAX_LOADSTRING); LoadString(hlnstance, IDC_API,
szWindowClass, MAX_LOADSTRING);
//======= Вызов функции регистрации приложения
MyRegisterClass(hlnstance);
//=======
Инициализация приложения:
if
(!Initlnstance (hlnstance, nCmdShow))
{
return
FALSE;
}
//=======
Загрузка клавиатурных ускорителей
hAccelTable =
LoadAccelerators (hlnstance, (LPCTSTR)IDC_API);
//======= Цикл ожидания и обработки сообщений:
while
(GetMessage(&msg, NULL, 0, 0))
if
(!TranslateAccelerator(msg.hwnd, hAccelTable,
Smsg))
{
TranslateMessage(Smsg);
DispatchMessage(Srasg);
}
}
return
msg.wParam;
}
//
// FUNCTION: MyRegisterClass ()
//
// НАЗНАЧЕНИЕ: Регистрирует оконный класс
//
// COMMENTS: //
// Эта функция нужна только если вы хотите,
чтобы код
// был совместим с Win32 системами, которые
// существовали до создания функции 'RegisterClassEx
' ,
// введенной в Windows 95.
// Вызов 'RegisterClassEx' необходим для
правильного
// создания маленького (small) значка,
ассоциированного
// с приложением.
//
ATOM MyRegisterClass (HINSTANCE hlnstance)
{
WNDCLASSEX wcex;
wcex.cbSize =
sizeof (WNDCLASSEX) ;
wcex. style =
CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc =
(WNDPROC) WndProc;
wcex. cbClsExtra =
0;
wcex.cbWndExtra =
0;
wcex. hlnstance =
hlnstance;
wcex.hlcon =
Loadlcon (hlnstance,
(LPCTSTR) IDI_API) ;
wcex.hCursor =
LoadCursor (NULL, IDC_ARROW) ;
wcex.hbrBackground
= (HBRUSH) (COLOR_WINDOW+1) ;
wcex.lpszMenuName =
(LPCSTR) IDC_API;
wcex. IpszClassName
= szWindowClass;
wcex.hlconSm =
Loadlcon (wcex. hlnstance, (LPCTSTR) IDI_SMALL)
return
RegisterClassEx (&wcex) ;
}
//
// FUNCTION: Initlnstance (HANDLE, int)
//
// НАЗНАЧЕНИЕ: Запоминание описателя экземпляра
// приложения и создание главного окна
приложения
//
// COMMENTS:
// В этой функции мы запоминаем описатель
экземпляра
// приложения в глобальной переменной и создаем
//
главное окно приложения.
//
BOOL
Initlnstance(HINSTANCE hlnstance, int nCmdShow)
{
HWND hWnd;
//=======
Запоминаем экземпляр приложения
hlnst = hlnstance;
//=======
Создаем главное окно
hWnd =
CreateWindow(szWindowClass, szTitle,
WSJDVERLAPPEDWINDOW,CW_USEDEFAULT, 0,
CW_USEDEFAULT, 0, NULL, NULL, hlnstance, NULL),
if
(IhWnd) {
return
FALSE; }
ShowWindow(hWnd,
nCmdShow);
UpdateWindow(hWnd)
;
return
TRUE; }
//
// FUNCTION: WndProc(HWND, unsigned, WORD, LONG)
//
// НАЗНАЧЕНИЕ: Обработка сообщений главного
окна.
//
// WM_COMMAND - обработка команд меню
// WM_PAINT - перерисовка окна
// WM_DESTROY - посылка сообщения о завершении и
выход
//
//
LRESULT CALLBACK
WndProc (HWND hWnd, UINT message,
WPARAM wParam,
LPARAM IParam)
{
int
wmld, wmEvent;
PAINTSTRUCT ps;
HDC hdc;
switch
(message)
{
case
WM_COMMAND:
wmld = LOWORD (wParam)
;
wmEvent - HIWORD (wParam)
;
//====== Расшифровка выбора в меню:
switch
(wmld)
{
case
IDM_ABOUT:
DialogBox (hlnst, (LPCTSTR)
IDD_ABOUTBOX, hWnd,
(DLGPROC)About) ;
break;
case
IDM_EXIT:
DestroyWindow(hWnd);
break;
default:
return
DefWindowProc(hWnd, message, wParam, IParara);
{
break;
//======= Ветвь перерисовки содержимого окна
case
WM_PAINT:
hdc = BeginPaint(hWnd,
sps);
//======= TODO: Вставьте сюда рисующий код
EndPaint(hWnd, Sps);
break;
//======= Ветвь закрытия окна
case
WM_DESTROY:
PostQuitMessage(0);
break; default:
return
DefWindowProc(hWnd, message, wParam, IParam);
}
return 0;
}
//=======
Обработчик команды вызова диалога About
LRESULT CALLBACK
About(HWND hDlg, UINT message,
WPARAM wParam,
LPARAM IParam)
{
switch
(message)
{
//======= Ветвь инициализации окна диалога
case
WM_INITDIALOG:
return
TRUE;
//======= Ветвь обработки команд, исходящих
//======= от элементов управления диалога
case
WM_COMMAND:
if
(LOWORD(wParam) == IDOK ||
LOWORD(wParam) ==
IDCANCEL)
EndDialog(hDlg,
LOWORD(wParam));
return
TRUE;
}
break;
}
return
FALSE;
} |