1// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef UI_BASE_WIN_WINDOW_IMPL_H_
6#define UI_BASE_WIN_WINDOW_IMPL_H_
7
8#include <atlbase.h>
9#include <atlapp.h>
10#include <atlmisc.h>
11#include <atlcrack.h>
12
13#include <string>
14
15#include "base/logging.h"
16#include "ui/base/ui_export.h"
17#include "ui/gfx/native_widget_types.h"
18#include "ui/gfx/rect.h"
19
20namespace ui {
21
22// An interface implemented by classes that use message maps.
23// ProcessWindowMessage is implemented by the BEGIN_MESSAGE_MAP_EX macro.
24class MessageMapInterface {
25 public:
26  // Processes one message from the window's message queue.
27  virtual BOOL ProcessWindowMessage(HWND window,
28                                    UINT message,
29                                    WPARAM w_param,
30                                    LPARAM l_param,
31                                    LRESULT& result,
32                                    DWORD msg_map_id = 0) = 0;
33};
34
35///////////////////////////////////////////////////////////////////////////////
36//
37// WindowImpl
38//  A convenience class that encapsulates the details of creating and
39//  destroying a HWND.  This class also hosts the windows procedure used by all
40//  Windows.
41//
42///////////////////////////////////////////////////////////////////////////////
43class UI_EXPORT WindowImpl : public MessageMapInterface {
44 public:
45  WindowImpl();
46  virtual ~WindowImpl();
47
48  // Initializes the Window with a parent and an initial desired size.
49  void Init(HWND parent, const gfx::Rect& bounds);
50
51  // Returns the default window icon to use for windows of this type.
52  virtual HICON GetDefaultWindowIcon() const;
53
54  // Returns the HWND associated with this Window.
55  HWND hwnd() const { return hwnd_; }
56
57  // Sets the window styles. This is ONLY used when the window is created.
58  // In other words, if you invoke this after invoking Init, nothing happens.
59  void set_window_style(DWORD style) { window_style_ = style; }
60  DWORD window_style() const { return window_style_; }
61
62  // Sets the extended window styles. See comment about |set_window_style|.
63  void set_window_ex_style(DWORD style) { window_ex_style_ = style; }
64  DWORD window_ex_style() const { return window_ex_style_; }
65
66  // Sets the class style to use. The default is CS_DBLCLKS.
67  void set_initial_class_style(UINT class_style) {
68    // We dynamically generate the class name, so don't register it globally!
69    DCHECK_EQ((class_style & CS_GLOBALCLASS), 0u);
70    class_style_ = class_style;
71  }
72  UINT initial_class_style() const { return class_style_; }
73
74 protected:
75  // Handles the WndProc callback for this object.
76  virtual LRESULT OnWndProc(UINT message, WPARAM w_param, LPARAM l_param);
77
78  // Subclasses must call this method from their destructors to ensure that
79  // this object is properly disassociated from the HWND during destruction,
80  // otherwise it's possible this object may still exist while a subclass is
81  // destroyed.
82  void ClearUserData();
83
84 private:
85  friend class ClassRegistrar;
86
87  // The window procedure used by all Windows.
88  static LRESULT CALLBACK WndProc(HWND window,
89                                  UINT message,
90                                  WPARAM w_param,
91                                  LPARAM l_param);
92
93  // Gets the window class atom to use when creating the corresponding HWND.
94  // If necessary, this registers the window class.
95  ATOM GetWindowClassAtom();
96
97  // All classes registered by WindowImpl start with this name.
98  static const wchar_t* const kBaseClassName;
99
100  // Window Styles used when creating the window.
101  DWORD window_style_;
102
103  // Window Extended Styles used when creating the window.
104  DWORD window_ex_style_;
105
106  // Style of the class to use.
107  UINT class_style_;
108
109  // Our hwnd.
110  HWND hwnd_;
111
112  // For debugging.
113  // TODO(sky): nuke this when get crash data.
114  bool got_create_;
115  bool got_valid_hwnd_;
116  bool* destroyed_;
117
118  DISALLOW_COPY_AND_ASSIGN(WindowImpl);
119};
120
121}  // namespace ui
122
123#endif  // UI_BASE_WIN_WINDOW_IMPL_H_
124