Я имел в виду что-то наподобие следующего, но такое решение мне не совсем нравится
WIN.H
C++ | 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
| #pragma once
/*--------------------------------------------------------------------------------------+
| CLASS CWINDOW |
+--------------------------------------------------------------------------------------*/
class CWindow
{
public:
/* Переменные */
HWND m_hWnd;
/* Конструктор */
CWindow(void);
/* Методы */
virtual bool CreateEx(HINSTANCE hInst,
LPCTSTR lpszName,
LPCTSTR lpszClass = "CWINDOW",
DWORD dwExStyle = 0,
DWORD dwStyle = WS_OVERLAPPEDWINDOW,
int x = CW_USEDEFAULT,
int y = CW_USEDEFAULT,
int nWidth = CW_USEDEFAULT,
int nHeight = CW_USEDEFAULT,
HWND hParent = NULL,
HMENU hMenu = NULL);
bool RegisterClass(LPCTSTR lpszClass, HINSTANCE hInst);
virtual WPARAM MessageLoop(void);
BOOL ShowWindow(int nCmdShow) const;
BOOL UpdateWindow(void) const;
private:
virtual void OnDraw(HDC hDC);
virtual void OnKeyDown(WPARAM wParam, LPARAM lParam);
virtual LRESULT WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
virtual void GetWndClassEx(WNDCLASSEX &wc);
private:
static LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
}; |
|
WIN.CPP
C++ | 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
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
| #include <windows.h>
#include "win.h"
/*--------------------------------------------------------------------------------------+
| РЕАЛИЗАЦИЯ CLASSA CWINDOW |
+--------------------------------------------------------------------------------------*/
CWindow::CWindow()
{
m_hWnd = NULL;
}
void CWindow::OnDraw(
HDC hDC)
{
}
void CWindow::OnKeyDown(
WPARAM wParam,
LPARAM lParam)
{
}
LRESULT CWindow::WndProc(
HWND hWnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam)
{
switch(uMsg)
{
case WM_KEYDOWN:
OnKeyDown(wParam, lParam);
return 0;
case WM_PAINT:
{
PAINTSTRUCT ps;
BeginPaint(m_hWnd, &ps);
OnDraw(ps.hdc);
EndPaint(m_hWnd, &ps);
}
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hWnd,
uMsg, wParam, lParam);
}
LRESULT CALLBACK CWindow::WindowProc(
HWND hWnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam)
{
CWindow *pWindow;
if (uMsg == WM_NCCREATE)
{
MDICREATESTRUCT *pMDIC =
(MDICREATESTRUCT*)((LPCREATESTRUCT)lParam)->lpCreateParams;
pWindow = (CWindow*)(pMDIC->lParam);
SetWindowLong(hWnd, GWL_USERDATA, (LONG) pWindow);
}
else
pWindow = (CWindow*)GetWindowLong(hWnd, GWL_USERDATA);
if (pWindow)
return pWindow->WndProc(hWnd, uMsg, wParam, lParam);
else
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
void CWindow::GetWndClassEx(
WNDCLASSEX &wc)
{
memset(& wc, 0, sizeof(wc));
/* Здесь реализуется заполнения шаблона
значениями по-умолчанию, то есть такие
параметры будут иметь все созданные окна
при помощи класса CWindow.
*/
wc.cbSize = sizeof(WNDCLASSEX);
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = WindowProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = NULL;
wc.hIcon = NULL;
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH) (COLOR_WINDOW + 1);
wc.lpszMenuName = NULL;
wc.lpszClassName = NULL;
wc.hIconSm = NULL;
}
bool CWindow::CreateEx(
HINSTANCE hInst,
LPCTSTR lpszName,
LPCTSTR lpszClass,
DWORD dwExStyle,
DWORD dwStyle,
int x, int y,
int nWidth, int nHeight,
HWND hParent,
HMENU hMenu)
{
if (!RegisterClass(lpszClass, hInst))
return false;
MDICREATESTRUCT mdic;
memset(& mdic, 0, sizeof(mdic));
mdic.lParam = (LPARAM) this;
m_hWnd = CreateWindowEx(dwExStyle, lpszClass,
lpszName, dwStyle, x, y, nWidth, nHeight,
hParent, hMenu, hInst, & mdic);
return m_hWnd != NULL;
}
bool CWindow::RegisterClass(
LPCTSTR lpszClass,
HINSTANCE hInst)
{
WNDCLASSEX wc;
wc.cbSize = sizeof(wc);
if (!GetClassInfoEx(hInst, lpszClass, &wc))
{
GetWndClassEx(wc);
wc.hInstance = hInst;
wc.lpszClassName = lpszClass;
if (!RegisterClassEx(&wc))
return false;
}
return true;
}
WPARAM CWindow::MessageLoop()
{
MSG msg;
while(GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
BOOL CWindow::ShowWindow(int nCmdShow) const
{
return ::ShowWindow(m_hWnd, nCmdShow);
}
BOOL CWindow::UpdateWindow(void) const
{
return ::UpdateWindow(m_hWnd);
} |
|
C++ | 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
| #include <windows.h>
#include "win.h"
/* Класс дочерний от CWindow */
class ChildWin : public CWindow
{
private:
/* WM_PAINT */
void OnDraw(HDC hDC)
{
TextOut(hDC, 20, 20, "HELLO, WORLD!", 13);
}
/* WM_ONKEYDOWN */
void OnKeyDown(WPARAM wParam, LPARAM lParam)
{
switch(wParam)
{
case VK_ESCAPE:
PostMessage(m_hWnd, WM_CLOSE, wParam, lParam);
break;
}
}
};
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR lpCmd, int nShow)
{
CWindow CWIN; /* I. ПРИМЕР СОЗДАНИЯ ОКНА CWINDOW */
CWIN.CreateEx(hInst, "ПРИМЕР ОКНА CWINDOW"); // 1. CreateEx - создать окно
CWIN.ShowWindow(nShow); // 2. ShowWindow - показать окно
CWIN.UpdateWindow(); // 3. UpdateWindow - обновить окно
/*CWIN.MessageLoop();*/ // 4. MessageLoop - запустить цикл обработки сообщений
ChildWin CCHILD; /* II. ПРИМЕР СОЗДАНИЯ ОКНА НА ОСНВОВЕ CWINDOW */
CCHILD.CreateEx(hInst,"ПРИМЕР ДОЧЕРНЕГО ОКНА CWINDOW", // Процедура создания окна ничем не отличается,
"CWINDOWCHILD", // Подробнее смотреть описание класса ChildWin.
0, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT,
200, 200);
CCHILD.ShowWindow(nShow);
CCHILD.UpdateWindow();
CCHILD.MessageLoop();
CWIN.MessageLoop();
return 0;
} |
|
0
|