Программирование под 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);