Стартовая заготовка приложения Win32
Если вы знакомы со структурой приложения 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;
}