// Windows/Control/Window2.h

#ifndef __WINDOWS_CONTROL_WINDOW2_H
#define __WINDOWS_CONTROL_WINDOW2_H

#include "../Window.h"

namespace NWindows {
namespace NControl {

class CWindow2: public CWindow
{
  LRESULT DefProc(UINT message, WPARAM wParam, LPARAM lParam);
public:
  CWindow2(HWND newWindow = NULL): CWindow(newWindow){};
  virtual ~CWindow2() {};

  bool CreateEx(DWORD exStyle, LPCTSTR className, LPCTSTR windowName,
      DWORD style, int x, int y, int width, int height,
      HWND parentWindow, HMENU idOrHMenu, HINSTANCE instance);

  #ifndef _UNICODE
  bool CreateEx(DWORD exStyle, LPCWSTR className, LPCWSTR windowName,
      DWORD style, int x, int y, int width, int height,
      HWND parentWindow, HMENU idOrHMenu, HINSTANCE instance);
  #endif

  virtual LRESULT OnMessage(UINT message, WPARAM wParam, LPARAM lParam);
  virtual bool OnCreate(CREATESTRUCT * /* createStruct */) { return true; }
  // virtual LRESULT OnCommand(WPARAM wParam, LPARAM lParam);
  virtual bool OnCommand(WPARAM wParam, LPARAM lParam, LRESULT &result);
  virtual bool OnCommand(int code, int itemID, LPARAM lParam, LRESULT &result);
  virtual bool OnSize(WPARAM /* wParam */, int /* xSize */, int /* ySize */) { return false; }
  virtual bool OnNotify(UINT /* controlID */, LPNMHDR /* lParam */, LRESULT & /* result */) { return false; }
  virtual void OnDestroy() { PostQuitMessage(0); }
  virtual void OnClose() { Destroy(); }
  /*
  virtual LRESULT  OnHelp(LPHELPINFO helpInfo) { OnHelp(); };
  virtual LRESULT  OnHelp() {};
  virtual bool OnButtonClicked(int buttonID, HWND buttonHWND);
  virtual void OnOK() {};
  virtual void OnCancel() {};
  */

  LONG_PTR SetMsgResult(LONG_PTR newLongPtr) { return SetLongPtr(DWLP_MSGRESULT, newLongPtr); }
  LONG_PTR GetMsgResult() const { return GetLongPtr(DWLP_MSGRESULT); }
};

}}

#endif
