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