15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#ifndef UI_GFX_WIN_WINDOW_IMPL_H_ 6d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#define UI_GFX_WIN_WINDOW_IMPL_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <atlbase.h> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <atlapp.h> 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <atlmisc.h> 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <atlcrack.h> 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 16d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/gfx/gfx_export.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/native_widget_types.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/rect.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)namespace gfx { 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// An interface implemented by classes that use message maps. 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ProcessWindowMessage is implemented by the BEGIN_MESSAGE_MAP_EX macro. 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MessageMapInterface { 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Processes one message from the window's message queue. 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual BOOL ProcessWindowMessage(HWND window, 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UINT message, 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WPARAM w_param, 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LPARAM l_param, 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LRESULT& result, 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DWORD msg_map_id = 0) = 0; 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/////////////////////////////////////////////////////////////////////////////// 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WindowImpl 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A convenience class that encapsulates the details of creating and 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// destroying a HWND. This class also hosts the windows procedure used by all 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Windows. 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/////////////////////////////////////////////////////////////////////////////// 434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class GFX_EXPORT WindowImpl : public MessageMapInterface { 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WindowImpl(); 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~WindowImpl(); 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Initializes the Window with a parent and an initial desired size. 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Init(HWND parent, const gfx::Rect& bounds); 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the default window icon to use for windows of this type. 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual HICON GetDefaultWindowIcon() const; 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the HWND associated with this Window. 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HWND hwnd() const { return hwnd_; } 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Sets the window styles. This is ONLY used when the window is created. 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // In other words, if you invoke this after invoking Init, nothing happens. 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_window_style(DWORD style) { window_style_ = style; } 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DWORD window_style() const { return window_style_; } 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Sets the extended window styles. See comment about |set_window_style|. 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_window_ex_style(DWORD style) { window_ex_style_ = style; } 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DWORD window_ex_style() const { return window_ex_style_; } 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Sets the class style to use. The default is CS_DBLCLKS. 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_initial_class_style(UINT class_style) { 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We dynamically generate the class name, so don't register it globally! 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_EQ((class_style & CS_GLOBALCLASS), 0u); 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) class_style_ = class_style; 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UINT initial_class_style() const { return class_style_; } 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Handles the WndProc callback for this object. 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual LRESULT OnWndProc(UINT message, WPARAM w_param, LPARAM l_param); 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Subclasses must call this method from their destructors to ensure that 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // this object is properly disassociated from the HWND during destruction, 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // otherwise it's possible this object may still exist while a subclass is 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // destroyed. 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ClearUserData(); 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class ClassRegistrar; 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The window procedure used by all Windows. 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static LRESULT CALLBACK WndProc(HWND window, 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UINT message, 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WPARAM w_param, 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LPARAM l_param); 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Gets the window class atom to use when creating the corresponding HWND. 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If necessary, this registers the window class. 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ATOM GetWindowClassAtom(); 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // All classes registered by WindowImpl start with this name. 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const wchar_t* const kBaseClassName; 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Window Styles used when creating the window. 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DWORD window_style_; 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Window Extended Styles used when creating the window. 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DWORD window_ex_style_; 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Style of the class to use. 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UINT class_style_; 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Our hwnd. 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HWND hwnd_; 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // For debugging. 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(sky): nuke this when get crash data. 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool got_create_; 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool got_valid_hwnd_; 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool* destroyed_; 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(WindowImpl); 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 121d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)} // namespace gfx 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 123d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#endif // UI_GFX_WIN_WINDOW_IMPL_H_ 124