со структурой приложения 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;
}