Программирование под Windows графических интерфейсов пользователя
Покупка
Основная коллекция
Тематика:
Программирование и алгоритмизация
Издательство:
Новосибирский государственный технический университет
Год издания: 2018
Кол-во страниц: 72
Дополнительно
Вид издания:
Учебное пособие
Уровень образования:
ВО - Бакалавриат
ISBN: 978-5-7782-3754-4
Артикул: 778165.01.99
В учебном пособии рассмотрены основы программирования интерфейсов пользователя в ОС WINDOWS с использованием Windows API, Windows Forms, WPF и UWP. Предлагаемые в конце каждого
раздела задания позволяют глубже ознакомиться с возможностями описанных в разделе технологий. Пособие рекомендуется студентам старших курсов ФПМИ.
Тематика:
ББК:
УДК:
ОКСО:
- ВО - Бакалавриат
- 01.03.02: Прикладная математика и информатика
- 09.03.01: Информатика и вычислительная техника
- 09.03.03: Прикладная информатика
ГРНТИ:
Скопировать запись
Фрагмент текстового слоя документа размещен для индексирующих роботов
Министерство науки и высшего образования Российской Федерации НОВОСИБИРСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ М.Э. РОЯК, И.М. СТУПАКОВ ПРОГРАММИРОВАНИЕ ПОД WINDOWS ГРАФИЧЕСКИХ ИНТЕРФЕЙСОВ ПОЛЬЗОВАТЕЛЯ Утверждено Редакционно-издательским советом университета в качестве учебного пособия НОВОСИБИРСК 2018
УДК 004.45:004.514(075.8)
Р 816
Рецензенты:
канд. техн. наук, доцент А.Г. Задорожный
канд. техн. наук, доцент В.М. Стасышин
Рояк М.Э.
Р 816
Программирование под Windows графических интерфейсов
пользователя: учебное пособие / М.Э. Рояк, И.М. Ступаков. –
Новосибирск: Изд-во НГТУ, 2018. – 72 с.
ISBN 978-5-7782-3754-4
В учебном пособии рассмотрены основы программирования интерфейсов пользователя в ОС WINDOWS с использованием Windows
API, Windows Forms, WPF и UWP. Предлагаемые в конце каждого
раздела задания позволяют глубже ознакомиться с возможностями
описанных в разделе технологий. Пособие рекомендуется студентам
старших курсов ФПМИ.
УДК 004.45:004.514(075.8)
ISBN 978-5-7782-3754-4
© Рояк М.Э., Ступаков И.М., 2018
© Новосибирский государственный
технический университет, 2018
1. БАЗОВЫЕ ПОНЯТИЯ ПРОГРАММИРОВАНИЯ ПОД WINDOWS. WINDOWS API 1.1. ЦИКЛ ОБРАБОТКИ СООБЩЕНИЙ И ФУНКЦИЯ ОКНА Для того чтобы понимать преимущества современных технологий программирования, иногда полезно познакомиться с теми средствами, которые использовались до появления этих технологий. Для программирования под ОС Windows таким базовым средством является написание программ на C++ с использованием непосредственных вызовов функций Windows API (Application Program Interface). Эта технология программирования существует более 30 лет и в чистом виде сейчас практически не используется. Тем не менее современные версии MS Visual Studio (на момент написания этого пособия Visual Studio 2017) сохраняют средства поддержки этой технологии и даже создают шаблонную программу при выборе соответствующего типа проекта. Если создать проект типа «Windows Desktop Application» для языка С++ и дать ему имя «WindowsDesktopBase», то Visual Studio 2017 сгенерирует проект, содержащий файлы header.h, resource.h, targetver.h, WindowsDesktopBase.h, WindowsDesktopBase.cpp, small.ico, WindowsDesktopBase.ico и Windows DesktopBase.rc. Файл header.h содержит включения основных заголовочных файлов: // header.h: include file for standard system include files, // or project specific include files // #pragma once #include "targetver.h" #define WIN32_LEAN_AND_MEAN
// Windows Header Files:
#include <windows.h>
// C RunTime Header Files
#include <stdlib.h>
#include <malloc.h>
#include <memory.h>
#include <tchar.h>
// TODO: reference additional headers your program requires here
Файл resource.h имеет следующий вид:
//{{NO_DEPENDENCIES}}
// Microsoft Visual C++ generated include file.
// Used by WindowsDesktopBase.rc
//
#define IDS_APP_TITLE
103
#define IDR_MAINFRAME
128
#define IDD_WINDOWSDESKTOPBASE_DIALOG 102
#define IDD_ABOUTBOX
103
#define IDM_ABOUT
104
#define IDM_EXIT
105
#define IDI_WINDOWSDESKTOPBASE
107
#define IDI_SMALL
108
#define IDC_WINDOWSDESKTOPBASE
109
#define IDC_MYICON
2
#ifndef IDC_STATIC
#define IDC_STATIC
‐1
#endif
// Next default values for new objects
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NO_MFC
130
#define _APS_NEXT_RESOURCE_VALUE 129
#define _APS_NEXT_COMMAND_VALUE
32771
#define _APS_NEXT_CONTROL_VALUE
1000
#define _APS_NEXT_SYMED_VALUE 110 #endif #endif Комментарий в начале файла указывает, что этот файл генерируется IDE (т. е. не предназначен для ручного редактирования) и используется в WindowsDesktopBase.rc. Файл targetver.h имеет вид: #pragma once // Including SDKDDKVer.h defines the highest available // Windows platform. // If you wish to build your application for a previous // Windows // platform, include WinSDKVer.h and // set the _WIN32_WINNT macro to the platform you wish // to support // before including SDKDDKVer.h. #include <SDKDDKVer.h> Этот файл описания проекта предназначен для управления целевой версией Windows для этого проекта, поэтому для нашего ознакомительного обзора интереса не представляет. Файл WindowsDesktopBase.h предназначен для описания типов, используемых в проекте, и поэтому пока практически пуст: #pragma once #include "resource.h" Наибольший интерес представляет файл WindowsDesktopBase.cpp. Приведем его полностью с нумерацией строк, чтобы в дальнейшем была возможность дать пояснения к программе: 1 // WindowsDesktopBase.cpp: Defines the entry point for the 2 // application. 3 //
4
5 #include "header.h"
6 #include "WindowsDesktopBase.h"
7
8 #define MAX_LOADSTRING 100
9
10 // Global Variables:
11 HINSTANCE hInst; // current instance
12 WCHAR szTitle[MAX_LOADSTRING]; // The title bar text
13 WCHAR szWindowClass[MAX_LOADSTRING]; // the main window
// class name
14
15 // Forward declarations of functions included in
// this code module:
16 ATOM MyRegisterClass(HINSTANCE hInstance);
17 BOOL InitInstance(HINSTANCE, int);
18 LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
19 INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM);
20
21 int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
22 _In_opt_ HINSTANCE hPrevInstance,
23 _In_ LPWSTR lpCmdLine,
24 _In_ int nCmdShow)
25 {
26 UNREFERENCED_PARAMETER(hPrevInstance);
27 UNREFERENCED_PARAMETER(lpCmdLine);
28
29 // TODO: Place code here.
30
31 // Initialize global strings
32 LoadStringW(hInstance, IDS_APP_TITLE, szTitle,
MAX_LOADSTRING);
33 LoadStringW(hInstance, IDC_WINDOWSDESKTOPBASE,
34
szWindowClass, MAX_LOADSTRING);
35 MyRegisterClass(hInstance);
36
37 // Perform application initialization:
38 if (!InitInstance (hInstance, nCmdShow))
39 {
40 return FALSE;
41 }
42
43 HACCEL hAccelTable = LoadAccelerators(hInstance,
44
MAKEINTRESOURCE(IDC_WINDOWSDESKTOPBASE));
45
46 MSG msg;
47
48 // Main message loop:
49 while (GetMessage(&msg, nullptr, 0, 0))
50 {
51 if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
52 {
53 TranslateMessage(&msg);
54 DispatchMessage(&msg);
55 }
56 }
57
58 return (int) msg.wParam;
59 }
60 //
61 // FUNCTION: MyRegisterClass()
62 //
63 // PURPOSE: Registers the window class.
64 //
65 ATOM MyRegisterClass(HINSTANCE hInstance)
66 {
67 WNDCLASSEXW wcex;
68
69 wcex.cbSize = sizeof(WNDCLASSEX);
70
71 wcex.style = CS_HREDRAW | CS_VREDRAW;
72 wcex.lpfnWndProc = WndProc;
73 wcex.cbClsExtra = 0;
74 wcex.cbWndExtra = 0;
75 wcex.hInstance = hInstance;
76 wcex.hIcon = LoadIcon(hInstance,
77
MAKEINTRESOURCE(IDI_WINDOWSDESKTOPBASE));
78 wcex.hCursor = LoadCursor(nullptr, IDC_ARROW);
79 wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
80 wcex.lpszMenuName =
MAKEINTRESOURCEW(IDC_WINDOWSDESKTOPBASE);
81 wcex.lpszClassName = szWindowClass;
82 wcex.hIconSm = LoadIcon(wcex.hInstance,
83
MAKEINTRESOURCE(IDI_SMALL));
84
85 return RegisterClassExW(&wcex);
86 }
87
88 //
89 // FUNCTION: InitInstance(HINSTANCE, int)
90 //
91 // PURPOSE: Saves instance handle and creates main
// window
92 //
93 // COMMENTS:
94 //
95 // In this function, we save the instance handle in a
96 // global variable and create and display the main program
window.
97 //
98 BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
99 {
100 hInst = hInstance; // Store instance handle in our
global variable
101
102 HWND hWnd = CreateWindowW(szWindowClass, szTitle,
103
WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0,
104
CW_USEDEFAULT, 0, nullptr, nullptr, hInstance,
nullptr);
105
106 if (!hWnd)
107 {
108 return FALSE;
109 }
110
111 ShowWindow(hWnd, nCmdShow);
112 UpdateWindow(hWnd);