Home | History | Annotate | Download | only in Windows
      1 // Windows/Window.cpp
      2 
      3 #include "StdAfx.h"
      4 
      5 #ifndef _UNICODE
      6 #include "../Common/StringConvert.h"
      7 #endif
      8 #include "Window.h"
      9 
     10 #ifndef _UNICODE
     11 extern bool g_IsNT;
     12 #endif
     13 
     14 namespace NWindows {
     15 
     16 #ifndef _UNICODE
     17 ATOM MyRegisterClass(CONST WNDCLASSW *wndClass)
     18 {
     19   if (g_IsNT)
     20     return RegisterClassW(wndClass);
     21   WNDCLASSA wndClassA;
     22   wndClassA.style = wndClass->style;
     23   wndClassA.lpfnWndProc = wndClass->lpfnWndProc;
     24   wndClassA.cbClsExtra = wndClass->cbClsExtra;
     25   wndClassA.cbWndExtra = wndClass->cbWndExtra;
     26   wndClassA.hInstance = wndClass->hInstance;
     27   wndClassA.hIcon = wndClass->hIcon;
     28   wndClassA.hCursor = wndClass->hCursor;
     29   wndClassA.hbrBackground = wndClass->hbrBackground;
     30   AString menuName;
     31   AString className;
     32   if (IS_INTRESOURCE(wndClass->lpszMenuName))
     33     wndClassA.lpszMenuName = (LPCSTR)wndClass->lpszMenuName;
     34   else
     35   {
     36     menuName = GetSystemString(wndClass->lpszMenuName);
     37     wndClassA.lpszMenuName = menuName;
     38   }
     39   if (IS_INTRESOURCE(wndClass->lpszClassName))
     40     wndClassA.lpszClassName = (LPCSTR)wndClass->lpszClassName;
     41   else
     42   {
     43     className = GetSystemString(wndClass->lpszClassName);
     44     wndClassA.lpszClassName = className;
     45   }
     46   return RegisterClassA(&wndClassA);
     47 }
     48 
     49 bool CWindow::Create(LPCWSTR className,
     50       LPCWSTR windowName, DWORD style,
     51       int x, int y, int width, int height,
     52       HWND parentWindow, HMENU idOrHMenu,
     53       HINSTANCE instance, LPVOID createParam)
     54 {
     55   if (g_IsNT)
     56   {
     57     _window = ::CreateWindowW(className, windowName,
     58         style, x, y, width, height, parentWindow,
     59         idOrHMenu, instance, createParam);
     60      return (_window != NULL);
     61   }
     62   return Create(GetSystemString(className), GetSystemString(windowName),
     63         style, x, y, width, height, parentWindow,
     64         idOrHMenu, instance, createParam);
     65 }
     66 
     67 bool CWindow::CreateEx(DWORD exStyle, LPCWSTR className,
     68       LPCWSTR windowName, DWORD style,
     69       int x, int y, int width, int height,
     70       HWND parentWindow, HMENU idOrHMenu,
     71       HINSTANCE instance, LPVOID createParam)
     72 {
     73   if (g_IsNT)
     74   {
     75     _window = ::CreateWindowExW(exStyle, className, windowName,
     76       style, x, y, width, height, parentWindow,
     77       idOrHMenu, instance, createParam);
     78      return (_window != NULL);
     79   }
     80   AString classNameA;
     81   LPCSTR classNameP;
     82   if (IS_INTRESOURCE(className))
     83     classNameP = (LPCSTR)className;
     84   else
     85   {
     86     classNameA = GetSystemString(className);
     87     classNameP = classNameA;
     88   }
     89   AString windowNameA;
     90   LPCSTR windowNameP;
     91   if (IS_INTRESOURCE(windowName))
     92     windowNameP = (LPCSTR)windowName;
     93   else
     94   {
     95     windowNameA = GetSystemString(windowName);
     96     windowNameP = windowNameA;
     97   }
     98   return CreateEx(exStyle, classNameP, windowNameP,
     99       style, x, y, width, height, parentWindow,
    100       idOrHMenu, instance, createParam);
    101 }
    102 
    103 #endif
    104 
    105 #ifndef _UNICODE
    106 bool MySetWindowText(HWND wnd, LPCWSTR s)
    107 {
    108   if (g_IsNT)
    109     return BOOLToBool(::SetWindowTextW(wnd, s));
    110   return BOOLToBool(::SetWindowTextA(wnd, UnicodeStringToMultiByte(s)));
    111 }
    112 #endif
    113 
    114 bool CWindow::GetText(CSysString &s)
    115 {
    116   s.Empty();
    117   int len = GetTextLength();
    118   if (len == 0)
    119     return (::GetLastError() == ERROR_SUCCESS);
    120   TCHAR *p = s.GetBuf(len);
    121   {
    122     int len2 = GetText(p, len + 1);
    123     if (len > len2)
    124       len = len2;
    125   }
    126   s.ReleaseBuf_CalcLen(len);
    127   if (len == 0)
    128     return (::GetLastError() == ERROR_SUCCESS);
    129   return true;
    130 }
    131 
    132 #ifndef _UNICODE
    133 bool CWindow::GetText(UString &s)
    134 {
    135   if (g_IsNT)
    136   {
    137     s.Empty();
    138     int len = GetWindowTextLengthW(_window);
    139     if (len == 0)
    140       return (::GetLastError() == ERROR_SUCCESS);
    141     wchar_t *p = s.GetBuf(len);
    142     {
    143       int len2 = GetWindowTextW(_window, p, len + 1);
    144       if (len > len2)
    145         len = len2;
    146     }
    147     s.ReleaseBuf_CalcLen(len);
    148     if (len == 0)
    149       return (::GetLastError() == ERROR_SUCCESS);
    150     return true;
    151   }
    152   CSysString sysString;
    153   bool result = GetText(sysString);
    154   MultiByteToUnicodeString2(s, sysString);
    155   return result;
    156 }
    157 #endif
    158 
    159 
    160 /*
    161 bool CWindow::ModifyStyleBase(int styleOffset,
    162   DWORD remove, DWORD add, UINT flags)
    163 {
    164   DWORD style = GetWindowLong(styleOffset);
    165   DWORD newStyle = (style & ~remove) | add;
    166   if (style == newStyle)
    167     return false; // it is not good
    168 
    169   SetWindowLong(styleOffset, newStyle);
    170   if (flags != 0)
    171   {
    172     ::SetWindowPos(_window, NULL, 0, 0, 0, 0,
    173       SWP_NOSIZE | SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE | flags);
    174   }
    175   return TRUE;
    176 }
    177 */
    178 
    179 }
    180