Читайте также:
|
|
Технология создания файла-проекта применяется на классическом примере “Hello, world!”. Функция окна будет иметь вид:
LRESULT CALLBACK WndProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
PAINTSTRUCT ps;
HDChdc;
TCHAR greeting [] = _T(“Hello, world!”);
switch(message)
{
case WM_PAINT:
hdc=BeginPaint(hWnd&ps);
Text Out(hdc, 55, greeting, _tcslen (greeting));
EndPaint(hWnd, &ps);
break;
case WM_DESTROY:
PastQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
break;
}
return 0;
}
В данном пошаговом руководстве демонстрируется создание базового приложения на базе Win32, отображающего в окне надпись "Hello, World!". Можно воспользоваться кодом, созданным в этом пошаговом руководстве, в качестве шаблона для создания других приложений на базе Win32.
API-интерфейс Win32 (также известный как Windows API) — это платформа на основе C для создания приложений Windows. Дополнительные сведения об API-интерфейсе Win32 см. в разделе Windows API.
Создание проекта на базе Win32
В поле Имя введите имя проекта, например win32app. Нажмите кнопку ОК.
Запуск приложения на базе Win32
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow);
2. Поскольку в коде приложения должны использоваться существующие определения, следует добавить в файл операторы включения.
#include <windows.h>
#include <stdlib.h>
#include <string.h>
#include <tchar.h>
3. Наряду с функцией WinMain в каждом приложении на базе Win32 также должна быть определена функция оконной процедуры. Обычно эта функция имеет имя WndProc. WndProc имеет следующий синтаксис.
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
4. Эта функция обрабатывает многочисленные сообщения, которые приложение получает от операционной системы. Например, в приложении с диалоговым окном, в котором расположена кнопка ОК, при нажатии этой кнопки пользователем операционная система отправляет в приложение сообщение о том, что эта кнопка была нажата. Функция WndProc отвечает за реагирование на это событие. В этом примере соответствующей реакцией на это событие может быть закрытие диалогового окна.
Добавление функциональных возможностей в функцию WinMain.
1. В функции WinMain создайте структуру класса окна типа WNDCLASSEX. Эта структура содержит информацию об окне, такую как используемые в приложении значки, цвет фона окна, отображаемое в заголовке окна название, имя функции процедуры окна и т. д. В следующем примере показана типичная структура WNDCLASSEX.
WNDCLASSEX wcex;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_APPLICATION));
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName = NULL;
wcex.lpszClassName = szWindowClass;
wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_APPLICATION));
Обозначение кода:
cbSize
Тип: UINT
Размер в байтах в структуре. Этот член устанавливается как SizeOf (WNDCLASSEX). Его устанавливают перед вызовом функции
GetClassInfoEx.Тип: UINT
Стиль класса. Этим элементом может быть любая комбинация стилей класса.
lpfnWndProc
Тип: WNDPROC
Указатель на оконную процедуру. Использование функции CallWindowProc помогает вызывать оконную процедуру.
cbClsExtra
Тип: INT
Выделяется дополнительное количество байтов для структуры окна класса. Система сводит байты к нулю.
cbWndExtra
Тип: INT
Выделяется дополнительное количество байтов для экземпляра окна. Система сводит байты к нулю. Если приложение использует WNDCLASSEX, тем самым регистрируя диалоговое окно, созданный с помощью директивы CLASS в файле ресурсов, то такая директива должна установить член DLGWINDOWEXTRA.
HINSTANCE
Тип: HINSTANCE
Ручка к экземпляру, который содержит оконную процедуру для класса.
Hicon
Тип: HICON
Ручка со значком класса. Этот элемент должен быть ручкой с иконкой ресурса. Если этот элемент является NULL, система обеспечивает значок по умолчанию.
HCURSOR
Тип: HCURSOR
Ручка с курсором класса. Этот элемент должен быть дескриптором ресурса курсора. Если этот элемент является NULL, приложение должно явно установить форму курсора, когда мышь движется в окне приложения.
hbrBackground
Тип: HBRUSH
Ручка класса кисти фона. Этот элемент может быть дескриптором кисти, который может использоваться для закрашивания фона, или он может быть значением цвета. Значение цвета должно быть одним из следующих стандартных цветов системы (значение 1 должно быть добавлено к выбранным цветом). Если значение цвета задано, его необходимо преобразовать в один из следующих типов HBRUSH:
COLOR_ACTIVEBORDER
COLOR_ACTIVECAPTION
COLOR_APPWORKSPACE
COLOR_BACKGROUND
COLOR_BTNFACE
COLOR_BTNSHADOW
COLOR_BTNTEXT
COLOR_CAPTIONTEXT
COLOR_GRAYTEXT
COLOR_HIGHLIGHT
COLOR_HIGHLIGHTTEXT
COLOR_INACTIVEBORDER
COLOR_INACTIVECAPTION
COLOR_MENU
COLOR_MENUTEXT
COLOR_SCROLLBAR
COLOR_WINDOW
COLOR_WINDOWFRAME
COLOR_WINDOWTEXT
Система автоматически удаляет класс фоновые щетки, когда класс не зарегистрирован с помощью UnregisterClass. Приложение не должно удалять эти кисти.
Если это поле NULL, приложение должно рисовать свою предысторию, когда требуется нарисовать в своей клиентской области. Чтобы определить, должен ли быть окрашен фон, приложение может либо обработать сообщение WM_ERASEBKGND, либо проверить член fErase структуры PAINTSTRUCT заполненной функции BeginPaint.
lpszMenuName
Тип: LPCTSTR
Указатель на строку с завершающими строку символами, которые определяют имя ресурса меню класса, когда имя появляется в файле ресурсов. Если используеся число для идентификации меню, то при помощи макроса MAKEINTRESOURCE. Если этот член равен значению NULL,то окна, принадлежащие к этому классу, не имеют меню по умолчанию.
lpszClassName
Тип: LPCTSTR
Указатель на строку с нулевым символом. Если этот параметр с нулевым символом, он должен быть нулевым символом класса, созданного предыдущим вызовом функции RegisterClass или RegisterClassEx. Нулевой символ должен быть в младшей функции lpszClassName; старшая функция должна быть нулевой.
Если функция lpszClassName является строкой, то она определяет имя класса окна. Имя класса может быть любым именем, зарегистрированным как RegisterClass или RegisterClassEx. Максимальный размер lpszClassName равен 256 байтам. Если lpszClassName будет больше максимального размера, то функция RegisterClassEx не выполнится.
hIconSm
Тип: HICON
Дескриптор маленького значка, который связан с классом окна. Если этот элемент равен значению NULL, то система ищет иконку ресурсу, указанному членом Hicon для значка соответствующего размера, чтобы использовать в качестве маленькой иконки.
2.После того как класс окна будет создан, необходимо зарегистрировать его. Воспользуйтесь функцией RegisterClassEx и передайте структуру класса окна в качестве аргумента.
if (!RegisterClassEx(&wcex))
{
MessageBox(NULL,
_T("Call to RegisterClassEx failed!"),
_T("Win32 Guided Tour"),
NULL);
return 1;
}
3.Теперь можно создать окно. Воспользуйтесь функцией CreateWindow.
static TCHAR szWindowClass[] = _T("win32app");
static TCHAR szTitle[] = _T("Win32 Guided Tour Application");
// The parameters to CreateWindow explained:
// szWindowClass: the name of the application
// szTitle: the text that appears in the title bar
// WS_OVERLAPPEDWINDOW: the type of window to create
// CW_USEDEFAULT, CW_USEDEFAULT: initial position (x, y)
// 500, 100: initial size (width, length)
// NULL: the parent of this window
// NULL: this application does not have a menu bar
// hInstance: the first parameter from WinMain
// NULL: not used in this application
HWND hWnd = CreateWindow(
szWindowClass,
szTitle,
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT,
500, 100,
NULL,
NULL,
hInstance,
NULL
);
if (!hWnd)
{
MessageBox(NULL,
_T("Call to CreateWindow failed!"),
_T("Win32 Guided Tour"),
NULL);
return 1;
}
Эта функция возвращает объект HWND, являющийся дескриптором окна
4.Теперь воспользуйтесь следующим кодом, чтобы отобразить окно.
// The parameters to ShowWindow explained:
// hWnd: the value returned from CreateWindow
// nCmdShow: the fourth parameter from WinMain
ShowWindow(hWnd,
nCmdShow);
UpdateWindow(hWnd);
На этом этапе в окне не будет отображаться большое количество содержимого, поскольку функция WndProc еще не реализована.
5. Теперь добавьте цикл обработки сообщений для прослушивания отправляемых ОС сообщений. Когда приложение получает сообщение, этот цикл пересылает его функции WndProc для обработки.Цикл обработки сообщений напоминает следующий код.
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return (int) msg.wParam;
На данном этапе функция WinMain должна напоминать следующий код.
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
WNDCLASSEX wcex;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_APPLICATION));
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName = NULL;
wcex.lpszClassName = szWindowClass;
wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_APPLICATION));
if (!RegisterClassEx(&wcex))
{
MessageBox(NULL,
_T("Call to RegisterClassEx failed!"),
_T("Win32 Guided Tour"),
NULL);
return 1;
}
hInst = hInstance; // Store instance handle in our global variable
// The parameters to CreateWindow explained:
// szWindowClass: the name of the application
// szTitle: the text that appears in the title bar
// WS_OVERLAPPEDWINDOW: the type of window to create
// CW_USEDEFAULT, CW_USEDEFAULT: initial position (x, y)
// 500, 100: initial size (width, length)
// NULL: the parent of this window
// NULL: this application dows not have a menu bar
// hInstance: the first parameter from WinMain
// NULL: not used in this application
HWND hWnd = CreateWindow(
szWindowClass,
szTitle,
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT,
500, 100,
NULL,
NULL,
hInstance,
NULL
);
if (!hWnd)
{
MessageBox(NULL,
_T("Call to CreateWindow failed!"),
_T("Win32 Guided Tour"),
NULL);
return 1;
}
// The parameters to ShowWindow explained:
// hWnd: the value returned from CreateWindow
// nCmdShow: the fourth parameter from WinMain
ShowWindow(hWnd,
nCmdShow);
UpdateWindow(hWnd);
// Main message loop:
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return (int) msg.wParam;
}
Дата добавления: 2015-09-03; просмотров: 74 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Енохианских посланий. | | | Библиотека MFC |