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
12extern bool g_IsNT;
13#endif
14
15namespace NWindows {
16
17#ifndef _UNICODE
18ATOM MyRegisterClass(CONST WNDCLASSW *wndClass);
19#endif
20
21namespace 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
29static 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
49bool 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
76bool 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
123LRESULT 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
133LRESULT 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
163bool CWindow2::OnCommand(WPARAM wParam, LPARAM lParam, LRESULT &result)
164{
165  return OnCommand(HIWORD(wParam), LOWORD(wParam), lParam, result);
166}
167
168bool 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/*
179bool 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