Home | History | Annotate | Download | only in Control
      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 
     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 
     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 
     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 
    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 
    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 
    163 bool CWindow2::OnCommand(WPARAM wParam, LPARAM lParam, LRESULT &result)
    164 {
    165   return OnCommand(HIWORD(wParam), LOWORD(wParam), lParam, result);
    166 }
    167 
    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 (buttonID)
    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