1 // Windows/Control/Window2.cpp
2
3 #include "StdAfx.h"
4
5 #ifndef _UNICODE
6 #include "../../Common/StringConvert.h"
7 #endif
8
9 #include "Window2.h"
10
11 #ifndef _UNICODE
12 extern bool g_IsNT;
13 #endif
14
15 namespace NWindows {
16
17 #ifndef _UNICODE
18 ATOM MyRegisterClass(CONST WNDCLASSW *wndClass);
19 #endif
20
21 namespace NControl {
22
23 #ifdef UNDER_CE
24 #define MY_START_WM_CREATE WM_CREATE
25 #else
26 #define MY_START_WM_CREATE WM_NCCREATE
27 #endif
28
WindowProcedure(HWND aHWND,UINT message,WPARAM wParam,LPARAM lParam)29 static LRESULT CALLBACK WindowProcedure(HWND aHWND, UINT message, WPARAM wParam, LPARAM lParam)
30 {
31 CWindow tempWindow(aHWND);
32 if (message == MY_START_WM_CREATE)
33 tempWindow.SetUserDataLongPtr((LONG_PTR)(((LPCREATESTRUCT)lParam)->lpCreateParams));
34 CWindow2 *window = (CWindow2 *)(tempWindow.GetUserDataLongPtr());
35 if (window != NULL && message == MY_START_WM_CREATE)
36 window->Attach(aHWND);
37 if (window == 0)
38 {
39 #ifndef _UNICODE
40 if (g_IsNT)
41 return DefWindowProcW(aHWND, message, wParam, lParam);
42 else
43 #endif
44 return DefWindowProc(aHWND, message, wParam, lParam);
45 }
46 return window->OnMessage(message, wParam, lParam);
47 }
48
CreateEx(DWORD exStyle,LPCTSTR className,LPCTSTR windowName,DWORD style,int x,int y,int width,int height,HWND parentWindow,HMENU idOrHMenu,HINSTANCE instance)49 bool CWindow2::CreateEx(DWORD exStyle, LPCTSTR className, LPCTSTR windowName,
50 DWORD style, int x, int y, int width, int height,
51 HWND parentWindow, HMENU idOrHMenu, HINSTANCE instance)
52 {
53 WNDCLASS wc;
54 if (!::GetClassInfo(instance, className, &wc))
55 {
56 // wc.style = CS_HREDRAW | CS_VREDRAW;
57 wc.style = 0;
58 wc.lpfnWndProc = WindowProcedure;
59 wc.cbClsExtra = 0;
60 wc.cbWndExtra = 0;
61 wc.hInstance = instance;
62 wc.hIcon = NULL;
63 wc.hCursor = LoadCursor(NULL, IDC_ARROW);
64 wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
65 wc.lpszMenuName = NULL;
66 wc.lpszClassName = className;
67 if (::RegisterClass(&wc) == 0)
68 return false;
69 }
70 return CWindow::CreateEx(exStyle, className, windowName, style,
71 x, y, width, height, parentWindow, idOrHMenu, instance, this);
72 }
73
74 #ifndef _UNICODE
75
CreateEx(DWORD exStyle,LPCWSTR className,LPCWSTR windowName,DWORD style,int x,int y,int width,int height,HWND parentWindow,HMENU idOrHMenu,HINSTANCE instance)76 bool CWindow2::CreateEx(DWORD exStyle, LPCWSTR className, LPCWSTR windowName,
77 DWORD style, int x, int y, int width, int height,
78 HWND parentWindow, HMENU idOrHMenu, HINSTANCE instance)
79 {
80 bool needRegister;
81 if (g_IsNT)
82 {
83 WNDCLASSW wc;
84 needRegister = ::GetClassInfoW(instance, className, &wc) == 0;
85 }
86 else
87 {
88 WNDCLASSA windowClassA;
89 AString classNameA;
90 LPCSTR classNameP;
91 if (IS_INTRESOURCE(className))
92 classNameP = (LPCSTR)className;
93 else
94 {
95 classNameA = GetSystemString(className);
96 classNameP = classNameA;
97 }
98 needRegister = ::GetClassInfoA(instance, classNameP, &windowClassA) == 0;
99 }
100 if (needRegister)
101 {
102 WNDCLASSW wc;
103 // wc.style = CS_HREDRAW | CS_VREDRAW;
104 wc.style = 0;
105 wc.lpfnWndProc = WindowProcedure;
106 wc.cbClsExtra = 0;
107 wc.cbWndExtra = 0;
108 wc.hInstance = instance;
109 wc.hIcon = NULL;
110 wc.hCursor = LoadCursor(NULL, IDC_ARROW);
111 wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
112 wc.lpszMenuName = NULL;
113 wc.lpszClassName = className;
114 if (MyRegisterClass(&wc) == 0)
115 return false;
116 }
117 return CWindow::CreateEx(exStyle, className, windowName, style,
118 x, y, width, height, parentWindow, idOrHMenu, instance, this);
119 }
120
121 #endif
122
DefProc(UINT message,WPARAM wParam,LPARAM lParam)123 LRESULT CWindow2::DefProc(UINT message, WPARAM wParam, LPARAM lParam)
124 {
125 #ifndef _UNICODE
126 if (g_IsNT)
127 return DefWindowProcW(_window, message, wParam, lParam);
128 else
129 #endif
130 return DefWindowProc(_window, message, wParam, lParam);
131 }
132
OnMessage(UINT message,WPARAM wParam,LPARAM lParam)133 LRESULT CWindow2::OnMessage(UINT message, WPARAM wParam, LPARAM lParam)
134 {
135 LRESULT result;
136 switch (message)
137 {
138 case WM_CREATE:
139 if (!OnCreate((CREATESTRUCT *)lParam))
140 return -1;
141 break;
142 case WM_COMMAND:
143 if (OnCommand(wParam, lParam, result))
144 return result;
145 break;
146 case WM_NOTIFY:
147 if (OnNotify((UINT)wParam, (LPNMHDR) lParam, result))
148 return result;
149 break;
150 case WM_DESTROY:
151 OnDestroy();
152 break;
153 case WM_CLOSE:
154 OnClose();
155 return 0;
156 case WM_SIZE:
157 if (OnSize(wParam, LOWORD(lParam), HIWORD(lParam)))
158 return 0;
159 }
160 return DefProc(message, wParam, lParam);
161 }
162
OnCommand(WPARAM wParam,LPARAM lParam,LRESULT & result)163 bool CWindow2::OnCommand(WPARAM wParam, LPARAM lParam, LRESULT &result)
164 {
165 return OnCommand(HIWORD(wParam), LOWORD(wParam), lParam, result);
166 }
167
OnCommand(int,int,LPARAM,LRESULT &)168 bool CWindow2::OnCommand(int /* code */, int /* itemID */, LPARAM /* lParam */, LRESULT & /* result */)
169 {
170 return false;
171 // return DefProc(message, wParam, lParam);
172 /*
173 if (code == BN_CLICKED)
174 return OnButtonClicked(itemID, (HWND)lParam);
175 */
176 }
177
178 /*
179 bool CDialog::OnButtonClicked(int buttonID, HWND buttonHWND)
180 {
181 switch(aButtonID)
182 {
183 case IDOK:
184 OnOK();
185 break;
186 case IDCANCEL:
187 OnCancel();
188 break;
189 case IDHELP:
190 OnHelp();
191 break;
192 default:
193 return false;
194 }
195 return true;
196 }
197
198 */
199
200 }}
201