annotate foosdk/wtl/Include/atlctrlw.h @ 1:20d02a178406 default tip

*: check in everything else yay
author Paper <paper@tflc.us>
date Mon, 05 Jan 2026 02:15:46 -0500
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1 // Windows Template Library - WTL version 10.0
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2 // Copyright (C) Microsoft Corporation, WTL Team. All rights reserved.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3 //
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4 // This file is a part of the Windows Template Library.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5 // The use and distribution terms for this software are covered by the
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
6 // Microsoft Public License (http://opensource.org/licenses/MS-PL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7 // which can be found in the file MS-PL.txt at the root folder.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9 #ifndef __ATLCTRLW_H__
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10 #define __ATLCTRLW_H__
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
11
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12 #pragma once
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14 #ifndef __ATLAPP_H__
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 #error atlctrlw.h requires atlapp.h to be included first
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18 #ifndef __ATLCTRLS_H__
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19 #error atlctrlw.h requires atlctrls.h to be included first
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
22 // Define _WTL_CMDBAR_VISTA_MENUS as 0 to exclude Vista menus support
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
23 #ifndef _WTL_CMDBAR_VISTA_MENUS
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
24 #define _WTL_CMDBAR_VISTA_MENUS 1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27 // Note: Define _WTL_CMDBAR_VISTA_STD_MENUBAR to use Vista standard menubar look with Vista menus
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30 ///////////////////////////////////////////////////////////////////////////////
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31 // Classes in this file:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32 //
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33 // CCommandBarCtrlImpl<T, TBase, TWinTraits>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
34 // CCommandBarCtrl
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35 // CMDICommandBarCtrlImpl<T, TBase, TWinTraits>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36 // CMDICommandBarCtrl
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39 namespace WTL
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42 ///////////////////////////////////////////////////////////////////////////////
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43 // Command Bars
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
44
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
45 // Window Styles:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
46 #define CBRWS_TOP CCS_TOP
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
47 #define CBRWS_BOTTOM CCS_BOTTOM
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48 #define CBRWS_NORESIZE CCS_NORESIZE
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49 #define CBRWS_NOPARENTALIGN CCS_NOPARENTALIGN
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50 #define CBRWS_NODIVIDER CCS_NODIVIDER
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52 // Extended styles
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
53 #define CBR_EX_TRANSPARENT 0x00000001L
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
54 #define CBR_EX_SHAREMENU 0x00000002L
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
55 #define CBR_EX_ALTFOCUSMODE 0x00000004L
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
56 #define CBR_EX_TRACKALWAYS 0x00000008L
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
57 #define CBR_EX_NOVISTAMENUS 0x00000010L
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59 // standard command bar styles
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
60 #define ATL_SIMPLE_CMDBAR_PANE_STYLE \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
61 (WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | CBRWS_NODIVIDER | CBRWS_NORESIZE | CBRWS_NOPARENTALIGN)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
62
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
63 // Messages - support chevrons for frame windows
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
64 #define CBRM_GETCMDBAR (WM_USER + 301) // returns command bar HWND
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
65 #define CBRM_GETMENU (WM_USER + 302) // returns loaded or attached menu
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
66 #define CBRM_TRACKPOPUPMENU (WM_USER + 303) // displays a popup menu
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
67
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
68 typedef struct tagCBRPOPUPMENU
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
69 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
70 int cbSize;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
71 HMENU hMenu; // popup menu do display
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
72 UINT uFlags; // TPM_* flags for ::TrackPopupMenuEx
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
73 int x;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
74 int y;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
75 LPTPMPARAMS lptpm; // ptr to TPMPARAMS for ::TrackPopupMenuEx
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
76 } CBRPOPUPMENU, *LPCBRPOPUPMENU;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
77
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
78 // helper class
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
79 template <class T>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
80 class CSimpleStack : public ATL::CSimpleArray< T >
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
81 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
82 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
83 BOOL Push(T t)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
84 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
85 #ifdef _CMDBAR_EXTRA_TRACE
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
86 ATLTRACE2(atlTraceUI, 0, _T("CmdBar - STACK-PUSH (%8.8X) size = %i\n"), t, GetSize());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
87 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
88 return this->Add(t);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
89 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
90
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
91 T Pop()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
92 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
93 int nLast = this->GetSize() - 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
94 if(nLast < 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
95 return NULL; // must be able to convert to NULL
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
96 T t = this->m_aT[nLast];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
97 #ifdef _CMDBAR_EXTRA_TRACE
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
98 ATLTRACE2(atlTraceUI, 0, _T("CmdBar - STACK-POP (%8.8X) size = %i\n"), t, GetSize());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
99 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
100 if(!this->RemoveAt(nLast))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
101 return NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
102 return t;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
103 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
104
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
105 T GetCurrent()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
106 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
107 int nLast = this->GetSize() - 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
108 if(nLast < 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
109 return NULL; // must be able to convert to NULL
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
110 return this->m_aT[nLast];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
111 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
112 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
113
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
114
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
115 ///////////////////////////////////////////////////////////////////////////////
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
116 // CCommandBarCtrlBase - base class for the Command Bar implementation
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
117
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
118 class CCommandBarCtrlBase : public CToolBarCtrl
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
119 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
120 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
121 struct _MsgHookData
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
122 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
123 HHOOK hMsgHook;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
124 DWORD dwUsage;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
125
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
126 _MsgHookData() : hMsgHook(NULL), dwUsage(0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
127 { }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
128 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
129
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
130 typedef ATL::CSimpleMap<DWORD, _MsgHookData*> CMsgHookMap;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
131 static CMsgHookMap* s_pmapMsgHook;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
132
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
133 static HHOOK s_hCreateHook;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
134 static CCommandBarCtrlBase* s_pCurrentBar;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
135 static bool s_bStaticInit;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
136
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
137 CSimpleStack<HWND> m_stackMenuWnd;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
138 CSimpleStack<HMENU> m_stackMenuHandle;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
139
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
140 HWND m_hWndHook;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
141 DWORD m_dwMagic;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
142
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
143
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
144 CCommandBarCtrlBase() : m_hWndHook(NULL), m_dwMagic(1314)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
145 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
146 // init static variables
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
147 if(!s_bStaticInit)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
148 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
149 CStaticDataInitCriticalSectionLock lock;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
150 if(FAILED(lock.Lock()))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
151 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
152 ATLTRACE2(atlTraceUI, 0, _T("ERROR : Unable to lock critical section in CCommandBarCtrlBase::CCommandBarCtrlBase.\n"));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
153 ATLASSERT(FALSE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
154 return;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
155 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
156
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
157 if(!s_bStaticInit)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
158 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
159 // Just in case...
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
160 AtlInitCommonControls(ICC_COOL_CLASSES | ICC_BAR_CLASSES);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
161 // done
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
162 s_bStaticInit = true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
163 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
164
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
165 lock.Unlock();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
166 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
167 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
168
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
169 bool IsCommandBarBase() const { return m_dwMagic == 1314; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
170 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
171
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
172 __declspec(selectany) CCommandBarCtrlBase::CMsgHookMap* CCommandBarCtrlBase::s_pmapMsgHook = NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
173 __declspec(selectany) HHOOK CCommandBarCtrlBase::s_hCreateHook = NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
174 __declspec(selectany) CCommandBarCtrlBase* CCommandBarCtrlBase::s_pCurrentBar = NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
175 __declspec(selectany) bool CCommandBarCtrlBase::s_bStaticInit = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
176
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
177
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
178 ///////////////////////////////////////////////////////////////////////////////
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
179 // CCommandBarCtrl - ATL implementation of Command Bars
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
180
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
181 template <class T, class TBase = CCommandBarCtrlBase, class TWinTraits = ATL::CControlWinTraits>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
182 class ATL_NO_VTABLE CCommandBarCtrlImpl : public ATL::CWindowImpl< T, TBase, TWinTraits >
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
183 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
184 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
185 DECLARE_WND_SUPERCLASS2(NULL, T, TBase::GetWndClassName())
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
186
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
187 // Declarations
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
188 struct _MenuItemData // menu item data
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
189 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
190 DWORD dwMagic;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
191 LPTSTR lpstrText;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
192 UINT fType;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
193 UINT fState;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
194 int iButton;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
195
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
196 _MenuItemData() : dwMagic(0x1313), lpstrText(NULL), fType(0U), fState(0U), iButton(0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
197 { }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
198
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
199 bool IsCmdBarMenuItem() { return (dwMagic == 0x1313); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
200 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
201
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
202 struct _ToolBarData // toolbar resource data
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
203 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
204 WORD wVersion;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
205 WORD wWidth;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
206 WORD wHeight;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
207 WORD wItemCount;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
208 //WORD aItems[wItemCount]
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
209
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
210 WORD* items()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
211 { return (WORD*)(this+1); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
212 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
213
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
214 // Constants
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
215 enum _CmdBarDrawConstants
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
216 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
217 s_kcxGap = 1,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
218 s_kcxTextMargin = 2,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
219 s_kcxButtonMargin = 3,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
220 s_kcyButtonMargin = 3
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
221 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
222
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
223 enum
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
224 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
225 _nMaxMenuItemTextLength = 100,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
226 _chChevronShortcut = _T('/')
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
227 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
228
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
229 #ifndef DT_HIDEPREFIX
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
230 enum { DT_HIDEPREFIX = 0x00100000 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
231 #endif // !DT_HIDEPREFIX
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
232
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
233 // Data members
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
234 HMENU m_hMenu;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
235 HIMAGELIST m_hImageList;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
236 ATL::CSimpleValArray<WORD> m_arrCommand;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
237
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
238 DWORD m_dwExtendedStyle; // Command Bar specific extended styles
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
239
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
240 ATL::CContainedWindow m_wndParent;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
241
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
242 bool m_bMenuActive:1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
243 bool m_bAttachedMenu:1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
244 bool m_bImagesVisible:1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
245 bool m_bPopupItem:1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
246 bool m_bContextMenu:1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
247 bool m_bEscapePressed:1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
248 bool m_bSkipMsg:1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
249 bool m_bParentActive:1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
250 bool m_bFlatMenus:1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
251 bool m_bUseKeyboardCues:1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
252 bool m_bShowKeyboardCues:1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
253 bool m_bAllowKeyboardCues:1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
254 bool m_bKeyboardInput:1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
255 bool m_bAlphaImages:1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
256 bool m_bLayoutRTL:1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
257 bool m_bSkipPostDown:1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
258 bool m_bVistaMenus:1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
259
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
260 int m_nPopBtn;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
261 int m_nNextPopBtn;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
262
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
263 SIZE m_szBitmap;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
264 SIZE m_szButton;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
265
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
266 COLORREF m_clrMask;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
267 CFont m_fontMenu; // used internally, only to measure text
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
268
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
269 UINT m_uSysKey;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
270
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
271 HWND m_hWndFocus; // Alternate focus mode
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
272
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
273 int m_cxExtraSpacing;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
274
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
275 #if _WTL_CMDBAR_VISTA_MENUS
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
276 ATL::CSimpleValArray<HBITMAP> m_arrVistaBitmap; // Bitmaps for Vista menus
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
277 #endif // _WTL_CMDBAR_VISTA_MENUS
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
278
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
279 // Constructor/destructor
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
280 CCommandBarCtrlImpl() :
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
281 m_hMenu(NULL),
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
282 m_hImageList(NULL),
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
283 m_dwExtendedStyle(CBR_EX_TRANSPARENT | CBR_EX_SHAREMENU | CBR_EX_TRACKALWAYS),
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
284 m_wndParent(this, 1),
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
285 m_bMenuActive(false),
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
286 m_bAttachedMenu(false),
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
287 m_bImagesVisible(true),
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
288 m_bPopupItem(false),
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
289 m_bContextMenu(false),
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
290 m_bEscapePressed(false),
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
291 m_bSkipMsg(false),
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
292 m_bParentActive(true),
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
293 m_bFlatMenus(false),
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
294 m_bUseKeyboardCues(false),
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
295 m_bShowKeyboardCues(false),
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
296 m_bAllowKeyboardCues(true),
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
297 m_bKeyboardInput(false),
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
298 m_bAlphaImages(false),
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
299 m_bLayoutRTL(false),
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
300 m_bSkipPostDown(false),
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
301 m_bVistaMenus(false),
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
302 m_nPopBtn(-1),
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
303 m_nNextPopBtn(-1),
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
304 m_clrMask(RGB(192, 192, 192)),
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
305 m_uSysKey(0),
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
306 m_hWndFocus(NULL),
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
307 m_cxExtraSpacing(0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
308 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
309 SetImageSize(16, 15); // default
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
310 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
311
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
312 ~CCommandBarCtrlImpl()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
313 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
314 if(m_wndParent.IsWindow())
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
315 /*scary!*/ m_wndParent.UnsubclassWindow();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
316
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
317 if((m_hMenu != NULL) && ((m_dwExtendedStyle & CBR_EX_SHAREMENU) == 0))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
318 ::DestroyMenu(m_hMenu);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
319
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
320 if(m_hImageList != NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
321 ::ImageList_Destroy(m_hImageList);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
322 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
323
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
324 // Attributes
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
325 DWORD GetCommandBarExtendedStyle() const
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
326 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
327 return m_dwExtendedStyle;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
328 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
329
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
330 DWORD SetCommandBarExtendedStyle(DWORD dwExtendedStyle, DWORD dwMask = 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
331 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
332 DWORD dwPrevStyle = m_dwExtendedStyle;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
333 if(dwMask == 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
334 m_dwExtendedStyle = dwExtendedStyle;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
335 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
336 m_dwExtendedStyle = (m_dwExtendedStyle & ~dwMask) | (dwExtendedStyle & dwMask);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
337 return dwPrevStyle;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
338 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
339
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
340 CMenuHandle GetMenu() const
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
341 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
342 ATLASSERT(::IsWindow(this->m_hWnd));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
343 return m_hMenu;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
344 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
345
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
346 COLORREF GetImageMaskColor() const
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
347 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
348 return m_clrMask;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
349 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
350
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
351 COLORREF SetImageMaskColor(COLORREF clrMask)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
352 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
353 COLORREF clrOld = m_clrMask;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
354 m_clrMask = clrMask;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
355 return clrOld;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
356 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
357
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
358 bool GetImagesVisible() const
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
359 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
360 return m_bImagesVisible;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
361 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
362
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
363 bool SetImagesVisible(bool bVisible)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
364 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
365 bool bOld = m_bImagesVisible;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
366 m_bImagesVisible = bVisible;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
367 return bOld;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
368 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
369
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
370 void GetImageSize(SIZE& size) const
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
371 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
372 size = m_szBitmap;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
373 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
374
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
375 bool SetImageSize(SIZE& size)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
376 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
377 return SetImageSize(size.cx, size.cy);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
378 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
379
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
380 bool SetImageSize(int cx, int cy)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
381 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
382 if(m_hImageList != NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
383 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
384 if(::ImageList_GetImageCount(m_hImageList) == 0) // empty
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
385 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
386 ::ImageList_Destroy(m_hImageList);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
387 m_hImageList = NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
388 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
389 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
390 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
391 return false; // can't set, image list exists
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
392 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
393 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
394
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
395 if((cx == 0) || (cy == 0))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
396 return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
397
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
398 m_szBitmap.cx = cx;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
399 m_szBitmap.cy = cy;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
400 m_szButton.cx = m_szBitmap.cx + 2 * s_kcxButtonMargin;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
401 m_szButton.cy = m_szBitmap.cy + 2 * s_kcyButtonMargin;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
402
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
403 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
404 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
405
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
406 bool GetAlphaImages() const
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
407 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
408 return m_bAlphaImages;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
409 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
410
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
411 bool SetAlphaImages(bool bAlphaImages)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
412 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
413 if(m_hImageList != NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
414 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
415 if(::ImageList_GetImageCount(m_hImageList) == 0) // empty
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
416 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
417 ::ImageList_Destroy(m_hImageList);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
418 m_hImageList = NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
419 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
420 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
421 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
422 return false; // can't set, image list exists
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
423 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
424 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
425
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
426 m_bAlphaImages = bAlphaImages;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
427 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
428 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
429
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
430 HWND GetCmdBar() const
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
431 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
432 ATLASSERT(::IsWindow(this->m_hWnd));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
433 return (HWND)::SendMessage(this->m_hWnd, CBRM_GETCMDBAR, 0, 0L);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
434 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
435
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
436 // Methods
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
437 HWND Create(HWND hWndParent, RECT& rcPos, LPCTSTR szWindowName = NULL,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
438 DWORD dwStyle = 0, DWORD dwExStyle = 0,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
439 UINT nID = 0, LPVOID lpCreateParam = NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
440 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
441 // These styles are required for command bars
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
442 dwStyle |= TBSTYLE_LIST | TBSTYLE_FLAT;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
443 return ATL::CWindowImpl< T, TBase, TWinTraits >::Create(hWndParent, rcPos, szWindowName, dwStyle, dwExStyle, nID, lpCreateParam);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
444 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
445
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
446 BOOL AttachToWindow(HWND hWnd)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
447 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
448 ATLASSERT(this->m_hWnd == NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
449 ATLASSERT(::IsWindow(hWnd));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
450 BOOL bRet = this->SubclassWindow(hWnd);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
451 if(bRet)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
452 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
453 m_bAttachedMenu = true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
454 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
455 pT->GetSystemSettings();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
456 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
457 return bRet;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
458 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
459
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
460 BOOL LoadMenu(ATL::_U_STRINGorID menu)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
461 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
462 ATLASSERT(::IsWindow(this->m_hWnd));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
463
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
464 if(m_bAttachedMenu) // doesn't work in this mode
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
465 return FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
466 if(menu.m_lpstr == NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
467 return FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
468
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
469 HMENU hMenu = ::LoadMenu(ModuleHelper::GetResourceInstance(), menu.m_lpstr);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
470 if(hMenu == NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
471 return FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
472
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
473 return AttachMenu(hMenu);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
474 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
475
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
476 BOOL AttachMenu(HMENU hMenu)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
477 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
478 ATLASSERT(::IsWindow(this->m_hWnd));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
479 ATLASSERT((hMenu == NULL) || ::IsMenu(hMenu));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
480 if((hMenu != NULL) && !::IsMenu(hMenu))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
481 return FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
482
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
483 #if _WTL_CMDBAR_VISTA_MENUS
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
484 // remove Vista bitmaps if used
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
485 if(m_bVistaMenus && (m_hMenu != NULL))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
486 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
487 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
488 pT->_RemoveVistaBitmapsFromMenu();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
489 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
490 #endif // _WTL_CMDBAR_VISTA_MENUS
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
491
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
492 // destroy old menu, if needed, and set new one
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
493 if((m_hMenu != NULL) && ((m_dwExtendedStyle & CBR_EX_SHAREMENU) == 0))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
494 ::DestroyMenu(m_hMenu);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
495
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
496 m_hMenu = hMenu;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
497
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
498 if(m_bAttachedMenu) // Nothing else in this mode
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
499 return TRUE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
500
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
501 // Build buttons according to menu
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
502 this->SetRedraw(FALSE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
503
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
504 // Clear all buttons
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
505 int nCount = this->GetButtonCount();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
506 for(int i = 0; i < nCount; i++)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
507 ATLVERIFY(this->DeleteButton(0) != FALSE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
508
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
509 // Add buttons for each menu item
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
510 if(m_hMenu != NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
511 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
512 int nItems = ::GetMenuItemCount(m_hMenu);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
513
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
514 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
515 (void)pT; // avoid level 4 warning
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
516 TCHAR szString[pT->_nMaxMenuItemTextLength] = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
517 for(int i = 0; i < nItems; i++)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
518 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
519 CMenuItemInfo mii;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
520 mii.fMask = MIIM_TYPE | MIIM_STATE | MIIM_SUBMENU;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
521 mii.fType = MFT_STRING;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
522 mii.dwTypeData = szString;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
523 mii.cch = pT->_nMaxMenuItemTextLength;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
524 BOOL bRet = ::GetMenuItemInfo(m_hMenu, i, TRUE, &mii);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
525 ATLASSERT(bRet);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
526 // If we have more than the buffer, we assume we have bitmaps bits
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
527 if(lstrlen(szString) > pT->_nMaxMenuItemTextLength - 1)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
528 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
529 mii.fType = MFT_BITMAP;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
530 ::SetMenuItemInfo(m_hMenu, i, TRUE, &mii);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
531 szString[0] = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
532 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
533
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
534 // NOTE: Command Bar currently supports only drop-down menu items
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
535 ATLASSERT(mii.hSubMenu != NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
536
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
537 TBBUTTON btn = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
538 btn.iBitmap = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
539 btn.idCommand = i;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
540 btn.fsState = (BYTE)(((mii.fState & MFS_DISABLED) == 0) ? TBSTATE_ENABLED : 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
541 btn.fsStyle = BTNS_BUTTON | BTNS_AUTOSIZE | BTNS_DROPDOWN;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
542 btn.dwData = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
543 btn.iString = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
544
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
545 bRet = this->InsertButton(-1, &btn);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
546 ATLASSERT(bRet);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
547
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
548 TBBUTTONINFO bi = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
549 bi.cbSize = sizeof(TBBUTTONINFO);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
550 bi.dwMask = TBIF_TEXT;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
551 bi.pszText = szString;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
552
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
553 bRet = this->SetButtonInfo(i, &bi);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
554 ATLASSERT(bRet);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
555 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
556 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
557
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
558 this->SetRedraw(TRUE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
559 this->Invalidate();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
560 this->UpdateWindow();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
561
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
562 return TRUE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
563 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
564
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
565 BOOL LoadImages(ATL::_U_STRINGorID image)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
566 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
567 return _LoadImagesHelper(image, false);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
568 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
569
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
570 BOOL LoadMappedImages(UINT nIDImage, UINT nFlags = 0, LPCOLORMAP lpColorMap = NULL, int nMapSize = 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
571 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
572 return _LoadImagesHelper(nIDImage, true, nFlags , lpColorMap, nMapSize);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
573 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
574
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
575 BOOL _LoadImagesHelper(ATL::_U_STRINGorID image, bool bMapped, UINT nFlags = 0, LPCOLORMAP lpColorMap = NULL, int nMapSize = 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
576 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
577 ATLASSERT(::IsWindow(this->m_hWnd));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
578 HINSTANCE hInstance = ModuleHelper::GetResourceInstance();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
579
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
580 HRSRC hRsrc = ::FindResource(hInstance, image.m_lpstr, (LPTSTR)RT_TOOLBAR);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
581 if(hRsrc == NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
582 return FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
583
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
584 HGLOBAL hGlobal = ::LoadResource(hInstance, hRsrc);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
585 if(hGlobal == NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
586 return FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
587
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
588 _ToolBarData* pData = (_ToolBarData*)::LockResource(hGlobal);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
589 if(pData == NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
590 return FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
591 ATLASSERT(pData->wVersion == 1);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
592
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
593 WORD* pItems = pData->items();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
594 int nItems = pData->wItemCount;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
595
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
596 // Set internal data
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
597 SetImageSize(pData->wWidth, pData->wHeight);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
598
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
599 // Create image list if needed
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
600 if(m_hImageList == NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
601 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
602 // Check if the bitmap is 32-bit (alpha channel) bitmap (valid for Windows XP only)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
603 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
604 m_bAlphaImages = AtlIsAlphaBitmapResource(image);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
605
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
606 if(!pT->CreateInternalImageList(pData->wItemCount))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
607 return FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
608 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
609
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
610 #if _WTL_CMDBAR_VISTA_MENUS
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
611 int nOldImageCount = ::ImageList_GetImageCount(m_hImageList);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
612 #endif // _WTL_CMDBAR_VISTA_MENUS
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
613
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
614 // Add bitmap to our image list
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
615 CBitmap bmp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
616 if(bMapped)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
617 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
618 ATLASSERT(HIWORD(PtrToUlong(image.m_lpstr)) == 0); // if mapped, must be a numeric ID
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
619 int nIDImage = (int)(short)LOWORD(PtrToUlong(image.m_lpstr));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
620 bmp.LoadMappedBitmap(nIDImage, (WORD)nFlags, lpColorMap, nMapSize);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
621 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
622 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
623 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
624 if(m_bAlphaImages)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
625 bmp = (HBITMAP)::LoadImage(ModuleHelper::GetResourceInstance(), image.m_lpstr, IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION | LR_DEFAULTSIZE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
626 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
627 bmp.LoadBitmap(image.m_lpstr);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
628 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
629 ATLASSERT(bmp.m_hBitmap != NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
630 if(bmp.m_hBitmap == NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
631 return FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
632 if(::ImageList_AddMasked(m_hImageList, bmp, m_clrMask) == -1)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
633 return FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
634
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
635 // Fill the array with command IDs
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
636 for(int i = 0; i < nItems; i++)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
637 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
638 if(pItems[i] != 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
639 m_arrCommand.Add(pItems[i]);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
640 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
641
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
642 int nImageCount = ::ImageList_GetImageCount(m_hImageList);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
643 ATLASSERT(nImageCount == m_arrCommand.GetSize());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
644 if(nImageCount != m_arrCommand.GetSize())
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
645 return FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
646
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
647 #if _WTL_CMDBAR_VISTA_MENUS
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
648 if(RunTimeHelper::IsVista())
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
649 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
650 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
651 pT->_AddVistaBitmapsFromImageList(nOldImageCount, nImageCount - nOldImageCount);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
652 ATLASSERT(nImageCount == m_arrVistaBitmap.GetSize());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
653 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
654 #endif // _WTL_CMDBAR_VISTA_MENUS
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
655
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
656 return TRUE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
657 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
658
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
659 BOOL AddBitmap(ATL::_U_STRINGorID bitmap, int nCommandID)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
660 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
661 ATLASSERT(::IsWindow(this->m_hWnd));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
662 CBitmap bmp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
663 bmp.LoadBitmap(bitmap.m_lpstr);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
664 if(bmp.m_hBitmap == NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
665 return FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
666 return AddBitmap(bmp, nCommandID);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
667 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
668
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
669 BOOL AddBitmap(HBITMAP hBitmap, UINT nCommandID)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
670 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
671 ATLASSERT(::IsWindow(this->m_hWnd));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
672 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
673 // Create image list if it doesn't exist
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
674 if(m_hImageList == NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
675 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
676 if(!pT->CreateInternalImageList(1))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
677 return FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
678 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
679 // check bitmap size
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
680 CBitmapHandle bmp = hBitmap;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
681 SIZE size = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
682 bmp.GetSize(size);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
683 if((size.cx != m_szBitmap.cx) || (size.cy != m_szBitmap.cy))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
684 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
685 ATLASSERT(FALSE); // must match size!
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
686 return FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
687 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
688 // add bitmap
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
689 int nRet = ::ImageList_AddMasked(m_hImageList, hBitmap, m_clrMask);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
690 if(nRet == -1)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
691 return FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
692 BOOL bRet = m_arrCommand.Add((WORD)nCommandID);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
693 ATLASSERT(::ImageList_GetImageCount(m_hImageList) == m_arrCommand.GetSize());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
694 #if _WTL_CMDBAR_VISTA_MENUS
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
695 if(RunTimeHelper::IsVista())
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
696 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
697 pT->_AddVistaBitmapFromImageList(m_arrCommand.GetSize() - 1);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
698 ATLASSERT(m_arrVistaBitmap.GetSize() == m_arrCommand.GetSize());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
699 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
700 #endif // _WTL_CMDBAR_VISTA_MENUS
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
701 return bRet;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
702 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
703
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
704 BOOL AddIcon(ATL::_U_STRINGorID icon, UINT nCommandID)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
705 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
706 ATLASSERT(::IsWindow(this->m_hWnd));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
707 HICON hIcon = ::LoadIcon(ModuleHelper::GetResourceInstance(), icon.m_lpstr);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
708 if(hIcon == NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
709 return FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
710 return AddIcon(hIcon, nCommandID);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
711 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
712
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
713 BOOL AddIcon(HICON hIcon, UINT nCommandID)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
714 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
715 ATLASSERT(::IsWindow(this->m_hWnd));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
716 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
717 // create image list if it doesn't exist
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
718 if(m_hImageList == NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
719 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
720 if(!pT->CreateInternalImageList(1))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
721 return FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
722 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
723
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
724 int nRet = ::ImageList_AddIcon(m_hImageList, hIcon);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
725 if(nRet == -1)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
726 return FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
727 BOOL bRet = m_arrCommand.Add((WORD)nCommandID);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
728 ATLASSERT(::ImageList_GetImageCount(m_hImageList) == m_arrCommand.GetSize());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
729 #if _WTL_CMDBAR_VISTA_MENUS
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
730 if(RunTimeHelper::IsVista())
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
731 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
732 pT->_AddVistaBitmapFromImageList(m_arrCommand.GetSize() - 1);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
733 ATLASSERT(m_arrVistaBitmap.GetSize() == m_arrCommand.GetSize());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
734 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
735 #endif // _WTL_CMDBAR_VISTA_MENUS
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
736 return bRet;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
737 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
738
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
739 BOOL ReplaceBitmap(ATL::_U_STRINGorID bitmap, int nCommandID)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
740 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
741 ATLASSERT(::IsWindow(this->m_hWnd));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
742 CBitmap bmp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
743 bmp.LoadBitmap(bitmap.m_lpstr);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
744 if(bmp.m_hBitmap == NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
745 return FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
746 return ReplaceBitmap(bmp, nCommandID);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
747 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
748
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
749 BOOL ReplaceBitmap(HBITMAP hBitmap, UINT nCommandID)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
750 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
751 ATLASSERT(::IsWindow(this->m_hWnd));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
752 BOOL bRet = FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
753 for(int i = 0; i < m_arrCommand.GetSize(); i++)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
754 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
755 if(m_arrCommand[i] == nCommandID)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
756 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
757 bRet = ::ImageList_Remove(m_hImageList, i);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
758 if(bRet)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
759 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
760 m_arrCommand.RemoveAt(i);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
761 #if _WTL_CMDBAR_VISTA_MENUS
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
762 if(RunTimeHelper::IsVista())
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
763 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
764 if(m_arrVistaBitmap[i] != NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
765 ::DeleteObject(m_arrVistaBitmap[i]);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
766 m_arrVistaBitmap.RemoveAt(i);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
767 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
768 #endif // _WTL_CMDBAR_VISTA_MENUS
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
769 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
770 break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
771 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
772 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
773 if(bRet)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
774 bRet = AddBitmap(hBitmap, nCommandID);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
775 return bRet;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
776 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
777
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
778 BOOL ReplaceIcon(ATL::_U_STRINGorID icon, UINT nCommandID)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
779 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
780 ATLASSERT(::IsWindow(this->m_hWnd));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
781 HICON hIcon = ::LoadIcon(ModuleHelper::GetResourceInstance(), icon.m_lpstr);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
782 if(hIcon == NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
783 return FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
784 return ReplaceIcon(hIcon, nCommandID);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
785 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
786
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
787 BOOL ReplaceIcon(HICON hIcon, UINT nCommandID)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
788 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
789 ATLASSERT(::IsWindow(this->m_hWnd));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
790 BOOL bRet = FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
791 for(int i = 0; i < m_arrCommand.GetSize(); i++)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
792 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
793 if(m_arrCommand[i] == nCommandID)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
794 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
795 bRet = (::ImageList_ReplaceIcon(m_hImageList, i, hIcon) != -1);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
796 #if _WTL_CMDBAR_VISTA_MENUS
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
797 if(RunTimeHelper::IsVista() && (bRet != FALSE))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
798 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
799 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
800 pT->_ReplaceVistaBitmapFromImageList(i);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
801 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
802 #endif // _WTL_CMDBAR_VISTA_MENUS
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
803 break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
804 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
805 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
806 return bRet;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
807 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
808
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
809 BOOL RemoveImage(int nCommandID)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
810 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
811 ATLASSERT(::IsWindow(this->m_hWnd));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
812
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
813 BOOL bRet = FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
814 for(int i = 0; i < m_arrCommand.GetSize(); i++)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
815 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
816 if(m_arrCommand[i] == nCommandID)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
817 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
818 bRet = ::ImageList_Remove(m_hImageList, i);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
819 if(bRet)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
820 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
821 m_arrCommand.RemoveAt(i);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
822 #if _WTL_CMDBAR_VISTA_MENUS
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
823 if(RunTimeHelper::IsVista())
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
824 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
825 if(m_arrVistaBitmap[i] != NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
826 ::DeleteObject(m_arrVistaBitmap[i]);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
827 m_arrVistaBitmap.RemoveAt(i);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
828 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
829 #endif // _WTL_CMDBAR_VISTA_MENUS
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
830 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
831 break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
832 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
833 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
834 return bRet;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
835 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
836
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
837 BOOL RemoveAllImages()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
838 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
839 ATLASSERT(::IsWindow(this->m_hWnd));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
840
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
841 ATLTRACE2(atlTraceUI, 0, _T("CmdBar - Removing all images\n"));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
842 BOOL bRet = ::ImageList_RemoveAll(m_hImageList);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
843 if(bRet)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
844 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
845 m_arrCommand.RemoveAll();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
846 #if _WTL_CMDBAR_VISTA_MENUS
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
847 for(int i = 0; i < m_arrVistaBitmap.GetSize(); i++)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
848 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
849 if(m_arrVistaBitmap[i] != NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
850 ::DeleteObject(m_arrVistaBitmap[i]);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
851 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
852 m_arrVistaBitmap.RemoveAll();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
853 #endif // _WTL_CMDBAR_VISTA_MENUS
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
854 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
855 return bRet;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
856 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
857
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
858 BOOL TrackPopupMenu(HMENU hMenu, UINT uFlags, int x, int y, LPTPMPARAMS lpParams = NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
859 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
860 ATLASSERT(::IsWindow(this->m_hWnd));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
861 ATLASSERT(::IsMenu(hMenu));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
862 if(!::IsMenu(hMenu))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
863 return FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
864 m_bContextMenu = true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
865 if(m_bUseKeyboardCues)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
866 m_bShowKeyboardCues = m_bKeyboardInput;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
867 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
868 return pT->DoTrackPopupMenu(hMenu, uFlags, x, y, lpParams);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
869 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
870
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
871 BOOL SetMDIClient(HWND /*hWndMDIClient*/)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
872 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
873 // Use CMDICommandBarCtrl for MDI support
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
874 ATLASSERT(FALSE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
875 return FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
876 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
877
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
878 // Message map and handlers
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
879 BEGIN_MSG_MAP(CCommandBarCtrlImpl)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
880 MESSAGE_HANDLER(WM_CREATE, OnCreate)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
881 MESSAGE_HANDLER(WM_DESTROY, OnDestroy)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
882 MESSAGE_HANDLER(WM_ERASEBKGND, OnEraseBackground)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
883 MESSAGE_HANDLER(WM_INITMENU, OnInitMenu)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
884 MESSAGE_HANDLER(WM_INITMENUPOPUP, OnInitMenuPopup)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
885 MESSAGE_HANDLER(WM_MENUSELECT, OnMenuSelect)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
886 MESSAGE_HANDLER(GetAutoPopupMessage(), OnInternalAutoPopup)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
887 MESSAGE_HANDLER(GetGetBarMessage(), OnInternalGetBar)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
888 MESSAGE_HANDLER(WM_SETTINGCHANGE, OnSettingChange)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
889 MESSAGE_HANDLER(WM_MENUCHAR, OnMenuChar)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
890 MESSAGE_HANDLER(WM_KILLFOCUS, OnKillFocus)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
891
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
892 MESSAGE_HANDLER(WM_KEYDOWN, OnKeyDown)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
893 MESSAGE_HANDLER(WM_KEYUP, OnKeyUp)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
894 MESSAGE_HANDLER(WM_CHAR, OnChar)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
895 MESSAGE_HANDLER(WM_SYSKEYDOWN, OnSysKeyDown)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
896 MESSAGE_HANDLER(WM_SYSKEYUP, OnSysKeyUp)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
897 MESSAGE_HANDLER(WM_SYSCHAR, OnSysChar)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
898 // public API handlers - these stay to support chevrons in atlframe.h
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
899 MESSAGE_HANDLER(CBRM_GETMENU, OnAPIGetMenu)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
900 MESSAGE_HANDLER(CBRM_TRACKPOPUPMENU, OnAPITrackPopupMenu)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
901 MESSAGE_HANDLER(CBRM_GETCMDBAR, OnAPIGetCmdBar)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
902
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
903 MESSAGE_HANDLER(WM_DRAWITEM, OnDrawItem)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
904 MESSAGE_HANDLER(WM_MEASUREITEM, OnMeasureItem)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
905
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
906 MESSAGE_HANDLER(WM_FORWARDMSG, OnForwardMsg)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
907 ALT_MSG_MAP(1) // Parent window messages
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
908 NOTIFY_CODE_HANDLER(TBN_HOTITEMCHANGE, OnParentHotItemChange)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
909 NOTIFY_CODE_HANDLER(TBN_DROPDOWN, OnParentDropDown)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
910 MESSAGE_HANDLER(WM_INITMENUPOPUP, OnParentInitMenuPopup)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
911 MESSAGE_HANDLER(GetGetBarMessage(), OnParentInternalGetBar)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
912 MESSAGE_HANDLER(WM_SYSCOMMAND, OnParentSysCommand)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
913 MESSAGE_HANDLER(CBRM_GETMENU, OnParentAPIGetMenu)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
914 MESSAGE_HANDLER(WM_MENUCHAR, OnParentMenuChar)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
915 MESSAGE_HANDLER(CBRM_TRACKPOPUPMENU, OnParentAPITrackPopupMenu)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
916 MESSAGE_HANDLER(CBRM_GETCMDBAR, OnParentAPIGetCmdBar)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
917 MESSAGE_HANDLER(WM_SETTINGCHANGE, OnParentSettingChange)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
918
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
919 MESSAGE_HANDLER(WM_DRAWITEM, OnParentDrawItem)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
920 MESSAGE_HANDLER(WM_MEASUREITEM, OnParentMeasureItem)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
921
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
922 MESSAGE_HANDLER(WM_ACTIVATE, OnParentActivate)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
923 NOTIFY_CODE_HANDLER(NM_CUSTOMDRAW, OnParentCustomDraw)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
924 ALT_MSG_MAP(2) // MDI client window messages
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
925 // Use CMDICommandBarCtrl for MDI support
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
926 ALT_MSG_MAP(3) // Message hook messages
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
927 MESSAGE_HANDLER(WM_MOUSEMOVE, OnHookMouseMove)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
928 MESSAGE_HANDLER(WM_SYSKEYDOWN, OnHookSysKeyDown)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
929 MESSAGE_HANDLER(WM_SYSKEYUP, OnHookSysKeyUp)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
930 MESSAGE_HANDLER(WM_SYSCHAR, OnHookSysChar)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
931 MESSAGE_HANDLER(WM_KEYDOWN, OnHookKeyDown)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
932 MESSAGE_HANDLER(WM_NEXTMENU, OnHookNextMenu)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
933 MESSAGE_HANDLER(WM_CHAR, OnHookChar)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
934 END_MSG_MAP()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
935
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
936 LRESULT OnForwardMsg(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& /*bHandled*/)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
937 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
938 LPMSG pMsg = (LPMSG)lParam;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
939 if((pMsg->message >= WM_MOUSEFIRST) && (pMsg->message <= WM_MOUSELAST))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
940 m_bKeyboardInput = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
941 else if((pMsg->message >= WM_KEYFIRST) && (pMsg->message <= WM_KEYLAST))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
942 m_bKeyboardInput = true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
943 LRESULT lRet = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
944 ProcessWindowMessage(pMsg->hwnd, pMsg->message, pMsg->wParam, pMsg->lParam, lRet, 3);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
945 return lRet;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
946 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
947
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
948 LRESULT OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
949 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
950 // Let the toolbar initialize itself
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
951 LRESULT lRet = this->DefWindowProc(uMsg, wParam, lParam);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
952 // get and use system settings
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
953 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
954 pT->GetSystemSettings();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
955 // Parent init
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
956 ATL::CWindow wndParent = this->GetParent();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
957 ATL::CWindow wndTopLevelParent = wndParent.GetTopLevelParent();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
958 m_wndParent.SubclassWindow(wndTopLevelParent);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
959 // Toolbar Init
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
960 this->SetButtonStructSize();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
961 this->SetImageList(NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
962
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
963 // Create message hook if needed
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
964 CWindowCreateCriticalSectionLock lock;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
965 if(FAILED(lock.Lock()))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
966 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
967 ATLTRACE2(atlTraceUI, 0, _T("ERROR : Unable to lock critical section in CCommandBarCtrlImpl::OnCreate.\n"));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
968 ATLASSERT(FALSE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
969 return -1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
970 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
971
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
972 if(this->s_pmapMsgHook == NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
973 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
974 ATLTRY(this->s_pmapMsgHook = new CCommandBarCtrlBase::CMsgHookMap);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
975 ATLASSERT(this->s_pmapMsgHook != NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
976 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
977
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
978 if(this->s_pmapMsgHook != NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
979 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
980 DWORD dwThreadID = ::GetCurrentThreadId();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
981 CCommandBarCtrlBase::_MsgHookData* pData = this->s_pmapMsgHook->Lookup(dwThreadID);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
982 if(pData == NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
983 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
984 ATLTRY(pData = new CCommandBarCtrlBase::_MsgHookData);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
985 ATLASSERT(pData != NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
986 HHOOK hMsgHook = ::SetWindowsHookEx(WH_GETMESSAGE, MessageHookProc, ModuleHelper::GetModuleInstance(), dwThreadID);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
987 ATLASSERT(hMsgHook != NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
988 if((pData != NULL) && (hMsgHook != NULL))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
989 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
990 pData->hMsgHook = hMsgHook;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
991 pData->dwUsage = 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
992 BOOL bRet = this->s_pmapMsgHook->Add(dwThreadID, pData);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
993 (void)bRet; // avoid level 4 warning
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
994 ATLASSERT(bRet);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
995 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
996 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
997 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
998 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
999 (pData->dwUsage)++;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1000 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1001 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1002 lock.Unlock();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1003
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1004 // Get layout
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1005 m_bLayoutRTL = ((this->GetExStyle() & WS_EX_LAYOUTRTL) != 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1006
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1007 return lRet;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1008 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1009
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1010 LRESULT OnDestroy(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1011 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1012 LRESULT lRet = this->DefWindowProc(uMsg, wParam, lParam);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1013
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1014 #if _WTL_CMDBAR_VISTA_MENUS
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1015 if(m_bVistaMenus && (m_hMenu != NULL))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1016 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1017 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1018 pT->_RemoveVistaBitmapsFromMenu();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1019 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1020
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1021 for(int i = 0; i < m_arrVistaBitmap.GetSize(); i++)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1022 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1023 if(m_arrVistaBitmap[i] != NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1024 ::DeleteObject(m_arrVistaBitmap[i]);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1025 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1026 #endif // _WTL_CMDBAR_VISTA_MENUS
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1027
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1028 if(m_bAttachedMenu) // nothing to do in this mode
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1029 return lRet;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1030
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1031 CWindowCreateCriticalSectionLock lock;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1032 if(FAILED(lock.Lock()))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1033 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1034 ATLTRACE2(atlTraceUI, 0, _T("ERROR : Unable to lock critical section in CCommandBarCtrlImpl::OnDestroy.\n"));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1035 ATLASSERT(FALSE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1036 return lRet;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1037 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1038
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1039 if(this->s_pmapMsgHook != NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1040 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1041 DWORD dwThreadID = ::GetCurrentThreadId();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1042 CCommandBarCtrlBase::_MsgHookData* pData = this->s_pmapMsgHook->Lookup(dwThreadID);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1043 if(pData != NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1044 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1045 (pData->dwUsage)--;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1046 if(pData->dwUsage == 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1047 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1048 BOOL bRet = ::UnhookWindowsHookEx(pData->hMsgHook);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1049 ATLASSERT(bRet);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1050 bRet = this->s_pmapMsgHook->Remove(dwThreadID);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1051 ATLASSERT(bRet);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1052 if(bRet)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1053 delete pData;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1054 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1055
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1056 if(this->s_pmapMsgHook->GetSize() == 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1057 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1058 delete this->s_pmapMsgHook;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1059 this->s_pmapMsgHook = NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1060 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1061 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1062 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1063
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1064 lock.Unlock();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1065
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1066 return lRet;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1067 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1068
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1069 LRESULT OnKeyDown(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1070 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1071 #ifdef _CMDBAR_EXTRA_TRACE
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1072 ATLTRACE2(atlTraceUI, 0, _T("CmdBar - OnKeyDown\n"));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1073 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1074 if(m_bAttachedMenu) // nothing to do in this mode
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1075 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1076 bHandled = FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1077 return 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1078 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1079
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1080 bHandled = FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1081 // Simulate Alt+Space for the parent
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1082 if(wParam == VK_SPACE)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1083 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1084 m_wndParent.PostMessage(WM_SYSKEYDOWN, wParam, lParam | (1 << 29));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1085 bHandled = TRUE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1086 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1087 else if((wParam == VK_LEFT) || (wParam == VK_RIGHT))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1088 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1089 WPARAM wpNext = m_bLayoutRTL ? VK_LEFT : VK_RIGHT;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1090
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1091 if(!m_bMenuActive)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1092 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1093 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1094 int nBtn = this->GetHotItem();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1095 int nNextBtn = (wParam == wpNext) ? pT->GetNextMenuItem(nBtn) : pT->GetPreviousMenuItem(nBtn);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1096 if(nNextBtn == -2)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1097 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1098 this->SetHotItem(-1);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1099 if(pT->DisplayChevronMenu())
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1100 bHandled = TRUE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1101 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1102 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1103 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1104 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1105 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1106
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1107 LRESULT OnKeyUp(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1108 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1109 #ifdef _CMDBAR_EXTRA_TRACE
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1110 ATLTRACE2(atlTraceUI, 0, _T("CmdBar - OnKeyUp\n"));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1111 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1112 if(m_bAttachedMenu) // nothing to do in this mode
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1113 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1114 bHandled = FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1115 return 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1116 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1117
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1118 if(wParam != VK_SPACE)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1119 bHandled = FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1120
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1121 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1122 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1123
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1124 LRESULT OnChar(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1125 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1126 #ifdef _CMDBAR_EXTRA_TRACE
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1127 ATLTRACE2(atlTraceUI, 0, _T("CmdBar - OnChar\n"));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1128 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1129 if(m_bAttachedMenu) // nothing to do in this mode
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1130 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1131 bHandled = FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1132 return 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1133 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1134
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1135 if(wParam != VK_SPACE)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1136 bHandled = FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1137 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1138 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1139 // Security
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1140 if(!m_wndParent.IsWindowEnabled() || (::GetFocus() != this->m_hWnd))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1141 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1142
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1143 // Handle mnemonic press when we have focus
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1144 int nBtn = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1145 if((wParam != VK_RETURN) && !this->MapAccelerator((TCHAR)LOWORD(wParam), nBtn))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1146 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1147 if((TCHAR)LOWORD(wParam) != _chChevronShortcut)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1148 ::MessageBeep(0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1149 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1150 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1151 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1152 RECT rcClient = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1153 this->GetClientRect(&rcClient);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1154 RECT rcBtn = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1155 this->GetItemRect(nBtn, &rcBtn);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1156 TBBUTTON tbb = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1157 this->GetButton(nBtn, &tbb);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1158 if(((tbb.fsState & TBSTATE_ENABLED) != 0) && ((tbb.fsState & TBSTATE_HIDDEN) == 0) && (rcBtn.right <= rcClient.right))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1159 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1160 this->PostMessage(WM_KEYDOWN, VK_DOWN, 0L);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1161 if(wParam != VK_RETURN)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1162 this->SetHotItem(nBtn);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1163 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1164 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1165 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1166 ::MessageBeep(0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1167 bHandled = TRUE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1168 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1169 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1170 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1171 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1172
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1173 LRESULT OnSysKeyDown(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1174 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1175 #ifdef _CMDBAR_EXTRA_TRACE
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1176 ATLTRACE2(atlTraceUI, 0, _T("CmdBar - OnSysKeyDown\n"));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1177 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1178 bHandled = FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1179 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1180 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1181
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1182 LRESULT OnSysKeyUp(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1183 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1184 #ifdef _CMDBAR_EXTRA_TRACE
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1185 ATLTRACE2(atlTraceUI, 0, _T("CmdBar - OnSysKeyUp\n"));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1186 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1187 bHandled = FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1188 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1189 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1190
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1191 LRESULT OnSysChar(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1192 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1193 #ifdef _CMDBAR_EXTRA_TRACE
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1194 ATLTRACE2(atlTraceUI, 0, _T("CmdBar - OnSysChar\n"));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1195 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1196 bHandled = FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1197 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1198 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1199
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1200 LRESULT OnEraseBackground(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1201 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1202 if(m_bAttachedMenu || (m_dwExtendedStyle & CBR_EX_TRANSPARENT))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1203 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1204 bHandled = FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1205 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1206 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1207
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1208 CDCHandle dc = (HDC)wParam;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1209 RECT rect = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1210 this->GetClientRect(&rect);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1211 dc.FillRect(&rect, COLOR_MENU);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1212
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1213 return 1; // don't do the default erase
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1214 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1215
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1216 LRESULT OnInitMenu(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1217 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1218 int nIndex = this->GetHotItem();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1219 this->SendMessage(WM_MENUSELECT, MAKEWPARAM(nIndex, MF_POPUP|MF_HILITE), (LPARAM)m_hMenu);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1220 bHandled = FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1221 return 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1222 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1223
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1224 LRESULT OnInitMenuPopup(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1225 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1226 if((BOOL)HIWORD(lParam)) // System menu, do nothing
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1227 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1228 bHandled = FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1229 return 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1230 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1231
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1232 if(!(m_bAttachedMenu || m_bMenuActive)) // Not attached or ours, do nothing
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1233 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1234 bHandled = FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1235 return 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1236 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1237
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1238 #ifdef _CMDBAR_EXTRA_TRACE
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1239 ATLTRACE2(atlTraceUI, 0, _T("CmdBar - OnInitMenuPopup\n"));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1240 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1241 // forward to the parent or subclassed window, so it can handle update UI
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1242 LRESULT lRet = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1243 if(m_bAttachedMenu)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1244 lRet = this->DefWindowProc(uMsg, wParam, (lParam || m_bContextMenu) ? lParam : this->GetHotItem());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1245 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1246 lRet = m_wndParent.DefWindowProc(uMsg, wParam, (lParam || m_bContextMenu) ? lParam : this->GetHotItem());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1247
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1248 #if _WTL_CMDBAR_VISTA_MENUS
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1249 // If Vista menus are active, just set bitmaps and return
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1250 if(m_bVistaMenus)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1251 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1252 CMenuHandle menu = (HMENU)wParam;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1253 ATLASSERT(menu.m_hMenu != NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1254
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1255 for(int i = 0; i < menu.GetMenuItemCount(); i++)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1256 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1257 WORD nID = (WORD)menu.GetMenuItemID(i);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1258 int nIndex = m_arrCommand.Find(nID);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1259
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1260 CMenuItemInfo mii;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1261 mii.fMask = MIIM_BITMAP;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1262 mii.hbmpItem = (m_bImagesVisible && (nIndex != -1)) ? m_arrVistaBitmap[nIndex] : NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1263 menu.SetMenuItemInfo(i, TRUE, &mii);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1264 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1265
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1266 return lRet;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1267 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1268 #endif // _WTL_CMDBAR_VISTA_MENUS
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1269
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1270 // Convert menu items to ownerdraw, add our data
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1271 if(m_bImagesVisible)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1272 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1273 CMenuHandle menuPopup = (HMENU)wParam;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1274 ATLASSERT(menuPopup.m_hMenu != NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1275
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1276 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1277 (void)pT; // avoid level 4 warning
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1278 TCHAR szString[pT->_nMaxMenuItemTextLength] = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1279 BOOL bRet = FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1280 for(int i = 0; i < menuPopup.GetMenuItemCount(); i++)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1281 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1282 CMenuItemInfo mii;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1283 mii.cch = pT->_nMaxMenuItemTextLength;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1284 mii.fMask = MIIM_CHECKMARKS | MIIM_DATA | MIIM_ID | MIIM_STATE | MIIM_SUBMENU | MIIM_TYPE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1285 mii.dwTypeData = szString;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1286 bRet = menuPopup.GetMenuItemInfo(i, TRUE, &mii);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1287 ATLASSERT(bRet);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1288
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1289 if(!(mii.fType & MFT_OWNERDRAW)) // Not already an ownerdraw item
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1290 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1291 mii.fMask = MIIM_DATA | MIIM_TYPE | MIIM_STATE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1292 _MenuItemData* pMI = NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1293 ATLTRY(pMI = new _MenuItemData);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1294 ATLASSERT(pMI != NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1295 if(pMI != NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1296 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1297 pMI->fType = mii.fType;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1298 pMI->fState = mii.fState;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1299 mii.fType |= MFT_OWNERDRAW;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1300 pMI->iButton = -1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1301 for(int j = 0; j < m_arrCommand.GetSize(); j++)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1302 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1303 if(m_arrCommand[j] == mii.wID)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1304 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1305 pMI->iButton = j;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1306 break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1307 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1308 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1309 int cchLen = lstrlen(szString) + 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1310 pMI->lpstrText = NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1311 ATLTRY(pMI->lpstrText = new TCHAR[cchLen]);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1312 ATLASSERT(pMI->lpstrText != NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1313 if(pMI->lpstrText != NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1314 ATL::Checked::tcscpy_s(pMI->lpstrText, cchLen, szString);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1315 mii.dwItemData = (ULONG_PTR)pMI;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1316 bRet = menuPopup.SetMenuItemInfo(i, TRUE, &mii);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1317 ATLASSERT(bRet);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1318 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1319 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1320 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1321
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1322 // Add it to the list
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1323 this->m_stackMenuHandle.Push(menuPopup.m_hMenu);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1324 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1325
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1326 return lRet;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1327 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1328
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1329 LRESULT OnMenuSelect(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1330 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1331 if(!m_bAttachedMenu) // Not attached, do nothing, forward to parent
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1332 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1333 m_bPopupItem = (lParam != NULL) && ((HMENU)lParam != m_hMenu) && (HIWORD(wParam) & MF_POPUP);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1334 if(m_wndParent.IsWindow())
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1335 m_wndParent.SendMessage(uMsg, wParam, lParam);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1336 bHandled = FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1337 return 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1338 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1339
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1340 // Check if a menu is closing, do a cleanup
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1341 if((HIWORD(wParam) == 0xFFFF) && (lParam == NULL)) // Menu closing
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1342 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1343 #ifdef _CMDBAR_EXTRA_TRACE
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1344 ATLTRACE2(atlTraceUI, 0, _T("CmdBar - OnMenuSelect - CLOSING!!!!\n"));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1345 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1346 ATLASSERT(this->m_stackMenuWnd.GetSize() == 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1347 // Restore the menu items to the previous state for all menus that were converted
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1348 if(m_bImagesVisible)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1349 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1350 HMENU hMenu = NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1351 while((hMenu = this->m_stackMenuHandle.Pop()) != NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1352 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1353 CMenuHandle menuPopup = hMenu;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1354 ATLASSERT(menuPopup.m_hMenu != NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1355 // Restore state and delete menu item data
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1356 BOOL bRet = FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1357 for(int i = 0; i < menuPopup.GetMenuItemCount(); i++)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1358 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1359 CMenuItemInfo mii;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1360 mii.fMask = MIIM_DATA | MIIM_TYPE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1361 bRet = menuPopup.GetMenuItemInfo(i, TRUE, &mii);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1362 ATLASSERT(bRet);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1363
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1364 _MenuItemData* pMI = (_MenuItemData*)mii.dwItemData;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1365 if(_IsValidMem(pMI) && pMI->IsCmdBarMenuItem())
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1366 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1367 mii.fMask = MIIM_DATA | MIIM_TYPE | MIIM_STATE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1368 mii.fType = pMI->fType;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1369 mii.dwTypeData = pMI->lpstrText;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1370 mii.cch = lstrlen(pMI->lpstrText);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1371 mii.dwItemData = NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1372
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1373 bRet = menuPopup.SetMenuItemInfo(i, TRUE, &mii);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1374 ATLASSERT(bRet);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1375
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1376 delete [] pMI->lpstrText;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1377 pMI->dwMagic = 0x6666;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1378 delete pMI;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1379 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1380 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1381 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1382 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1383 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1384
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1385 bHandled = FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1386 return 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1387 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1388
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1389 LRESULT OnInternalAutoPopup(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& /*bHandled*/)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1390 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1391 int nIndex = (int)wParam;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1392 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1393 pT->DoPopupMenu(nIndex, false);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1394 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1395 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1396
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1397 LRESULT OnInternalGetBar(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& /*bHandled*/)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1398 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1399 // Let's make sure we're not embedded in another process
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1400 if((LPVOID)wParam != NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1401 *((DWORD*)wParam) = GetCurrentProcessId();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1402 if(this->IsWindowVisible())
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1403 return (LRESULT)static_cast<CCommandBarCtrlBase*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1404 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1405 return NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1406 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1407
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1408 LRESULT OnSettingChange(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& /*bHandled*/)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1409 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1410 if((wParam == SPI_SETNONCLIENTMETRICS) || (wParam == SPI_SETKEYBOARDCUES) || (wParam == SPI_SETFLATMENU))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1411 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1412 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1413 pT->GetSystemSettings();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1414 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1415
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1416 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1417 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1418
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1419 LRESULT OnWindowPosChanging(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1420 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1421 LRESULT lRet = this->DefWindowProc(uMsg, wParam, lParam);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1422
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1423 LPWINDOWPOS lpWP = (LPWINDOWPOS)lParam;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1424 int cyMin = ::GetSystemMetrics(SM_CYMENU);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1425 if(lpWP->cy < cyMin)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1426 lpWP->cy = cyMin;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1427
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1428 return lRet;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1429 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1430
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1431 LRESULT OnMenuChar(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1432 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1433 #ifdef _CMDBAR_EXTRA_TRACE
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1434 ATLTRACE2(atlTraceUI, 0, _T("CmdBar - OnMenuChar\n"));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1435 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1436 bHandled = TRUE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1437 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1438
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1439 LRESULT lRet;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1440 if(m_bMenuActive && (LOWORD(wParam) != 0x0D))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1441 lRet = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1442 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1443 lRet = MAKELRESULT(1, 1);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1444
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1445 if(m_bMenuActive && (HIWORD(wParam) == MF_POPUP))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1446 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1447 // Convert character to lower/uppercase and possibly Unicode, using current keyboard layout
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1448 TCHAR ch = (TCHAR)LOWORD(wParam);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1449 CMenuHandle menu = (HMENU)lParam;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1450 int nCount = ::GetMenuItemCount(menu);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1451 int nRetCode = MNC_EXECUTE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1452 BOOL bRet = FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1453 TCHAR szString[pT->_nMaxMenuItemTextLength] = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1454 WORD wMnem = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1455 bool bFound = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1456 for(int i = 0; i < nCount; i++)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1457 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1458 CMenuItemInfo mii;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1459 mii.cch = pT->_nMaxMenuItemTextLength;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1460 mii.fMask = MIIM_CHECKMARKS | MIIM_DATA | MIIM_ID | MIIM_STATE | MIIM_SUBMENU | MIIM_TYPE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1461 mii.dwTypeData = szString;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1462 bRet = menu.GetMenuItemInfo(i, TRUE, &mii);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1463 if(!bRet || (mii.fType & MFT_SEPARATOR))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1464 continue;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1465 _MenuItemData* pmd = (_MenuItemData*)mii.dwItemData;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1466 if(_IsValidMem(pmd) && pmd->IsCmdBarMenuItem())
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1467 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1468 LPTSTR p = pmd->lpstrText;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1469
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1470 if(p != NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1471 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1472 while(*p && (*p != _T('&')))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1473 p = ::CharNext(p);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1474 if((p != NULL) && *p)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1475 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1476 DWORD dwP = MAKELONG(*(++p), 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1477 DWORD dwC = MAKELONG(ch, 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1478 if(::CharLower((LPTSTR)ULongToPtr(dwP)) == ::CharLower((LPTSTR)ULongToPtr(dwC)))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1479 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1480 if(!bFound)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1481 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1482 wMnem = (WORD)i;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1483 bFound = true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1484 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1485 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1486 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1487 nRetCode = MNC_SELECT;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1488 break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1489 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1490 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1491 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1492 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1493 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1494 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1495 if(bFound)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1496 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1497 if(nRetCode == MNC_EXECUTE)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1498 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1499 this->PostMessage(TB_SETHOTITEM, (WPARAM)-1, 0L);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1500 pT->GiveFocusBack();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1501 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1502 bHandled = TRUE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1503 lRet = MAKELRESULT(wMnem, nRetCode);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1504 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1505 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1506 else if(!m_bMenuActive)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1507 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1508 int nBtn = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1509 if(!this->MapAccelerator((TCHAR)LOWORD(wParam), nBtn))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1510 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1511 bHandled = FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1512 this->PostMessage(TB_SETHOTITEM, (WPARAM)-1, 0L);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1513 pT->GiveFocusBack();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1514
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1515 // check if we should display chevron menu
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1516 if((TCHAR)LOWORD(wParam) == pT->_chChevronShortcut)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1517 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1518 if(pT->DisplayChevronMenu())
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1519 bHandled = TRUE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1520 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1521 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1522 else if(m_wndParent.IsWindowEnabled())
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1523 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1524 RECT rcClient = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1525 this->GetClientRect(&rcClient);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1526 RECT rcBtn = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1527 this->GetItemRect(nBtn, &rcBtn);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1528 TBBUTTON tbb = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1529 this->GetButton(nBtn, &tbb);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1530 if(((tbb.fsState & TBSTATE_ENABLED) != 0) && ((tbb.fsState & TBSTATE_HIDDEN) == 0) && (rcBtn.right <= rcClient.right))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1531 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1532 if(m_bUseKeyboardCues && !m_bShowKeyboardCues)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1533 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1534 m_bAllowKeyboardCues = true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1535 ShowKeyboardCues(true);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1536 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1537 pT->TakeFocus();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1538 this->PostMessage(WM_KEYDOWN, VK_DOWN, 0L);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1539 this->SetHotItem(nBtn);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1540 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1541 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1542 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1543 ::MessageBeep(0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1544 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1545 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1546 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1547
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1548 return lRet;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1549 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1550
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1551 LRESULT OnKillFocus(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1552 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1553 if(m_bUseKeyboardCues && m_bShowKeyboardCues)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1554 ShowKeyboardCues(false);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1555
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1556 bHandled = FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1557 return 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1558 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1559
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1560 LRESULT OnDrawItem(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& bHandled)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1561 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1562 LPDRAWITEMSTRUCT lpDrawItemStruct = (LPDRAWITEMSTRUCT)lParam;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1563 _MenuItemData* pmd = (_MenuItemData*)lpDrawItemStruct->itemData;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1564 if((lpDrawItemStruct->CtlType == ODT_MENU) && _IsValidMem(pmd) && pmd->IsCmdBarMenuItem())
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1565 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1566 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1567 pT->DrawItem(lpDrawItemStruct);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1568 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1569 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1570 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1571 bHandled = FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1572 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1573 return (LRESULT)TRUE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1574 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1575
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1576 LRESULT OnMeasureItem(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& bHandled)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1577 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1578 LPMEASUREITEMSTRUCT lpMeasureItemStruct = (LPMEASUREITEMSTRUCT)lParam;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1579 _MenuItemData* pmd = (_MenuItemData*)lpMeasureItemStruct->itemData;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1580 if((lpMeasureItemStruct->CtlType == ODT_MENU) && _IsValidMem(pmd) && pmd->IsCmdBarMenuItem())
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1581 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1582 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1583 pT->MeasureItem(lpMeasureItemStruct);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1584 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1585 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1586 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1587 bHandled = FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1588 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1589 return (LRESULT)TRUE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1590 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1591
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1592 // API message handlers
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1593 LRESULT OnAPIGetMenu(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1594 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1595 return (LRESULT)m_hMenu;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1596 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1597
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1598 LRESULT OnAPITrackPopupMenu(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& /*bHandled*/)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1599 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1600 if(lParam == NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1601 return FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1602 LPCBRPOPUPMENU lpCBRPopupMenu = (LPCBRPOPUPMENU)lParam;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1603 if(lpCBRPopupMenu->cbSize != sizeof(CBRPOPUPMENU))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1604 return FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1605
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1606 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1607 return pT->TrackPopupMenu(lpCBRPopupMenu->hMenu, lpCBRPopupMenu->uFlags, lpCBRPopupMenu->x, lpCBRPopupMenu->y, lpCBRPopupMenu->lptpm);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1608 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1609
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1610 LRESULT OnAPIGetCmdBar(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1611 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1612 return (LRESULT)this->m_hWnd;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1613 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1614
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1615 // Parent window message handlers
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1616 LRESULT OnParentHotItemChange(int /*idCtrl*/, LPNMHDR pnmh, BOOL& bHandled)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1617 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1618 LPNMTBHOTITEM lpNMHT = (LPNMTBHOTITEM)pnmh;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1619
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1620 // Check if this comes from us
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1621 if(pnmh->hwndFrom != this->m_hWnd)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1622 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1623 bHandled = FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1624 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1625 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1626
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1627 bool bBlockTracking = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1628 if((m_dwExtendedStyle & CBR_EX_TRACKALWAYS) == 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1629 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1630 DWORD dwProcessID;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1631 ::GetWindowThreadProcessId(::GetActiveWindow(), &dwProcessID);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1632 bBlockTracking = (::GetCurrentProcessId() != dwProcessID);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1633 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1634
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1635 if((!m_wndParent.IsWindowEnabled() || bBlockTracking) && (lpNMHT->dwFlags & HICF_MOUSE))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1636 return 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1637
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1638 bHandled = FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1639
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1640 // Send WM_MENUSELECT to the app if it needs to display a status text
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1641 if(!(lpNMHT->dwFlags & HICF_MOUSE) && !(lpNMHT->dwFlags & HICF_ACCELERATOR) && !(lpNMHT->dwFlags & HICF_LMOUSE))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1642 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1643 if(lpNMHT->dwFlags & HICF_ENTERING)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1644 m_wndParent.SendMessage(WM_MENUSELECT, 0, (LPARAM)m_hMenu);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1645 if(lpNMHT->dwFlags & HICF_LEAVING)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1646 m_wndParent.SendMessage(WM_MENUSELECT, MAKEWPARAM(0, 0xFFFF), NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1647 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1648
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1649 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1650 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1651
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1652 LRESULT OnParentDropDown(int /*idCtrl*/, LPNMHDR pnmh, BOOL& bHandled)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1653 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1654 // Check if this comes from us
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1655 if(pnmh->hwndFrom != this->m_hWnd)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1656 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1657 bHandled = FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1658 return 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1659 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1660
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1661 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1662 if(::GetFocus() != this->m_hWnd)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1663 pT->TakeFocus();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1664 LPNMTOOLBAR pNMToolBar = (LPNMTOOLBAR)pnmh;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1665 int nIndex = this->CommandToIndex(pNMToolBar->iItem);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1666 m_bContextMenu = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1667 m_bEscapePressed = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1668 pT->DoPopupMenu(nIndex, true);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1669
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1670 return TBDDRET_DEFAULT;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1671 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1672
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1673 LRESULT OnParentInitMenuPopup(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1674 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1675 return OnInitMenuPopup(uMsg, wParam, lParam, bHandled);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1676 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1677
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1678 LRESULT OnParentInternalGetBar(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1679 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1680 return OnInternalGetBar(uMsg, wParam, lParam, bHandled);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1681 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1682
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1683 LRESULT OnParentSysCommand(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1684 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1685 bHandled = FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1686 if(((m_uSysKey == VK_MENU)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1687 || ((m_uSysKey == VK_F10) && !(::GetKeyState(VK_SHIFT) & 0x80))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1688 || (m_uSysKey == VK_SPACE))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1689 && (wParam == SC_KEYMENU))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1690 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1691 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1692 if(::GetFocus() == this->m_hWnd)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1693 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1694 pT->GiveFocusBack(); // exit menu "loop"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1695 this->PostMessage(TB_SETHOTITEM, (WPARAM)-1, 0L);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1696 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1697 else if((m_uSysKey != VK_SPACE) && !m_bSkipMsg)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1698 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1699 if(m_bUseKeyboardCues && !m_bShowKeyboardCues && m_bAllowKeyboardCues)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1700 ShowKeyboardCues(true);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1701
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1702 pT->TakeFocus(); // enter menu "loop"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1703 bHandled = TRUE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1704 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1705 else if(m_uSysKey != VK_SPACE)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1706 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1707 bHandled = TRUE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1708 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1709 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1710 m_bSkipMsg = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1711 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1712 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1713
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1714 LRESULT OnParentAPIGetMenu(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1715 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1716 return OnAPIGetMenu(uMsg, wParam, lParam, bHandled);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1717 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1718
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1719 LRESULT OnParentMenuChar(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1720 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1721 return OnMenuChar(uMsg, wParam, lParam, bHandled);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1722 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1723
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1724 LRESULT OnParentAPITrackPopupMenu(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1725 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1726 return OnAPITrackPopupMenu(uMsg, wParam, lParam, bHandled);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1727 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1728
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1729 LRESULT OnParentAPIGetCmdBar(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1730 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1731 return OnAPIGetCmdBar(uMsg, wParam, lParam, bHandled);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1732 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1733
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1734 LRESULT OnParentSettingChange(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1735 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1736 OnSettingChange(uMsg, wParam, lParam, bHandled);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1737 bHandled = FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1738 return 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1739 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1740
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1741 LRESULT OnParentDrawItem(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1742 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1743 return OnDrawItem(uMsg, wParam, lParam, bHandled);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1744 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1745
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1746 LRESULT OnParentMeasureItem(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1747 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1748 return OnMeasureItem(uMsg, wParam, lParam, bHandled);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1749 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1750
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1751 LRESULT OnParentActivate(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1752 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1753 m_bParentActive = (LOWORD(wParam) != WA_INACTIVE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1754 if(!m_bParentActive && m_bUseKeyboardCues && m_bShowKeyboardCues)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1755 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1756 ShowKeyboardCues(false); // this will repaint our window
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1757 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1758 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1759 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1760 this->Invalidate();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1761 this->UpdateWindow();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1762 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1763 bHandled = FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1764 return 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1765 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1766
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1767 LRESULT OnParentCustomDraw(int /*idCtrl*/, LPNMHDR pnmh, BOOL& bHandled)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1768 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1769 LRESULT lRet = CDRF_DODEFAULT;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1770 bHandled = FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1771 if(pnmh->hwndFrom == this->m_hWnd)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1772 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1773 LPNMTBCUSTOMDRAW lpTBCustomDraw = (LPNMTBCUSTOMDRAW)pnmh;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1774 if(lpTBCustomDraw->nmcd.dwDrawStage == CDDS_PREPAINT)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1775 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1776 lRet = CDRF_NOTIFYITEMDRAW;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1777 bHandled = TRUE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1778 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1779 else if(lpTBCustomDraw->nmcd.dwDrawStage == CDDS_ITEMPREPAINT)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1780 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1781 #if _WTL_CMDBAR_VISTA_MENUS && defined(_WTL_CMDBAR_VISTA_STD_MENUBAR)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1782 if(m_bVistaMenus)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1783 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1784 ::SetRectEmpty(&lpTBCustomDraw->rcText);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1785 lRet = CDRF_NOTIFYPOSTPAINT;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1786 bHandled = TRUE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1787 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1788 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1789 #endif // _WTL_CMDBAR_VISTA_MENUS && defined(_WTL_CMDBAR_VISTA_STD_MENUBAR)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1790 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1791 if(m_bFlatMenus)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1792 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1793 bool bDisabled = ((lpTBCustomDraw->nmcd.uItemState & CDIS_DISABLED) == CDIS_DISABLED);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1794 if(!bDisabled && (((lpTBCustomDraw->nmcd.uItemState & CDIS_HOT) == CDIS_HOT) ||
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1795 (lpTBCustomDraw->nmcd.uItemState & CDIS_SELECTED) == CDIS_SELECTED))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1796 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1797 ::FillRect(lpTBCustomDraw->nmcd.hdc, &lpTBCustomDraw->nmcd.rc, ::GetSysColorBrush(COLOR_MENUHILIGHT));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1798 ::FrameRect(lpTBCustomDraw->nmcd.hdc, &lpTBCustomDraw->nmcd.rc, ::GetSysColorBrush(COLOR_HIGHLIGHT));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1799 lpTBCustomDraw->clrText = ::GetSysColor(m_bParentActive ? COLOR_HIGHLIGHTTEXT : COLOR_GRAYTEXT);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1800 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1801 else if(bDisabled || !m_bParentActive)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1802 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1803 lpTBCustomDraw->clrText = ::GetSysColor(COLOR_GRAYTEXT);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1804 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1805
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1806 _ParentCustomDrawHelper(lpTBCustomDraw);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1807
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1808 lRet = CDRF_SKIPDEFAULT;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1809 bHandled = TRUE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1810 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1811 else if(!m_bParentActive)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1812 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1813 lpTBCustomDraw->clrText = ::GetSysColor(COLOR_GRAYTEXT);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1814 bHandled = TRUE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1815 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1816 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1817 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1818 #if _WTL_CMDBAR_VISTA_MENUS && defined(_WTL_CMDBAR_VISTA_STD_MENUBAR)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1819 else if (lpTBCustomDraw->nmcd.dwDrawStage == CDDS_ITEMPOSTPAINT)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1820 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1821 bool bDisabled = ((lpTBCustomDraw->nmcd.uItemState & CDIS_DISABLED) == CDIS_DISABLED);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1822 if(bDisabled || !m_bParentActive)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1823 lpTBCustomDraw->clrText = ::GetSysColor(COLOR_GRAYTEXT);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1824
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1825 _ParentCustomDrawHelper(lpTBCustomDraw);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1826
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1827 lRet = CDRF_SKIPDEFAULT;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1828 bHandled = TRUE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1829 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1830 #endif // _WTL_CMDBAR_VISTA_MENUS && defined(_WTL_CMDBAR_VISTA_STD_MENUBAR)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1831 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1832 return lRet;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1833 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1834
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1835 void _ParentCustomDrawHelper(LPNMTBCUSTOMDRAW lpTBCustomDraw)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1836 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1837 CDCHandle dc = lpTBCustomDraw->nmcd.hdc;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1838 dc.SetTextColor(lpTBCustomDraw->clrText);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1839 dc.SetBkMode(lpTBCustomDraw->nStringBkMode);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1840
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1841 HFONT hFont = this->GetFont();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1842 HFONT hFontOld = NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1843 if(hFont != NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1844 hFontOld = dc.SelectFont(hFont);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1845
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1846 const int cchText = 200;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1847 TCHAR szText[cchText] = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1848 TBBUTTONINFO tbbi = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1849 tbbi.cbSize = sizeof(TBBUTTONINFO);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1850 tbbi.dwMask = TBIF_TEXT;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1851 tbbi.pszText = szText;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1852 tbbi.cchText = cchText;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1853 this->GetButtonInfo((int)lpTBCustomDraw->nmcd.dwItemSpec, &tbbi);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1854
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1855 dc.DrawText(szText, -1, &lpTBCustomDraw->nmcd.rc, DT_SINGLELINE | DT_CENTER | DT_VCENTER | (m_bShowKeyboardCues ? 0 : DT_HIDEPREFIX));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1856
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1857 if(hFont != NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1858 dc.SelectFont(hFontOld);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1859 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1860
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1861 // Message hook handlers
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1862 LRESULT OnHookMouseMove(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1863 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1864 static POINT s_point = { -1, -1 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1865 DWORD dwPoint = ::GetMessagePos();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1866 POINT point = { GET_X_LPARAM(dwPoint), GET_Y_LPARAM(dwPoint) };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1867
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1868 bHandled = FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1869 if(m_bMenuActive)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1870 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1871 if(::WindowFromPoint(point) == this->m_hWnd)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1872 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1873 this->ScreenToClient(&point);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1874 int nHit = this->HitTest(&point);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1875
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1876 if(((point.x != s_point.x) || (point.y != s_point.y)) && (nHit >= 0) && (nHit < ::GetMenuItemCount(m_hMenu)) && (nHit != m_nPopBtn) && (m_nPopBtn != -1))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1877 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1878 TBBUTTON tbb = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1879 this->GetButton(nHit, &tbb);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1880 if((tbb.fsState & TBSTATE_ENABLED) != 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1881 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1882 m_nNextPopBtn = nHit | 0xFFFF0000;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1883 HWND hWndMenu = this->m_stackMenuWnd.GetCurrent();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1884 ATLASSERT(hWndMenu != NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1885
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1886 // this one is needed to close a menu if mouse button was down
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1887 ::PostMessage(hWndMenu, WM_LBUTTONUP, 0, MAKELPARAM(point.x, point.y));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1888 // this one closes a popup menu
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1889 ::PostMessage(hWndMenu, WM_KEYDOWN, VK_ESCAPE, 0L);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1890
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1891 bHandled = TRUE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1892 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1893 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1894 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1895 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1896 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1897 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1898 this->ScreenToClient(&point);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1899 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1900
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1901 s_point = point;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1902 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1903 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1904
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1905 LRESULT OnHookSysKeyDown(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1906 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1907 bHandled = FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1908 #ifdef _CMDBAR_EXTRA_TRACE
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1909 ATLTRACE2(atlTraceUI, 0, _T("CmdBar - Hook WM_SYSKEYDOWN (0x%2.2X)\n"), wParam);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1910 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1911
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1912 if((wParam == VK_MENU) && m_bParentActive && m_bUseKeyboardCues && !m_bShowKeyboardCues && m_bAllowKeyboardCues)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1913 ShowKeyboardCues(true);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1914
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1915 if((wParam != VK_SPACE) && !m_bMenuActive && (::GetFocus() == this->m_hWnd))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1916 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1917 m_bAllowKeyboardCues = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1918 this->PostMessage(TB_SETHOTITEM, (WPARAM)-1, 0L);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1919 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1920 pT->GiveFocusBack();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1921 m_bSkipMsg = true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1922 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1923 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1924 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1925 if((wParam == VK_SPACE) && m_bUseKeyboardCues && m_bShowKeyboardCues)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1926 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1927 m_bAllowKeyboardCues = true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1928 ShowKeyboardCues(false);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1929 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1930 m_uSysKey = (UINT)wParam;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1931 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1932 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1933 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1934
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1935 LRESULT OnHookSysKeyUp(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1936 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1937 if(!m_bAllowKeyboardCues)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1938 m_bAllowKeyboardCues = true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1939 bHandled = FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1940 (void)wParam; // avoid level 4 warning
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1941 #ifdef _CMDBAR_EXTRA_TRACE
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1942 ATLTRACE2(atlTraceUI, 0, _T("CmdBar - Hook WM_SYSKEYUP (0x%2.2X)\n"), wParam);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1943 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1944 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1945 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1946
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1947 LRESULT OnHookSysChar(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1948 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1949 bHandled = FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1950 #ifdef _CMDBAR_EXTRA_TRACE
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1951 ATLTRACE2(atlTraceUI, 0, _T("CmdBar - Hook WM_SYSCHAR (0x%2.2X)\n"), wParam);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1952 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1953
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1954 if(!m_bMenuActive && (this->m_hWndHook != this->m_hWnd) && (wParam != VK_SPACE))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1955 bHandled = TRUE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1956 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1957 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1958
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1959 LRESULT OnHookKeyDown(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1960 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1961 #ifdef _CMDBAR_EXTRA_TRACE
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1962 ATLTRACE2(atlTraceUI, 0, _T("CmdBar - Hook WM_KEYDOWN (0x%2.2X)\n"), wParam);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1963 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1964 bHandled = FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1965 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1966
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1967 if((wParam == VK_ESCAPE) && (this->m_stackMenuWnd.GetSize() <= 1))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1968 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1969 if(m_bMenuActive && !m_bContextMenu)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1970 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1971 int nHot = this->GetHotItem();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1972 if(nHot == -1)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1973 nHot = m_nPopBtn;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1974 if(nHot == -1)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1975 nHot = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1976 this->SetHotItem(nHot);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1977 bHandled = TRUE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1978 pT->TakeFocus();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1979 m_bEscapePressed = true; // To keep focus
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1980 m_bSkipPostDown = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1981 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1982 else if((::GetFocus() == this->m_hWnd) && m_wndParent.IsWindow())
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1983 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1984 this->SetHotItem(-1);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1985 pT->GiveFocusBack();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1986 bHandled = TRUE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1987 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1988 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1989 else if((wParam == VK_RETURN) || (wParam == VK_UP) || (wParam == VK_DOWN))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1990 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1991 if(!m_bMenuActive && (::GetFocus() == this->m_hWnd) && m_wndParent.IsWindow())
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1992 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1993 int nHot = this->GetHotItem();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1994 if(nHot != -1)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1995 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1996 if(wParam != VK_RETURN)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1997 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1998 if(!m_bSkipPostDown)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1999 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2000 this->PostMessage(WM_KEYDOWN, VK_DOWN, 0L);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2001 m_bSkipPostDown = true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2002 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2003 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2004 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2005 ATLTRACE2(atlTraceUI, 0, _T("CmdBar - skipping posting another VK_DOWN\n"));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2006 m_bSkipPostDown = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2007 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2008 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2009 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2010 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2011 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2012 ATLTRACE2(atlTraceUI, 0, _T("CmdBar - Can't find hot button\n"));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2013 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2014 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2015 if((wParam == VK_RETURN) && m_bMenuActive)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2016 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2017 this->PostMessage(TB_SETHOTITEM, (WPARAM)-1, 0L);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2018 m_nNextPopBtn = -1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2019 pT->GiveFocusBack();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2020 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2021 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2022 else if((wParam == VK_LEFT) || (wParam == VK_RIGHT))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2023 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2024 WPARAM wpNext = m_bLayoutRTL ? VK_LEFT : VK_RIGHT;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2025 WPARAM wpPrev = m_bLayoutRTL ? VK_RIGHT : VK_LEFT;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2026
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2027 if(m_bMenuActive && !m_bContextMenu && !((wParam == wpNext) && m_bPopupItem))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2028 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2029 bool bAction = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2030 if((wParam == wpPrev) && (this->s_pCurrentBar->m_stackMenuWnd.GetSize() == 1))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2031 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2032 m_nNextPopBtn = pT->GetPreviousMenuItem(m_nPopBtn);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2033 if(m_nNextPopBtn != -1)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2034 bAction = true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2035 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2036 else if(wParam == wpNext)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2037 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2038 m_nNextPopBtn = pT->GetNextMenuItem(m_nPopBtn);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2039 if(m_nNextPopBtn != -1)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2040 bAction = true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2041 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2042 HWND hWndMenu = this->m_stackMenuWnd.GetCurrent();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2043 ATLASSERT(hWndMenu != NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2044
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2045 // Close the popup menu
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2046 if(bAction)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2047 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2048 ::PostMessage(hWndMenu, WM_KEYDOWN, VK_ESCAPE, 0L);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2049 if(wParam == wpNext)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2050 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2051 int cItem = this->m_stackMenuWnd.GetSize() - 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2052 while(cItem >= 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2053 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2054 hWndMenu = this->m_stackMenuWnd[cItem];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2055 if(hWndMenu != NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2056 ::PostMessage(hWndMenu, WM_KEYDOWN, VK_ESCAPE, 0L);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2057 cItem--;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2058 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2059 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2060 if(m_nNextPopBtn == -2)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2061 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2062 m_nNextPopBtn = -1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2063 pT->DisplayChevronMenu();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2064 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2065 bHandled = TRUE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2066 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2067 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2068 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2069 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2070 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2071
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2072 LRESULT OnHookNextMenu(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2073 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2074 #ifdef _CMDBAR_EXTRA_TRACE
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2075 ATLTRACE2(atlTraceUI, 0, _T("CmdBar - Hook WM_NEXTMENU\n"));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2076 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2077 bHandled = FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2078 return 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2079 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2080
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2081 LRESULT OnHookChar(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2082 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2083 #ifdef _CMDBAR_EXTRA_TRACE
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2084 ATLTRACE2(atlTraceUI, 0, _T("CmdBar - Hook WM_CHAR (0x%2.2X)\n"), wParam);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2085 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2086 bHandled = (wParam == VK_ESCAPE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2087 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2088 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2089
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2090 // Implementation - ownerdraw overrideables and helpers
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2091 void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2092 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2093 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2094 if(m_bFlatMenus)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2095 pT->DrawItemFlat(lpDrawItemStruct);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2096 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2097 pT->DrawItem3D(lpDrawItemStruct);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2098
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2099 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2100
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2101 void DrawItem3D(LPDRAWITEMSTRUCT lpDrawItemStruct)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2102 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2103 _MenuItemData* pmd = (_MenuItemData*)lpDrawItemStruct->itemData;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2104 CDCHandle dc = lpDrawItemStruct->hDC;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2105 const RECT& rcItem = lpDrawItemStruct->rcItem;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2106 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2107
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2108 if(pmd->fType & MFT_SEPARATOR)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2109 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2110 // draw separator
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2111 RECT rc = rcItem;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2112 rc.top += (rc.bottom - rc.top) / 2; // vertical center
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2113 dc.DrawEdge(&rc, EDGE_ETCHED, BF_TOP); // draw separator line
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2114 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2115 else // not a separator
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2116 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2117 BOOL bDisabled = lpDrawItemStruct->itemState & ODS_GRAYED;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2118 BOOL bSelected = lpDrawItemStruct->itemState & ODS_SELECTED;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2119 BOOL bChecked = lpDrawItemStruct->itemState & ODS_CHECKED;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2120 BOOL bHasImage = FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2121
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2122 if(LOWORD(lpDrawItemStruct->itemID) == (WORD)-1)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2123 bSelected = FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2124 RECT rcButn = { rcItem.left, rcItem.top, rcItem.left + m_szButton.cx, rcItem.top + m_szButton.cy }; // button rect
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2125 ::OffsetRect(&rcButn, 0, ((rcItem.bottom - rcItem.top) - (rcButn.bottom - rcButn.top)) / 2); // center vertically
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2126
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2127 int iButton = pmd->iButton;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2128 if(iButton >= 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2129 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2130 bHasImage = TRUE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2131
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2132 // calc drawing point
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2133 SIZE sz = { rcButn.right - rcButn.left - m_szBitmap.cx, rcButn.bottom - rcButn.top - m_szBitmap.cy };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2134 sz.cx /= 2;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2135 sz.cy /= 2;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2136 POINT point = { rcButn.left + sz.cx, rcButn.top + sz.cy };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2137
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2138 // fill background depending on state
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2139 if(!bChecked || (bSelected && !bDisabled))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2140 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2141 if(!bDisabled)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2142 dc.FillRect(&rcButn, (bChecked && !bSelected) ? COLOR_3DLIGHT : COLOR_MENU);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2143 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2144 dc.FillRect(&rcButn, COLOR_MENU);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2145 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2146 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2147 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2148 COLORREF crTxt = dc.SetTextColor(::GetSysColor(COLOR_BTNFACE));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2149 COLORREF crBk = dc.SetBkColor(::GetSysColor(COLOR_BTNHILIGHT));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2150 CBrush hbr(CDCHandle::GetHalftoneBrush());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2151 dc.SetBrushOrg(rcButn.left, rcButn.top);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2152 dc.FillRect(&rcButn, hbr);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2153 dc.SetTextColor(crTxt);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2154 dc.SetBkColor(crBk);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2155 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2156
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2157 // draw disabled or normal
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2158 if(!bDisabled)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2159 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2160 // draw pushed-in or popped-out edge
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2161 if(bSelected || bChecked)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2162 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2163 RECT rc2 = rcButn;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2164 dc.DrawEdge(&rc2, bChecked ? BDR_SUNKENOUTER : BDR_RAISEDINNER, BF_RECT);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2165 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2166 // draw the image
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2167 ::ImageList_Draw(m_hImageList, iButton, dc, point.x, point.y, ILD_TRANSPARENT);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2168 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2169 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2170 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2171 HBRUSH hBrushBackground = bChecked ? NULL : ::GetSysColorBrush(COLOR_MENU);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2172 pT->DrawBitmapDisabled(dc, iButton, point, hBrushBackground);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2173 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2174 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2175 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2176 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2177 // no image - look for custom checked/unchecked bitmaps
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2178 CMenuItemInfo info;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2179 info.fMask = MIIM_CHECKMARKS | MIIM_TYPE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2180 ::GetMenuItemInfo((HMENU)lpDrawItemStruct->hwndItem, lpDrawItemStruct->itemID, MF_BYCOMMAND, &info);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2181 if(bChecked || (info.hbmpUnchecked != NULL))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2182 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2183 BOOL bRadio = ((info.fType & MFT_RADIOCHECK) != 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2184 bHasImage = pT->DrawCheckmark(dc, rcButn, bSelected, bDisabled, bRadio, bChecked ? info.hbmpChecked : info.hbmpUnchecked);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2185 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2186 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2187
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2188 // draw item text
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2189 int cxButn = m_szButton.cx;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2190 COLORREF colorBG = ::GetSysColor(bSelected ? COLOR_HIGHLIGHT : COLOR_MENU);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2191 if(bSelected || (lpDrawItemStruct->itemAction == ODA_SELECT))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2192 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2193 RECT rcBG = rcItem;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2194 if(bHasImage)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2195 rcBG.left += cxButn + s_kcxGap;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2196 dc.FillRect(&rcBG, bSelected ? COLOR_HIGHLIGHT : COLOR_MENU);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2197 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2198
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2199 // calc text rectangle and colors
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2200 RECT rcText = rcItem;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2201 rcText.left += cxButn + s_kcxGap + s_kcxTextMargin;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2202 rcText.right -= cxButn;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2203 dc.SetBkMode(TRANSPARENT);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2204 COLORREF colorText = ::GetSysColor(bDisabled ? (bSelected ? COLOR_GRAYTEXT : COLOR_3DSHADOW) : (bSelected ? COLOR_HIGHLIGHTTEXT : COLOR_MENUTEXT));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2205
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2206 // font already selected by Windows
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2207 if(bDisabled && (!bSelected || (colorText == colorBG)))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2208 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2209 // disabled - draw shadow text shifted down and right 1 pixel (unles selected)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2210 RECT rcDisabled = rcText;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2211 ::OffsetRect(&rcDisabled, 1, 1);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2212 pT->DrawMenuText(dc, rcDisabled, pmd->lpstrText, ::GetSysColor(COLOR_3DHILIGHT));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2213 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2214 pT->DrawMenuText(dc, rcText, pmd->lpstrText, colorText); // finally!
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2215 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2216 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2217
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2218 void DrawItemFlat(LPDRAWITEMSTRUCT lpDrawItemStruct)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2219 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2220 _MenuItemData* pmd = (_MenuItemData*)lpDrawItemStruct->itemData;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2221 CDCHandle dc = lpDrawItemStruct->hDC;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2222 const RECT& rcItem = lpDrawItemStruct->rcItem;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2223 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2224
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2225 BOOL bDisabled = lpDrawItemStruct->itemState & ODS_GRAYED;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2226 BOOL bSelected = lpDrawItemStruct->itemState & ODS_SELECTED;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2227 BOOL bChecked = lpDrawItemStruct->itemState & ODS_CHECKED;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2228
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2229 // paint background
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2230 if(bSelected || (lpDrawItemStruct->itemAction == ODA_SELECT))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2231 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2232 if(bSelected)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2233 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2234 dc.FillRect(&rcItem, ::GetSysColorBrush(COLOR_MENUHILIGHT));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2235 dc.FrameRect(&rcItem, ::GetSysColorBrush(COLOR_HIGHLIGHT));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2236 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2237 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2238 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2239 dc.FillRect(&rcItem, ::GetSysColorBrush(COLOR_MENU));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2240 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2241 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2242
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2243 if(pmd->fType & MFT_SEPARATOR)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2244 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2245 // draw separator
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2246 RECT rc = rcItem;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2247 rc.top += (rc.bottom - rc.top) / 2; // vertical center
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2248 dc.DrawEdge(&rc, EDGE_ETCHED, BF_TOP); // draw separator line
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2249 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2250 else // not a separator
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2251 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2252 if(LOWORD(lpDrawItemStruct->itemID) == (WORD)-1)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2253 bSelected = FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2254 RECT rcButn = { rcItem.left, rcItem.top, rcItem.left + m_szButton.cx, rcItem.top + m_szButton.cy }; // button rect
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2255 ::OffsetRect(&rcButn, 0, ((rcItem.bottom - rcItem.top) - (rcButn.bottom - rcButn.top)) / 2); // center vertically
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2256
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2257 // draw background and border for checked items
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2258 if(bChecked)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2259 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2260 RECT rcCheck = rcButn;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2261 ::InflateRect(&rcCheck, -1, -1);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2262 if(bSelected)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2263 dc.FillRect(&rcCheck, ::GetSysColorBrush(COLOR_MENU));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2264 dc.FrameRect(&rcCheck, ::GetSysColorBrush(COLOR_HIGHLIGHT));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2265 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2266
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2267 int iButton = pmd->iButton;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2268 if(iButton >= 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2269 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2270 // calc drawing point
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2271 SIZE sz = { rcButn.right - rcButn.left - m_szBitmap.cx, rcButn.bottom - rcButn.top - m_szBitmap.cy };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2272 sz.cx /= 2;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2273 sz.cy /= 2;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2274 POINT point = { rcButn.left + sz.cx, rcButn.top + sz.cy };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2275
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2276 // draw disabled or normal
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2277 if(!bDisabled)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2278 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2279 ::ImageList_Draw(m_hImageList, iButton, dc, point.x, point.y, ILD_TRANSPARENT);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2280 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2281 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2282 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2283 HBRUSH hBrushBackground = ::GetSysColorBrush((bSelected && !(bDisabled && bChecked)) ? COLOR_MENUHILIGHT : COLOR_MENU);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2284 HBRUSH hBrushDisabledImage = ::GetSysColorBrush(COLOR_3DSHADOW);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2285 pT->DrawBitmapDisabled(dc, iButton, point, hBrushBackground, hBrushBackground, hBrushDisabledImage);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2286 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2287 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2288 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2289 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2290 // no image - look for custom checked/unchecked bitmaps
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2291 CMenuItemInfo info;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2292 info.fMask = MIIM_CHECKMARKS | MIIM_TYPE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2293 ::GetMenuItemInfo((HMENU)lpDrawItemStruct->hwndItem, lpDrawItemStruct->itemID, MF_BYCOMMAND, &info);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2294 if(bChecked || (info.hbmpUnchecked != NULL))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2295 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2296 BOOL bRadio = ((info.fType & MFT_RADIOCHECK) != 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2297 pT->DrawCheckmark(dc, rcButn, bSelected, bDisabled, bRadio, bChecked ? info.hbmpChecked : info.hbmpUnchecked);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2298 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2299 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2300
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2301 // draw item text
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2302 int cxButn = m_szButton.cx;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2303 // calc text rectangle and colors
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2304 RECT rcText = rcItem;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2305 rcText.left += cxButn + s_kcxGap + s_kcxTextMargin;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2306 rcText.right -= cxButn;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2307 dc.SetBkMode(TRANSPARENT);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2308 COLORREF colorText = ::GetSysColor(bDisabled ? (bSelected ? COLOR_GRAYTEXT : COLOR_3DSHADOW) : (bSelected ? COLOR_HIGHLIGHTTEXT : COLOR_MENUTEXT));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2309
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2310 pT->DrawMenuText(dc, rcText, pmd->lpstrText, colorText); // finally!
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2311 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2312 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2313
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2314 void DrawMenuText(CDCHandle& dc, RECT& rc, LPCTSTR lpstrText, COLORREF color)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2315 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2316 int nTab = -1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2317 const int nLen = lstrlen(lpstrText);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2318 for(int i = 0; i < nLen; i++)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2319 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2320 if(lpstrText[i] == _T('\t'))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2321 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2322 nTab = i;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2323 break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2324 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2325 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2326 dc.SetTextColor(color);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2327 dc.DrawText(lpstrText, nTab, &rc, DT_SINGLELINE | DT_LEFT | DT_VCENTER | (m_bShowKeyboardCues ? 0 : DT_HIDEPREFIX));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2328 if(nTab != -1)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2329 dc.DrawText(&lpstrText[nTab + 1], -1, &rc, DT_SINGLELINE | DT_RIGHT | DT_VCENTER | (m_bShowKeyboardCues ? 0 : DT_HIDEPREFIX));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2330 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2331
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2332 void DrawBitmapDisabled(CDCHandle& dc, int nImage, POINT point,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2333 HBRUSH hBrushBackground = ::GetSysColorBrush(COLOR_3DFACE),
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2334 HBRUSH hBrush3DEffect = ::GetSysColorBrush(COLOR_3DHILIGHT),
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2335 HBRUSH hBrushDisabledImage = ::GetSysColorBrush(COLOR_3DSHADOW))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2336 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2337 if(m_bAlphaImages)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2338 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2339 IMAGELISTDRAWPARAMS ildp = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2340 ildp.cbSize = sizeof(IMAGELISTDRAWPARAMS);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2341 ildp.himl = m_hImageList;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2342 ildp.i = nImage;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2343 ildp.hdcDst = dc;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2344 ildp.x = point.x;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2345 ildp.y = point.y;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2346 ildp.cx = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2347 ildp.cy = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2348 ildp.xBitmap = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2349 ildp.yBitmap = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2350 ildp.fStyle = ILD_TRANSPARENT;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2351 ildp.fState = ILS_SATURATE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2352 ildp.Frame = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2353 ::ImageList_DrawIndirect(&ildp);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2354 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2355 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2356 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2357 // create memory DC
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2358 CDC dcMem;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2359 dcMem.CreateCompatibleDC(dc);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2360 // create mono or color bitmap
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2361 CBitmap bmp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2362 bmp.CreateCompatibleBitmap(dc, m_szBitmap.cx, m_szBitmap.cy);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2363 ATLASSERT(bmp.m_hBitmap != NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2364 // draw image into memory DC--fill BG white first
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2365 HBITMAP hBmpOld = dcMem.SelectBitmap(bmp);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2366 dcMem.PatBlt(0, 0, m_szBitmap.cx, m_szBitmap.cy, WHITENESS);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2367 // If white is the text color, we can't use the normal painting since
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2368 // it would blend with the WHITENESS, but the mask is OK
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2369 UINT uDrawStyle = (::GetSysColor(COLOR_BTNTEXT) == RGB(255, 255, 255)) ? ILD_MASK : ILD_NORMAL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2370 ::ImageList_Draw(m_hImageList, nImage, dcMem, 0, 0, uDrawStyle);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2371 dc.DitherBlt(point.x, point.y, m_szBitmap.cx, m_szBitmap.cy, dcMem, NULL, 0, 0, hBrushBackground, hBrush3DEffect, hBrushDisabledImage);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2372 dcMem.SelectBitmap(hBmpOld); // restore
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2373 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2374 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2375
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2376 // old name
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2377 BOOL Draw3DCheckmark(CDCHandle& dc, const RECT& rc, BOOL bSelected, BOOL bDisabled, BOOL bRadio, HBITMAP hBmpCheck)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2378 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2379 return DrawCheckmark(dc, rc, bSelected, bDisabled, bRadio, hBmpCheck);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2380 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2381
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2382 BOOL DrawCheckmark(CDCHandle& dc, const RECT& rc, BOOL bSelected, BOOL bDisabled, BOOL bRadio, HBITMAP hBmpCheck)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2383 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2384 // get checkmark bitmap, if none, use Windows standard
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2385 SIZE size = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2386 CBitmapHandle bmp = hBmpCheck;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2387 if(hBmpCheck != NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2388 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2389 bmp.GetSize(size);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2390 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2391 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2392 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2393 size.cx = ::GetSystemMetrics(SM_CXMENUCHECK);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2394 size.cy = ::GetSystemMetrics(SM_CYMENUCHECK);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2395 bmp.CreateCompatibleBitmap(dc, size.cx, size.cy);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2396 ATLASSERT(bmp.m_hBitmap != NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2397 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2398 // center bitmap in caller's rectangle
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2399 RECT rcDest = rc;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2400 if((rc.right - rc.left) > size.cx)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2401 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2402 rcDest.left = rc.left + (rc.right - rc.left - size.cx) / 2;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2403 rcDest.right = rcDest.left + size.cx;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2404 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2405 if((rc.bottom - rc.top) > size.cy)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2406 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2407 rcDest.top = rc.top + (rc.bottom - rc.top - size.cy) / 2;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2408 rcDest.bottom = rcDest.top + size.cy;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2409 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2410 // paint background
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2411 if(!m_bFlatMenus)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2412 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2413 if(bSelected && !bDisabled)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2414 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2415 dc.FillRect(&rcDest, COLOR_MENU);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2416 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2417 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2418 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2419 COLORREF clrTextOld = dc.SetTextColor(::GetSysColor(COLOR_BTNFACE));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2420 COLORREF clrBkOld = dc.SetBkColor(::GetSysColor(COLOR_BTNHILIGHT));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2421 CBrush hbr(CDCHandle::GetHalftoneBrush());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2422 dc.SetBrushOrg(rcDest.left, rcDest.top);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2423 dc.FillRect(&rcDest, hbr);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2424 dc.SetTextColor(clrTextOld);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2425 dc.SetBkColor(clrBkOld);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2426 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2427 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2428
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2429 // create source image
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2430 CDC dcSource;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2431 dcSource.CreateCompatibleDC(dc);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2432 HBITMAP hBmpOld = dcSource.SelectBitmap(bmp);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2433 // set colors
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2434 const COLORREF clrBlack = RGB(0, 0, 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2435 const COLORREF clrWhite = RGB(255, 255, 255);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2436 COLORREF clrTextOld = dc.SetTextColor(clrBlack);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2437 COLORREF clrBkOld = dc.SetBkColor(clrWhite);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2438 // create mask
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2439 CDC dcMask;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2440 dcMask.CreateCompatibleDC(dc);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2441 CBitmap bmpMask;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2442 bmpMask.CreateBitmap(size.cx, size.cy, 1, 1, NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2443 HBITMAP hBmpOld1 = dcMask.SelectBitmap(bmpMask);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2444
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2445 // draw the checkmark transparently
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2446 int cx = rcDest.right - rcDest.left;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2447 int cy = rcDest.bottom - rcDest.top;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2448 if(hBmpCheck != NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2449 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2450 // build mask based on transparent color
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2451 dcSource.SetBkColor(m_clrMask);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2452 dcMask.SetBkColor(clrBlack);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2453 dcMask.SetTextColor(clrWhite);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2454 dcMask.BitBlt(0, 0, size.cx, size.cy, dcSource, 0, 0, SRCCOPY);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2455 // draw bitmap using the mask
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2456 dc.BitBlt(rcDest.left, rcDest.top, cx, cy, dcSource, 0, 0, SRCINVERT);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2457 dc.BitBlt(rcDest.left, rcDest.top, cx, cy, dcMask, 0, 0, SRCAND);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2458 dc.BitBlt(rcDest.left, rcDest.top, cx, cy, dcSource, 0, 0, SRCINVERT);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2459 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2460 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2461 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2462 const DWORD ROP_DSno = 0x00BB0226L;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2463 const DWORD ROP_DSa = 0x008800C6L;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2464 const DWORD ROP_DSo = 0x00EE0086L;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2465 const DWORD ROP_DSna = 0x00220326L;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2466
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2467 // draw mask
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2468 RECT rcSource = { 0, 0, __min(size.cx, rc.right - rc.left), __min(size.cy, rc.bottom - rc.top) };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2469 dcMask.DrawFrameControl(&rcSource, DFC_MENU, bRadio ? DFCS_MENUBULLET : DFCS_MENUCHECK);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2470
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2471 // draw shadow if disabled
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2472 if(!m_bFlatMenus && bDisabled)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2473 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2474 // offset by one pixel
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2475 int x = rcDest.left + 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2476 int y = rcDest.top + 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2477 // paint source bitmap
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2478 const int nColor = COLOR_3DHILIGHT;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2479 dcSource.FillRect(&rcSource, nColor);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2480 // draw checkmark - special case black and white colors
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2481 COLORREF clrCheck = ::GetSysColor(nColor);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2482 if(clrCheck == clrWhite)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2483 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2484 dc.BitBlt(x, y, cx, cy, dcMask, 0, 0, ROP_DSno);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2485 dc.BitBlt(x, y, cx, cy, dcSource, 0, 0, ROP_DSa);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2486 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2487 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2488 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2489 if(clrCheck != clrBlack)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2490 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2491 ATLASSERT(dcSource.GetTextColor() == clrBlack);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2492 ATLASSERT(dcSource.GetBkColor() == clrWhite);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2493 dcSource.BitBlt(0, 0, size.cx, size.cy, dcMask, 0, 0, ROP_DSna);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2494 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2495 dc.BitBlt(x, y, cx, cy, dcMask, 0, 0, ROP_DSa);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2496 dc.BitBlt(x, y, cx, cy, dcSource, 0, 0, ROP_DSo);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2497 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2498 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2499
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2500 // paint source bitmap
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2501 const int nColor = bDisabled ? COLOR_BTNSHADOW : COLOR_MENUTEXT;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2502 dcSource.FillRect(&rcSource, nColor);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2503 // draw checkmark - special case black and white colors
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2504 COLORREF clrCheck = ::GetSysColor(nColor);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2505 if(clrCheck == clrWhite)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2506 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2507 dc.BitBlt(rcDest.left, rcDest.top, cx, cy, dcMask, 0, 0, ROP_DSno);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2508 dc.BitBlt(rcDest.left, rcDest.top, cx, cy, dcSource, 0, 0, ROP_DSa);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2509 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2510 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2511 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2512 if(clrCheck != clrBlack)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2513 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2514 ATLASSERT(dcSource.GetTextColor() == clrBlack);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2515 ATLASSERT(dcSource.GetBkColor() == clrWhite);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2516 dcSource.BitBlt(0, 0, size.cx, size.cy, dcMask, 0, 0, ROP_DSna);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2517 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2518 dc.BitBlt(rcDest.left, rcDest.top, cx, cy, dcMask, 0, 0, ROP_DSa);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2519 dc.BitBlt(rcDest.left, rcDest.top, cx, cy, dcSource, 0, 0, ROP_DSo);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2520 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2521 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2522 // restore all
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2523 dc.SetTextColor(clrTextOld);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2524 dc.SetBkColor(clrBkOld);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2525 dcSource.SelectBitmap(hBmpOld);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2526 dcMask.SelectBitmap(hBmpOld1);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2527 if(hBmpCheck == NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2528 bmp.DeleteObject();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2529 // draw pushed-in hilight
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2530 if(!m_bFlatMenus && !bDisabled)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2531 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2532 if(rc.right - rc.left > size.cx)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2533 ::InflateRect(&rcDest, 1,1); // inflate checkmark by one pixel all around
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2534 dc.DrawEdge(&rcDest, BDR_SUNKENOUTER, BF_RECT);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2535 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2536
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2537 return TRUE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2538 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2539
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2540 void MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2541 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2542 _MenuItemData* pmd = (_MenuItemData*)lpMeasureItemStruct->itemData;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2543
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2544 if(pmd->fType & MFT_SEPARATOR) // separator - use half system height and zero width
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2545 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2546 lpMeasureItemStruct->itemHeight = ::GetSystemMetrics(SM_CYMENU) / 2;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2547 lpMeasureItemStruct->itemWidth = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2548 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2549 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2550 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2551 // compute size of text - use DrawText with DT_CALCRECT
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2552 CWindowDC dc(NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2553 CFont fontBold;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2554 HFONT hOldFont = NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2555 if(pmd->fState & MFS_DEFAULT)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2556 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2557 // need bold version of font
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2558 LOGFONT lf = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2559 m_fontMenu.GetLogFont(lf);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2560 lf.lfWeight += 200;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2561 fontBold.CreateFontIndirect(&lf);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2562 ATLASSERT(fontBold.m_hFont != NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2563 hOldFont = dc.SelectFont(fontBold);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2564 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2565 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2566 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2567 hOldFont = dc.SelectFont(m_fontMenu);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2568 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2569
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2570 RECT rcText = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2571 dc.DrawText(pmd->lpstrText, -1, &rcText, DT_SINGLELINE | DT_LEFT | DT_VCENTER | DT_CALCRECT);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2572 int cx = rcText.right - rcText.left;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2573 dc.SelectFont(hOldFont);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2574
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2575 LOGFONT lf = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2576 m_fontMenu.GetLogFont(lf);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2577 int cy = lf.lfHeight;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2578 if(cy < 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2579 cy = -cy;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2580 const int cyMargin = 8;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2581 cy += cyMargin;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2582
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2583 // height of item is the bigger of these two
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2584 lpMeasureItemStruct->itemHeight = __max(cy, (int)m_szButton.cy);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2585
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2586 // width is width of text plus a bunch of stuff
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2587 cx += 2 * s_kcxTextMargin; // L/R margin for readability
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2588 cx += s_kcxGap; // space between button and menu text
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2589 cx += 2 * m_szButton.cx; // button width (L=button; R=empty margin)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2590 cx += m_cxExtraSpacing; // extra between item text and accelerator keys
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2591
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2592 // Windows adds 1 to returned value
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2593 cx -= ::GetSystemMetrics(SM_CXMENUCHECK) - 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2594 lpMeasureItemStruct->itemWidth = cx; // done deal
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2595 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2596 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2597
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2598 // Implementation - Hook procs
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2599 static LRESULT CALLBACK CreateHookProc(int nCode, WPARAM wParam, LPARAM lParam)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2600 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2601 const int cchClassName = 7;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2602 TCHAR szClassName[cchClassName] = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2603
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2604 if(nCode == HCBT_CREATEWND)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2605 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2606 HWND hWndMenu = (HWND)wParam;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2607 #ifdef _CMDBAR_EXTRA_TRACE
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2608 ATLTRACE2(atlTraceUI, 0, _T("CmdBar - HCBT_CREATEWND (HWND = %8.8X)\n"), hWndMenu);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2609 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2610
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2611 ::GetClassName(hWndMenu, szClassName, cchClassName);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2612 if(!lstrcmp(_T("#32768"), szClassName))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2613 CCommandBarCtrlBase::s_pCurrentBar->m_stackMenuWnd.Push(hWndMenu);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2614 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2615 else if(nCode == HCBT_DESTROYWND)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2616 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2617 HWND hWndMenu = (HWND)wParam;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2618 #ifdef _CMDBAR_EXTRA_TRACE
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2619 ATLTRACE2(atlTraceUI, 0, _T("CmdBar - HCBT_DESTROYWND (HWND = %8.8X)\n"), hWndMenu);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2620 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2621
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2622 ::GetClassName(hWndMenu, szClassName, cchClassName);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2623 if(!lstrcmp(_T("#32768"), szClassName))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2624 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2625 ATLASSERT(hWndMenu == CCommandBarCtrlBase::s_pCurrentBar->m_stackMenuWnd.GetCurrent());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2626 CCommandBarCtrlBase::s_pCurrentBar->m_stackMenuWnd.Pop();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2627 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2628 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2629
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2630 return ::CallNextHookEx(CCommandBarCtrlBase::s_hCreateHook, nCode, wParam, lParam);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2631 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2632
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2633 static LRESULT CALLBACK MessageHookProc(int nCode, WPARAM wParam, LPARAM lParam)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2634 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2635 LPMSG pMsg = (LPMSG)lParam;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2636
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2637 if((nCode == HC_ACTION) && (wParam == PM_REMOVE) && (pMsg->message != GetGetBarMessage()) && (pMsg->message != WM_FORWARDMSG))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2638 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2639 CCommandBarCtrlBase* pCmdBar = NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2640 HWND hWnd = pMsg->hwnd;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2641 DWORD dwPID = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2642 while((pCmdBar == NULL) && (hWnd != NULL))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2643 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2644 pCmdBar = (CCommandBarCtrlBase*)::SendMessage(hWnd, GetGetBarMessage(), (WPARAM)&dwPID, 0L);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2645 hWnd = ::GetParent(hWnd);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2646 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2647
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2648 if((pCmdBar != NULL) && (dwPID == GetCurrentProcessId()))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2649 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2650 pCmdBar->m_hWndHook = pMsg->hwnd;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2651 ATLASSERT(pCmdBar->IsCommandBarBase());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2652
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2653 if(::IsWindow(pCmdBar->m_hWnd))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2654 pCmdBar->SendMessage(WM_FORWARDMSG, 0, (LPARAM)pMsg);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2655 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2656 ATLTRACE2(atlTraceUI, 0, _T("CmdBar - Hook skipping message, can't find command bar!\n"));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2657 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2658 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2659
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2660 LRESULT lRet = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2661 ATLASSERT(CCommandBarCtrlBase::s_pmapMsgHook != NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2662 if(CCommandBarCtrlBase::s_pmapMsgHook != NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2663 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2664 DWORD dwThreadID = ::GetCurrentThreadId();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2665 CCommandBarCtrlBase::_MsgHookData* pData = CCommandBarCtrlBase::s_pmapMsgHook->Lookup(dwThreadID);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2666 if(pData != NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2667 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2668 lRet = ::CallNextHookEx(pData->hMsgHook, nCode, wParam, lParam);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2669 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2670 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2671 return lRet;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2672 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2673
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2674 // Implementation
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2675 void DoPopupMenu(int nIndex, bool bAnimate)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2676 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2677 #ifdef _CMDBAR_EXTRA_TRACE
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2678 ATLTRACE2(atlTraceUI, 0, _T("CmdBar - DoPopupMenu, bAnimate = %s\n"), bAnimate ? "true" : "false");
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2679 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2680 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2681
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2682 // get popup menu and it's position
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2683 RECT rect = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2684 this->GetItemRect(nIndex, &rect);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2685 POINT pt = { rect.left, rect.bottom };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2686 this->MapWindowPoints(NULL, &pt, 1);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2687 this->MapWindowPoints(NULL, &rect);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2688 TPMPARAMS TPMParams = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2689 TPMParams.cbSize = sizeof(TPMPARAMS);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2690 TPMParams.rcExclude = rect;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2691 HMENU hMenuPopup = ::GetSubMenu(m_hMenu, nIndex);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2692 ATLASSERT(hMenuPopup != NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2693
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2694 // get button ID
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2695 TBBUTTON tbb = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2696 this->GetButton(nIndex, &tbb);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2697 int nCmdID = tbb.idCommand;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2698
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2699 m_nPopBtn = nIndex; // remember current button's index
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2700
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2701 // press button and display popup menu
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2702 this->PressButton(nCmdID, TRUE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2703 this->SetHotItem(nCmdID);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2704 pT->DoTrackPopupMenu(hMenuPopup, TPM_LEFTBUTTON | TPM_VERTICAL | TPM_LEFTALIGN | TPM_TOPALIGN |
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2705 (bAnimate ? TPM_VERPOSANIMATION : TPM_NOANIMATION), pt.x, pt.y, &TPMParams);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2706 this->PressButton(nCmdID, FALSE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2707 if(::GetFocus() != this->m_hWnd)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2708 this->SetHotItem(-1);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2709
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2710 m_nPopBtn = -1; // restore
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2711
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2712 // eat next message if click is on the same button
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2713 MSG msg = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2714 if(::PeekMessage(&msg, this->m_hWnd, WM_LBUTTONDOWN, WM_LBUTTONDOWN, PM_NOREMOVE) && ::PtInRect(&rect, msg.pt))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2715 ::PeekMessage(&msg, this->m_hWnd, WM_LBUTTONDOWN, WM_LBUTTONDOWN, PM_REMOVE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2716
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2717 // check if another popup menu should be displayed
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2718 if(m_nNextPopBtn != -1)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2719 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2720 this->PostMessage(GetAutoPopupMessage(), m_nNextPopBtn & 0xFFFF);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2721 if(!(m_nNextPopBtn & 0xFFFF0000) && !m_bPopupItem)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2722 this->PostMessage(WM_KEYDOWN, VK_DOWN, 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2723 m_nNextPopBtn = -1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2724 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2725 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2726 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2727 m_bContextMenu = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2728 // If user didn't hit escape, give focus back
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2729 if(!m_bEscapePressed)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2730 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2731 if(m_bUseKeyboardCues && m_bShowKeyboardCues)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2732 m_bAllowKeyboardCues = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2733 pT->GiveFocusBack();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2734 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2735 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2736 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2737 this->SetHotItem(nCmdID);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2738 this->SetAnchorHighlight(TRUE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2739 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2740 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2741 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2742
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2743 BOOL DoTrackPopupMenu(HMENU hMenu, UINT uFlags, int x, int y, LPTPMPARAMS lpParams = NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2744 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2745 CMenuHandle menuPopup = hMenu;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2746
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2747 CWindowCreateCriticalSectionLock lock;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2748 if(FAILED(lock.Lock()))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2749 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2750 ATLTRACE2(atlTraceUI, 0, _T("ERROR : Unable to lock critical section in CCommandBarCtrlImpl::DoTrackPopupMenu.\n"));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2751 ATLASSERT(FALSE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2752 return FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2753 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2754
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2755 ATLASSERT(this->s_hCreateHook == NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2756
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2757 this->s_pCurrentBar = static_cast<CCommandBarCtrlBase*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2758
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2759 this->s_hCreateHook = ::SetWindowsHookEx(WH_CBT, CreateHookProc, ModuleHelper::GetModuleInstance(), GetCurrentThreadId());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2760 ATLASSERT(this->s_hCreateHook != NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2761
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2762 m_bPopupItem = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2763 m_bMenuActive = true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2764
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2765 BOOL bTrackRet = menuPopup.TrackPopupMenuEx(uFlags, x, y, this->m_hWnd, lpParams);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2766 m_bMenuActive = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2767
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2768 ::UnhookWindowsHookEx(this->s_hCreateHook);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2769
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2770 this->s_hCreateHook = NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2771 this->s_pCurrentBar = NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2772
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2773 lock.Unlock();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2774
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2775 // cleanup - convert menus back to original state
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2776 #ifdef _CMDBAR_EXTRA_TRACE
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2777 ATLTRACE2(atlTraceUI, 0, _T("CmdBar - TrackPopupMenu - cleanup\n"));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2778 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2779
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2780 ATLASSERT(this->m_stackMenuWnd.GetSize() == 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2781
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2782 this->UpdateWindow();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2783 ATL::CWindow wndTL = this->GetTopLevelParent();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2784 wndTL.UpdateWindow();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2785
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2786 // restore the menu items to the previous state for all menus that were converted
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2787 if(m_bImagesVisible)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2788 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2789 HMENU hMenuSav = NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2790 while((hMenuSav = this->m_stackMenuHandle.Pop()) != NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2791 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2792 menuPopup = hMenuSav;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2793 BOOL bRet = FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2794 // restore state and delete menu item data
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2795 for(int i = 0; i < menuPopup.GetMenuItemCount(); i++)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2796 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2797 CMenuItemInfo mii;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2798 mii.fMask = MIIM_DATA | MIIM_TYPE | MIIM_ID;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2799 bRet = menuPopup.GetMenuItemInfo(i, TRUE, &mii);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2800 ATLASSERT(bRet);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2801
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2802 _MenuItemData* pMI = (_MenuItemData*)mii.dwItemData;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2803 if(_IsValidMem(pMI) && pMI->IsCmdBarMenuItem())
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2804 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2805 mii.fMask = MIIM_DATA | MIIM_TYPE | MIIM_STATE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2806 mii.fType = pMI->fType;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2807 mii.fState = pMI->fState;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2808 mii.dwTypeData = pMI->lpstrText;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2809 mii.cch = lstrlen(pMI->lpstrText);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2810 mii.dwItemData = NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2811
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2812 bRet = menuPopup.SetMenuItemInfo(i, TRUE, &mii);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2813 // this one triggers WM_MEASUREITEM
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2814 menuPopup.ModifyMenu(i, MF_BYPOSITION | mii.fType | mii.fState, mii.wID, pMI->lpstrText);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2815 ATLASSERT(bRet);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2816
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2817 delete [] pMI->lpstrText;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2818 delete pMI;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2819 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2820 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2821 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2822 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2823 return bTrackRet;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2824 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2825
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2826 int GetPreviousMenuItem(int nBtn) const
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2827 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2828 if(nBtn == -1)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2829 return -1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2830 RECT rcClient = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2831 this->GetClientRect(&rcClient);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2832 int nNextBtn;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2833 for(nNextBtn = nBtn - 1; nNextBtn != nBtn; nNextBtn--)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2834 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2835 if(nNextBtn < 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2836 nNextBtn = ::GetMenuItemCount(m_hMenu) - 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2837 TBBUTTON tbb = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2838 this->GetButton(nNextBtn, &tbb);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2839 RECT rcBtn = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2840 this->GetItemRect(nNextBtn, &rcBtn);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2841 if(rcBtn.right > rcClient.right)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2842 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2843 nNextBtn = -2; // chevron
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2844 break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2845 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2846 if(((tbb.fsState & TBSTATE_ENABLED) != 0) && ((tbb.fsState & TBSTATE_HIDDEN) == 0))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2847 break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2848 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2849 return (nNextBtn != nBtn) ? nNextBtn : -1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2850 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2851
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2852 int GetNextMenuItem(int nBtn) const
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2853 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2854 if(nBtn == -1)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2855 return -1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2856 RECT rcClient = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2857 this->GetClientRect(&rcClient);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2858 int nNextBtn = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2859 int nCount = ::GetMenuItemCount(m_hMenu);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2860 for(nNextBtn = nBtn + 1; nNextBtn != nBtn; nNextBtn++)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2861 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2862 if(nNextBtn >= nCount)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2863 nNextBtn = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2864 TBBUTTON tbb = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2865 this->GetButton(nNextBtn, &tbb);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2866 RECT rcBtn = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2867 this->GetItemRect(nNextBtn, &rcBtn);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2868 if(rcBtn.right > rcClient.right)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2869 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2870 nNextBtn = -2; // chevron
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2871 break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2872 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2873 if(((tbb.fsState & TBSTATE_ENABLED) != 0) && ((tbb.fsState & TBSTATE_HIDDEN) == 0))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2874 break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2875 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2876 return (nNextBtn != nBtn) ? nNextBtn : -1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2877 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2878
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2879 bool DisplayChevronMenu()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2880 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2881 // assume we are in a rebar
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2882 HWND hWndReBar = this->GetParent();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2883 int nCount = (int)::SendMessage(hWndReBar, RB_GETBANDCOUNT, 0, 0L);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2884 bool bRet = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2885 for(int i = 0; i < nCount; i++)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2886 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2887 REBARBANDINFO rbbi = { RunTimeHelper::SizeOf_REBARBANDINFO(), RBBIM_CHILD | RBBIM_STYLE };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2888 BOOL bRetBandInfo = (BOOL)::SendMessage(hWndReBar, RB_GETBANDINFO, i, (LPARAM)&rbbi);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2889 if(bRetBandInfo && (rbbi.hwndChild == this->m_hWnd))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2890 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2891 if((rbbi.fStyle & RBBS_USECHEVRON) != 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2892 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2893 ::PostMessage(hWndReBar, RB_PUSHCHEVRON, i, 0L);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2894 this->PostMessage(WM_KEYDOWN, VK_DOWN, 0L);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2895 bRet = true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2896 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2897 break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2898 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2899 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2900 return bRet;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2901 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2902
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2903 void GetSystemSettings()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2904 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2905 // refresh our font
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2906 NONCLIENTMETRICS info = { RunTimeHelper::SizeOf_NONCLIENTMETRICS() };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2907 BOOL bRet = ::SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(info), &info, 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2908 ATLASSERT(bRet);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2909 if(bRet)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2910 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2911 LOGFONT logfont = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2912 if(m_fontMenu.m_hFont != NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2913 m_fontMenu.GetLogFont(logfont);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2914 if((logfont.lfHeight != info.lfMenuFont.lfHeight) ||
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2915 (logfont.lfWidth != info.lfMenuFont.lfWidth) ||
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2916 (logfont.lfEscapement != info.lfMenuFont.lfEscapement) ||
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2917 (logfont.lfOrientation != info.lfMenuFont.lfOrientation) ||
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2918 (logfont.lfWeight != info.lfMenuFont.lfWeight) ||
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2919 (logfont.lfItalic != info.lfMenuFont.lfItalic) ||
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2920 (logfont.lfUnderline != info.lfMenuFont.lfUnderline) ||
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2921 (logfont.lfStrikeOut != info.lfMenuFont.lfStrikeOut) ||
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2922 (logfont.lfCharSet != info.lfMenuFont.lfCharSet) ||
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2923 (logfont.lfOutPrecision != info.lfMenuFont.lfOutPrecision) ||
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2924 (logfont.lfClipPrecision != info.lfMenuFont.lfClipPrecision) ||
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2925 (logfont.lfQuality != info.lfMenuFont.lfQuality) ||
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2926 (logfont.lfPitchAndFamily != info.lfMenuFont.lfPitchAndFamily) ||
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2927 (lstrcmp(logfont.lfFaceName, info.lfMenuFont.lfFaceName) != 0))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2928 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2929 HFONT hFontMenu = ::CreateFontIndirect(&info.lfMenuFont);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2930 ATLASSERT(hFontMenu != NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2931 if(hFontMenu != NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2932 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2933 if(m_fontMenu.m_hFont != NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2934 m_fontMenu.DeleteObject();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2935 m_fontMenu.Attach(hFontMenu);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2936 this->SetFont(m_fontMenu);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2937 this->AddStrings(_T("NS\0")); // for proper item height
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2938 this->AutoSize();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2939 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2940 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2941 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2942
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2943 // check if we need extra spacing for menu item text
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2944 CWindowDC dc(this->m_hWnd);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2945 HFONT hFontOld = dc.SelectFont(m_fontMenu);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2946 RECT rcText = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2947 dc.DrawText(_T("\t"), -1, &rcText, DT_SINGLELINE | DT_LEFT | DT_VCENTER | DT_CALCRECT);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2948 if((rcText.right - rcText.left) < 4)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2949 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2950 ::SetRectEmpty(&rcText);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2951 dc.DrawText(_T("x"), -1, &rcText, DT_SINGLELINE | DT_LEFT | DT_VCENTER | DT_CALCRECT);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2952 m_cxExtraSpacing = rcText.right - rcText.left;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2953 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2954 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2955 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2956 m_cxExtraSpacing = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2957 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2958 dc.SelectFont(hFontOld);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2959
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2960 // get Windows version
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2961 #ifndef _versionhelpers_H_INCLUDED_
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2962 OSVERSIONINFO ovi = { sizeof(OSVERSIONINFO) };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2963 ::GetVersionEx(&ovi);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2964 #endif // !_versionhelpers_H_INCLUDED_
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2965
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2966 // query keyboard cues mode (Windows 2000 or later)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2967 #ifdef _versionhelpers_H_INCLUDED_
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2968 if(::IsWindowsVersionOrGreater(5, 0, 0))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2969 #else // !_versionhelpers_H_INCLUDED_
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2970 if (ovi.dwMajorVersion >= 5)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2971 #endif // _versionhelpers_H_INCLUDED_
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2972 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2973 BOOL bRetVal = TRUE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2974 bRet = ::SystemParametersInfo(SPI_GETKEYBOARDCUES, 0, &bRetVal, 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2975 m_bUseKeyboardCues = (bRet && !bRetVal);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2976 m_bAllowKeyboardCues = true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2977 ShowKeyboardCues(!m_bUseKeyboardCues);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2978 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2979
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2980 // query flat menu mode (Windows XP or later)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2981 #ifdef _versionhelpers_H_INCLUDED_
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2982 if(::IsWindowsXPOrGreater())
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2983 #else // !_versionhelpers_H_INCLUDED_
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2984 if (((ovi.dwMajorVersion == 5) && (ovi.dwMinorVersion >= 1)) || (ovi.dwMajorVersion > 5))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2985 #endif // _versionhelpers_H_INCLUDED_
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2986 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2987 BOOL bRetVal = FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2988 bRet = ::SystemParametersInfo(SPI_GETFLATMENU, 0, &bRetVal, 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2989 m_bFlatMenus = (bRet && bRetVal);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2990 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2991
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2992 #if _WTL_CMDBAR_VISTA_MENUS
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2993 // check if we should use Vista menus
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2994 bool bVistaMenus = (((m_dwExtendedStyle & CBR_EX_NOVISTAMENUS) == 0) && RunTimeHelper::IsVista() && RunTimeHelper::IsThemeAvailable());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2995 if(!bVistaMenus && m_bVistaMenus && (m_hMenu != NULL) && (m_arrCommand.GetSize() > 0))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2996 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2997 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2998 pT->_RemoveVistaBitmapsFromMenu();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2999 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3000
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3001 m_bVistaMenus = bVistaMenus;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3002 #endif // _WTL_CMDBAR_VISTA_MENUS
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3003
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3004 #ifdef _CMDBAR_EXTRA_TRACE
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3005 ATLTRACE2(atlTraceUI, 0, _T("CmdBar - GetSystemSettings:\n m_bFlatMenus = %s\n m_bUseKeyboardCues = %s m_bVistaMenus = %s\n"),
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3006 m_bFlatMenus ? "true" : "false", m_bUseKeyboardCues ? "true" : "false", m_bVistaMenus ? "true" : "false");
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3007 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3008 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3009
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3010 // Implementation - alternate focus mode support
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3011 void TakeFocus()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3012 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3013 if((m_dwExtendedStyle & CBR_EX_ALTFOCUSMODE) && (m_hWndFocus == NULL))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3014 m_hWndFocus = ::GetFocus();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3015 this->SetFocus();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3016 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3017
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3018 void GiveFocusBack()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3019 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3020 if(m_bParentActive)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3021 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3022 if((m_dwExtendedStyle & CBR_EX_ALTFOCUSMODE) && ::IsWindow(m_hWndFocus))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3023 ::SetFocus(m_hWndFocus);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3024 else if(!(m_dwExtendedStyle & CBR_EX_ALTFOCUSMODE) && m_wndParent.IsWindow())
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3025 m_wndParent.SetFocus();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3026 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3027 m_hWndFocus = NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3028 this->SetAnchorHighlight(FALSE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3029 if(m_bUseKeyboardCues && m_bShowKeyboardCues)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3030 this->ShowKeyboardCues(false);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3031 m_bSkipPostDown = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3032 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3033
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3034 void ShowKeyboardCues(bool bShow)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3035 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3036 m_bShowKeyboardCues = bShow;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3037 this->SetDrawTextFlags(DT_HIDEPREFIX, m_bShowKeyboardCues ? 0 : DT_HIDEPREFIX);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3038 this->Invalidate();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3039 this->UpdateWindow();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3040 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3041
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3042 // Implementation - internal message helpers
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3043 static UINT GetAutoPopupMessage()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3044 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3045 static UINT uAutoPopupMessage = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3046 if(uAutoPopupMessage == 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3047 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3048 CStaticDataInitCriticalSectionLock lock;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3049 if(FAILED(lock.Lock()))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3050 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3051 ATLTRACE2(atlTraceUI, 0, _T("ERROR : Unable to lock critical section in CCommandBarCtrlImpl::GetAutoPopupMessage.\n"));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3052 ATLASSERT(FALSE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3053 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3054 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3055
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3056 if(uAutoPopupMessage == 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3057 uAutoPopupMessage = ::RegisterWindowMessage(_T("WTL_CmdBar_InternalAutoPopupMsg"));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3058
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3059 lock.Unlock();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3060 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3061 ATLASSERT(uAutoPopupMessage != 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3062 return uAutoPopupMessage;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3063 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3064
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3065 static UINT GetGetBarMessage()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3066 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3067 static UINT uGetBarMessage = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3068 if(uGetBarMessage == 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3069 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3070 CStaticDataInitCriticalSectionLock lock;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3071 if(FAILED(lock.Lock()))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3072 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3073 ATLTRACE2(atlTraceUI, 0, _T("ERROR : Unable to lock critical section in CCommandBarCtrlImpl::GetGetBarMessage.\n"));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3074 ATLASSERT(FALSE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3075 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3076 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3077
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3078 if(uGetBarMessage == 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3079 uGetBarMessage = ::RegisterWindowMessage(_T("WTL_CmdBar_InternalGetBarMsg"));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3080
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3081 lock.Unlock();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3082 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3083 ATLASSERT(uGetBarMessage != 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3084 return uGetBarMessage;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3085 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3086
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3087 // Implementation
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3088 bool CreateInternalImageList(int cImages)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3089 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3090 UINT uFlags = (m_bAlphaImages ? ILC_COLOR32 : ILC_COLOR24) | ILC_MASK;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3091 m_hImageList = ::ImageList_Create(m_szBitmap.cx, m_szBitmap.cy, uFlags, cImages, 1);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3092 ATLASSERT(m_hImageList != NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3093 return (m_hImageList != NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3094 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3095
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3096 // Implementation - support for Vista menus
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3097 #if _WTL_CMDBAR_VISTA_MENUS
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3098 void _AddVistaBitmapsFromImageList(int nStartIndex, int nCount)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3099 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3100 // Create display compatible memory DC
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3101 CClientDC dc(NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3102 CDC dcMem;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3103 dcMem.CreateCompatibleDC(dc);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3104 HBITMAP hBitmapSave = dcMem.GetCurrentBitmap();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3105
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3106 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3107 // Create bitmaps for all menu items
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3108 for(int i = 0; i < nCount; i++)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3109 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3110 HBITMAP hBitmap = pT->_CreateVistaBitmapHelper(nStartIndex + i, dc, dcMem);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3111 dcMem.SelectBitmap(hBitmapSave);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3112 m_arrVistaBitmap.Add(hBitmap);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3113 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3114 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3115
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3116 void _AddVistaBitmapFromImageList(int nIndex)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3117 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3118 // Create display compatible memory DC
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3119 CClientDC dc(NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3120 CDC dcMem;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3121 dcMem.CreateCompatibleDC(dc);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3122 HBITMAP hBitmapSave = dcMem.GetCurrentBitmap();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3123
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3124 // Create bitmap for menu item
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3125 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3126 HBITMAP hBitmap = pT->_CreateVistaBitmapHelper(nIndex, dc, dcMem);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3127
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3128 // Select saved bitmap back and add bitmap to the array
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3129 dcMem.SelectBitmap(hBitmapSave);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3130 m_arrVistaBitmap.Add(hBitmap);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3131 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3132
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3133 void _ReplaceVistaBitmapFromImageList(int nIndex)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3134 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3135 // Delete existing bitmap
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3136 if(m_arrVistaBitmap[nIndex] != NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3137 ::DeleteObject(m_arrVistaBitmap[nIndex]);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3138
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3139 // Create display compatible memory DC
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3140 CClientDC dc(NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3141 CDC dcMem;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3142 dcMem.CreateCompatibleDC(dc);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3143 HBITMAP hBitmapSave = dcMem.GetCurrentBitmap();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3144
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3145 // Create bitmap for menu item
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3146 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3147 HBITMAP hBitmap = pT->_CreateVistaBitmapHelper(nIndex, dc, dcMem);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3148
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3149 // Select saved bitmap back and replace bitmap in the array
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3150 dcMem.SelectBitmap(hBitmapSave);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3151 m_arrVistaBitmap.SetAtIndex(nIndex, hBitmap);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3152 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3153
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3154 HBITMAP _CreateVistaBitmapHelper(int nIndex, HDC hDCSource, HDC hDCTarget)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3155 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3156 // Create 32-bit bitmap
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3157 BITMAPINFO bi = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3158 bi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3159 bi.bmiHeader.biWidth = m_szBitmap.cx;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3160 bi.bmiHeader.biHeight = m_szBitmap.cy;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3161 bi.bmiHeader.biPlanes = 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3162 bi.bmiHeader.biBitCount = 32;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3163 bi.bmiHeader.biCompression = BI_RGB;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3164 bi.bmiHeader.biSizeImage = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3165 bi.bmiHeader.biXPelsPerMeter = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3166 bi.bmiHeader.biYPelsPerMeter = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3167 bi.bmiHeader.biClrUsed = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3168 bi.bmiHeader.biClrImportant = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3169 HBITMAP hBitmap = ::CreateDIBSection(hDCSource, &bi, DIB_RGB_COLORS, NULL, NULL, 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3170 ATLASSERT(hBitmap != NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3171
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3172 // Select bitmap into target DC and draw from image list to it
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3173 if(hBitmap != NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3174 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3175 ::SelectObject(hDCTarget, hBitmap);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3176
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3177 IMAGELISTDRAWPARAMS ildp = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3178 ildp.cbSize = sizeof(IMAGELISTDRAWPARAMS);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3179 ildp.himl = m_hImageList;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3180 ildp.i = nIndex;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3181 ildp.hdcDst = hDCTarget;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3182 ildp.x = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3183 ildp.y = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3184 ildp.cx = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3185 ildp.cy = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3186 ildp.xBitmap = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3187 ildp.yBitmap = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3188 ildp.fStyle = ILD_TRANSPARENT;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3189 ildp.fState = ILS_ALPHA;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3190 ildp.Frame = 255;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3191 ::ImageList_DrawIndirect(&ildp);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3192 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3193
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3194 return hBitmap;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3195 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3196
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3197 void _RemoveVistaBitmapsFromMenu()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3198 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3199 CMenuHandle menu = m_hMenu;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3200 for(int i = 0; i < m_arrCommand.GetSize(); i++)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3201 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3202 CMenuItemInfo mii;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3203 mii.fMask = MIIM_BITMAP;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3204 mii.hbmpItem = NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3205 menu.SetMenuItemInfo(m_arrCommand[i], FALSE, &mii);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3206 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3207 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3208 #endif // _WTL_CMDBAR_VISTA_MENUS
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3209
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3210 // Implementation helper
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3211 static bool _IsValidMem(void* pMem)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3212 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3213 bool bRet = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3214 if(pMem != NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3215 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3216 MEMORY_BASIC_INFORMATION mbi = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3217 ::VirtualQuery(pMem, &mbi, sizeof(MEMORY_BASIC_INFORMATION));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3218 bRet = (mbi.BaseAddress != NULL) && ((mbi.Protect & (PAGE_READONLY | PAGE_READWRITE)) != 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3219 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3220
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3221 return bRet;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3222 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3223 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3224
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3225
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3226 class CCommandBarCtrl : public CCommandBarCtrlImpl<CCommandBarCtrl>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3227 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3228 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3229 DECLARE_WND_SUPERCLASS(_T("WTL_CommandBar"), GetWndClassName())
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3230 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3231
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3232
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3233 ///////////////////////////////////////////////////////////////////////////////
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3234 // CMDICommandBarCtrl - ATL implementation of Command Bars for MDI apps
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3235
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3236 template <class T, class TBase = CCommandBarCtrlBase, class TWinTraits = ATL::CControlWinTraits>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3237 class ATL_NO_VTABLE CMDICommandBarCtrlImpl : public CCommandBarCtrlImpl< T, TBase, TWinTraits>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3238 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3239 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3240 // Data members
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3241 ATL::CContainedWindow m_wndMDIClient;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3242 bool m_bChildMaximized;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3243 HWND m_hWndChildMaximized;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3244 HICON m_hIconChildMaximized;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3245 int m_nBtnPressed;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3246 int m_nBtnWasPressed;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3247
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3248 int m_cxyOffset; // offset between nonclient elements
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3249 int m_cxIconWidth; // small icon width
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3250 int m_cyIconHeight; // small icon height
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3251 int m_cxBtnWidth; // nonclient button width
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3252 int m_cyBtnHeight; // nonclient button height
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3253 int m_cxLeft; // left nonclient area width
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3254 int m_cxRight; // right nonclient area width
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3255
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3256 HTHEME m_hTheme;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3257
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3258 // Constructor/destructor
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3259 CMDICommandBarCtrlImpl() :
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3260 m_wndMDIClient(this, 2), m_bChildMaximized(false),
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3261 m_hWndChildMaximized(NULL), m_hIconChildMaximized(NULL),
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3262 m_nBtnPressed(-1), m_nBtnWasPressed(-1),
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3263 m_cxyOffset(2),
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3264 m_cxIconWidth(16), m_cyIconHeight(16),
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3265 m_cxBtnWidth(16), m_cyBtnHeight(14),
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3266 m_cxLeft(20), m_cxRight(55),
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3267 m_hTheme(NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3268 { }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3269
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3270 ~CMDICommandBarCtrlImpl()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3271 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3272 if(m_wndMDIClient.IsWindow())
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3273 /*scary!*/ m_wndMDIClient.UnsubclassWindow();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3274 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3275
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3276 // Operations
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3277 BOOL SetMDIClient(HWND hWndMDIClient)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3278 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3279 ATLASSERT(::IsWindow(this->m_hWnd));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3280 ATLASSERT(::IsWindow(hWndMDIClient));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3281 if(!::IsWindow(hWndMDIClient))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3282 return FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3283
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3284 #ifdef _DEBUG
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3285 // BLOCK: Test if the passed window is MDICLIENT
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3286 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3287 LPCTSTR lpszMDIClientClass = _T("MDICLIENT");
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3288 const int nNameLen = 9 + 1; // "MDICLIENT" + NULL
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3289 TCHAR szClassName[nNameLen] = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3290 ::GetClassName(hWndMDIClient, szClassName, nNameLen);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3291 ATLASSERT(lstrcmpi(szClassName, lpszMDIClientClass) == 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3292 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3293 #endif // _DEBUG
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3294
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3295 if(m_wndMDIClient.IsWindow())
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3296 /*scary!*/ m_wndMDIClient.UnsubclassWindow();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3297
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3298 return m_wndMDIClient.SubclassWindow(hWndMDIClient);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3299 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3300
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3301 // Message maps
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3302 typedef CCommandBarCtrlImpl< T, TBase, TWinTraits > _baseClass;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3303 BEGIN_MSG_MAP(CMDICommandBarCtrlImpl)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3304 MESSAGE_HANDLER(WM_CREATE, OnCreate)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3305 MESSAGE_HANDLER(WM_DESTROY, OnDestroy)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3306 MESSAGE_HANDLER(_GetThemeChangedMsg(), OnThemeChanged)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3307 MESSAGE_HANDLER(WM_SIZE, OnSize)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3308 MESSAGE_HANDLER(WM_NCCALCSIZE, OnNcCalcSize)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3309 MESSAGE_HANDLER(WM_NCPAINT, OnNcPaint)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3310 MESSAGE_HANDLER(WM_NCHITTEST, OnNcHitTest)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3311 MESSAGE_HANDLER(WM_NCLBUTTONDOWN, OnNcLButtonDown)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3312 MESSAGE_HANDLER(WM_MOUSEMOVE, OnMouseMove)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3313 MESSAGE_HANDLER(WM_LBUTTONUP, OnLButtonUp)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3314 MESSAGE_HANDLER(WM_NCLBUTTONDBLCLK, OnNcLButtonDblClk)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3315 MESSAGE_HANDLER(WM_CAPTURECHANGED, OnCaptureChanged)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3316 CHAIN_MSG_MAP(_baseClass)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3317 ALT_MSG_MAP(1) // Parent window messages
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3318 MESSAGE_HANDLER(WM_ACTIVATE, OnParentActivate)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3319 CHAIN_MSG_MAP_ALT(_baseClass, 1)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3320 ALT_MSG_MAP(2) // MDI client window messages
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3321 MESSAGE_HANDLER(WM_MDISETMENU, OnMDISetMenu)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3322 // no chaining needed since this was moved from the base class here
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3323 ALT_MSG_MAP(3) // Message hook messages
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3324 MESSAGE_RANGE_HANDLER(0, 0xFFFF, OnAllHookMessages)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3325 CHAIN_MSG_MAP_ALT(_baseClass, 3)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3326 END_MSG_MAP()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3327
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3328 // Additional MDI message handlers
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3329 LRESULT OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3330 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3331 LRESULT lRet = _baseClass::OnCreate(uMsg, wParam, lParam, bHandled);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3332 if(lRet == (LRESULT)-1)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3333 return lRet;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3334
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3335 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3336 pT->_OpenThemeData();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3337
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3338 return lRet;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3339 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3340
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3341 LRESULT OnDestroy(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3342 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3343 LRESULT lRet = _baseClass::OnDestroy(uMsg, wParam, lParam, bHandled);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3344
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3345 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3346 pT->_CloseThemeData();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3347
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3348 return lRet;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3349 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3350
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3351 LRESULT OnThemeChanged(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3352 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3353 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3354 pT->_CloseThemeData();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3355 pT->_OpenThemeData();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3356
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3357 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3358 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3359
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3360 LRESULT OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3361 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3362 LRESULT lRet = this->DefWindowProc(uMsg, wParam, lParam);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3363 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3364 pT->_AdjustBtnSize(GET_Y_LPARAM(lParam));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3365 return lRet;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3366 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3367
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3368 LRESULT OnNcCalcSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3369 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3370 LRESULT lRet = this->DefWindowProc(uMsg, wParam, lParam);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3371
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3372 if(m_bChildMaximized && (BOOL)wParam)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3373 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3374 LPNCCALCSIZE_PARAMS lpParams = (LPNCCALCSIZE_PARAMS)lParam;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3375 if(this->m_bLayoutRTL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3376 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3377 lpParams->rgrc[0].left += m_cxRight;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3378 lpParams->rgrc[0].right -= m_cxLeft;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3379 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3380 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3381 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3382 lpParams->rgrc[0].left += m_cxLeft;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3383 lpParams->rgrc[0].right -= m_cxRight;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3384 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3385 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3386
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3387 return lRet;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3388 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3389
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3390 LRESULT OnNcPaint(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3391 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3392 LRESULT lRet = this->DefWindowProc(uMsg, wParam, lParam);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3393
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3394 if(!m_bChildMaximized)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3395 return lRet;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3396
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3397 ATLASSERT((m_hWndChildMaximized != NULL) && (m_hIconChildMaximized != NULL));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3398
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3399 // get DC and window rectangle
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3400 CWindowDC dc(this->m_hWnd);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3401 RECT rect = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3402 this->GetWindowRect(&rect);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3403 int cxWidth = rect.right - rect.left;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3404 int cyHeight = rect.bottom - rect.top;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3405
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3406 // paint left side nonclient background and draw icon
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3407 ::SetRect(&rect, 0, 0, m_cxLeft, cyHeight);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3408 if(m_hTheme != NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3409 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3410 ::DrawThemeParentBackground(this->m_hWnd, dc, &rect);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3411 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3412 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3413 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3414 if((this->m_dwExtendedStyle & CBR_EX_TRANSPARENT) != 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3415 dc.FillRect(&rect, COLOR_3DFACE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3416 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3417 dc.FillRect(&rect, COLOR_MENU);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3418 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3419
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3420 RECT rcIcon = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3421 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3422 pT->_CalcIconRect(cxWidth, cyHeight, rcIcon);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3423 dc.DrawIconEx(rcIcon.left, rcIcon.top, m_hIconChildMaximized, m_cxIconWidth, m_cyIconHeight);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3424
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3425 // paint right side nonclient background
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3426 ::SetRect(&rect, cxWidth - m_cxRight, 0, cxWidth, cyHeight);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3427 if(m_hTheme != NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3428 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3429 // this is to account for the left non-client area
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3430 POINT ptOrg = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3431 dc.GetViewportOrg(&ptOrg);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3432 dc.SetViewportOrg(ptOrg.x + m_cxLeft, ptOrg.y);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3433 ::OffsetRect(&rect, -m_cxLeft, 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3434
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3435 ::DrawThemeParentBackground(this->m_hWnd, dc, &rect);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3436
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3437 // restore
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3438 dc.SetViewportOrg(ptOrg);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3439 ::OffsetRect(&rect, m_cxLeft, 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3440 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3441 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3442 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3443 if((this->m_dwExtendedStyle & CBR_EX_TRANSPARENT) != 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3444 dc.FillRect(&rect, COLOR_3DFACE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3445 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3446 dc.FillRect(&rect, COLOR_MENU);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3447 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3448
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3449 // draw buttons
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3450 RECT arrRect[3] = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3451 pT->_CalcBtnRects(cxWidth, cyHeight, arrRect);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3452 pT->_DrawMDIButton(dc, arrRect, -1); // draw all buttons
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3453
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3454 return lRet;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3455 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3456
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3457 LRESULT OnNcHitTest(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3458 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3459 LRESULT lRet = this->DefWindowProc(uMsg, wParam, lParam);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3460 if(m_bChildMaximized)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3461 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3462 RECT rect = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3463 this->GetWindowRect(&rect);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3464 POINT pt = { GET_X_LPARAM(lParam) - rect.left, GET_Y_LPARAM(lParam) - rect.top };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3465 if(this->m_bLayoutRTL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3466 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3467 if((pt.x < m_cxRight) || (pt.x > ((rect.right - rect.left) - m_cxLeft)))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3468 lRet = HTBORDER;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3469 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3470 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3471 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3472 if((pt.x < m_cxLeft) || (pt.x > ((rect.right - rect.left) - m_cxRight)))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3473 lRet = HTBORDER;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3474 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3475 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3476 return lRet;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3477 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3478
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3479 LRESULT OnNcLButtonDown(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& bHandled)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3480 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3481 if(!m_bChildMaximized)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3482 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3483 bHandled = FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3484 return 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3485 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3486
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3487 ATLASSERT(_DebugCheckChild());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3488
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3489 POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3490 RECT rect = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3491 this->GetWindowRect(&rect);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3492 pt.x -= rect.left;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3493 pt.y -= rect.top;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3494
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3495 RECT rcIcon = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3496 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3497 pT->_CalcIconRect(rect.right - rect.left, rect.bottom - rect.top, rcIcon, this->m_bLayoutRTL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3498 RECT arrRect[3] = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3499 pT->_CalcBtnRects(rect.right - rect.left, rect.bottom - rect.top, arrRect, this->m_bLayoutRTL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3500
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3501 if(::PtInRect(&rcIcon, pt))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3502 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3503 #ifdef _CMDBAR_EXTRA_TRACE
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3504 ATLTRACE2(atlTraceUI, 0, _T("MDI CmdBar - LButtonDown: icon\n"));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3505 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3506 CMenuHandle menu = ::GetSystemMenu(m_hWndChildMaximized, FALSE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3507 UINT uRet = (UINT)menu.TrackPopupMenu(TPM_LEFTBUTTON | TPM_VERTICAL | TPM_LEFTALIGN | TPM_TOPALIGN | TPM_RETURNCMD |
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3508 TPM_VERPOSANIMATION, this->m_bLayoutRTL ? rect.right : rect.left, rect.bottom, m_hWndChildMaximized);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3509
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3510 // eat next message if click is on the same button
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3511 ::OffsetRect(&rcIcon, rect.left, rect.top);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3512 MSG msg = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3513 if(::PeekMessage(&msg, this->m_hWnd, WM_NCLBUTTONDOWN, WM_NCLBUTTONDOWN, PM_NOREMOVE) && ::PtInRect(&rcIcon, msg.pt))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3514 ::PeekMessage(&msg, this->m_hWnd, WM_NCLBUTTONDOWN, WM_NCLBUTTONDOWN, PM_REMOVE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3515
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3516 if(uRet != 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3517 ::SendMessage(m_hWndChildMaximized, WM_SYSCOMMAND, uRet, 0L);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3518 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3519 else if(::PtInRect(&arrRect[0], pt))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3520 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3521 #ifdef _CMDBAR_EXTRA_TRACE
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3522 ATLTRACE2(atlTraceUI, 0, _T("MDI CmdBar - LButtonDown: close button\n"));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3523 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3524 m_nBtnWasPressed = m_nBtnPressed = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3525 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3526 else if(::PtInRect(&arrRect[1], pt))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3527 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3528 #ifdef _CMDBAR_EXTRA_TRACE
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3529 ATLTRACE2(atlTraceUI, 0, _T("MDI CmdBar - LButtonDown: restore button\n"));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3530 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3531 m_nBtnWasPressed = m_nBtnPressed = 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3532 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3533 else if(::PtInRect(&arrRect[2], pt))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3534 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3535 #ifdef _CMDBAR_EXTRA_TRACE
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3536 ATLTRACE2(atlTraceUI, 0, _T("MDI CmdBar - LButtonDown: minimize button\n"));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3537 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3538 m_nBtnWasPressed = m_nBtnPressed = 2;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3539 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3540 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3541 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3542 bHandled = FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3543 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3544
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3545 // draw the button state if it was pressed
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3546 if(m_nBtnPressed != -1)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3547 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3548 this->SetCapture();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3549 CWindowDC dc(this->m_hWnd);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3550 pT->_CalcBtnRects(rect.right - rect.left, rect.bottom - rect.top, arrRect);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3551 pT->_DrawMDIButton(dc, arrRect, m_nBtnPressed);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3552 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3553
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3554 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3555 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3556
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3557 LRESULT OnMouseMove(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& bHandled)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3558 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3559 if(!m_bChildMaximized || (::GetCapture() != this->m_hWnd) || (m_nBtnWasPressed == -1))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3560 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3561 bHandled = FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3562 return 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3563 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3564
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3565 POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3566 this->ClientToScreen(&pt);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3567 RECT rect = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3568 this->GetWindowRect(&rect);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3569 pt.x -= rect.left;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3570 pt.y -= rect.top;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3571 RECT arrRect[3] = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3572 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3573 pT->_CalcBtnRects(rect.right - rect.left, rect.bottom - rect.top, arrRect, this->m_bLayoutRTL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3574 int nOldBtnPressed = m_nBtnPressed;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3575 m_nBtnPressed = ::PtInRect(&arrRect[m_nBtnWasPressed], pt) ? m_nBtnWasPressed : -1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3576 if(nOldBtnPressed != m_nBtnPressed)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3577 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3578 CWindowDC dc(this->m_hWnd);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3579 pT->_CalcBtnRects(rect.right - rect.left, rect.bottom - rect.top, arrRect);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3580 pT->_DrawMDIButton(dc, arrRect, (m_nBtnPressed != -1) ? m_nBtnPressed : nOldBtnPressed);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3581 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3582
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3583 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3584 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3585
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3586 LRESULT OnLButtonUp(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& bHandled)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3587 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3588 if(!m_bChildMaximized || (::GetCapture() != this->m_hWnd) || (m_nBtnWasPressed == -1))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3589 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3590 bHandled = FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3591 return 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3592 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3593
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3594 ATLASSERT(_DebugCheckChild());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3595
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3596 POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3597 this->ClientToScreen(&pt);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3598 RECT rect = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3599 this->GetWindowRect(&rect);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3600 pt.x -= rect.left;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3601 pt.y -= rect.top;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3602
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3603 int nBtn = m_nBtnWasPressed;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3604 ReleaseCapture();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3605
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3606 RECT arrRect[3] = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3607 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3608 pT->_CalcBtnRects(rect.right - rect.left, rect.bottom - rect.top, arrRect, this->m_bLayoutRTL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3609 if(::PtInRect(&arrRect[nBtn], pt))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3610 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3611 switch(nBtn)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3612 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3613 case 0: // close
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3614 #ifdef _CMDBAR_EXTRA_TRACE
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3615 ATLTRACE2(atlTraceUI, 0, _T("MDI CmdBar - LButtonUp: close button\n"));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3616 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3617 ::SendMessage(m_hWndChildMaximized, WM_SYSCOMMAND, SC_CLOSE, 0L);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3618 break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3619 case 1: // restore
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3620 #ifdef _CMDBAR_EXTRA_TRACE
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3621 ATLTRACE2(atlTraceUI, 0, _T("MDI CmdBar - LButtonUp: restore button\n"));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3622 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3623 ::SendMessage(m_hWndChildMaximized, WM_SYSCOMMAND, SC_RESTORE, 0L);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3624 break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3625 case 2: // minimize
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3626 #ifdef _CMDBAR_EXTRA_TRACE
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3627 ATLTRACE2(atlTraceUI, 0, _T("MDI CmdBar - LButtonUp: minimize button\n"));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3628 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3629 ::SendMessage(m_hWndChildMaximized, WM_SYSCOMMAND, SC_MINIMIZE, 0L);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3630 break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3631 default:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3632 break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3633 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3634 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3635
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3636 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3637 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3638
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3639 LRESULT OnNcLButtonDblClk(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& bHandled)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3640 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3641 if(!m_bChildMaximized || (m_nBtnWasPressed != -1))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3642 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3643 bHandled = FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3644 return 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3645 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3646
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3647 ATLASSERT(_DebugCheckChild());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3648
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3649 POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3650 RECT rect = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3651 this->GetWindowRect(&rect);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3652 pt.x -= rect.left;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3653 pt.y -= rect.top;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3654
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3655 RECT rcIcon = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3656 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3657 pT->_CalcIconRect(rect.right - rect.left, rect.bottom - rect.top, rcIcon, this->m_bLayoutRTL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3658 RECT arrRect[3] = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3659 pT->_CalcBtnRects(rect.right - rect.left, rect.bottom - rect.top, arrRect, this->m_bLayoutRTL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3660
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3661 if(::PtInRect(&rcIcon, pt))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3662 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3663 CMenuHandle menu = ::GetSystemMenu(m_hWndChildMaximized, FALSE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3664 UINT uDefID = menu.GetMenuDefaultItem();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3665 if(uDefID == (UINT)-1)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3666 uDefID = SC_CLOSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3667 ::SendMessage(m_hWndChildMaximized, WM_SYSCOMMAND, uDefID, 0L);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3668 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3669
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3670 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3671 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3672
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3673 LRESULT OnCaptureChanged(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3674 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3675 if(m_bChildMaximized)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3676 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3677 if(m_nBtnPressed != -1)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3678 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3679 ATLASSERT(m_nBtnPressed == m_nBtnWasPressed); // must be
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3680 m_nBtnPressed = -1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3681 RECT rect = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3682 this->GetWindowRect(&rect);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3683 RECT arrRect[3] = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3684 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3685 pT->_CalcBtnRects(rect.right - rect.left, rect.bottom - rect.top, arrRect);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3686 CWindowDC dc(this->m_hWnd);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3687 pT->_DrawMDIButton(dc, arrRect, m_nBtnWasPressed);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3688 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3689 m_nBtnWasPressed = -1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3690 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3691 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3692 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3693 bHandled = FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3694 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3695 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3696 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3697
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3698 // Parent window message handlers
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3699 LRESULT OnParentActivate(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3700 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3701 this->m_bParentActive = (LOWORD(wParam) != WA_INACTIVE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3702 this->RedrawWindow(NULL, NULL, RDW_INVALIDATE | RDW_FRAME | RDW_UPDATENOW);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3703 bHandled = FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3704 return 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3705 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3706
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3707 // MDI client window message handlers
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3708 LRESULT OnMDISetMenu(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3709 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3710 m_wndMDIClient.DefWindowProc(uMsg, NULL, lParam);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3711 HMENU hOldMenu = this->GetMenu();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3712 BOOL bRet = this->AttachMenu((HMENU)wParam);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3713 (void)bRet; // avoid level 4 warning
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3714 ATLASSERT(bRet);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3715
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3716 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3717 pT->UpdateRebarBandIdealSize();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3718
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3719 return (LRESULT)hOldMenu;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3720 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3721
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3722 // All messages from the message hook
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3723 LRESULT OnAllHookMessages(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3724 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3725 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3726 pT->_ProcessAllHookMessages(uMsg, wParam, lParam);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3727
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3728 bHandled = FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3729 return 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3730 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3731
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3732 // Overrideables
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3733 // override this to provide different ideal size
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3734 void UpdateRebarBandIdealSize()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3735 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3736 // assuming we are in a rebar, change ideal size to our size
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3737 // we hope that if we are not in a rebar, nCount will be 0
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3738 int nCount = (int)this->GetParent().SendMessage(RB_GETBANDCOUNT, 0, 0L);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3739 for(int i = 0; i < nCount; i++)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3740 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3741 REBARBANDINFO rbi = { RunTimeHelper::SizeOf_REBARBANDINFO(), RBBIM_CHILD | RBBIM_CHILDSIZE | RBBIM_IDEALSIZE };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3742 this->GetParent().SendMessage(RB_GETBANDINFO, i, (LPARAM)&rbi);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3743 if(rbi.hwndChild == this->m_hWnd)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3744 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3745 rbi.fMask = RBBIM_IDEALSIZE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3746 rbi.cxIdeal = m_bChildMaximized ? m_cxLeft + m_cxRight : 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3747 int nBtnCount = this->GetButtonCount();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3748 if(nBtnCount > 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3749 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3750 RECT rect = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3751 this->GetItemRect(nBtnCount - 1, &rect);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3752 rbi.cxIdeal += rect.right;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3753 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3754 this->GetParent().SendMessage(RB_SETBANDINFO, i, (LPARAM)&rbi);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3755 break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3756 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3757 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3758 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3759
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3760 // all hook messages - check for the maximized MDI child window change
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3761 void _ProcessAllHookMessages(UINT uMsg, WPARAM /*wParam*/, LPARAM /*lParam*/)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3762 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3763 if((uMsg == WM_MDIGETACTIVE) || (uMsg == WM_MDISETMENU))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3764 return;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3765
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3766 BOOL bMaximized = FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3767 HWND hWndChild = (HWND)::SendMessage(m_wndMDIClient, WM_MDIGETACTIVE, 0, (LPARAM)&bMaximized);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3768 bool bMaxOld = m_bChildMaximized;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3769 m_bChildMaximized = ((hWndChild != NULL) && bMaximized);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3770 HICON hIconOld = m_hIconChildMaximized;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3771
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3772 if(m_bChildMaximized)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3773 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3774 if(m_hWndChildMaximized != hWndChild)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3775 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3776 ATL::CWindow wnd = m_hWndChildMaximized = hWndChild;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3777 m_hIconChildMaximized = wnd.GetIcon(FALSE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3778 if(m_hIconChildMaximized == NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3779 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3780 m_hIconChildMaximized = wnd.GetIcon(TRUE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3781 if(m_hIconChildMaximized == NULL) // no icon set with WM_SETICON, get the class one
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3782 m_hIconChildMaximized = (HICON)::GetClassLongPtr(wnd, GCLP_HICONSM);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3783 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3784 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3785 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3786 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3787 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3788 m_hWndChildMaximized = NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3789 m_hIconChildMaximized = NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3790 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3791
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3792 if(bMaxOld != m_bChildMaximized)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3793 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3794 #ifdef _CMDBAR_EXTRA_TRACE
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3795 ATLTRACE2(atlTraceUI, 0, _T("MDI CmdBar - All messages hook change: m_bChildMaximized = %s\n"), m_bChildMaximized ? "true" : "false");
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3796 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3797 // assuming we are in a rebar, change our size to accomodate new state
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3798 // we hope that if we are not in a rebar, nCount will be 0
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3799 int nCount = (int)this->GetParent().SendMessage(RB_GETBANDCOUNT, 0, 0L);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3800 int cxDiff = (m_bChildMaximized ? 1 : -1) * (m_cxLeft + m_cxRight);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3801 for(int i = 0; i < nCount; i++)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3802 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3803 REBARBANDINFO rbi = { RunTimeHelper::SizeOf_REBARBANDINFO(), RBBIM_CHILD | RBBIM_CHILDSIZE | RBBIM_IDEALSIZE | RBBIM_STYLE };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3804 this->GetParent().SendMessage(RB_GETBANDINFO, i, (LPARAM)&rbi);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3805 if(rbi.hwndChild == this->m_hWnd)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3806 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3807 if((rbi.fStyle & RBBS_USECHEVRON) != 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3808 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3809 rbi.fMask = RBBIM_CHILDSIZE | RBBIM_IDEALSIZE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3810 rbi.cxMinChild += cxDiff;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3811 rbi.cxIdeal += cxDiff;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3812 this->GetParent().SendMessage(RB_SETBANDINFO, i, (LPARAM)&rbi);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3813 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3814 break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3815 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3816 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3817 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3818
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3819 if((bMaxOld != m_bChildMaximized) || (hIconOld != m_hIconChildMaximized))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3820 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3821 // force size change and redraw everything
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3822 RECT rect = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3823 this->GetWindowRect(&rect);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3824 ::MapWindowPoints(NULL, this->GetParent(), (LPPOINT)&rect, 2);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3825 this->SetRedraw(FALSE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3826 this->SetWindowPos(NULL, 0, 0, 1, 1, SWP_NOZORDER | SWP_NOMOVE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3827 this->SetWindowPos(NULL, &rect, SWP_NOZORDER | SWP_NOMOVE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3828 this->SetRedraw(TRUE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3829 this->RedrawWindow(NULL, NULL, RDW_FRAME | RDW_INVALIDATE | RDW_UPDATENOW);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3830 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3831 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3832
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3833 // Implementation
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3834 void GetSystemSettings()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3835 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3836 #ifdef _CMDBAR_EXTRA_TRACE
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3837 ATLTRACE2(atlTraceUI, 0, _T("MDI CmdBar - GetSystemSettings\n"));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3838 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3839 _baseClass::GetSystemSettings();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3840
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3841 NONCLIENTMETRICS info = { RunTimeHelper::SizeOf_NONCLIENTMETRICS() };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3842 BOOL bRet = ::SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(info), &info, 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3843 ATLASSERT(bRet);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3844 if(bRet)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3845 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3846 m_cxIconWidth = ::GetSystemMetrics(SM_CXSMICON);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3847 m_cyIconHeight = ::GetSystemMetrics(SM_CYSMICON);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3848 m_cxLeft = m_cxIconWidth;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3849
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3850 if(m_hTheme != NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3851 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3852 m_cxBtnWidth = info.iCaptionWidth - 2 * m_cxyOffset;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3853 m_cyBtnHeight = info.iCaptionHeight - 2 * m_cxyOffset;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3854 m_cxRight = 3 * m_cxBtnWidth;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3855 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3856 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3857 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3858 m_cxBtnWidth = info.iCaptionWidth - m_cxyOffset;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3859 m_cyBtnHeight = info.iCaptionHeight - 2 * m_cxyOffset;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3860 m_cxRight = 3 * m_cxBtnWidth + m_cxyOffset;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3861 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3862 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3863
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3864 RECT rect = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3865 this->GetClientRect(&rect);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3866 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3867 pT->_AdjustBtnSize(rect.bottom);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3868 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3869
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3870 void _AdjustBtnSize(int cyHeight)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3871 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3872 if((cyHeight > 1) && (m_cyBtnHeight > cyHeight))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3873 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3874 if(m_hTheme != NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3875 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3876 m_cyBtnHeight = cyHeight;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3877 m_cxBtnWidth = cyHeight;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3878 m_cxRight = 3 * m_cxBtnWidth;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3879 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3880 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3881 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3882 m_cyBtnHeight = cyHeight;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3883 m_cxBtnWidth = cyHeight + m_cxyOffset;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3884 m_cxRight = 3 * m_cxBtnWidth + m_cxyOffset;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3885 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3886 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3887 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3888
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3889 void _CalcIconRect(int cxWidth, int cyHeight, RECT& rect, bool bInvertX = false) const
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3890 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3891 int xStart = (m_cxLeft - m_cxIconWidth) / 2;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3892 if(xStart < 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3893 xStart = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3894 int yStart = (cyHeight - m_cyIconHeight) / 2;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3895 if(yStart < 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3896 yStart = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3897
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3898 if(bInvertX)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3899 ::SetRect(&rect, cxWidth - (xStart + m_cxBtnWidth), yStart, cxWidth - xStart, yStart + m_cyBtnHeight);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3900 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3901 ::SetRect(&rect, xStart, yStart, xStart + m_cxBtnWidth, yStart + m_cyBtnHeight);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3902 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3903
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3904 void _CalcBtnRects(int cxWidth, int cyHeight, RECT arrRect[3], bool bInvertX = false) const
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3905 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3906 int yStart = (cyHeight - m_cyBtnHeight) / 2;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3907 if(yStart < 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3908 yStart = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3909
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3910 RECT rcBtn = { cxWidth - m_cxBtnWidth, yStart, cxWidth, yStart + m_cyBtnHeight };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3911 int nDirection = -1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3912 if(bInvertX)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3913 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3914 ::SetRect(&rcBtn, 0, yStart, m_cxBtnWidth, yStart + m_cyBtnHeight);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3915 nDirection = 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3916 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3917
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3918 arrRect[0] = rcBtn;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3919 if(m_hTheme != NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3920 ::OffsetRect(&rcBtn, nDirection * m_cxBtnWidth, 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3921 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3922 ::OffsetRect(&rcBtn, nDirection * (m_cxBtnWidth + m_cxyOffset), 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3923 arrRect[1] = rcBtn;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3924 ::OffsetRect(&rcBtn, nDirection * m_cxBtnWidth, 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3925 arrRect[2] = rcBtn;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3926 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3927
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3928 void _DrawMDIButton(CWindowDC& dc, LPRECT pRects, int nBtn)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3929 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3930 if(m_hTheme != NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3931 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3932 #ifndef __VSSYM32_H__
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3933 const int WP_MDICLOSEBUTTON = 20;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3934 const int CBS_NORMAL = 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3935 const int CBS_PUSHED = 3;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3936 const int CBS_DISABLED = 4;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3937 const int WP_MDIRESTOREBUTTON = 22;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3938 const int RBS_NORMAL = 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3939 const int RBS_PUSHED = 3;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3940 const int RBS_DISABLED = 4;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3941 const int WP_MDIMINBUTTON = 16;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3942 const int MINBS_NORMAL = 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3943 const int MINBS_PUSHED = 3;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3944 const int MINBS_DISABLED = 4;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3945 #endif // __VSSYM32_H__
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3946 if((nBtn == -1) || (nBtn == 0))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3947 ::DrawThemeBackground(m_hTheme, dc, WP_MDICLOSEBUTTON, this->m_bParentActive ? ((m_nBtnPressed == 0) ? CBS_PUSHED : CBS_NORMAL) : CBS_DISABLED, &pRects[0], NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3948 if((nBtn == -1) || (nBtn == 1))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3949 ::DrawThemeBackground(m_hTheme, dc, WP_MDIRESTOREBUTTON, this->m_bParentActive ? ((m_nBtnPressed == 1) ? RBS_PUSHED : RBS_NORMAL) : RBS_DISABLED, &pRects[1], NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3950 if((nBtn == -1) || (nBtn == 2))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3951 ::DrawThemeBackground(m_hTheme, dc, WP_MDIMINBUTTON, this->m_bParentActive ? ((m_nBtnPressed == 2) ? MINBS_PUSHED : MINBS_NORMAL) : MINBS_DISABLED, &pRects[2], NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3952 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3953 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3954 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3955 if((nBtn == -1) || (nBtn == 0))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3956 dc.DrawFrameControl(&pRects[0], DFC_CAPTION, DFCS_CAPTIONCLOSE | ((m_nBtnPressed == 0) ? DFCS_PUSHED : 0));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3957 if((nBtn == -1) || (nBtn == 1))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3958 dc.DrawFrameControl(&pRects[1], DFC_CAPTION, DFCS_CAPTIONRESTORE | ((m_nBtnPressed == 1) ? DFCS_PUSHED : 0));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3959 if((nBtn == -1) || (nBtn == 2))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3960 dc.DrawFrameControl(&pRects[2], DFC_CAPTION, DFCS_CAPTIONMIN | ((m_nBtnPressed == 2) ? DFCS_PUSHED : 0));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3961 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3962 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3963
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3964 static UINT _GetThemeChangedMsg()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3965 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3966 #ifndef WM_THEMECHANGED
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3967 static const UINT WM_THEMECHANGED = 0x031A;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3968 #endif // !WM_THEMECHANGED
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3969 return WM_THEMECHANGED;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3970 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3971
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3972 void _OpenThemeData()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3973 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3974 if(RunTimeHelper::IsThemeAvailable())
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3975 m_hTheme = ::OpenThemeData(this->m_hWnd, L"Window");
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3976 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3977
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3978 void _CloseThemeData()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3979 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3980 if(m_hTheme != NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3981 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3982 ::CloseThemeData(m_hTheme);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3983 m_hTheme = NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3984 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3985 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3986
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3987 bool _DebugCheckChild()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3988 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3989 #ifdef _DEBUG
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3990 BOOL bMaximized = FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3991 HWND hWndChild = (HWND)::SendMessage(m_wndMDIClient, WM_MDIGETACTIVE, 0, (LPARAM)&bMaximized);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3992 return (bMaximized && (hWndChild == m_hWndChildMaximized));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3993 #else // !_DEBUG
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3994 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3995 #endif // !_DEBUG
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3996 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3997 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3998
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3999 class CMDICommandBarCtrl : public CMDICommandBarCtrlImpl<CMDICommandBarCtrl>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4000 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4001 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4002 DECLARE_WND_SUPERCLASS(_T("WTL_MDICommandBar"), GetWndClassName())
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4003 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4004
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4005 } // namespace WTL
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4006
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4007 #endif // __ATLCTRLW_H__