Книжная полка Сохранить
Размер шрифта:
А
А
А
|  Шрифт:
Arial
Times
|  Интервал:
Стандартный
Средний
Большой
|  Цвет сайта:
Ц
Ц
Ц
Ц
Ц

Программирование под Windows графических интерфейсов пользователя

Покупка
Основная коллекция
Артикул: 778165.01.99
В учебном пособии рассмотрены основы программирования интерфейсов пользователя в ОС WINDOWS с использованием Windows API, Windows Forms, WPF и UWP. Предлагаемые в конце каждого раздела задания позволяют глубже ознакомиться с возможностями описанных в разделе технологий. Пособие рекомендуется студентам старших курсов ФПМИ.
Рояк, М. Э. Программирование под Windows графических интерфейсов пользователя : учебное пособие / М. Э. Рояк, И. М. Ступаков. - Новосибирск : Изд-во НГТУ, 2018. - 72 с. - ISBN 978-5-7782-3754-4. - Текст : электронный. - URL: https://znanium.com/catalog/product/1866917 (дата обращения: 19.05.2024). – Режим доступа: по подписке.
Фрагмент текстового слоя документа размещен для индексирующих роботов. Для полноценной работы с документом, пожалуйста, перейдите в ридер.
Министерство науки и высшего образования Российской Федерации 

НОВОСИБИРСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ 

 
 
 
 
 
 
М.Э. РОЯК, И.М. СТУПАКОВ  
 
 
 
 
 
ПРОГРАММИРОВАНИЕ 
ПОД 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); 

113  
114    return TRUE; 
115 } 
116  
117 // 
118 //  FUNCTION: WndProc(HWND, UINT, WPARAM, LPARAM) 
119 // 
120 //  PURPOSE:  Processes messages for the main window. 
121 // 
122 //  WM_COMMAND  ‐ process the application menu 
123 //  WM_PAINT    ‐ Paint the main window 
124 //  WM_DESTROY  ‐ post a quit message and return 
125 // 
126 // 
127 LRESULT CALLBACK WndProc(HWND hWnd, UINT message,  
128    
 
 
 
 
WPARAM wParam, LPARAM lParam) 
129 { 
130     switch (message) 
131     { 
132     case WM_COMMAND: 
133         { 
134         int wmId = LOWORD(wParam); 
135         // Parse the menu selections: 
136         switch (wmId) 
137         { 
138         case IDM_ABOUT: 
139     DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX),  
         hWnd, About); 
140                 break; 
141         case IDM_EXIT: 
142     DestroyWindow(hWnd); 
143                 break; 
144        default: 
145     return DefWindowProc(hWnd, message, wParam, lParam); 
146         } 
147     } 
148     break; 
149     case WM_PAINT: 
150         { 

151         PAINTSTRUCT ps; 
152         HDC hdc = BeginPaint(hWnd, &ps); 
153         // TODO: Add any drawing code that uses  
             // hdc here... 
154         EndPaint(hWnd, &ps); 
155         } 
156         break; 
157     case WM_DESTROY: 
158         PostQuitMessage(0); 
159         break; 
160     default: 
161      return DefWindowProc(hWnd, message, wParam, lParam); 
162     } 
163     return 0; 
164 } 
165  
166 // Message handler for about box. 
167 INT_PTR CALLBACK About(HWND hDlg, UINT message,  
168    
 
 
 
 
WPARAM wParam, LPARAM lParam) 
169 { 
170     UNREFERENCED_PARAMETER(lParam); 
171     switch (message) 
172     { 
173     case WM_INITDIALOG: 
174         return (INT_PTR)TRUE; 
175  
176     case WM_COMMAND: 
177        if (LOWORD(wParam) == IDOK || LOWORD(wParam) ==  
            IDCANCEL) 
178         { 
179             EndDialog(hDlg, LOWORD(wParam)); 
180             return (INT_PTR)TRUE; 
181         } 
182         break; 
183     } 
184     return (INT_PTR)FALSE; 
185 }