1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
| #include <windows.h>
#include <gdiplus.h>
#pragma comment(lib, "Gdiplus.lib")
using namespace Gdiplus;
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
VOID OnPaint(HDC hdc);
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nCmdShow)
{
TCHAR szClassName[] = L"Мой класс"; // строка с именем класса
HWND hMainWnd; // создаём дескриптор будущего окошка
MSG msg; // создём экземпляр структуры MSG для обработки сообщений
GdiplusStartupInput gdiplusStartupInput;
ULONG_PTR gdiplusToken;
WNDCLASSEX wc; // создаём экземпляр, для обращения к членам класса WNDCLASSEX
wc.cbSize = sizeof(wc); // размер структуры (в байтах)
wc.style = CS_HREDRAW | CS_VREDRAW; // стиль класса окошка
wc.lpfnWndProc = WndProc; // указатель на пользовательскую функцию
wc.lpszMenuName = NULL; // указатель на имя меню (у нас его нет)
wc.lpszClassName = szClassName; // указатель на имя класса
wc.cbWndExtra = NULL; // число освобождаемых байтов в конце структуры
wc.cbClsExtra = NULL; // число освобождаемых байтов при создании экземпляра приложения
wc.hIcon = LoadIcon(NULL, IDI_WINLOGO); // декриптор пиктограммы
wc.hIconSm = LoadIcon(NULL, IDI_WINLOGO); // дескриптор маленькой пиктограммы (в трэе)
wc.hCursor = LoadCursor(NULL, IDC_ARROW); // дескриптор курсора
wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); // дескриптор кисти для закраски фона окна
wc.hInstance = hInst; // указатель на строку, содержащую имя меню, применяемого для класса
if (!GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL)) // запускаем ГДИ и проверям на наличие ошибок
{
MessageBox(NULL, L"Не получилось запустить GDI!", L"Ошибка", MB_OK | MB_ICONWARNING);
return NULL; // возвращаем, следовательно, выходим из WinMain
}
if (!RegisterClassEx(&wc))
{
// в случае отсутствия регистрации класса:
MessageBox(NULL, L"Не получилось зарегистрировать класс!", L"Ошибка", MB_OK | MB_ICONWARNING);
return NULL; // возвращаем, следовательно, выходим из WinMain
}
// Функция, создающая окошко:
hMainWnd = CreateWindow(
szClassName, // имя класса
L"Полноценная оконная процедура", // имя окошка (то что сверху)
WS_OVERLAPPEDWINDOW | WS_VSCROLL, // режимы отображения окошка
CW_USEDEFAULT, // позиция окошка по оси х
NULL, // позиция окошка по оси у (раз дефолт в х, то писать не нужно)
CW_USEDEFAULT, // ширина окошка
NULL, // высота окошка (раз дефолт в ширине, то писать не нужно)
(HWND)NULL, // дескриптор родительского окна
NULL, // дескриптор меню
HINSTANCE(hInst), // дескриптор экземпляра приложения
NULL); // ничего не передаём из WndProc
if (!hMainWnd)
{
MessageBox(NULL, L"Не получилось создать окно!", L"Ошибка", MB_OK);
return NULL;
}
ShowWindow(hMainWnd, nCmdShow); // отображаем окошко
UpdateWindow(hMainWnd); // обновляем окошко
while (GetMessage(&msg, NULL, NULL, NULL))
{ // извлекаем сообщения из очереди, посылаемые фу-циями, ОС
TranslateMessage(&msg); // интерпретируем сообщения
DispatchMessage(&msg); // передаём сообщения обратно ОС
}
GdiplusShutdown(gdiplusToken); // выключаем ГДИ и ложим прогу спать
return msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
HDC hDC;
PAINTSTRUCT ps;
switch (uMsg)
{
case WM_CREATE:
MessageBox(hWnd, L"Привет паца, ты крутой програм ибо создал это окошко и твоя прога пашет, удачи))!!)!)!)!", L"re", MB_OK | MB_ICONHAND);
break;
case WM_DESTROY: // если окошко закрылось, то:
PostQuitMessage(NULL); // отправляем WinMain() сообщение WM_QUIT
break;
case WM_PAINT: //рисуем
hDC = BeginPaint(hWnd, &ps); // начинаем рисовать
OnPaint(hDC); // пользовательская функция рисования
EndPaint(hWnd, &ps); // заканчиваем рисовать
break;
default:
return DefWindowProc(hWnd, uMsg, wParam, lParam); // если закрыли окошко
}
return NULL; // возвращаем значение
}
VOID OnPaint(HDC hdc)
{ //ну здесь все понятно всякие шрифты для текса и т.д.
Graphics graphics(hdc);
SolidBrush brush(Color::Blue);
FontFamily fontFamily(L"Times New Roman");
Font font(&fontFamily, 24, FontStyleRegular, UnitPixel);
PointF pointF(10.0f, 20.0f);
graphics.DrawString(L"Все вышло, -1, &font, pointF, &brush); // рисуем свои каракули на экране
} |