- •Министерство образования и науки российской федерации
- •Введение
- •1.WindowsApi. Определение и задачи.
- •2. Интерфейс программирования приложенийWin32
- •2.1 Расширение функциональности WinMain.
- •2.2 Класс окна
- •2.3 Создание окна
- •2.4 Расширение функциональности WndProc
- •3. С чего начать? Переход от Win32 к Win64
- •3.1 Операционная система x64
- •4.1 Как сделать код совместимым с Win64
- •4.2 Отладка
- •Заключение
- •5. Приложения
- •5.1 Приложение 1.
- •5.2 Приложение 2.
- •Литература
5. Приложения
5.1 Приложение 1.
// kursovik.cpp: определяет точку входа для приложения.
//
#include <windows.h>
#include <stdlib.h>
#include <malloc.h>
#include <memory.h>
#include <tchar.h>
#define MAX_LOADSTRING 100
HWND fact, hButton1, hButton2, hButton3, hButton4, hButton5, hButton6, Edit1, Edit2, Edit3;
int aTemp, bTemp, sumTemp, multTemp;
// Глобальные переменные:
HINSTANCE hInst; // текущий экземпляр
TCHAR szTitle[MAX_LOADSTRING]; // Текст строки заголовка
TCHAR szWindowClass[MAX_LOADSTRING]; // имя класса главного окна
// Отправить объявления функций, включенных в этот модуль кода:
ATOM MyRegisterClass(HINSTANCE hInstance);
BOOL InitInstance(HINSTANCE, int);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK View(HWND, UINT, WPARAM, LPARAM);
LONG_PTR Factorial (LONG_PTR x){
if(x < 0) // если пользователь ввел отрицательное число
return 0; // возвращаем ноль
if (x == 0) // если пользователь ввел ноль,
return 1; // возвращаем факториал от нуля - не удивляетесь, но это 1 =)
else // Во всех остальных случаях
return x * Factorial (x - 1); // делаем рекурсию.
}
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
UNREFERENCED_PARAMETER(hPrevInstance);
UNREFERENCED_PARAMETER(lpCmdLine);
// TODO: разместите код здесь.
MSG msg;
HACCEL hAccelTable;
// Инициализация глобальных строк
LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
LoadString(hInstance, IDC_KURSOVIK, szWindowClass, MAX_LOADSTRING);
MyRegisterClass(hInstance);
// Выполнить инициализацию приложения:
if (!InitInstance (hInstance, nCmdShow))
{
return FALSE;
}
hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_KURSOVIK));
// Цикл основного сообщения:
while (GetMessage(&msg, NULL, 0, 0))
{
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return (int) msg.wParam;
}
//
// ФУНКЦИЯ: MyRegisterClass()
//
// НАЗНАЧЕНИЕ: регистрирует класс окна.
//
ATOM MyRegisterClass(HINSTANCE hInstance)
{
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_KURSOVIK));
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName = MAKEINTRESOURCE(IDC_KURSOVIK);
wcex.lpszClassName = szWindowClass;
wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));
return RegisterClassEx(&wcex);
}
//
// ФУНКЦИЯ: InitInstance(HINSTANCE, int)
//
// НАЗНАЧЕНИЕ: сохраняет обработку экземпляра и создает главное окно.
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
HWND hWnd;
hInst = hInstance; // Сохранить дескриптор экземпляра в глобальной переменной
hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, 400, NULL, NULL, hInstance, NULL);
if (!hWnd)
{
return FALSE;
}
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
return TRUE;
}
//
// ФУНКЦИЯ: WndProc(HWND, UINT, WPARAM, LPARAM)
//
// НАЗНАЧЕНИЕ: обрабатывает сообщения в главном окне.
//
// WM_COMMAND - обработка меню приложения
// WM_PAINT - Закрасить главное окно
// WM_DESTROY - ввести сообщение о выходе и вернуться.
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc;
static int sx, sy;
//LPCTSTR szMsg = "I'm aplication, compilled with Win64 API";
LPCTSTR szMsg = "Я - приложение, скомпилированное с помощью интерфейса и средств компиляции Win64";
RECT rc;
SIZE sz;
LONG_PTR factorialTemp = 0;
char temp[16] = {0};
switch (message)
{
case WM_CREATE:
//Вызов диалогового окна "О программе"
hButton1 = CreateWindow("BUTTON", "О программе", WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON | BS_TEXT,
10, 10, 120, 20, hWnd, (HMENU)BTN1, NULL, NULL);
//Факториал сообщения введенного в Edit box
fact = CreateWindow("BUTTON", "Факториал", WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON | BS_TEXT,
270, 40, 120, 20, hWnd, (HMENU)factorial, NULL, NULL);
//Эхо сообщения введенного в Edit box
hButton2 = CreateWindow("BUTTON", "Эхо", WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON | BS_TEXT,
140, 40, 120, 20, hWnd, (HMENU)BTN2, NULL, NULL);
Edit1 = CreateWindowEx(WS_EX_CLIENTEDGE, "Edit", "", WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON | BS_TEXT,
10, 40, 120, 20, hWnd, 0, hInst, NULL);
//Ввод числа А
hButton3 = CreateWindow("BUTTON", "InPut A", WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON | BS_TEXT, 10, 70, 120, 20, hWnd, (HMENU)BTN3, NULL, NULL);
Edit2 = CreateWindowEx(WS_EX_CLIENTEDGE, "Edit", "", WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON | BS_TEXT, 140, 70, 120, 20, hWnd, 0, hInst, NULL);
//Ввод числа В
hButton4 = CreateWindow("BUTTON", "InPut B", WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON | BS_TEXT, 10, 100, 120, 20, hWnd, (HMENU)BTN4, NULL, NULL);
Edit3 = CreateWindowEx(WS_EX_CLIENTEDGE, "Edit", "", WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON | BS_TEXT, 140, 100, 120, 20, hWnd, 0, hInst, NULL);
//Сумма введенных чисел
hButton5 = CreateWindow("BUTTON", "Show sum", WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON | BS_TEXT, 270, 70, 120, 20, hWnd, (HMENU)BTN5, NULL, NULL);
//Произведение введенных чисел
hButton6 = CreateWindow("BUTTON", "Show mult", WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON | BS_TEXT, 270, 100, 120, 20, hWnd, (HMENU)BTN6, NULL, NULL);
break;
case WM_SIZE:
sx = LOWORD(lParam);
sy = HIWORD(lParam);
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
// Разобрать выбор в меню:
switch (wmId)
{
case factorial:
char f[256];
GetWindowTextA(Edit1, f, 256);
ltoa(Factorial(atol(f)), f, 10);
MessageBoxA(0, f, _T("Факториал"), MB_OK);
break;
case BTN1:
DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
break;
case BTN2:
char ch[256];
GetWindowTextA(Edit1, ch, 256);
MessageBoxA(0, ch, _T("Эхо"), MB_OK);
break;
case BTN3:
char aChar[256];
GetWindowTextA(Edit2, aChar, 256);
aTemp = atoi(aChar);
MessageBoxA(0, _T("Число А введено"), _T("Window A"), MB_OK);
break;
case BTN4:
char bChar[256];
GetWindowTextA(Edit3, bChar, 256);
bTemp = atoi(bChar);
MessageBoxA(0, _T("Число B введено"), _T("Window B"), MB_OK);
break;
case BTN5:
char sumChar[256];
sumTemp = aTemp + bTemp;
itoa(sumTemp, sumChar, 10);
MessageBoxA(0, sumChar, _T("Сумма"), MB_OK);
break;
case BTN6:
char multChar[256];
multTemp = aTemp * bTemp;
itoa(multTemp, multChar, 10);
MessageBoxA(0, multChar, _T("Произведение"), MB_OK);
break;
case IDM_ABOUT:
DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
break;
case ID_VIEW_MYNEWDIALOG:
DialogBox(hInst, MAKEINTRESOURCE(IDD_VIEW), hWnd, View);
break;
case IDM_EXIT:
DestroyWindow(hWnd);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
break;
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
for (float i=1; i<4; i++) {
MoveToEx(hdc, 133+i, 0, NULL);
LineTo(hdc, 133+i, 33+i);
}
for (float i=1; i<4; i++) {
MoveToEx(hdc, 0, 33+i, NULL);
LineTo(hdc, sx, 33+i);
}
for (float i=1; i<4; i++) {
MoveToEx(hdc, 0, 63+i, NULL);
LineTo(hdc, sx, 63+i);
}
for (float i=1; i<4; i++) {
MoveToEx(hdc, 0, 123+i, NULL);
LineTo(hdc, sx, 123+i);
}
GetClientRect(hWnd, &rc);
GetTextExtentPoint32(hdc, szMsg, _tcslen(szMsg), &sz);
TextOut(hdc, (rc.right + rc.left - sz.cx)/2, ((rc.bottom + rc.top - sz.cy)/2) - 30, szMsg, _tcslen(szMsg));
//szMsg = "Below, we can see Factorial of 10 in HEX radix:";
szMsg = "Ниже, мы можем увидеть факториал числа 10 в DEC и HEX системе счисления:";
GetTextExtentPoint32(hdc, szMsg, _tcslen(szMsg), &sz);
TextOut(hdc, (rc.right + rc.left - sz.cx)/2, ((rc.bottom + rc.top - sz.cy)/2) - 10, szMsg, _tcslen(szMsg));
ltoa(Factorial(10), temp, 10);
GetTextExtentPoint32(hdc, LPCTSTR(temp), _tcslen(LPCTSTR(temp)), &sz);
TextOut(hdc, (rc.right + rc.left - sz.cx)/2 - sz.cx*2/3 , ((rc.bottom + rc.top - sz.cy)/2) + 10, LPCTSTR(temp), _tcslen(LPCTSTR(temp)));
ltoa(Factorial(10), temp, 16);
GetTextExtentPoint32(hdc, LPCTSTR(temp), _tcslen(LPCTSTR(temp)), &sz);
TextOut(hdc, (rc.right + rc.left - sz.cx)/2 + sz.cx*2/3, ((rc.bottom + rc.top - sz.cy)/2) + 10, LPCTSTR(temp), _tcslen(LPCTSTR(temp)));
// TODO: добавьте любой код отрисовки...
EndPaint(hWnd, &ps);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
// Обработчик сообщений для окна "О программе".
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
UNREFERENCED_PARAMETER(lParam);
switch (message)
{
case WM_INITDIALOG:
return (INT_PTR)TRUE;
case WM_COMMAND:
if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
{
EndDialog(hDlg, LOWORD(wParam));
return (INT_PTR)TRUE;
}
break;
}
return (INT_PTR)FALSE;
}
INT_PTR CALLBACK View(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
UNREFERENCED_PARAMETER(lParam);
switch (message)
{
case WM_INITDIALOG:
return (INT_PTR)TRUE;
case WM_COMMAND:
if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
{
EndDialog(hDlg, LOWORD(wParam));
return (INT_PTR)TRUE;
}
break;
}
return (INT_PTR)FALSE;
}
// Resource.h
#define IDC_MYICON 2
#define IDD_KURSOVIK_DIALOG 102
#define IDS_APP_TITLE 103
#define IDD_ABOUTBOX 103
#define IDM_ABOUT 104
#define IDM_EXIT 105
#define IDI_KURSOVIK 107
#define IDI_SMALL 108
#define IDC_KURSOVIK 109
#define IDR_MAINFRAME 128
#define IDD_VIEW 129
#define ID_VIEW_MYNEWDIALOG 130
#define BTN1 131
#define BTN2 132
#define BTN3 133
#define BTN4 134
#define BTN5 135
#define BTN6 136
#define factorial 137
Руководство пользователя.
При запуске программы появится следующее окно:
в котором продемонстрированы основные и часто использованные функции интерфейса WIN API. В Данном окне продемонстрированы статические элементы приложения, такие, как текст, который всегда будет рисоваться в центре нашего окна, чтобы убедиться в этом можно попробовать изменить размеры нашего окна. Так же, к статическим элементам относятся поля ввода и кнопки, которые так же размещены в нашем окне, но они размещены относительно, т.е. при изменении размеров окна, она их габариты и размеры останутся неизменными. К динамическим элементам относятся диалоговые окна и выпадающие списки.
Каждой статической кнопке соответствует поле ввода, кнопки InPut - являются кнопками подтверждения ввода переменных, с которыми можно провести некоторые операции, которые представлены так же в виде кнопок.