| OLD | NEW |
| 1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #ifndef VIEWS_WIDGET_WIDGET_WIN_H_ | 5 #ifndef VIEWS_WIDGET_WIDGET_WIN_H_ |
| 6 #define VIEWS_WIDGET_WIDGET_WIN_H_ | 6 #define VIEWS_WIDGET_WIDGET_WIN_H_ |
| 7 | 7 |
| 8 #include <atlbase.h> | 8 #include <atlbase.h> |
| 9 #include <atlapp.h> | 9 #include <atlapp.h> |
| 10 #include <atlcrack.h> | 10 #include <atlcrack.h> |
| 11 #include <atlmisc.h> | 11 #include <atlmisc.h> |
| 12 | 12 |
| 13 #include "base/message_loop.h" | 13 #include "base/message_loop.h" |
| 14 #include "base/system_monitor.h" | 14 #include "base/system_monitor.h" |
| 15 #include "base/window_impl.h" |
| 15 #include "views/focus/focus_manager.h" | 16 #include "views/focus/focus_manager.h" |
| 16 #include "views/layout_manager.h" | 17 #include "views/layout_manager.h" |
| 17 #include "views/widget/widget.h" | 18 #include "views/widget/widget.h" |
| 18 | 19 |
| 19 namespace gfx { | 20 namespace gfx { |
| 20 class Canvas; | 21 class Canvas; |
| 21 class Rect; | 22 class Rect; |
| 22 } | 23 } |
| 23 | 24 |
| 24 namespace views { | 25 namespace views { |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 56 // A Widget for a views hierarchy used to represent anything that can be | 57 // A Widget for a views hierarchy used to represent anything that can be |
| 57 // contained within an HWND, e.g. a control, a window, etc. Specializations | 58 // contained within an HWND, e.g. a control, a window, etc. Specializations |
| 58 // suitable for specific tasks, e.g. top level window, are derived from this. | 59 // suitable for specific tasks, e.g. top level window, are derived from this. |
| 59 // | 60 // |
| 60 // This Widget contains a RootView which owns the hierarchy of views within it. | 61 // This Widget contains a RootView which owns the hierarchy of views within it. |
| 61 // As long as views are part of this tree, they will be deleted automatically | 62 // As long as views are part of this tree, they will be deleted automatically |
| 62 // when the RootView is destroyed. If you remove a view from the tree, you are | 63 // when the RootView is destroyed. If you remove a view from the tree, you are |
| 63 // then responsible for cleaning up after it. | 64 // then responsible for cleaning up after it. |
| 64 // | 65 // |
| 65 /////////////////////////////////////////////////////////////////////////////// | 66 /////////////////////////////////////////////////////////////////////////////// |
| 66 class WidgetWin : public Widget, | 67 class WidgetWin : public base::WindowImpl, |
| 68 public Widget, |
| 67 public MessageLoopForUI::Observer, | 69 public MessageLoopForUI::Observer, |
| 68 public FocusTraversable, | 70 public FocusTraversable, |
| 69 public AcceleratorTarget { | 71 public AcceleratorTarget { |
| 70 public: | 72 public: |
| 71 WidgetWin(); | 73 WidgetWin(); |
| 72 virtual ~WidgetWin(); | 74 virtual ~WidgetWin(); |
| 73 | 75 |
| 74 // Sets the window styles. This is ONLY used when the window is created. | 76 // Returns the RootView associated with the specified HWND (if any). |
| 75 // In other words, if you invoke this after invoking Init, nothing happens. | 77 static RootView* FindRootView(HWND hwnd); |
| 76 void set_window_style(DWORD style) { window_style_ = style; } | |
| 77 DWORD window_style() const { return window_style_; } | |
| 78 | 78 |
| 79 // Sets the extended window styles. See comment about |set_window_style|. | 79 // Returns the Widget associated with the specified HWND (if any). |
| 80 void set_window_ex_style(DWORD style) { window_ex_style_ = style; } | 80 static WidgetWin* GetWidget(HWND hwnd); |
| 81 DWORD window_ex_style() const { return window_ex_style_; }; | |
| 82 | |
| 83 // Sets the class style to use. The default is CS_DBLCLKS. | |
| 84 void set_initial_class_style(UINT class_style) { | |
| 85 // We dynamically generate the class name, so don't register it globally! | |
| 86 DCHECK((class_style & CS_GLOBALCLASS) == 0); | |
| 87 class_style_ = class_style; | |
| 88 } | |
| 89 UINT initial_class_style() { return class_style_; } | |
| 90 | 81 |
| 91 void set_delete_on_destroy(bool delete_on_destroy) { | 82 void set_delete_on_destroy(bool delete_on_destroy) { |
| 92 delete_on_destroy_ = delete_on_destroy; | 83 delete_on_destroy_ = delete_on_destroy; |
| 93 } | 84 } |
| 94 | 85 |
| 95 // See description of use_layered_buffer_ for details. | 86 // See description of use_layered_buffer_ for details. |
| 96 void SetUseLayeredBuffer(bool use_layered_buffer); | 87 void SetUseLayeredBuffer(bool use_layered_buffer); |
| 97 | 88 |
| 98 // Disable Layered Window updates by setting to false. | 89 // Disable Layered Window updates by setting to false. |
| 99 void set_can_update_layered_window(bool can_update_layered_window) { | 90 void set_can_update_layered_window(bool can_update_layered_window) { |
| 100 can_update_layered_window_ = can_update_layered_window; | 91 can_update_layered_window_ = can_update_layered_window; |
| 101 } | 92 } |
| 102 | 93 |
| 103 // Returns the RootView associated with the specified HWND (if any). | 94 BEGIN_MSG_MAP_EX(WidgetWin) |
| 104 static RootView* FindRootView(HWND hwnd); | |
| 105 | |
| 106 // Returns the Widget associated with the specified HWND (if any). | |
| 107 static WidgetWin* GetWidget(HWND hwnd); | |
| 108 | |
| 109 // All classes registered by WidgetWin start with this name. | |
| 110 static const wchar_t* const kBaseClassName; | |
| 111 | |
| 112 BEGIN_MSG_MAP_EX(0) | |
| 113 // Range handlers must go first! | 95 // Range handlers must go first! |
| 114 MESSAGE_RANGE_HANDLER_EX(WM_MOUSEFIRST, WM_MOUSELAST, OnMouseRange) | 96 MESSAGE_RANGE_HANDLER_EX(WM_MOUSEFIRST, WM_MOUSELAST, OnMouseRange) |
| 115 MESSAGE_RANGE_HANDLER_EX(WM_NCMOUSEMOVE, WM_NCMOUSEMOVE, OnMouseRange) | 97 MESSAGE_RANGE_HANDLER_EX(WM_NCMOUSEMOVE, WM_NCMOUSEMOVE, OnMouseRange) |
| 116 | 98 |
| 117 // Reflected message handler | 99 // Reflected message handler |
| 118 MESSAGE_HANDLER_EX(kReflectedMessage, OnReflectedMessage) | 100 MESSAGE_HANDLER_EX(kReflectedMessage, OnReflectedMessage) |
| 119 | 101 |
| 120 // CustomFrameWindow hacks | 102 // CustomFrameWindow hacks |
| 121 MESSAGE_HANDLER_EX(WM_NCUAHDRAWCAPTION, OnNCUAHDrawCaption) | 103 MESSAGE_HANDLER_EX(WM_NCUAHDRAWCAPTION, OnNCUAHDrawCaption) |
| 122 MESSAGE_HANDLER_EX(WM_NCUAHDRAWFRAME, OnNCUAHDrawFrame) | 104 MESSAGE_HANDLER_EX(WM_NCUAHDRAWFRAME, OnNCUAHDrawFrame) |
| (...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 309 | 291 |
| 310 // Resets the last move flag so that we can go around the optimization | 292 // Resets the last move flag so that we can go around the optimization |
| 311 // that disregards duplicate mouse moves when ending animation requires | 293 // that disregards duplicate mouse moves when ending animation requires |
| 312 // a new hit-test to do some highlighting as in TabStrip::RemoveTabAnimation | 294 // a new hit-test to do some highlighting as in TabStrip::RemoveTabAnimation |
| 313 // to cause the close button to highlight. | 295 // to cause the close button to highlight. |
| 314 void ResetLastMouseMoveFlag() { | 296 void ResetLastMouseMoveFlag() { |
| 315 last_mouse_event_was_move_ = false; | 297 last_mouse_event_was_move_ = false; |
| 316 } | 298 } |
| 317 | 299 |
| 318 protected: | 300 protected: |
| 319 // Call close instead of this to Destroy the window. | 301 // Overridden from WindowImpl: |
| 320 BOOL DestroyWindow() { | 302 virtual HICON GetDefaultWindowIcon() const; |
| 321 DCHECK(::IsWindow(GetNativeView())); | 303 virtual LRESULT OnWndProc(UINT message, WPARAM w_param, LPARAM l_param); |
| 322 return ::DestroyWindow(GetNativeView()); | |
| 323 } | |
| 324 | 304 |
| 325 // Message Handlers | 305 // Message Handlers |
| 326 // These are all virtual so that specialized Widgets can modify or augment | 306 // These are all virtual so that specialized Widgets can modify or augment |
| 327 // processing. | 307 // processing. |
| 328 // This list is in _ALPHABETICAL_ order! | 308 // This list is in _ALPHABETICAL_ order! |
| 329 // Note: in the base class these functions must do nothing but convert point | 309 // Note: in the base class these functions must do nothing but convert point |
| 330 // coordinates to client coordinates (if necessary) and forward the | 310 // coordinates to client coordinates (if necessary) and forward the |
| 331 // handling to the appropriate Process* function. This is so that | 311 // handling to the appropriate Process* function. This is so that |
| 332 // subclasses can easily override these methods to do different things | 312 // subclasses can easily override these methods to do different things |
| 333 // and have a convenient function to call to get the default behavior. | 313 // and have a convenient function to call to get the default behavior. |
| (...skipping 204 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 538 void PaintLayeredWindow(); | 518 void PaintLayeredWindow(); |
| 539 | 519 |
| 540 // In layered mode, update the layered window. |dib_dc| represents a handle | 520 // In layered mode, update the layered window. |dib_dc| represents a handle |
| 541 // to a device context that contains the contents of the window. | 521 // to a device context that contains the contents of the window. |
| 542 void UpdateWindowFromContents(HDC dib_dc); | 522 void UpdateWindowFromContents(HDC dib_dc); |
| 543 | 523 |
| 544 // Invoked from WM_DESTROY. Does appropriate cleanup and invokes OnDestroy | 524 // Invoked from WM_DESTROY. Does appropriate cleanup and invokes OnDestroy |
| 545 // so that subclasses can do any cleanup they need to. | 525 // so that subclasses can do any cleanup they need to. |
| 546 void OnDestroyImpl(); | 526 void OnDestroyImpl(); |
| 547 | 527 |
| 548 // The windows procedure used by all WidgetWins. | |
| 549 static LRESULT CALLBACK WndProc(HWND window, | |
| 550 UINT message, | |
| 551 WPARAM w_param, | |
| 552 LPARAM l_param); | |
| 553 | |
| 554 // Called after the WM_ACTIVATE message has been processed by the default | 528 // Called after the WM_ACTIVATE message has been processed by the default |
| 555 // windows procedure. | 529 // windows procedure. |
| 556 static void PostProcessActivateMessage(WidgetWin* widget, | 530 static void PostProcessActivateMessage(WidgetWin* widget, |
| 557 int activation_state); | 531 int activation_state); |
| 558 | 532 |
| 559 // Gets the window class name to use when creating the corresponding HWND. | |
| 560 // If necessary, this registers the window class. | |
| 561 std::wstring GetWindowClassName(); | |
| 562 | |
| 563 // The following factory is used for calls to close the WidgetWin | 533 // The following factory is used for calls to close the WidgetWin |
| 564 // instance. | 534 // instance. |
| 565 ScopedRunnableMethodFactory<WidgetWin> close_widget_factory_; | 535 ScopedRunnableMethodFactory<WidgetWin> close_widget_factory_; |
| 566 | 536 |
| 567 // The flags currently being used with TrackMouseEvent to track mouse | 537 // The flags currently being used with TrackMouseEvent to track mouse |
| 568 // messages. 0 if there is no active tracking. The value of this member is | 538 // messages. 0 if there is no active tracking. The value of this member is |
| 569 // used when tracking is canceled. | 539 // used when tracking is canceled. |
| 570 DWORD active_mouse_tracking_flags_; | 540 DWORD active_mouse_tracking_flags_; |
| 571 | 541 |
| 572 bool opaque_; | 542 bool opaque_; |
| 573 | 543 |
| 574 // Window Styles used when creating the window. | |
| 575 DWORD window_style_; | |
| 576 | |
| 577 // Window Extended Styles used when creating the window. | |
| 578 DWORD window_ex_style_; | |
| 579 | |
| 580 // Style of the class to use. | |
| 581 UINT class_style_; | |
| 582 | |
| 583 // Should we keep an offscreen buffer? This is initially true and if the | 544 // Should we keep an offscreen buffer? This is initially true and if the |
| 584 // window has WS_EX_LAYERED then it remains true. You can set this to false | 545 // window has WS_EX_LAYERED then it remains true. You can set this to false |
| 585 // at any time to ditch the buffer, and similarly set back to true to force | 546 // at any time to ditch the buffer, and similarly set back to true to force |
| 586 // creation of the buffer. | 547 // creation of the buffer. |
| 587 // | 548 // |
| 588 // NOTE: this is intended to be used with a layered window (a window with an | 549 // NOTE: this is intended to be used with a layered window (a window with an |
| 589 // extended window style of WS_EX_LAYERED). If you are using a layered window | 550 // extended window style of WS_EX_LAYERED). If you are using a layered window |
| 590 // and NOT changing the layered alpha or anything else, then leave this value | 551 // and NOT changing the layered alpha or anything else, then leave this value |
| 591 // alone. OTOH if you are invoking SetLayeredWindowAttributes then you'll | 552 // alone. OTOH if you are invoking SetLayeredWindowAttributes then you'll |
| 592 // must likely want to set this to false, or after changing the alpha toggle | 553 // must likely want to set this to false, or after changing the alpha toggle |
| (...skipping 24 matching lines...) Expand all Loading... |
| 617 bool last_mouse_event_was_move_; | 578 bool last_mouse_event_was_move_; |
| 618 | 579 |
| 619 // Coordinates of the last mouse move event, in screen coordinates. | 580 // Coordinates of the last mouse move event, in screen coordinates. |
| 620 int last_mouse_move_x_; | 581 int last_mouse_move_x_; |
| 621 int last_mouse_move_y_; | 582 int last_mouse_move_y_; |
| 622 | 583 |
| 623 // Instance of accessibility information and handling for MSAA root | 584 // Instance of accessibility information and handling for MSAA root |
| 624 CComPtr<IAccessible> accessibility_root_; | 585 CComPtr<IAccessible> accessibility_root_; |
| 625 | 586 |
| 626 scoped_ptr<DefaultThemeProvider> default_theme_provider_; | 587 scoped_ptr<DefaultThemeProvider> default_theme_provider_; |
| 627 | |
| 628 // Our hwnd. | |
| 629 HWND hwnd_; | |
| 630 }; | 588 }; |
| 631 | 589 |
| 632 } // namespace views | 590 } // namespace views |
| 633 | 591 |
| 634 #endif // #ifndef VIEWS_WIDGET_WIDGET_WIN_H_ | 592 #endif // VIEWS_WIDGET_WIDGET_WIN_H_ |
| OLD | NEW |