10 #define __ATLFRAME_H__ 15 #error atlframe.h requires atlapp.h to be included first 19 #error atlframe.h requires atlwin.h to be included first 53 enum { cchAutoName = 5 +
sizeof(
void*) * 2 };
56 enum { cchAutoName = MAX_PATH };
59 LPCTSTR m_lpszOrigName;
61 LPCTSTR m_lpszCursorID;
64 TCHAR m_szAutoName[cchAutoName];
65 UINT m_uCommonResourceID;
68 ATOM Register(WNDPROC* pProc)
73 if(FAILED(lock.Lock()))
75 ATLTRACE2(atlTraceUI, 0, _T(
"ERROR : Unable to lock critical section in CFrameWndClassInfo::Register.\n"));
82 HINSTANCE hInst = ModuleHelper::GetModuleInstance();
84 if (m_lpszOrigName != NULL)
86 ATLASSERT(pProc != NULL);
87 LPCTSTR lpsz = m_wc.lpszClassName;
88 WNDPROC proc = m_wc.lpfnWndProc;
90 WNDCLASSEX wc = {
sizeof(WNDCLASSEX) };
92 if(!::GetClassInfoEx(ModuleHelper::GetModuleInstance(), m_lpszOrigName, &wc))
95 if(!::GetClassInfoEx(NULL, m_lpszOrigName, &wc))
102 pWndProc = m_wc.lpfnWndProc;
103 m_wc.lpszClassName = lpsz;
104 m_wc.lpfnWndProc = proc;
108 m_wc.hCursor = ::LoadCursor(m_bSystemCursor ? NULL : hInst, m_lpszCursorID);
111 m_wc.hInstance = hInst;
112 m_wc.style &= ~CS_GLOBALCLASS;
113 if (m_wc.lpszClassName == NULL)
115 #if (_WIN32_WINNT >= 0x0500) || defined(_WIN64) 116 SecureHelper::wsprintf_x(m_szAutoName, cchAutoName, _T(
"ATL:%p"), &m_wc);
117 #else // !((_WIN32_WINNT >= 0x0500) || defined(_WIN64)) 118 SecureHelper::wsprintf_x(m_szAutoName, cchAutoName, _T(
"ATL:%8.8X"), (DWORD_PTR)&m_wc);
119 #endif // !((_WIN32_WINNT >= 0x0500) || defined(_WIN64)) 120 m_wc.lpszClassName = m_szAutoName;
123 WNDCLASSEX wcTemp = m_wc;
124 m_atom = (ATOM)::GetClassInfoEx(m_wc.hInstance, m_wc.lpszClassName, &wcTemp);
127 if(m_uCommonResourceID != 0)
129 m_wc.hIcon = (HICON)::LoadImage(ModuleHelper::GetResourceInstance(),
130 MAKEINTRESOURCE(m_uCommonResourceID), IMAGE_ICON,
131 ::GetSystemMetrics(SM_CXICON), ::GetSystemMetrics(SM_CYICON), LR_DEFAULTCOLOR);
132 m_wc.hIconSm = (HICON)::LoadImage(ModuleHelper::GetResourceInstance(),
133 MAKEINTRESOURCE(m_uCommonResourceID), IMAGE_ICON,
134 ::GetSystemMetrics(SM_CXSMICON), ::GetSystemMetrics(SM_CYSMICON), LR_DEFAULTCOLOR);
136 m_atom = ::RegisterClassEx(&m_wc);
143 if (m_lpszOrigName != NULL)
145 ATLASSERT(pProc != NULL);
146 ATLASSERT(pWndProc != NULL);
153 ATOM Register(WNDPROC* pProc)
158 if(FAILED(lock.Lock()))
160 ATLTRACE2(atlTraceUI, 0, _T(
"ERROR : Unable to lock critical section in CFrameWndClassInfo::Register.\n"));
167 HINSTANCE hInst = ModuleHelper::GetModuleInstance();
169 if (m_lpszOrigName != NULL)
171 ATLASSERT(pProc != NULL);
172 LPCTSTR lpsz = m_wc.lpszClassName;
173 WNDPROC proc = m_wc.lpfnWndProc;
177 if(!::GetClassInfo(ModuleHelper::GetModuleInstance(), m_lpszOrigName, &wc))
180 if(!::GetClassInfo(NULL, m_lpszOrigName, &wc))
187 pWndProc = m_wc.lpfnWndProc;
188 m_wc.lpszClassName = lpsz;
189 m_wc.lpfnWndProc = proc;
193 #if defined(GWES_CURSOR) || defined(GWES_MCURSOR) 194 m_wc.hCursor = ::LoadCursor(m_bSystemCursor ? NULL : hInst, m_lpszCursorID);
195 #else // !(defined(GWES_CURSOR) || defined(GWES_MCURSOR)) 197 #endif // !(defined(GWES_CURSOR) || defined(GWES_MCURSOR)) 200 m_wc.hInstance = hInst;
201 m_wc.style &= ~CS_GLOBALCLASS;
202 if (m_wc.lpszClassName == NULL)
204 wsprintf(m_szAutoName, _T(
"ATL:%8.8X"), (DWORD_PTR)&m_wc);
205 m_wc.lpszClassName = m_szAutoName;
208 WNDCLASS wcTemp = m_wc;
209 m_atom = (ATOM)::GetClassInfo(m_wc.hInstance, m_wc.lpszClassName, &wcTemp);
212 if(m_uCommonResourceID != 0)
213 m_wc.hIcon = (HICON)::LoadImage(ModuleHelper::GetResourceInstance(),
214 MAKEINTRESOURCE(m_uCommonResourceID), IMAGE_ICON,
215 ::GetSystemMetrics(SM_CXICON), ::GetSystemMetrics(SM_CYICON), LR_DEFAULTCOLOR);
216 m_atom = ::RegisterClass(&m_wc);
223 if (m_lpszOrigName != NULL)
225 ATLASSERT(pProc != NULL);
226 ATLASSERT(pWndProc != NULL);
241 #define DECLARE_FRAME_WND_CLASS(WndClassName, uCommonResourceID) \ 242 static WTL::CFrameWndClassInfo& GetWndClassInfo() \ 244 static WTL::CFrameWndClassInfo wc = \ 246 { sizeof(WNDCLASSEX), 0, StartWindowProc, \ 247 0, 0, NULL, NULL, NULL, (HBRUSH)(COLOR_WINDOW + 1), NULL, WndClassName, NULL }, \ 248 NULL, NULL, IDC_ARROW, TRUE, 0, _T(""), uCommonResourceID \ 253 #define DECLARE_FRAME_WND_CLASS_EX(WndClassName, uCommonResourceID, style, bkgnd) \ 254 static WTL::CFrameWndClassInfo& GetWndClassInfo() \ 256 static WTL::CFrameWndClassInfo wc = \ 258 { sizeof(WNDCLASSEX), style, StartWindowProc, \ 259 0, 0, NULL, NULL, NULL, (HBRUSH)(bkgnd + 1), NULL, WndClassName, NULL }, \ 260 NULL, NULL, IDC_ARROW, TRUE, 0, _T(""), uCommonResourceID \ 265 #define DECLARE_FRAME_WND_SUPERCLASS(WndClassName, OrigWndClassName, uCommonResourceID) \ 266 static WTL::CFrameWndClassInfo& GetWndClassInfo() \ 268 static WTL::CFrameWndClassInfo wc = \ 270 { sizeof(WNDCLASSEX), 0, StartWindowProc, \ 271 0, 0, NULL, NULL, NULL, NULL, NULL, WndClassName, NULL }, \ 272 OrigWndClassName, NULL, NULL, TRUE, 0, _T(""), uCommonResourceID \ 279 #define DECLARE_FRAME_WND_CLASS(WndClassName, uCommonResourceID) \ 280 static WTL::CFrameWndClassInfo& GetWndClassInfo() \ 282 static WTL::CFrameWndClassInfo wc = \ 284 { 0, StartWindowProc, \ 285 0, 0, NULL, NULL, NULL, (HBRUSH)(COLOR_WINDOW + 1), NULL, WndClassName }, \ 286 NULL, NULL, IDC_ARROW, TRUE, 0, _T(""), uCommonResourceID \ 291 #define DECLARE_FRAME_WND_CLASS_EX(WndClassName, uCommonResourceID, style, bkgnd) \ 292 static WTL::CFrameWndClassInfo& GetWndClassInfo() \ 294 static WTL::CFrameWndClassInfo wc = \ 296 { style, StartWindowProc, \ 297 0, 0, NULL, NULL, NULL, (HBRUSH)(bkgnd + 1), NULL, WndClassName }, \ 298 NULL, NULL, IDC_ARROW, TRUE, 0, _T(""), uCommonResourceID \ 303 #define DECLARE_FRAME_WND_SUPERCLASS(WndClassName, OrigWndClassName, uCommonResourceID) \ 304 static WTL::CFrameWndClassInfo& GetWndClassInfo() \ 306 static WTL::CFrameWndClassInfo wc = \ 308 { NULL, StartWindowProc, \ 309 0, 0, NULL, NULL, NULL, NULL, NULL, WndClassName }, \ 310 OrigWndClassName, NULL, IDC_ARROW, TRUE, 0, _T(""), uCommonResourceID \ 315 #endif // !_WIN32_WCE 322 #define CHAIN_CLIENT_COMMANDS() \ 323 if(uMsg == WM_COMMAND && m_hWndClient != NULL) \ 324 ::SendMessage(m_hWndClient, uMsg, wParam, lParam); 327 #define ATL_SIMPLE_TOOLBAR_STYLE \ 328 (WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | TBSTYLE_TOOLTIPS) 330 #define ATL_SIMPLE_TOOLBAR_PANE_STYLE \ 331 (WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | CCS_NODIVIDER | CCS_NORESIZE | CCS_NOPARENTALIGN | TBSTYLE_TOOLTIPS | TBSTYLE_FLAT) 333 #if (_WIN32_IE >= 0x0400) 334 #define ATL_SIMPLE_REBAR_STYLE \ 335 (WS_CHILD | WS_VISIBLE | WS_BORDER | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | RBS_VARHEIGHT | RBS_BANDBORDERS | RBS_AUTOSIZE) 337 #define ATL_SIMPLE_REBAR_STYLE \ 338 (WS_CHILD | WS_VISIBLE | WS_BORDER | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | RBS_VARHEIGHT | RBS_BANDBORDERS) 339 #endif // !(_WIN32_IE >= 0x0400) 341 #if (_WIN32_IE >= 0x0400) 342 #define ATL_SIMPLE_REBAR_NOBORDER_STYLE \ 343 (WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | RBS_VARHEIGHT | RBS_BANDBORDERS | RBS_AUTOSIZE | CCS_NODIVIDER) 345 #define ATL_SIMPLE_REBAR_NOBORDER_STYLE \ 346 (WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | RBS_VARHEIGHT | RBS_BANDBORDERS | CCS_NODIVIDER) 347 #endif // !(_WIN32_IE >= 0x0400) 350 #if !defined(__ATLCTRLW_H__) && !defined(_WIN32_WCE) 352 #define CBRM_GETCMDBAR (WM_USER + 301) // returns command bar HWND 353 #define CBRM_GETMENU (WM_USER + 302) // returns loaded or attached menu 354 #define CBRM_TRACKPOPUPMENU (WM_USER + 303) // displays a popup menu 366 #define CBRPOPUPMENU _AtlFrameWnd_CmdBarPopupMenu 368 #endif // !defined(__ATLCTRLW_H__) && !defined(_WIN32_WCE) 371 template <
class TBase = ATL::CWindow,
class TWinTraits = ATL::CFrameWinTraits>
375 DECLARE_FRAME_WND_CLASS(NULL, 0)
377 #if (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE) 378 struct _ChevronMenuInfo
381 LPNMREBARCHEVRON lpnm;
384 #endif // (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE) 388 HWND m_hWndStatusBar;
392 HWND m_hWndCECommandBar;
400 m_hWndStatusBar(NULL),
403 m_hWndCECommandBar(NULL),
409 HWND Create(HWND hWndParent,
ATL::_U_RECT rect, LPCTSTR szWindowName, DWORD dwStyle, DWORD dwExStyle,
ATL::_U_MENUorID MenuOrID, ATOM atom, LPVOID lpCreateParam)
411 ATLASSERT(m_hWnd == NULL);
413 #if (_ATL_VER >= 0x0800) 415 BOOL bRet = m_thunk.Init(NULL, NULL);
418 ::SetLastError(ERROR_OUTOFMEMORY);
421 #endif // (_ATL_VER >= 0x0800) 426 ModuleHelper::AddCreateWndData(&m_thunk.cd,
this);
428 if(MenuOrID.m_hMenu == NULL && (dwStyle & WS_CHILD))
429 MenuOrID.m_hMenu = (HMENU)(UINT_PTR)
this;
430 if(rect.m_lpRect == NULL)
431 rect.m_lpRect = &TBase::rcDefault;
433 HWND hWnd = ::CreateWindowEx(dwExStyle, MAKEINTATOM(atom), szWindowName,
434 dwStyle, rect.m_lpRect->left, rect.m_lpRect->top, rect.m_lpRect->right - rect.m_lpRect->left,
435 rect.m_lpRect->bottom - rect.m_lpRect->top, hWndParent, MenuOrID.m_hMenu,
436 ModuleHelper::GetModuleInstance(), lpCreateParam);
438 ATLASSERT(hWnd == NULL || m_hWnd == hWnd);
443 static HWND CreateSimpleToolBarCtrl(HWND hWndParent, UINT nResourceID, BOOL bInitialSeparator = FALSE,
444 DWORD dwStyle = ATL_SIMPLE_TOOLBAR_STYLE, UINT nID = ATL_IDW_TOOLBAR)
446 HINSTANCE hInst = ModuleHelper::GetResourceInstance();
447 HRSRC hRsrc = ::FindResource(hInst, MAKEINTRESOURCE(nResourceID), RT_TOOLBAR);
451 HGLOBAL hGlobal = ::LoadResource(hInst, hRsrc);
458 ATLASSERT(pData->wVersion == 1);
460 WORD* pItems = pData->items();
461 int nItems = pData->wItemCount + (bInitialSeparator ? 1 : 0);
463 TBBUTTON* pTBBtn = buff.Allocate(nItems);
464 ATLASSERT(pTBBtn != NULL);
468 const int cxSeparator = 8;
471 if(bInitialSeparator)
473 pTBBtn[0].iBitmap = cxSeparator / 2;
474 pTBBtn[0].idCommand = 0;
475 pTBBtn[0].fsState = 0;
476 pTBBtn[0].fsStyle = BTNS_SEP;
477 pTBBtn[0].dwData = 0;
478 pTBBtn[0].iString = 0;
482 for(
int i = 0, j = bInitialSeparator ? 1 : 0; i < pData->wItemCount; i++, j++)
486 pTBBtn[j].iBitmap = nBmp++;
487 pTBBtn[j].idCommand = pItems[i];
488 pTBBtn[j].fsState = TBSTATE_ENABLED;
489 pTBBtn[j].fsStyle = BTNS_BUTTON;
490 pTBBtn[j].dwData = 0;
491 pTBBtn[j].iString = 0;
495 pTBBtn[j].iBitmap = cxSeparator;
496 pTBBtn[j].idCommand = 0;
497 pTBBtn[j].fsState = 0;
498 pTBBtn[j].fsStyle = BTNS_SEP;
499 pTBBtn[j].dwData = 0;
500 pTBBtn[j].iString = 0;
505 HWND hWnd = ::CreateWindowEx(0, TOOLBARCLASSNAME, NULL, dwStyle, 0, 0, 100, 100, hWndParent, (HMENU)LongToHandle(nID), ModuleHelper::GetModuleInstance(), NULL);
515 HWND hWnd = hWndParent;
518 ::SendMessage(hWnd, TB_BUTTONSTRUCTSIZE,
sizeof(TBBUTTON), 0L);
521 CFontHandle font = (HFONT)::SendMessage(hWnd, WM_GETFONT, 0, 0L);
523 font = (HFONT)::GetStockObject(SYSTEM_FONT);
526 WORD cyFontHeight = (WORD)abs(lf.lfHeight);
529 WORD bitsPerPixel = AtlGetBitmapResourceBitsPerPixel(nResourceID);
532 COLORREF crMask = CLR_DEFAULT;
533 if(bitsPerPixel == 32)
538 HIMAGELIST hImageList = ImageList_LoadImage(ModuleHelper::GetResourceInstance(), MAKEINTRESOURCE(nResourceID), pData->wWidth, 1, crMask, IMAGE_BITMAP, LR_CREATEDIBSECTION | LR_DEFAULTSIZE);
539 ATLASSERT(hImageList != NULL);
540 ::SendMessage(hWnd, TB_SETIMAGELIST, 0, (LPARAM)hImageList);
543 #endif // !_WIN32_WCE 545 TBADDBITMAP tbab = { 0 };
547 tbab.nID = nResourceID;
548 ::SendMessage(hWnd, TB_ADDBITMAP, nBmp, (LPARAM)&tbab);
551 ::SendMessage(hWnd, TB_ADDBUTTONS, nItems, (LPARAM)pTBBtn);
552 ::SendMessage(hWnd, TB_SETBITMAPSIZE, 0, MAKELONG(pData->wWidth, __max(pData->wHeight, cyFontHeight)));
553 const int cxyButtonMargin = 7;
554 ::SendMessage(hWnd, TB_SETBUTTONSIZE, 0, MAKELONG(pData->wWidth + cxyButtonMargin, __max(pData->wHeight, cyFontHeight) + cxyButtonMargin));
560 static HWND CreateSimpleReBarCtrl(HWND hWndParent, DWORD dwStyle = ATL_SIMPLE_REBAR_STYLE, UINT nID = ATL_IDW_TOOLBAR)
563 if(dwStyle & CCS_NODIVIDER && dwStyle & WS_BORDER)
564 dwStyle &= ~WS_BORDER;
565 else if(!(dwStyle & WS_BORDER) && !(dwStyle & CCS_NODIVIDER))
566 dwStyle |= CCS_NODIVIDER;
569 HWND hWndReBar = ::CreateWindowEx(0, REBARCLASSNAME, NULL, dwStyle, 0, 0, 100, 100, hWndParent, (HMENU)LongToHandle(nID), ModuleHelper::GetModuleInstance(), NULL);
570 if(hWndReBar == NULL)
572 ATLTRACE2(atlTraceUI, 0, _T(
"Failed to create rebar.\n"));
577 REBARINFO rbi = {
sizeof(REBARINFO), 0 };
578 if(::SendMessage(hWndReBar, RB_SETBARINFO, 0, (LPARAM)&rbi) == 0)
580 ATLTRACE2(atlTraceUI, 0, _T(
"Failed to initialize rebar.\n"));
581 ::DestroyWindow(hWndReBar);
588 BOOL CreateSimpleReBar(DWORD dwStyle = ATL_SIMPLE_REBAR_STYLE, UINT nID = ATL_IDW_TOOLBAR)
590 ATLASSERT(!::IsWindow(m_hWndToolBar));
591 m_hWndToolBar = CreateSimpleReBarCtrl(m_hWnd, dwStyle, nID);
592 return (m_hWndToolBar != NULL);
595 static BOOL AddSimpleReBarBandCtrl(HWND hWndReBar, HWND hWndBand,
int nID = 0, LPCTSTR lpstrTitle = NULL, BOOL bNewRow = FALSE,
int cxWidth = 0, BOOL bFullWidthAlways = FALSE)
597 ATLASSERT(::IsWindow(hWndReBar));
601 TCHAR lpszClassName[
sizeof(REBARCLASSNAME)] = { 0 };
602 ::GetClassName(hWndReBar, lpszClassName,
sizeof(REBARCLASSNAME));
603 ATLASSERT(lstrcmp(lpszClassName, REBARCLASSNAME) == 0);
606 ATLASSERT(::IsWindow(hWndBand));
609 int nBtnCount = (int)::SendMessage(hWndBand, TB_BUTTONCOUNT, 0, 0L);
612 REBARBANDINFO rbBand = { RunTimeHelper::SizeOf_REBARBANDINFO() };
613 #if (_WIN32_IE >= 0x0400) 614 rbBand.fMask = RBBIM_CHILD | RBBIM_CHILDSIZE | RBBIM_STYLE | RBBIM_ID | RBBIM_SIZE | RBBIM_IDEALSIZE;
616 rbBand.fMask = RBBIM_CHILD | RBBIM_CHILDSIZE | RBBIM_STYLE | RBBIM_ID | RBBIM_SIZE;
617 #endif // !(_WIN32_IE >= 0x0400) 618 if(lpstrTitle != NULL)
619 rbBand.fMask |= RBBIM_TEXT;
620 rbBand.fStyle = RBBS_CHILDEDGE;
621 #if (_WIN32_IE >= 0x0500) 623 rbBand.fStyle |= RBBS_USECHEVRON;
624 #endif // (_WIN32_IE >= 0x0500) 626 rbBand.fStyle |= RBBS_BREAK;
628 rbBand.lpText = (LPTSTR)lpstrTitle;
629 rbBand.hwndChild = hWndBand;
631 nID = ATL_IDW_BAND_FIRST + (int)::SendMessage(hWndReBar, RB_GETBANDCOUNT, 0, 0L);
639 bRet = (BOOL)::SendMessage(hWndBand, TB_GETITEMRECT, nBtnCount - 1, (LPARAM)&rcTmp);
641 rbBand.cx = (cxWidth != 0) ? cxWidth : rcTmp.right;
642 rbBand.cyMinChild = rcTmp.bottom - rcTmp.top;
645 rbBand.cxMinChild = rbBand.cx;
647 else if(lpstrTitle == NULL)
649 bRet = (BOOL)::SendMessage(hWndBand, TB_GETITEMRECT, 0, (LPARAM)&rcTmp);
651 rbBand.cxMinChild = rcTmp.right;
655 rbBand.cxMinChild = 0;
660 bRet = ::GetWindowRect(hWndBand, &rcTmp);
662 rbBand.cx = (cxWidth != 0) ? cxWidth : (rcTmp.right - rcTmp.left);
663 rbBand.cxMinChild = bFullWidthAlways ? rbBand.cx : 0;
664 rbBand.cyMinChild = rcTmp.bottom - rcTmp.top;
667 #if (_WIN32_IE >= 0x0400) 668 rbBand.cxIdeal = rbBand.cx;
669 #endif // (_WIN32_IE >= 0x0400) 672 LRESULT lRes = ::SendMessage(hWndReBar, RB_INSERTBAND, (WPARAM)-1, (LPARAM)&rbBand);
675 ATLTRACE2(atlTraceUI, 0, _T(
"Failed to add a band to the rebar.\n"));
679 #if (_WIN32_IE >= 0x0501) 680 DWORD dwExStyle = (DWORD)::SendMessage(hWndBand, TB_GETEXTENDEDSTYLE, 0, 0L);
681 ::SendMessage(hWndBand, TB_SETEXTENDEDSTYLE, 0, dwExStyle | TBSTYLE_EX_HIDECLIPPEDBUTTONS);
682 #endif // (_WIN32_IE >= 0x0501) 687 BOOL AddSimpleReBarBand(HWND hWndBand, LPCTSTR lpstrTitle = NULL, BOOL bNewRow = FALSE,
int cxWidth = 0, BOOL bFullWidthAlways = FALSE)
689 ATLASSERT(::IsWindow(m_hWndToolBar));
690 ATLASSERT(::IsWindow(hWndBand));
691 return AddSimpleReBarBandCtrl(m_hWndToolBar, hWndBand, 0, lpstrTitle, bNewRow, cxWidth, bFullWidthAlways);
694 #if (_WIN32_IE >= 0x0400) 695 void SizeSimpleReBarBands()
697 ATLASSERT(::IsWindow(m_hWndToolBar));
699 int nCount = (int)::SendMessage(m_hWndToolBar, RB_GETBANDCOUNT, 0, 0L);
701 for(
int i = 0; i < nCount; i++)
703 REBARBANDINFO rbBand = { RunTimeHelper::SizeOf_REBARBANDINFO() };
704 rbBand.fMask = RBBIM_SIZE;
705 BOOL bRet = (BOOL)::SendMessage(m_hWndToolBar, RB_GETBANDINFO, i, (LPARAM)&rbBand);
708 ::SendMessage(m_hWndToolBar, RB_GETBANDBORDERS, i, (LPARAM)&rect);
709 rbBand.cx += rect.left + rect.right;
710 bRet = (BOOL)::SendMessage(m_hWndToolBar, RB_SETBANDINFO, i, (LPARAM)&rbBand);
714 #endif // (_WIN32_IE >= 0x0400) 718 BOOL CreateSimpleStatusBar(LPCTSTR lpstrText, DWORD dwStyle = WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | SBARS_SIZEGRIP, UINT nID = ATL_IDW_STATUS_BAR)
720 BOOL CreateSimpleStatusBar(LPCTSTR lpstrText, DWORD dwStyle = WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS, UINT nID = ATL_IDW_STATUS_BAR)
723 ATLASSERT(!::IsWindow(m_hWndStatusBar));
724 m_hWndStatusBar = ::CreateStatusWindow(dwStyle, lpstrText, m_hWnd, nID);
725 return (m_hWndStatusBar != NULL);
729 BOOL CreateSimpleStatusBar(UINT nTextID = ATL_IDS_IDLEMESSAGE, DWORD dwStyle = WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | SBARS_SIZEGRIP, UINT nID = ATL_IDW_STATUS_BAR)
731 BOOL CreateSimpleStatusBar(UINT nTextID = ATL_IDS_IDLEMESSAGE, DWORD dwStyle = WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS, UINT nID = ATL_IDW_STATUS_BAR)
734 const int cchMax = 128;
735 TCHAR szText[cchMax] = { 0 };
736 ::LoadString(ModuleHelper::GetResourceInstance(), nTextID, szText, cchMax);
737 return CreateSimpleStatusBar(szText, dwStyle, nID);
741 BOOL CreateSimpleCECommandBar(LPTSTR pszMenu = NULL, WORD iButton = 0, DWORD dwFlags = 0,
int nCmdBarID = 1)
743 ATLASSERT(m_hWndCECommandBar == NULL);
744 ATLASSERT(m_hWndToolBar == NULL);
746 m_hWndCECommandBar = ::CommandBar_Create(ModuleHelper::GetModuleInstance(), m_hWnd, nCmdBarID);
747 if(m_hWndCECommandBar == NULL)
750 m_hWndToolBar = m_hWndCECommandBar;
755 bRet &= ::CommandBar_InsertMenubarEx(m_hWndCECommandBar, IS_INTRESOURCE(pszMenu) ? ModuleHelper::GetResourceInstance() : NULL, pszMenu, iButton);
757 bRet &= ::CommandBar_AddAdornments(m_hWndCECommandBar, dwFlags, 0);
762 #if defined(_AYGSHELL_H_) || defined(__AYGSHELL_H__) 763 BOOL CreateSimpleCEMenuBar(UINT nToolBarId = ATL_IDW_MENU_BAR, DWORD dwFlags = 0,
int nBmpId = 0,
int cBmpImages = 0)
765 ATLASSERT(m_hWndCECommandBar == NULL);
767 SHMENUBARINFO mbi = { 0 };
768 mbi.cbSize =
sizeof(mbi);
769 mbi.hwndParent = m_hWnd;
770 mbi.dwFlags = dwFlags;
771 mbi.nToolBarId = nToolBarId;
772 mbi.hInstRes = ModuleHelper::GetResourceInstance();
774 mbi.cBmpImages = cBmpImages;
777 BOOL bRet = ::SHCreateMenuBar(&mbi);
780 m_hWndCECommandBar = mbi.hwndMB;
789 ATLASSERT(::IsWindow(m_hWnd));
790 ATLASSERT(::IsWindow(m_hWndCECommandBar));
793 GetWindowRect(&rect);
795 ::GetWindowRect(m_hWndCECommandBar, &rectMB);
796 int cy = ::IsWindowVisible(m_hWndCECommandBar) ? rectMB.top - rect.top : rectMB.bottom - rect.top;
797 SetWindowPos(NULL, 0, 0, rect.right - rect.left, cy, SWP_NOZORDER | SWP_NOMOVE);
799 #endif // defined(_AYGSHELL_H_) || defined(__AYGSHELL_H__) 802 void UpdateLayout(BOOL bResizeBars = TRUE)
805 GetClientRect(&rect);
808 UpdateBarsPosition(rect, bResizeBars);
811 if(m_hWndClient != NULL)
812 ::SetWindowPos(m_hWndClient, NULL, rect.left, rect.top,
813 rect.right - rect.left, rect.bottom - rect.top,
814 SWP_NOZORDER | SWP_NOACTIVATE);
817 void UpdateBarsPosition(RECT& rect, BOOL bResizeBars = TRUE)
820 if(m_hWndToolBar != NULL && ((DWORD)::GetWindowLong(m_hWndToolBar, GWL_STYLE) & WS_VISIBLE))
822 if(bResizeBars != FALSE)
824 ::SendMessage(m_hWndToolBar, WM_SIZE, 0, 0);
825 ::InvalidateRect(m_hWndToolBar, NULL, TRUE);
828 ::GetWindowRect(m_hWndToolBar, &rectTB);
829 rect.top += rectTB.bottom - rectTB.top;
833 if(m_hWndStatusBar != NULL && ((DWORD)::GetWindowLong(m_hWndStatusBar, GWL_STYLE) & WS_VISIBLE))
835 if(bResizeBars != FALSE)
836 ::SendMessage(m_hWndStatusBar, WM_SIZE, 0, 0);
838 ::GetWindowRect(m_hWndStatusBar, &rectSB);
839 rect.bottom -= rectSB.bottom - rectSB.top;
843 BOOL PreTranslateMessage(MSG* pMsg)
845 if(m_hAccel != NULL && ::TranslateAccelerator(m_hWnd, m_hAccel, pMsg))
851 MESSAGE_HANDLER(WM_ERASEBKGND, OnEraseBackground)
853 MESSAGE_HANDLER(WM_MENUSELECT, OnMenuSelect)
854 #endif // !_WIN32_WCE 855 MESSAGE_HANDLER(WM_SETFOCUS, OnSetFocus)
856 MESSAGE_HANDLER(WM_DESTROY, OnDestroy)
858 NOTIFY_CODE_HANDLER(TTN_GETDISPINFOA, OnToolTipTextA)
859 NOTIFY_CODE_HANDLER(TTN_GETDISPINFOW, OnToolTipTextW)
860 #endif // !_WIN32_WCE 863 LRESULT OnEraseBackground(UINT , WPARAM , LPARAM , BOOL& bHandled)
865 if(m_hWndClient != NULL)
873 LRESULT OnMenuSelect(UINT , WPARAM wParam, LPARAM lParam, BOOL& bHandled)
877 if(m_hWndStatusBar == NULL)
880 WORD wFlags = HIWORD(wParam);
881 if(wFlags == 0xFFFF && lParam == NULL)
883 ::SendMessage(m_hWndStatusBar, SB_SIMPLE, FALSE, 0L);
887 const int cchBuff = 256;
888 TCHAR szBuff[cchBuff] = { 0 };
889 if(!(wFlags & MF_POPUP))
891 WORD wID = LOWORD(wParam);
893 if(wID >= 0xF000 && wID < 0xF1F0)
894 wID = (WORD)(((wID - 0xF000) >> 4) + ATL_IDS_SCFIRST);
895 else if(wID >= ID_FILE_MRU_FIRST && wID <= ID_FILE_MRU_LAST)
896 wID = ATL_IDS_MRU_FILE;
897 else if(wID >= ATL_IDM_FIRST_MDICHILD && wID <= ATL_IDM_LAST_MDICHILD)
898 wID = ATL_IDS_MDICHILD;
900 int nRet = ::LoadString(ModuleHelper::GetResourceInstance(), wID, szBuff, cchBuff);
901 for(
int i = 0; i < nRet; i++)
903 if(szBuff[i] == _T(
'\n'))
910 ::SendMessage(m_hWndStatusBar, SB_SIMPLE, TRUE, 0L);
911 ::SendMessage(m_hWndStatusBar, SB_SETTEXT, (255 | SBT_NOBORDERS), (LPARAM)szBuff);
916 #endif // !_WIN32_WCE 918 LRESULT OnSetFocus(UINT, WPARAM, LPARAM, BOOL& bHandled)
920 if(m_hWndClient != NULL)
921 ::SetFocus(m_hWndClient);
927 LRESULT OnDestroy(UINT, WPARAM, LPARAM, BOOL& bHandled)
929 if((GetStyle() & (WS_CHILD | WS_POPUP)) == 0)
930 ::PostQuitMessage(1);
937 LRESULT OnToolTipTextA(
int idCtrl, LPNMHDR pnmh, BOOL& )
939 LPNMTTDISPINFOA pDispInfo = (LPNMTTDISPINFOA)pnmh;
940 if((idCtrl != 0) && !(pDispInfo->uFlags & TTF_IDISHWND))
942 const int cchBuff = 256;
943 char szBuff[cchBuff] = { 0 };
944 int nRet = ::LoadStringA(ModuleHelper::GetResourceInstance(), idCtrl, szBuff, cchBuff);
945 for(
int i = 0; i < nRet; i++)
947 if(szBuff[i] ==
'\n')
949 SecureHelper::strncpyA_x(pDispInfo->szText, _countof(pDispInfo->szText), &szBuff[i + 1], _TRUNCATE);
953 #if (_WIN32_IE >= 0x0300) 955 pDispInfo->uFlags |= TTF_DI_SETITEM;
956 #endif // (_WIN32_IE >= 0x0300) 962 LRESULT OnToolTipTextW(
int idCtrl, LPNMHDR pnmh, BOOL& )
964 LPNMTTDISPINFOW pDispInfo = (LPNMTTDISPINFOW)pnmh;
965 if((idCtrl != 0) && !(pDispInfo->uFlags & TTF_IDISHWND))
967 const int cchBuff = 256;
968 wchar_t szBuff[cchBuff] = { 0 };
969 int nRet = ::LoadStringW(ModuleHelper::GetResourceInstance(), idCtrl, szBuff, cchBuff);
970 for(
int i = 0; i < nRet; i++)
972 if(szBuff[i] == L
'\n')
974 SecureHelper::strncpyW_x(pDispInfo->szText, _countof(pDispInfo->szText), &szBuff[i + 1], _TRUNCATE);
978 #if (_WIN32_IE >= 0x0300) 980 pDispInfo->uFlags |= TTF_DI_SETITEM;
981 #endif // (_WIN32_IE >= 0x0300) 986 #endif // !_WIN32_WCE 989 #if (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE) 990 bool PrepareChevronMenu(_ChevronMenuInfo& cmi)
993 REBARBANDINFO rbbi = { RunTimeHelper::SizeOf_REBARBANDINFO() };
994 rbbi.fMask = RBBIM_CHILD;
995 BOOL bRet = (BOOL)::SendMessage(cmi.lpnm->hdr.hwndFrom, RB_GETBANDINFO, cmi.lpnm->uBand, (LPARAM)&rbbi);
999 ATL::CWindow wnd = rbbi.hwndChild;
1000 int nCount = (int)wnd.SendMessage(TB_BUTTONCOUNT);
1005 CMenuHandle menuCmdBar = (HMENU)wnd.SendMessage(CBRM_GETMENU);
1006 cmi.bCmdBar = (menuCmdBar.m_hMenu != NULL);
1010 bRet = menu.CreatePopupMenu();
1012 RECT rcClient = { 0 };
1013 bRet = wnd.GetClientRect(&rcClient);
1015 for(
int i = 0; i < nCount; i++)
1017 TBBUTTON tbb = { 0 };
1018 bRet = (BOOL)wnd.SendMessage(TB_GETBUTTON, i, (LPARAM)&tbb);
1021 if((tbb.fsState & TBSTATE_HIDDEN) != 0)
1023 RECT rcButton = { 0 };
1024 bRet = (BOOL)wnd.SendMessage(TB_GETITEMRECT, i, (LPARAM)&rcButton);
1026 bool bEnabled = ((tbb.fsState & TBSTATE_ENABLED) != 0);
1027 if((rcButton.right > rcClient.right) || (rcButton.bottom > rcClient.bottom))
1029 if(tbb.fsStyle & BTNS_SEP)
1031 if(menu.GetMenuItemCount() > 0)
1032 menu.AppendMenu(MF_SEPARATOR);
1034 else if(cmi.bCmdBar)
1036 const int cchBuff = 200;
1037 TCHAR szBuff[cchBuff] = { 0 };
1039 mii.fMask = MIIM_TYPE | MIIM_SUBMENU;
1040 mii.dwTypeData = szBuff;
1042 bRet = menuCmdBar.GetMenuItemInfo(i, TRUE, &mii);
1045 ATLASSERT(::IsMenu(mii.hSubMenu));
1046 bRet = menu.AppendMenu(MF_STRING | MF_POPUP | (bEnabled ? MF_ENABLED : MF_GRAYED), (UINT_PTR)mii.hSubMenu, mii.dwTypeData);
1052 const int cchBuff = 200;
1053 TCHAR szBuff[cchBuff] = { 0 };
1054 LPCTSTR lpstrText = szBuff;
1055 TBBUTTONINFO tbbi = { 0 };
1056 tbbi.cbSize =
sizeof(TBBUTTONINFO);
1057 tbbi.dwMask = TBIF_TEXT;
1058 tbbi.pszText = szBuff;
1059 tbbi.cchText = cchBuff;
1060 if((wnd.SendMessage(TB_GETBUTTONINFO, tbb.idCommand, (LPARAM)&tbbi) == -1) || (szBuff[0] == 0))
1064 int nRet = ::LoadString(ModuleHelper::GetResourceInstance(), tbb.idCommand, szBuff, cchBuff);
1065 for(
int n = 0; n < nRet; n++)
1067 if(szBuff[n] == _T(
'\n'))
1069 lpstrText = &szBuff[n + 1];
1074 bRet = menu.AppendMenu(MF_STRING | (bEnabled ? MF_ENABLED : MF_GRAYED), tbb.idCommand, lpstrText);
1080 if(menu.GetMenuItemCount() == 0)
1083 ::MessageBeep((UINT)-1);
1091 void DisplayChevronMenu(_ChevronMenuInfo& cmi)
1093 #ifndef TPM_VERPOSANIMATION 1094 const UINT TPM_VERPOSANIMATION = 0x1000L;
1097 ATL::CWindow wndFrom = cmi.lpnm->hdr.hwndFrom;
1098 POINT pt = { cmi.lpnm->rc.left, cmi.lpnm->rc.bottom };
1099 wndFrom.MapWindowPoints(NULL, &pt, 1);
1100 RECT rc = cmi.lpnm->rc;
1101 wndFrom.MapWindowPoints(NULL, &rc);
1103 UINT uMenuFlags = TPM_LEFTBUTTON | TPM_VERTICAL | TPM_LEFTALIGN | TPM_TOPALIGN | (!AtlIsOldWindows() ? TPM_VERPOSANIMATION : 0);
1104 TPMPARAMS TPMParams = { 0 };
1105 TPMParams.cbSize =
sizeof(TPMPARAMS);
1106 TPMParams.rcExclude = rc;
1108 HWND hWndCmdBar = (HWND)::SendMessage(m_hWnd, CBRM_GETCMDBAR, 0, 0L);
1109 if(::IsWindow(hWndCmdBar))
1112 ::SendMessage(hWndCmdBar, CBRM_TRACKPOPUPMENU, 0, (LPARAM)&CBRPopupMenu);
1117 menu.TrackPopupMenuEx(uMenuFlags, pt.x, pt.y, m_hWnd, &TPMParams);
1121 void CleanupChevronMenu(_ChevronMenuInfo& cmi)
1127 for(
int i = menu.GetMenuItemCount() - 1; i >=0; i--)
1128 menu.RemoveMenu(i, MF_BYPOSITION);
1133 ATL::CWindow wndFrom = cmi.lpnm->hdr.hwndFrom;
1134 RECT rc = cmi.lpnm->rc;
1135 wndFrom.MapWindowPoints(NULL, &rc);
1138 if(::PeekMessage(&msg, m_hWnd, WM_LBUTTONDOWN, WM_LBUTTONDOWN, PM_NOREMOVE) && ::PtInRect(&rc, msg.pt))
1139 ::PeekMessage(&msg, m_hWnd, WM_LBUTTONDOWN, WM_LBUTTONDOWN, PM_REMOVE);
1141 #endif // (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE) 1145 template <
class T,
class TBase = ATL::CWindow,
class TWinTraits = ATL::CFrameWinTraits>
1149 HWND Create(HWND hWndParent = NULL,
ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL,
1150 DWORD dwStyle = 0, DWORD dwExStyle = 0,
1151 HMENU hMenu = NULL, LPVOID lpCreateParam = NULL)
1153 ATOM atom = T::GetWndClassInfo().Register(&m_pfnSuperWindowProc);
1155 dwStyle = T::GetWndStyle(dwStyle);
1156 dwExStyle = T::GetWndExStyle(dwExStyle);
1158 if(rect.m_lpRect == NULL)
1159 rect.m_lpRect = &TBase::rcDefault;
1164 HWND CreateEx(HWND hWndParent = NULL,
ATL::_U_RECT rect = NULL, DWORD dwStyle = 0, DWORD dwExStyle = 0, LPVOID lpCreateParam = NULL)
1166 const int cchName = 256;
1167 TCHAR szWindowName[cchName] = { 0 };
1169 ::LoadString(ModuleHelper::GetResourceInstance(), T::GetWndClassInfo().m_uCommonResourceID, szWindowName, cchName);
1170 HMENU hMenu = ::LoadMenu(ModuleHelper::GetResourceInstance(), MAKEINTRESOURCE(T::GetWndClassInfo().m_uCommonResourceID));
1171 #else // CE specific 1172 ::LoadString(ModuleHelper::GetResourceInstance(), T::GetWndClassInfo().m_uCommonResourceID, szWindowName, cchName);
1178 #endif // _WIN32_WCE 1180 T* pT =
static_cast<T*
>(
this);
1181 HWND hWnd = pT->Create(hWndParent, rect, szWindowName, dwStyle, dwExStyle, hMenu, lpCreateParam);
1184 m_hAccel = ::LoadAccelerators(ModuleHelper::GetResourceInstance(), MAKEINTRESOURCE(T::GetWndClassInfo().m_uCommonResourceID));
1189 BOOL CreateSimpleToolBar(UINT nResourceID = 0, DWORD dwStyle = ATL_SIMPLE_TOOLBAR_STYLE, UINT nID = ATL_IDW_TOOLBAR)
1191 if(nResourceID == 0)
1192 nResourceID = T::GetWndClassInfo().m_uCommonResourceID;
1194 ATLASSERT(!::IsWindow(m_hWndToolBar));
1195 m_hWndToolBar = T::CreateSimpleToolBarCtrl(m_hWnd, nResourceID, TRUE, dwStyle, nID);
1196 return (m_hWndToolBar != NULL);
1197 #else // CE specific 1198 HWND hWnd= T::CreateSimpleToolBarCtrl(m_hWndCECommandBar, nResourceID, TRUE, dwStyle, nID);
1199 return (hWnd != NULL);
1200 #endif // _WIN32_WCE 1205 HWND CreateSimpleCEToolBar(UINT nResourceID = 0, DWORD dwStyle = ATL_SIMPLE_TOOLBAR_STYLE, UINT nID = ATL_IDW_TOOLBAR)
1207 if(nResourceID == 0)
1208 nResourceID = T::GetWndClassInfo().m_uCommonResourceID;
1210 return T::CreateSimpleToolBarCtrl(m_hWndCECommandBar, nResourceID, TRUE, dwStyle, nID);
1212 #endif // _WIN32_WCE 1218 MESSAGE_HANDLER(WM_SIZE, OnSize)
1219 #ifndef _ATL_NO_REBAR_SUPPORT 1220 #if (_WIN32_IE >= 0x0400) 1221 NOTIFY_CODE_HANDLER(RBN_AUTOSIZE, OnReBarAutoSize)
1222 #endif // (_WIN32_IE >= 0x0400) 1223 #if (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE) 1224 NOTIFY_CODE_HANDLER(RBN_CHEVRONPUSHED, OnChevronPushed)
1225 #endif // (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE) 1226 #endif // !_ATL_NO_REBAR_SUPPORT 1227 CHAIN_MSG_MAP(_baseClass)
1230 LRESULT OnSize(UINT , WPARAM wParam, LPARAM , BOOL& bHandled)
1232 if(wParam != SIZE_MINIMIZED)
1234 T* pT =
static_cast<T*
>(
this);
1241 #ifndef _ATL_NO_REBAR_SUPPORT 1242 #if (_WIN32_IE >= 0x0400) 1243 LRESULT OnReBarAutoSize(
int , LPNMHDR , BOOL& )
1245 T* pT =
static_cast<T*
>(
this);
1246 pT->UpdateLayout(FALSE);
1249 #endif // (_WIN32_IE >= 0x0400) 1251 #if (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE) 1252 LRESULT OnChevronPushed(
int , LPNMHDR pnmh, BOOL& bHandled)
1254 T* pT =
static_cast<T*
>(
this);
1255 _ChevronMenuInfo cmi = { NULL, (LPNMREBARCHEVRON)pnmh,
false };
1256 if(!pT->PrepareChevronMenu(cmi))
1262 pT->DisplayChevronMenu(cmi);
1264 pT->CleanupChevronMenu(cmi);
1267 #endif // (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE) 1268 #endif // !_ATL_NO_REBAR_SUPPORT 1277 inline HWND AtlCreateSimpleToolBar(HWND hWndParent, UINT nResourceID, BOOL bInitialSeparator = FALSE,
1278 DWORD dwStyle = ATL_SIMPLE_TOOLBAR_STYLE, UINT nID = ATL_IDW_TOOLBAR)
1283 #endif // !_WIN32_WCE 1291 #ifndef _WTL_MDIWINDOWMENU_TEXT 1292 #define _WTL_MDIWINDOWMENU_TEXT _T("&Window") 1299 HWND m_hWndMDIClient;
1303 CMDIWindow(HWND hWnd = NULL) : ATL::CWindow(hWnd), m_hWndMDIClient(NULL), m_hMenu(NULL)
1313 HWND MDIGetActive(BOOL* lpbMaximized = NULL)
1315 ATLASSERT(::IsWindow(m_hWndMDIClient));
1316 return (HWND)::SendMessage(m_hWndMDIClient, WM_MDIGETACTIVE, 0, (LPARAM)lpbMaximized);
1319 void MDIActivate(HWND hWndChildToActivate)
1321 ATLASSERT(::IsWindow(m_hWndMDIClient));
1322 ATLASSERT(::IsWindow(hWndChildToActivate));
1323 ::SendMessage(m_hWndMDIClient, WM_MDIACTIVATE, (WPARAM)hWndChildToActivate, 0);
1326 void MDINext(HWND hWndChild, BOOL bPrevious = FALSE)
1328 ATLASSERT(::IsWindow(m_hWndMDIClient));
1329 ATLASSERT(hWndChild == NULL || ::IsWindow(hWndChild));
1330 ::SendMessage(m_hWndMDIClient, WM_MDINEXT, (WPARAM)hWndChild, (LPARAM)bPrevious);
1333 void MDIMaximize(HWND hWndChildToMaximize)
1335 ATLASSERT(::IsWindow(m_hWndMDIClient));
1336 ATLASSERT(::IsWindow(hWndChildToMaximize));
1337 ::SendMessage(m_hWndMDIClient, WM_MDIMAXIMIZE, (WPARAM)hWndChildToMaximize, 0);
1340 void MDIRestore(HWND hWndChildToRestore)
1342 ATLASSERT(::IsWindow(m_hWndMDIClient));
1343 ATLASSERT(::IsWindow(hWndChildToRestore));
1344 ::SendMessage(m_hWndMDIClient, WM_MDIRESTORE, (WPARAM)hWndChildToRestore, 0);
1347 void MDIDestroy(HWND hWndChildToDestroy)
1349 ATLASSERT(::IsWindow(m_hWndMDIClient));
1350 ATLASSERT(::IsWindow(hWndChildToDestroy));
1351 ::SendMessage(m_hWndMDIClient, WM_MDIDESTROY, (WPARAM)hWndChildToDestroy, 0);
1354 BOOL MDICascade(UINT uFlags = 0)
1356 ATLASSERT(::IsWindow(m_hWndMDIClient));
1357 return (BOOL)::SendMessage(m_hWndMDIClient, WM_MDICASCADE, (WPARAM)uFlags, 0);
1360 BOOL MDITile(UINT uFlags = MDITILE_HORIZONTAL)
1362 ATLASSERT(::IsWindow(m_hWndMDIClient));
1363 return (BOOL)::SendMessage(m_hWndMDIClient, WM_MDITILE, (WPARAM)uFlags, 0);
1366 void MDIIconArrange()
1368 ATLASSERT(::IsWindow(m_hWndMDIClient));
1369 ::SendMessage(m_hWndMDIClient, WM_MDIICONARRANGE, 0, 0);
1372 HMENU MDISetMenu(HMENU hMenuFrame, HMENU hMenuWindow)
1374 ATLASSERT(::IsWindow(m_hWndMDIClient));
1375 return (HMENU)::SendMessage(m_hWndMDIClient, WM_MDISETMENU, (WPARAM)hMenuFrame, (LPARAM)hMenuWindow);
1378 HMENU MDIRefreshMenu()
1380 ATLASSERT(::IsWindow(m_hWndMDIClient));
1381 return (HMENU)::SendMessage(m_hWndMDIClient, WM_MDIREFRESHMENU, 0, 0);
1385 static HMENU GetStandardWindowMenu(HMENU hMenu)
1387 int nCount = ::GetMenuItemCount(hMenu);
1390 int nLen = ::GetMenuString(hMenu, nCount - 2, NULL, 0, MF_BYPOSITION);
1394 LPTSTR lpszText = buff.Allocate(nLen + 1);
1395 if(lpszText == NULL)
1397 if(::GetMenuString(hMenu, nCount - 2, lpszText, nLen + 1, MF_BYPOSITION) != nLen)
1399 if(lstrcmp(lpszText, _WTL_MDIWINDOWMENU_TEXT) != 0)
1401 return ::GetSubMenu(hMenu, nCount - 2);
1404 void SetMDIFrameMenu()
1406 HMENU hWindowMenu = GetStandardWindowMenu(m_hMenu);
1407 MDISetMenu(m_hMenu, hWindowMenu);
1409 ::DrawMenuBar(GetMDIFrame());
1412 HWND GetMDIFrame()
const 1414 return ::GetParent(m_hWndMDIClient);
1418 #endif // !_WIN32_WCE 1427 #define CHAIN_MDI_CHILD_COMMANDS() \ 1428 if(uMsg == WM_COMMAND) \ 1430 HWND hWndChild = MDIGetActive(); \ 1431 if(hWndChild != NULL) \ 1432 ::SendMessage(hWndChild, uMsg, wParam, lParam); \ 1435 template <
class T,
class TBase = CMDIWindow,
class TWinTraits = ATL::CFrameWinTraits>
1439 HWND Create(HWND hWndParent = NULL,
ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL,
1440 DWORD dwStyle = 0, DWORD dwExStyle = 0,
1441 HMENU hMenu = NULL, LPVOID lpCreateParam = NULL)
1444 ATOM atom = T::GetWndClassInfo().Register(&m_pfnSuperWindowProc);
1446 dwStyle = T::GetWndStyle(dwStyle);
1447 dwExStyle = T::GetWndExStyle(dwExStyle);
1449 if(rect.m_lpRect == NULL)
1450 rect.m_lpRect = &TBase::rcDefault;
1455 HWND CreateEx(HWND hWndParent = NULL,
ATL::_U_RECT rect = NULL, DWORD dwStyle = 0, DWORD dwExStyle = 0, LPVOID lpCreateParam = NULL)
1457 const int cchName = 256;
1458 TCHAR szWindowName[cchName] = { 0 };
1459 ::LoadString(ModuleHelper::GetResourceInstance(), T::GetWndClassInfo().m_uCommonResourceID, szWindowName, cchName);
1460 HMENU hMenu = ::LoadMenu(ModuleHelper::GetResourceInstance(), MAKEINTRESOURCE(T::GetWndClassInfo().m_uCommonResourceID));
1462 T* pT =
static_cast<T*
>(
this);
1463 HWND hWnd = pT->Create(hWndParent, rect, szWindowName, dwStyle, dwExStyle, hMenu, lpCreateParam);
1466 m_hAccel = ::LoadAccelerators(ModuleHelper::GetResourceInstance(), MAKEINTRESOURCE(T::GetWndClassInfo().m_uCommonResourceID));
1471 BOOL CreateSimpleToolBar(UINT nResourceID = 0, DWORD dwStyle = ATL_SIMPLE_TOOLBAR_STYLE, UINT nID = ATL_IDW_TOOLBAR)
1473 ATLASSERT(!::IsWindow(m_hWndToolBar));
1474 if(nResourceID == 0)
1475 nResourceID = T::GetWndClassInfo().m_uCommonResourceID;
1476 m_hWndToolBar = T::CreateSimpleToolBarCtrl(m_hWnd, nResourceID, TRUE, dwStyle, nID);
1477 return (m_hWndToolBar != NULL);
1480 virtual WNDPROC GetWindowProc()
1482 return MDIFrameWindowProc;
1485 static LRESULT CALLBACK MDIFrameWindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
1489 #if (_ATL_VER >= 0x0700) 1490 ATL::_ATL_MSG msg(pThis->m_hWnd, uMsg, wParam, lParam);
1491 const ATL::_ATL_MSG* pOldMsg = pThis->m_pCurrentMsg;
1492 #else // !(_ATL_VER >= 0x0700) 1493 MSG msg = { pThis->m_hWnd, uMsg, wParam, lParam, 0, { 0, 0 } };
1494 const MSG* pOldMsg = pThis->m_pCurrentMsg;
1495 #endif // !(_ATL_VER >= 0x0700) 1496 pThis->m_pCurrentMsg = &msg;
1499 BOOL bRet = pThis->ProcessWindowMessage(pThis->m_hWnd, uMsg, wParam, lParam, lRes, 0);
1501 ATLASSERT(pThis->m_pCurrentMsg == &msg);
1502 pThis->m_pCurrentMsg = pOldMsg;
1506 if(uMsg != WM_NCDESTROY)
1508 lRes = pThis->DefWindowProc(uMsg, wParam, lParam);
1513 LONG_PTR pfnWndProc = ::GetWindowLongPtr(pThis->m_hWnd, GWLP_WNDPROC);
1514 lRes = pThis->DefWindowProc(uMsg, wParam, lParam);
1515 if(pThis->m_pfnSuperWindowProc != ::DefWindowProc && ::GetWindowLongPtr(pThis->m_hWnd, GWLP_WNDPROC) == pfnWndProc)
1516 ::SetWindowLongPtr(pThis->m_hWnd, GWLP_WNDPROC, (LONG_PTR)pThis->m_pfnSuperWindowProc);
1517 #if (_ATL_VER >= 0x0700) 1519 pThis->m_dwState |= WINSTATE_DESTROYED;
1520 #else // !(_ATL_VER >= 0x0700) 1522 HWND hWnd = pThis->m_hWnd;
1523 pThis->m_hWnd = NULL;
1525 pThis->OnFinalMessage(hWnd);
1526 #endif // !(_ATL_VER >= 0x0700) 1529 #if (_ATL_VER >= 0x0700) 1530 if(pThis->m_dwState & WINSTATE_DESTROYED && pThis->m_pCurrentMsg == NULL)
1533 HWND hWndThis = pThis->m_hWnd;
1534 pThis->m_hWnd = NULL;
1535 pThis->m_dwState &= ~WINSTATE_DESTROYED;
1537 pThis->OnFinalMessage(hWndThis);
1539 #endif // (_ATL_VER >= 0x0700) 1544 LRESULT DefWindowProc()
1546 const MSG* pMsg = m_pCurrentMsg;
1549 lRes = DefWindowProc(pMsg->message, pMsg->wParam, pMsg->lParam);
1553 LRESULT DefWindowProc(UINT uMsg, WPARAM wParam, LPARAM lParam)
1555 return ::DefFrameProc(m_hWnd, m_hWndMDIClient, uMsg, wParam, lParam);
1558 BOOL PreTranslateMessage(MSG* pMsg)
1562 return ::TranslateMDISysAccel(m_hWndMDIClient, pMsg);
1565 HWND CreateMDIClient(HMENU hWindowMenu = NULL, UINT nID = ATL_IDW_CLIENT, UINT nFirstChildID = ATL_IDM_FIRST_MDICHILD)
1567 DWORD dwStyle = WS_VISIBLE | WS_CHILD | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | MDIS_ALLCHILDSTYLES;
1568 DWORD dwExStyle = WS_EX_CLIENTEDGE;
1570 CLIENTCREATESTRUCT ccs = { 0 };
1571 ccs.hWindowMenu = hWindowMenu;
1572 ccs.idFirstChild = nFirstChildID;
1574 if((GetStyle() & (WS_HSCROLL | WS_VSCROLL)) != 0)
1577 dwStyle |= (GetStyle() & (WS_HSCROLL | WS_VSCROLL));
1580 ModifyStyle(WS_HSCROLL | WS_VSCROLL, 0, SWP_NOREDRAW | SWP_FRAMECHANGED);
1584 m_hWndClient = ::CreateWindowEx(dwExStyle, _T(
"MDIClient"), NULL,
1585 dwStyle, 0, 0, 1, 1, m_hWnd, (HMENU)LongToHandle(nID),
1586 ModuleHelper::GetModuleInstance(), (LPVOID)&ccs);
1587 if (m_hWndClient == NULL)
1589 ATLTRACE2(atlTraceUI, 0, _T(
"MDI Frame failed to create MDICLIENT.\n"));
1594 ::BringWindowToTop(m_hWndClient);
1597 m_hWndMDIClient = m_hWndClient;
1600 T* pT =
static_cast<T*
>(
this);
1603 return m_hWndClient;
1609 MESSAGE_HANDLER(WM_SIZE, OnSize)
1610 MESSAGE_HANDLER(WM_SETFOCUS, OnSetFocus)
1611 MESSAGE_HANDLER(WM_MDISETMENU, OnMDISetMenu)
1612 #ifndef _ATL_NO_REBAR_SUPPORT 1613 #if (_WIN32_IE >= 0x0400) 1614 NOTIFY_CODE_HANDLER(RBN_AUTOSIZE, OnReBarAutoSize)
1615 #endif // (_WIN32_IE >= 0x0400) 1616 #if (_WIN32_IE >= 0x0500) 1617 NOTIFY_CODE_HANDLER(RBN_CHEVRONPUSHED, OnChevronPushed)
1618 #endif // (_WIN32_IE >= 0x0500) 1619 #endif // !_ATL_NO_REBAR_SUPPORT 1620 CHAIN_MSG_MAP(_baseClass)
1623 LRESULT OnSize(UINT , WPARAM wParam, LPARAM , BOOL& )
1625 if(wParam != SIZE_MINIMIZED)
1627 T* pT =
static_cast<T*
>(
this);
1634 LRESULT OnSetFocus(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& )
1637 return DefWindowProc(uMsg, wParam, lParam);
1640 LRESULT OnMDISetMenu(UINT , WPARAM , LPARAM , BOOL& )
1646 #ifndef _ATL_NO_REBAR_SUPPORT 1647 #if (_WIN32_IE >= 0x0400) 1648 LRESULT OnReBarAutoSize(
int , LPNMHDR , BOOL& )
1650 T* pT =
static_cast<T*
>(
this);
1651 pT->UpdateLayout(FALSE);
1654 #endif // (_WIN32_IE >= 0x0400) 1656 #if (_WIN32_IE >= 0x0500) 1657 LRESULT OnChevronPushed(
int , LPNMHDR pnmh, BOOL& bHandled)
1659 T* pT =
static_cast<T*
>(
this);
1660 _ChevronMenuInfo cmi = { NULL, (LPNMREBARCHEVRON)pnmh,
false };
1661 if(!pT->PrepareChevronMenu(cmi))
1667 pT->DisplayChevronMenu(cmi);
1669 pT->CleanupChevronMenu(cmi);
1672 #endif // (_WIN32_IE >= 0x0500) 1673 #endif // !_ATL_NO_REBAR_SUPPORT 1676 #endif // !_WIN32_WCE 1684 template <
class T,
class TBase = CMDIWindow,
class TWinTraits = ATL::CMDIChildWinTraits>
1688 HWND Create(HWND hWndParent,
ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL,
1689 DWORD dwStyle = 0, DWORD dwExStyle = 0,
1690 UINT nMenuID = 0, LPVOID lpCreateParam = NULL)
1692 ATOM atom = T::GetWndClassInfo().Register(&m_pfnSuperWindowProc);
1695 m_hMenu = ::LoadMenu(ModuleHelper::GetResourceInstance(), MAKEINTRESOURCE(nMenuID));
1697 dwStyle = T::GetWndStyle(dwStyle);
1698 dwExStyle = T::GetWndExStyle(dwExStyle);
1700 dwExStyle |= WS_EX_MDICHILD;
1701 m_pfnSuperWindowProc = ::DefMDIChildProc;
1702 m_hWndMDIClient = hWndParent;
1703 ATLASSERT(::IsWindow(m_hWndMDIClient));
1705 if(rect.m_lpRect == NULL)
1706 rect.m_lpRect = &TBase::rcDefault;
1709 ATL::CWindow wndParent = hWndParent;
1710 BOOL bMaximized = FALSE;
1711 wndParent.SendMessage(WM_MDIGETACTIVE, 0, (LPARAM)&bMaximized);
1713 wndParent.SetRedraw(FALSE);
1722 wndParent.SetRedraw(TRUE);
1723 wndParent.RedrawWindow(NULL, NULL, RDW_INVALIDATE | RDW_ALLCHILDREN);
1724 ::SetFocus(GetMDIFrame());
1726 else if(hWnd != NULL && ::IsWindowVisible(m_hWnd) && !::IsChild(hWnd, ::GetFocus()))
1734 HWND CreateEx(HWND hWndParent,
ATL::_U_RECT rect = NULL, LPCTSTR lpcstrWindowName = NULL, DWORD dwStyle = 0, DWORD dwExStyle = 0, LPVOID lpCreateParam = NULL)
1736 const int cchName = 256;
1737 TCHAR szWindowName[cchName] = { 0 };
1738 if(lpcstrWindowName == NULL)
1740 ::LoadString(ModuleHelper::GetResourceInstance(), T::GetWndClassInfo().m_uCommonResourceID, szWindowName, cchName);
1741 lpcstrWindowName = szWindowName;
1744 T* pT =
static_cast<T*
>(
this);
1745 HWND hWnd = pT->Create(hWndParent, rect, lpcstrWindowName, dwStyle, dwExStyle, T::GetWndClassInfo().m_uCommonResourceID, lpCreateParam);
1748 m_hAccel = ::LoadAccelerators(ModuleHelper::GetResourceInstance(), MAKEINTRESOURCE(T::GetWndClassInfo().m_uCommonResourceID));
1753 BOOL CreateSimpleToolBar(UINT nResourceID = 0, DWORD dwStyle = ATL_SIMPLE_TOOLBAR_STYLE, UINT nID = ATL_IDW_TOOLBAR)
1755 ATLASSERT(!::IsWindow(m_hWndToolBar));
1756 if(nResourceID == 0)
1757 nResourceID = T::GetWndClassInfo().m_uCommonResourceID;
1758 m_hWndToolBar = T::CreateSimpleToolBarCtrl(m_hWnd, nResourceID, TRUE, dwStyle, nID);
1759 return (m_hWndToolBar != NULL);
1762 BOOL UpdateClientEdge(LPRECT lpRect = NULL)
1765 HWND hWndChild = MDIGetActive();
1766 if(hWndChild != NULL && hWndChild != m_hWnd)
1770 DWORD dwStyle = ::GetWindowLong(m_hWndMDIClient, GWL_EXSTYLE);
1771 DWORD dwNewStyle = dwStyle;
1772 if(hWndChild != NULL && ((GetExStyle() & WS_EX_CLIENTEDGE) == 0) && ((GetStyle() & WS_MAXIMIZE) != 0))
1773 dwNewStyle &= ~(WS_EX_CLIENTEDGE);
1775 dwNewStyle |= WS_EX_CLIENTEDGE;
1777 if(dwStyle != dwNewStyle)
1780 ::RedrawWindow(m_hWndMDIClient, NULL, NULL,
1781 RDW_INVALIDATE | RDW_ALLCHILDREN);
1783 ::SetWindowLong(m_hWndMDIClient, GWL_EXSTYLE, dwNewStyle);
1784 ::SetWindowPos(m_hWndMDIClient, NULL, 0, 0, 0, 0,
1785 SWP_FRAMECHANGED | SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE |
1786 SWP_NOZORDER | SWP_NOCOPYBITS);
1790 ::GetClientRect(m_hWndMDIClient, lpRect);
1800 MESSAGE_HANDLER(WM_SIZE, OnSize)
1801 MESSAGE_HANDLER(WM_WINDOWPOSCHANGED, OnWindowPosChanged)
1802 MESSAGE_HANDLER(WM_MOUSEACTIVATE, OnMouseActivate)
1803 MESSAGE_HANDLER(WM_MENUSELECT, OnMenuSelect)
1804 MESSAGE_HANDLER(WM_MDIACTIVATE, OnMDIActivate)
1805 MESSAGE_HANDLER(WM_DESTROY, OnDestroy)
1806 #ifndef _ATL_NO_REBAR_SUPPORT 1807 #if (_WIN32_IE >= 0x0400) 1808 NOTIFY_CODE_HANDLER(RBN_AUTOSIZE, OnReBarAutoSize)
1809 #endif // (_WIN32_IE >= 0x0400) 1810 #if (_WIN32_IE >= 0x0500) 1811 NOTIFY_CODE_HANDLER(RBN_CHEVRONPUSHED, OnChevronPushed)
1812 #endif // (_WIN32_IE >= 0x0500) 1813 #endif // !_ATL_NO_REBAR_SUPPORT 1814 CHAIN_MSG_MAP(_baseClass)
1817 LRESULT OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& )
1819 DefWindowProc(uMsg, wParam, lParam);
1820 if(wParam != SIZE_MINIMIZED)
1822 T* pT =
static_cast<T*
>(
this);
1828 LRESULT OnWindowPosChanged(UINT , WPARAM , LPARAM lParam, BOOL& bHandled)
1831 LPWINDOWPOS lpWndPos = (LPWINDOWPOS)lParam;
1833 if(!(lpWndPos->flags & SWP_NOSIZE))
1835 RECT rectClient = { 0 };
1836 if(UpdateClientEdge(&rectClient) && ((GetStyle() & WS_MAXIMIZE) != 0))
1838 ::AdjustWindowRectEx(&rectClient, GetStyle(), FALSE, GetExStyle());
1839 lpWndPos->x = rectClient.left;
1840 lpWndPos->y = rectClient.top;
1841 lpWndPos->cx = rectClient.right - rectClient.left;
1842 lpWndPos->cy = rectClient.bottom - rectClient.top;
1850 LRESULT OnMouseActivate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& )
1852 LRESULT lRes = DefWindowProc(uMsg, wParam, lParam);
1855 if(lRes == MA_ACTIVATE || lRes == MA_ACTIVATEANDEAT)
1857 if(MDIGetActive() != m_hWnd)
1858 MDIActivate(m_hWnd);
1864 LRESULT OnMenuSelect(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& )
1866 return ::SendMessage(GetMDIFrame(), uMsg, wParam, lParam);
1869 LRESULT OnMDIActivate(UINT , WPARAM , LPARAM lParam, BOOL& bHandled)
1871 if((HWND)lParam == m_hWnd && m_hMenu != NULL)
1873 else if((HWND)lParam == NULL)
1874 ::SendMessage(GetMDIFrame(), WM_MDISETMENU, 0, 0);
1880 LRESULT OnDestroy(UINT , WPARAM , LPARAM , BOOL& bHandled)
1884 ::DestroyMenu(m_hMenu);
1892 #ifndef _ATL_NO_REBAR_SUPPORT 1893 #if (_WIN32_IE >= 0x0400) 1894 LRESULT OnReBarAutoSize(
int , LPNMHDR , BOOL& )
1896 T* pT =
static_cast<T*
>(
this);
1897 pT->UpdateLayout(FALSE);
1900 #endif // (_WIN32_IE >= 0x0400) 1902 #if (_WIN32_IE >= 0x0500) 1903 LRESULT OnChevronPushed(
int , LPNMHDR pnmh, BOOL& bHandled)
1905 T* pT =
static_cast<T*
>(
this);
1906 _ChevronMenuInfo cmi = { NULL, (LPNMREBARCHEVRON)pnmh,
false };
1907 if(!pT->PrepareChevronMenu(cmi))
1913 pT->DisplayChevronMenu(cmi);
1915 pT->CleanupChevronMenu(cmi);
1918 #endif // (_WIN32_IE >= 0x0500) 1919 #endif // !_ATL_NO_REBAR_SUPPORT 1922 #endif // !_WIN32_WCE 1932 #if (_ATL_VER < 0x0700) 1935 BOOL IsMsgHandled()
const 1937 return m_bHandledOD;
1939 void SetMsgHandled(BOOL bHandled)
1941 m_bHandledOD = bHandled;
1943 #endif // (_ATL_VER < 0x0700) 1947 MESSAGE_HANDLER(WM_DRAWITEM, OnDrawItem)
1948 MESSAGE_HANDLER(WM_MEASUREITEM, OnMeasureItem)
1949 MESSAGE_HANDLER(WM_COMPAREITEM, OnCompareItem)
1950 MESSAGE_HANDLER(WM_DELETEITEM, OnDeleteItem)
1952 MESSAGE_HANDLER(OCM_DRAWITEM, OnDrawItem)
1953 MESSAGE_HANDLER(OCM_MEASUREITEM, OnMeasureItem)
1954 MESSAGE_HANDLER(OCM_COMPAREITEM, OnCompareItem)
1955 MESSAGE_HANDLER(OCM_DELETEITEM, OnDeleteItem)
1958 LRESULT OnDrawItem(UINT , WPARAM , LPARAM lParam, BOOL& bHandled)
1960 T* pT =
static_cast<T*
>(
this);
1961 pT->SetMsgHandled(TRUE);
1962 pT->DrawItem((LPDRAWITEMSTRUCT)lParam);
1963 bHandled = pT->IsMsgHandled();
1964 return (LRESULT)TRUE;
1967 LRESULT OnMeasureItem(UINT , WPARAM , LPARAM lParam, BOOL& bHandled)
1969 T* pT =
static_cast<T*
>(
this);
1970 pT->SetMsgHandled(TRUE);
1971 pT->MeasureItem((LPMEASUREITEMSTRUCT)lParam);
1972 bHandled = pT->IsMsgHandled();
1973 return (LRESULT)TRUE;
1976 LRESULT OnCompareItem(UINT , WPARAM , LPARAM lParam, BOOL& bHandled)
1978 T* pT =
static_cast<T*
>(
this);
1979 pT->SetMsgHandled(TRUE);
1980 bHandled = pT->IsMsgHandled();
1981 return (LRESULT)pT->CompareItem((LPCOMPAREITEMSTRUCT)lParam);
1984 LRESULT OnDeleteItem(UINT , WPARAM , LPARAM lParam, BOOL& bHandled)
1986 T* pT =
static_cast<T*
>(
this);
1987 pT->SetMsgHandled(TRUE);
1988 pT->DeleteItem((LPDELETEITEMSTRUCT)lParam);
1989 bHandled = pT->IsMsgHandled();
1990 return (LRESULT)TRUE;
1994 void DrawItem(LPDRAWITEMSTRUCT )
2000 void MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct)
2002 if(lpMeasureItemStruct->CtlType != ODT_MENU)
2005 T* pT =
static_cast<T*
>(
this);
2006 HWND hWnd = pT->GetDlgItem(lpMeasureItemStruct->CtlID);
2008 TEXTMETRIC tm = { 0 };
2009 dc.GetTextMetrics(&tm);
2011 lpMeasureItemStruct->itemHeight = tm.tmHeight;
2014 lpMeasureItemStruct->itemHeight = ::GetSystemMetrics(SM_CYMENU);
2017 int CompareItem(LPCOMPAREITEMSTRUCT )
2023 void DeleteItem(LPDELETEITEMSTRUCT )
2034 #define BEGIN_UPDATE_UI_MAP(thisClass) \ 2035 static const CUpdateUIBase::_AtlUpdateUIMap* GetUpdateUIMap() \ 2037 static const _AtlUpdateUIMap theMap[] = \ 2040 #define UPDATE_ELEMENT(nID, wType) \ 2043 #define END_UPDATE_UI_MAP() \ 2059 UPDUI_MENUPOPUP = 0x0001,
2060 UPDUI_MENUBAR = 0x0002,
2061 UPDUI_CHILDWINDOW = 0x0004,
2062 UPDUI_TOOLBAR = 0x0008,
2063 UPDUI_STATUSBAR = 0x0010,
2065 UPDUI_ENABLED = 0x0000,
2066 UPDUI_DISABLED = 0x0100,
2067 UPDUI_CHECKED = 0x0200,
2068 UPDUI_CHECKED2 = 0x0400,
2069 UPDUI_RADIO = 0x0800,
2070 UPDUI_DEFAULT = 0x1000,
2071 UPDUI_TEXT = 0x2000,
2073 UPDUI_CLEARDEFAULT = 0x4000,
2083 {
return (m_hWnd == e.m_hWnd && m_wType == e.m_wType); }
2093 {
return (m_nID == e.m_nID && m_wType == e.m_wType); }
2097 #pragma warning(push) 2098 #pragma warning(disable: 4201) // nameless unions are part of C++ 2115 {
return (m_wState == e.m_wState && m_lpData == e.m_lpData); }
2118 #pragma warning(pop) 2120 ATL::CSimpleArray<_AtlUpdateUIElement> m_UIElements;
2125 bool m_bBlockAccelerators;
2129 CUpdateUIBase() : m_pUIMap(NULL), m_pUIData(NULL), m_wDirtyType(0), m_bBlockAccelerators(
false)
2134 if(m_pUIMap != NULL && m_pUIData != NULL)
2138 while(pUIMap->m_nID != (WORD)-1)
2140 if(pUIData->m_wState & UPDUI_TEXT)
2141 delete [] pUIData->m_lpstrText;
2145 delete [] m_pUIData;
2150 bool UIGetBlockAccelerators()
const 2152 return m_bBlockAccelerators;
2155 bool UISetBlockAccelerators(
bool bBlock)
2157 bool bOld = m_bBlockAccelerators;
2158 m_bBlockAccelerators = bBlock;
2163 BOOL UIAddMenuBar(HWND hWnd)
2169 e.m_wType = UPDUI_MENUBAR;
2170 return m_UIElements.Add(e);
2173 BOOL UIAddToolBar(HWND hWnd)
2179 e.m_wType = UPDUI_TOOLBAR;
2180 return m_UIElements.Add(e);
2183 BOOL UIAddStatusBar(HWND hWnd)
2189 e.m_wType = UPDUI_STATUSBAR;
2190 return m_UIElements.Add(e);
2193 BOOL UIAddChildWindowContainer(HWND hWnd)
2199 e.m_wType = UPDUI_CHILDWINDOW;
2200 return m_UIElements.Add(e);
2205 MESSAGE_HANDLER(WM_INITMENUPOPUP, OnInitMenuPopup)
2206 MESSAGE_HANDLER(WM_COMMAND, OnCommand)
2209 LRESULT OnInitMenuPopup(UINT , WPARAM wParam, LPARAM , BOOL& bHandled)
2212 HMENU hMenu = (HMENU)wParam;
2219 while(pMap->m_nID != (WORD)-1)
2221 if(pMap->m_wType & UPDUI_MENUPOPUP)
2223 UIUpdateMenuBarElement(pMap->m_nID, pUIData, hMenu);
2225 if((pUIData->m_wState & UPDUI_RADIO) != 0)
2226 ::CheckMenuRadioItem(hMenu, pUIData->m_nIDFirst, pUIData->m_nIDLast, pMap->m_nID, MF_BYCOMMAND);
2234 LRESULT OnCommand(UINT , WPARAM wParam, LPARAM , BOOL& bHandled)
2237 if(m_bBlockAccelerators && HIWORD(wParam) == 1)
2239 int nID = LOWORD(wParam);
2240 if((UIGetState(nID) & UPDUI_DISABLED) == UPDUI_DISABLED)
2242 ATLTRACE2(atlTraceUI, 0, _T(
"CUpdateUIBase::OnCommand - blocked disabled command 0x%4.4X\n"), nID);
2250 BOOL UIEnable(
int nID, BOOL bEnable, BOOL bForceUpdate = FALSE)
2257 for( ; pMap->m_nID != (WORD)-1; pMap++, pUIData++)
2259 if(nID == (
int)pMap->m_nID)
2263 if(pUIData->m_wState & UPDUI_DISABLED)
2265 pUIData->m_wState |= pMap->m_wType;
2266 pUIData->m_wState &= ~UPDUI_DISABLED;
2271 if(!(pUIData->m_wState & UPDUI_DISABLED))
2273 pUIData->m_wState |= pMap->m_wType;
2274 pUIData->m_wState |= UPDUI_DISABLED;
2279 pUIData->m_wState |= pMap->m_wType;
2280 if(pUIData->m_wState & pMap->m_wType)
2281 m_wDirtyType |= pMap->m_wType;
2290 BOOL UISetCheck(
int nID,
int nCheck, BOOL bForceUpdate = FALSE)
2297 for( ; pMap->m_nID != (WORD)-1; pMap++, pUIData++)
2299 if(nID == (
int)pMap->m_nID)
2304 if((pUIData->m_wState & UPDUI_CHECKED) || (pUIData->m_wState & UPDUI_CHECKED2))
2306 pUIData->m_wState |= pMap->m_wType;
2307 pUIData->m_wState &= ~(UPDUI_CHECKED | UPDUI_CHECKED2);
2311 if(!(pUIData->m_wState & UPDUI_CHECKED))
2313 pUIData->m_wState |= pMap->m_wType;
2314 pUIData->m_wState &= ~UPDUI_CHECKED2;
2315 pUIData->m_wState |= UPDUI_CHECKED;
2319 if(!(pUIData->m_wState & UPDUI_CHECKED2))
2321 pUIData->m_wState |= pMap->m_wType;
2322 pUIData->m_wState &= ~UPDUI_CHECKED;
2323 pUIData->m_wState |= UPDUI_CHECKED2;
2329 pUIData->m_wState |= pMap->m_wType;
2330 if(pUIData->m_wState & pMap->m_wType)
2331 m_wDirtyType |= pMap->m_wType;
2341 BOOL UISetCheck(
int nID,
bool bCheck, BOOL bForceUpdate = FALSE)
2343 return UISetCheck(nID, bCheck ? 1 : 0, bForceUpdate);
2346 BOOL UISetRadio(
int nID, BOOL bRadio, BOOL bForceUpdate = FALSE)
2353 for( ; pMap->m_nID != (WORD)-1; pMap++, pUIData++)
2355 if(nID == (
int)pMap->m_nID)
2359 if(!(pUIData->m_wState & UPDUI_RADIO))
2361 pUIData->m_wState |= pMap->m_wType;
2362 pUIData->m_wState |= UPDUI_RADIO;
2367 if(pUIData->m_wState & UPDUI_RADIO)
2369 pUIData->m_wState |= pMap->m_wType;
2370 pUIData->m_wState &= ~UPDUI_RADIO;
2375 pUIData->m_wState |= pMap->m_wType;
2376 if(pUIData->m_wState & pMap->m_wType)
2377 m_wDirtyType |= pMap->m_wType;
2387 BOOL UISetRadioMenuItem(
int nID,
int nIDFirst,
int nIDLast, BOOL bForceUpdate = FALSE)
2394 for( ; pMap->m_nID != (WORD)-1; pMap++, pUIData++)
2396 if(nID == (
int)pMap->m_nID)
2398 pUIData->m_wState |= pMap->m_wType;
2399 pUIData->m_wState |= UPDUI_RADIO;
2400 pUIData->m_nIDFirst = (WORD)nIDFirst;
2401 pUIData->m_nIDLast = (WORD)nIDLast;
2404 pUIData->m_wState |= pMap->m_wType;
2405 if(pUIData->m_wState & pMap->m_wType)
2406 m_wDirtyType |= pMap->m_wType;
2408 else if(pMap->m_nID >= nIDFirst && pMap->m_nID <= nIDLast)
2410 if(pUIData->m_wState & UPDUI_RADIO)
2412 pUIData->m_wState &= ~pMap->m_wType;
2413 pUIData->m_wState &= ~UPDUI_RADIO;
2414 pUIData->m_nIDFirst = 0;
2415 pUIData->m_nIDLast = 0;
2419 if(pMap->m_nID == nIDLast)
2426 BOOL UISetText(
int nID, LPCTSTR lpstrText, BOOL bForceUpdate = FALSE)
2432 if(lpstrText == NULL)
2435 for( ; pMap->m_nID != (WORD)-1; pMap++, pUIData++)
2437 if(nID == (
int)pMap->m_nID)
2439 if(pUIData->m_lpstrText == NULL || lstrcmp(pUIData->m_lpstrText, lpstrText))
2441 delete [] pUIData->m_lpstrText;
2442 pUIData->m_lpstrText = NULL;
2443 int nStrLen = lstrlen(lpstrText);
2444 ATLTRY(pUIData->m_lpstrText =
new TCHAR[nStrLen + 1]);
2445 if(pUIData->m_lpstrText == NULL)
2447 ATLTRACE2(atlTraceUI, 0, _T(
"UISetText - memory allocation failed\n"));
2450 SecureHelper::strcpy_x(pUIData->m_lpstrText, nStrLen + 1, lpstrText);
2451 pUIData->m_wState |= (UPDUI_TEXT | pMap->m_wType);
2455 pUIData->m_wState |= (UPDUI_TEXT | pMap->m_wType);
2456 if(pUIData->m_wState & pMap->m_wType)
2457 m_wDirtyType |= pMap->m_wType;
2466 BOOL UISetDefault(
int nID, BOOL bDefault, BOOL bForceUpdate = FALSE)
2473 for( ; pMap->m_nID != (WORD)-1; pMap++, pUIData++)
2475 if(nID == (
int)pMap->m_nID)
2479 if((pUIData->m_wState & UPDUI_DEFAULT) == 0)
2481 pUIData->m_wState |= pMap->m_wType;
2482 pUIData->m_wState |= UPDUI_DEFAULT;
2487 if((pUIData->m_wState & UPDUI_DEFAULT) != 0)
2489 pUIData->m_wState |= pMap->m_wType;
2490 pUIData->m_wState &= ~UPDUI_DEFAULT;
2491 pUIData->m_wState |= UPDUI_CLEARDEFAULT;
2496 pUIData->m_wState |= pMap->m_wType;
2497 if(pUIData->m_wState & pMap->m_wType)
2498 m_wDirtyType |= pMap->m_wType;
2508 BOOL UISetState(
int nID, DWORD dwState)
2514 for( ; pMap->m_nID != (WORD)-1; pMap++, pUIData++)
2516 if(nID == (
int)pMap->m_nID)
2518 pUIData->m_wState = (WORD)(dwState | pMap->m_wType);
2519 m_wDirtyType |= pMap->m_wType;
2526 DWORD UIGetState(
int nID)
2532 for( ; pMap->m_nID != (WORD)-1; pMap++, pUIData++)
2534 if(nID == (
int)pMap->m_nID)
2535 return pUIData->m_wState;
2542 BOOL UIUpdateMenuBar(BOOL bForceUpdate = FALSE, BOOL bMainMenu = FALSE)
2544 if(!(m_wDirtyType & UPDUI_MENUBAR) && !bForceUpdate)
2552 while(pMap->m_nID != (WORD)-1)
2554 for(
int i = 0; i < m_UIElements.GetSize(); i++)
2556 if(m_UIElements[i].m_wType == UPDUI_MENUBAR)
2558 HMENU hMenu = ::GetMenu(m_UIElements[i].m_hWnd);
2559 if(hMenu != NULL && (pUIData->m_wState & UPDUI_MENUBAR) && (pMap->m_wType & UPDUI_MENUBAR))
2560 UIUpdateMenuBarElement(pMap->m_nID, pUIData, hMenu);
2563 ::DrawMenuBar(m_UIElements[i].m_hWnd);
2566 pUIData->m_wState &= ~UPDUI_MENUBAR;
2567 if(pUIData->m_wState & UPDUI_TEXT)
2569 delete [] pUIData->m_lpstrText;
2570 pUIData->m_lpstrText = NULL;
2571 pUIData->m_wState &= ~UPDUI_TEXT;
2576 m_wDirtyType &= ~UPDUI_MENUBAR;
2579 #endif // !_WIN32_WCE 2581 BOOL UIUpdateToolBar(BOOL bForceUpdate = FALSE)
2583 if(!(m_wDirtyType & UPDUI_TOOLBAR) && !bForceUpdate)
2591 while(pMap->m_nID != (WORD)-1)
2593 for(
int i = 0; i < m_UIElements.GetSize(); i++)
2595 if(m_UIElements[i].m_wType == UPDUI_TOOLBAR)
2597 if((pUIData->m_wState & UPDUI_TOOLBAR) && (pMap->m_wType & UPDUI_TOOLBAR))
2598 UIUpdateToolBarElement(pMap->m_nID, pUIData, m_UIElements[i].m_hWnd);
2602 pUIData->m_wState &= ~UPDUI_TOOLBAR;
2606 m_wDirtyType &= ~UPDUI_TOOLBAR;
2610 BOOL UIUpdateStatusBar(BOOL bForceUpdate = FALSE)
2612 if(!(m_wDirtyType & UPDUI_STATUSBAR) && !bForceUpdate)
2620 while(pMap->m_nID != (WORD)-1)
2622 for(
int i = 0; i < m_UIElements.GetSize(); i++)
2624 if(m_UIElements[i].m_wType == UPDUI_STATUSBAR)
2626 if((pUIData->m_wState & UPDUI_STATUSBAR) && (pMap->m_wType & UPDUI_STATUSBAR))
2627 UIUpdateStatusBarElement(pMap->m_nID, pUIData, m_UIElements[i].m_hWnd);
2631 pUIData->m_wState &= ~UPDUI_STATUSBAR;
2632 if(pUIData->m_wState & UPDUI_TEXT)
2634 delete [] pUIData->m_lpstrText;
2635 pUIData->m_lpstrText = NULL;
2636 pUIData->m_wState &= ~UPDUI_TEXT;
2641 m_wDirtyType &= ~UPDUI_STATUSBAR;
2645 BOOL UIUpdateChildWindows(BOOL bForceUpdate = FALSE)
2647 if(!(m_wDirtyType & UPDUI_CHILDWINDOW) && !bForceUpdate)
2655 while(pMap->m_nID != (WORD)-1)
2657 for(
int i = 0; i < m_UIElements.GetSize(); i++)
2659 if(m_UIElements[i].m_wType == UPDUI_CHILDWINDOW)
2661 if((pUIData->m_wState & UPDUI_CHILDWINDOW) && (pMap->m_wType & UPDUI_CHILDWINDOW))
2662 UIUpdateChildWindow(pMap->m_nID, pUIData, m_UIElements[i].m_hWnd);
2666 pUIData->m_wState &= ~UPDUI_CHILDWINDOW;
2667 if(pUIData->m_wState & UPDUI_TEXT)
2669 delete [] pUIData->m_lpstrText;
2670 pUIData->m_lpstrText = NULL;
2671 pUIData->m_wState &= ~UPDUI_TEXT;
2676 m_wDirtyType &= ~UPDUI_CHILDWINDOW;
2681 static void UIUpdateMenuBarElement(
int nID,
_AtlUpdateUIData* pUIData, HMENU hMenu)
2684 if((pUIData->m_wState & UPDUI_CLEARDEFAULT) != 0)
2686 ::SetMenuDefaultItem(hMenu, (UINT)-1, 0);
2687 pUIData->m_wState &= ~UPDUI_CLEARDEFAULT;
2689 #endif // !_WIN32_WCE 2692 mii.fMask = MIIM_STATE;
2696 if((pUIData->m_wState & UPDUI_DISABLED) != 0)
2697 mii.fState |= MFS_DISABLED | MFS_GRAYED;
2699 mii.fState |= MFS_ENABLED;
2701 if((pUIData->m_wState & UPDUI_CHECKED) != 0)
2702 mii.fState |= MFS_CHECKED;
2704 mii.fState |= MFS_UNCHECKED;
2706 if((pUIData->m_wState & UPDUI_DEFAULT) != 0)
2707 mii.fState |= MFS_DEFAULT;
2708 #else // CE specific 2711 UINT uEnable = MF_BYCOMMAND;
2712 if((pUIData->m_wState & UPDUI_DISABLED) != 0)
2713 uEnable |= MF_GRAYED;
2715 uEnable |= MF_ENABLED;
2716 ::EnableMenuItem(hMenu, nID, uEnable);
2718 UINT uCheck = MF_BYCOMMAND;
2719 if((pUIData->m_wState & UPDUI_CHECKED) != 0)
2720 uCheck |= MF_CHECKED;
2722 uCheck |= MF_UNCHECKED;
2723 ::CheckMenuItem(hMenu, nID, uCheck);
2724 #endif // _WIN32_WCE 2726 if((pUIData->m_wState & UPDUI_TEXT) != 0)
2729 miiNow.fMask = MIIM_TYPE;
2731 if(::GetMenuItemInfo(hMenu, nID, FALSE, &miiNow))
2733 mii.fMask |= MIIM_TYPE;
2736 mii.fType |= (miiNow.fType & ~(MFT_BITMAP | MFT_SEPARATOR)) | MFT_STRING;
2737 #else // CE specific 2738 mii.fType |= (miiNow.fType & ~(MFT_SEPARATOR)) | MFT_STRING;
2739 #endif // _WIN32_WCE 2740 mii.dwTypeData = pUIData->m_lpstrText;
2744 ::SetMenuItemInfo(hMenu, nID, FALSE, &mii);
2747 static void UIUpdateToolBarElement(
int nID,
_AtlUpdateUIData* pUIData, HWND hWndToolBar)
2750 ::SendMessage(hWndToolBar, TB_ENABLEBUTTON, nID, (LPARAM)(pUIData->m_wState & UPDUI_DISABLED) ? FALSE : TRUE);
2751 ::SendMessage(hWndToolBar, TB_CHECKBUTTON, nID, (LPARAM)(pUIData->m_wState & UPDUI_CHECKED) ? TRUE : FALSE);
2752 ::SendMessage(hWndToolBar, TB_INDETERMINATE, nID, (LPARAM)(pUIData->m_wState & UPDUI_CHECKED2) ? TRUE : FALSE);
2753 ::SendMessage(hWndToolBar, TB_PRESSBUTTON, nID, (LPARAM)(pUIData->m_wState & UPDUI_RADIO) ? TRUE : FALSE);
2756 static void UIUpdateStatusBarElement(
int nID,
_AtlUpdateUIData* pUIData, HWND hWndStatusBar)
2759 if(pUIData->m_wState & UPDUI_TEXT)
2760 ::SendMessage(hWndStatusBar, SB_SETTEXT, nID, (LPARAM)pUIData->m_lpstrText);
2763 static void UIUpdateChildWindow(
int nID,
_AtlUpdateUIData* pUIData, HWND hWnd)
2765 HWND hChild = ::GetDlgItem(hWnd, nID);
2767 ::EnableWindow(hChild, (pUIData->m_wState & UPDUI_DISABLED) ? FALSE : TRUE);
2769 int nCheck = BST_UNCHECKED;
2770 if(pUIData->m_wState & UPDUI_CHECKED || pUIData->m_wState & UPDUI_RADIO)
2771 nCheck = BST_CHECKED;
2772 else if(pUIData->m_wState & UPDUI_CHECKED2)
2773 nCheck = BST_INDETERMINATE;
2774 ::SendMessage(hChild, BM_SETCHECK, nCheck, 0L);
2775 if(pUIData->m_wState & UPDUI_DEFAULT)
2777 DWORD dwRet = (DWORD)::SendMessage(hWnd, DM_GETDEFID, 0, 0L);
2778 if(HIWORD(dwRet) == DC_HASDEFID)
2780 HWND hOldDef = ::GetDlgItem(hWnd, (
int)(
short)LOWORD(dwRet));
2782 ::SendMessage(hOldDef, BM_SETSTYLE, BS_PUSHBUTTON, MAKELPARAM(TRUE, 0));
2784 ::SendMessage(hWnd, DM_SETDEFID, nID, 0L);
2786 if(pUIData->m_wState & UPDUI_TEXT)
2787 ::SetWindowText(hChild, pUIData->m_lpstrText);
2797 T* pT =
static_cast<T*
>(
this);
2801 ATLASSERT(m_pUIMap != NULL);
2803 for( ; pMap->m_nID != (WORD)-1; nCount++)
2808 for(
int i = 0; i < nCount; i++)
2810 for(
int j = 0; j < nCount; j++)
2814 ATLASSERT(m_pUIMap[j].m_nID != m_pUIMap[i].m_nID);
2820 ATLASSERT(m_pUIData != NULL);
2822 if(m_pUIData != NULL)
2837 ATL::CSimpleArray<_AtlUpdateUIMap> m_arrUIMap;
2838 ATL::CSimpleArray<_AtlUpdateUIData> m_arrUIData;
2843 T* pT =
static_cast<T*
>(
this);
2845 const _AtlUpdateUIMap* pMap = pT->GetUpdateUIMap();
2846 ATLASSERT(pMap != NULL);
2850 BOOL bRet = m_arrUIMap.Add(*(_AtlUpdateUIMap*)pMap);
2856 bRet = m_arrUIData.Add(data);
2860 if(pMap->m_nID == (WORD)-1)
2866 ATLASSERT(m_arrUIMap.GetSize() == m_arrUIData.GetSize());
2870 for(
int i = 0; i < m_arrUIMap.GetSize(); i++)
2872 for(
int j = 0; j < m_arrUIMap.GetSize(); j++)
2876 ATLASSERT(m_arrUIMap[j].m_nID != m_arrUIMap[i].m_nID);
2882 m_pUIMap = m_arrUIMap.m_aT;
2883 m_pUIData = m_arrUIData.m_aT;
2888 for(
int i = 0; i < m_arrUIData.GetSize(); i++)
2890 if((m_arrUIData[i].m_wState & UPDUI_TEXT) != 0)
2891 delete [] m_arrUIData[i].m_lpstrText;
2900 bool UIAddUpdateElement(WORD nID, WORD wType)
2903 for(
int i = 0; i < m_arrUIMap.GetSize(); i++)
2906 ATLASSERT(m_arrUIMap[i].m_nID != nID);
2907 if(m_arrUIMap[i].m_nID == nID)
2911 bool bRetVal =
false;
2914 _AtlUpdateUIMap uumEnd = { (WORD)-1, 0 };
2915 BOOL bRet = m_arrUIMap.Add(uumEnd);
2921 bRet = m_arrUIData.Add(uud);
2927 int nSize = m_arrUIMap.GetSize();
2928 _AtlUpdateUIMap uum = { nID, wType };
2929 m_arrUIMap.SetAtIndex(nSize - 2, uum);
2930 m_arrUIData.SetAtIndex(nSize - 2, uud);
2933 m_pUIMap = m_arrUIMap.m_aT;
2934 m_pUIData = m_arrUIData.m_aT;
2943 bool UIRemoveUpdateElement(WORD nID)
2945 bool bRetVal =
false;
2947 for(
int i = 0; i < m_arrUIMap.GetSize(); i++)
2949 if(m_arrUIMap[i].m_nID == nID)
2951 if((m_arrUIData[i].m_wState & UPDUI_TEXT) != 0)
2952 delete [] m_arrUIData[i].m_lpstrText;
2954 BOOL bRet = m_arrUIMap.RemoveAt(i);
2956 bRet = m_arrUIData.RemoveAt(i);
2976 LPCTSTR UIGetText(
int nID)
2978 for(
int i = 0; i < m_arrUIMap.GetSize(); i++)
2980 if(m_arrUIMap[i].m_nID == nID)
2981 return m_arrUIData[i].m_lpstrText;
2988 template <WORD t_wType>
2989 bool UIAddElement(UINT nID)
2992 for(
int i = 0; i < m_arrUIMap.GetSize(); i++)
2994 if(m_arrUIMap[i].m_nID == nID)
2997 m_arrUIMap[i].m_wType |= t_wType;
3003 return UIAddUpdateElement((WORD)nID, t_wType);
3006 template <WORD t_wType>
3007 bool UIRemoveElement(UINT nID)
3009 for(
int i = 0; i < m_arrUIMap.GetSize(); i++)
3011 if(m_arrUIMap[i].m_nID == nID)
3013 WORD wType = m_arrUIMap[i].m_wType & ~t_wType;
3016 m_arrUIMap[i].m_wType = wType;
3021 return UIRemoveUpdateElement((WORD)nID);
3030 bool UIAddMenu(HMENU hMenu,
bool bSetText =
false)
3032 #if defined(_WIN32_WCE) && (_ATL_VER >= 0x0800) 3033 using ATL::GetMenuString;
3035 ATLASSERT(::IsMenu(hMenu));
3036 MENUITEMINFO mii = {
sizeof(MENUITEMINFO), MIIM_TYPE | MIIM_ID | MIIM_SUBMENU};
3039 for (INT uItem = 0;
CMenuHandle(hMenu).GetMenuItemInfo(uItem, TRUE, &mii); uItem++)
3044 UIAddMenu(mii.hSubMenu, bSetText);
3046 else if (mii.wID != 0)
3049 UIAddElement<UPDUI_MENUPOPUP>(mii.wID);
3050 #if !defined(_WIN32_WCE) || (_ATL_VER >= 0x0800) 3053 TCHAR sText[64] = { 0 };
3054 if (GetMenuString(hMenu, uItem, sText, 64, MF_BYPOSITION))
3055 UISetText(mii.wID, sText);
3059 #endif // !defined(_WIN32_WCE) || (_ATL_VER >= 0x0800) 3066 bool UIAddMenu(UINT uID,
bool bSetText =
false)
3069 ATLVERIFY(menu.LoadMenu(uID));
3070 return UIAddMenu(menu, bSetText);
3074 #if !defined(_WIN32_WCE) || (defined(_AUTOUI_CE_TOOLBAR) && defined(TBIF_BYINDEX)) 3075 bool UIAddToolBar(HWND hWndToolBar)
3077 ATLASSERT(::IsWindow(hWndToolBar));
3078 TBBUTTONINFO tbbi = {
sizeof(TBBUTTONINFO), TBIF_COMMAND | TBIF_STYLE | TBIF_BYINDEX };
3081 for (
int uItem = 0; ::SendMessage(hWndToolBar, TB_GETBUTTONINFO, uItem, (LPARAM)&tbbi) != -1; uItem++)
3083 if (tbbi.fsStyle ^ BTNS_SEP)
3084 UIAddElement<UPDUI_TOOLBAR>(tbbi.idCommand);
3088 if (::GetWindow(hWndToolBar, GW_CHILD))
3089 UIAddChildWindowContainer(hWndToolBar);
3091 return (CUpdateUIBase::UIAddToolBar(hWndToolBar) != FALSE);
3093 #endif // !defined(_WIN32_WCE) || (defined(_AUTOUI_CE_TOOLBAR) && defined(TBIF_BYINDEX)) 3096 bool UIAddChildWindowContainer(HWND hWnd)
3098 ATLASSERT(::IsWindow(hWnd));
3101 for (ATL::CWindow wCtl = ::GetWindow(hWnd, GW_CHILD); wCtl.IsWindow(); wCtl = wCtl.GetWindow(GW_HWNDNEXT))
3103 int id = wCtl.GetDlgCtrlID();
3105 UIAddElement<UPDUI_CHILDWINDOW>(id);
3108 return (CUpdateUIBase::UIAddChildWindowContainer(hWnd) != FALSE);
3112 BOOL UIUpdateStatusBar(BOOL bForceUpdate = FALSE)
3114 if(!(m_wDirtyType & UPDUI_STATUSBAR) && !bForceUpdate)
3117 for(
int i = 0; i < m_arrUIMap.GetSize(); i++)
3119 for(
int e = 0; e < m_UIElements.GetSize(); e++)
3121 if((m_UIElements[e].m_wType == UPDUI_STATUSBAR) &&
3122 (m_arrUIMap[i].m_wType & UPDUI_STATUSBAR) &&
3123 (m_arrUIData[i].m_wState & UPDUI_STATUSBAR))
3125 UIUpdateStatusBarElement(m_arrUIMap[i].m_nID, &m_arrUIData[i], m_UIElements[e].m_hWnd);
3126 m_arrUIData[i].m_wState &= ~UPDUI_STATUSBAR;
3127 if(m_arrUIData[i].m_wState & UPDUI_TEXT)
3128 m_arrUIData[i].m_wState &= ~UPDUI_TEXT;
3133 m_wDirtyType &= ~UPDUI_STATUSBAR;
3137 bool UIAddStatusBar(HWND hWndStatusBar, INT nPanes = 1)
3139 ATLASSERT(::IsWindow(hWndStatusBar));
3142 for (
int iPane = 0; iPane < nPanes; iPane++)
3143 UIAddElement<UPDUI_STATUSBAR>(ID_DEFAULT_PANE + iPane);
3145 return (CUpdateUIBase::UIAddStatusBar(hWndStatusBar) != FALSE);
3171 #define BEGIN_DLGRESIZE_MAP(thisClass) \ 3172 static const _AtlDlgResizeMap* GetDlgResizeMap() \ 3174 static const _AtlDlgResizeMap theMap[] = \ 3177 #define END_DLGRESIZE_MAP() \ 3183 #define DLGRESIZE_CONTROL(id, flags) \ 3186 #define BEGIN_DLGRESIZE_GROUP() \ 3187 { -1, _DLSZ_BEGIN_GROUP }, 3189 #define END_DLGRESIZE_GROUP() \ 3190 { -1, _DLSZ_END_GROUP }, 3200 DLSZ_SIZE_X = 0x00000001,
3201 DLSZ_SIZE_Y = 0x00000002,
3202 DLSZ_MOVE_X = 0x00000004,
3203 DLSZ_MOVE_Y = 0x00000008,
3204 DLSZ_REPAINT = 0x00000010,
3205 DLSZ_CENTER_X = 0x00000020,
3206 DLSZ_CENTER_Y = 0x00000040,
3209 _DLSZ_BEGIN_GROUP = 0x00001000,
3210 _DLSZ_END_GROUP = 0x00002000,
3211 _DLSZ_GRIPPER = 0x00004000
3217 DWORD m_dwResizeFlags;
3223 DWORD m_dwResizeFlags;
3226 int GetGroupCount()
const 3228 return (
int)LOBYTE(HIWORD(m_dwResizeFlags));
3231 void SetGroupCount(
int nCount)
3233 ATLASSERT(nCount > 0 && nCount < 256);
3234 DWORD dwCount = (DWORD)MAKELONG(0, MAKEWORD(nCount, 0));
3235 m_dwResizeFlags &= 0xFF00FFFF;
3236 m_dwResizeFlags |= dwCount;
3240 {
return (m_nCtlID == r.m_nCtlID && m_dwResizeFlags == r.m_dwResizeFlags); }
3243 ATL::CSimpleArray<_AtlDlgResizeData> m_arrData;
3245 POINT m_ptMinTrackSize;
3252 m_sizeDialog.cx = 0;
3253 m_sizeDialog.cy = 0;
3254 m_ptMinTrackSize.x = -1;
3255 m_ptMinTrackSize.y = -1;
3259 void DlgResize_Init(
bool bAddGripper =
true,
bool bUseMinTrackSize =
true, DWORD dwForceStyle = WS_CLIPCHILDREN)
3261 T* pT =
static_cast<T*
>(
this);
3262 ATLASSERT(::IsWindow(pT->m_hWnd));
3264 DWORD dwStyle = pT->GetStyle();
3268 if(((dwStyle & WS_CHILD) == 0) && ((dwStyle & WS_THICKFRAME) == 0))
3269 ATLTRACE2(atlTraceUI, 0, _T(
"DlgResize_Init - warning: top level dialog without the WS_THICKFRAME style - user cannot resize it\n"));
3273 if((dwStyle & dwForceStyle) != dwForceStyle)
3274 pT->ModifyStyle(0, dwForceStyle);
3280 if((dwStyle & WS_CHILD) == 0)
3282 pT->ModifyStyleEx(0, WS_EX_DLGMODALFRAME);
3283 if(pT->GetIcon(FALSE) == NULL)
3284 pT->SetIcon(NULL, FALSE);
3291 ATL::CWindow wndGripper = pT->GetDlgItem(ATL_IDW_STATUS_BAR);
3292 if(wndGripper.IsWindow() && m_arrData.GetSize() > 0 && (m_arrData[0].m_dwResizeFlags & _DLSZ_GRIPPER) != 0)
3293 wndGripper.DestroyWindow();
3296 m_arrData.RemoveAll();
3297 m_sizeDialog.cx = 0;
3298 m_sizeDialog.cy = 0;
3299 m_ptMinTrackSize.x = -1;
3300 m_ptMinTrackSize.y = -1;
3303 RECT rectDlg = { 0 };
3304 pT->GetClientRect(&rectDlg);
3305 m_sizeDialog.cx = rectDlg.right;
3306 m_sizeDialog.cy = rectDlg.bottom;
3314 ATLASSERT(!::IsWindow(pT->GetDlgItem(ATL_IDW_STATUS_BAR)));
3315 if(!::IsWindow(pT->GetDlgItem(ATL_IDW_STATUS_BAR)))
3317 ATL::CWindow wndGripper;
3318 wndGripper.Create(_T(
"SCROLLBAR"), pT->m_hWnd, rectDlg, NULL, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | SBS_SIZEBOX | SBS_SIZEGRIP | SBS_SIZEBOXBOTTOMRIGHTALIGN, 0, ATL_IDW_STATUS_BAR);
3319 ATLASSERT(wndGripper.IsWindow());
3320 if(wndGripper.IsWindow())
3323 RECT rectCtl = { 0 };
3324 wndGripper.GetWindowRect(&rectCtl);
3325 ::MapWindowPoints(NULL, pT->m_hWnd, (LPPOINT)&rectCtl, 2);
3326 _AtlDlgResizeData data = { ATL_IDW_STATUS_BAR, DLSZ_MOVE_X | DLSZ_MOVE_Y | DLSZ_REPAINT | _DLSZ_GRIPPER, { rectCtl.left, rectCtl.top, rectCtl.right, rectCtl.bottom } };
3327 m_arrData.Add(data);
3331 #else // CE specific 3333 #endif // _WIN32_WCE 3336 if(bUseMinTrackSize)
3338 if((dwStyle & WS_CHILD) != 0)
3341 pT->GetClientRect(&rect);
3342 m_ptMinTrackSize.x = rect.right - rect.left;
3343 m_ptMinTrackSize.y = rect.bottom - rect.top;
3348 pT->GetWindowRect(&rect);
3349 m_ptMinTrackSize.x = rect.right - rect.left;
3350 m_ptMinTrackSize.y = rect.bottom - rect.top;
3356 ATLASSERT(pMap != NULL);
3357 int nGroupStart = -1;
3358 for(
int nCount = 1; !(pMap->m_nCtlID == -1 && pMap->m_dwResizeFlags == 0); nCount++, pMap++)
3360 if(pMap->m_nCtlID == -1)
3362 switch(pMap->m_dwResizeFlags)
3364 case _DLSZ_BEGIN_GROUP:
3365 ATLASSERT(nGroupStart == -1);
3366 nGroupStart = m_arrData.GetSize();
3368 case _DLSZ_END_GROUP:
3370 ATLASSERT(nGroupStart != -1);
3371 int nGroupCount = m_arrData.GetSize() - nGroupStart;
3372 m_arrData[nGroupStart].SetGroupCount(nGroupCount);
3377 ATLASSERT(FALSE && _T(
"Invalid DLGRESIZE Map Entry"));
3384 ATLASSERT(m_bGripper ? (pMap->m_nCtlID != ATL_IDW_STATUS_BAR) : TRUE);
3386 ATL::CWindow ctl = pT->GetDlgItem(pMap->m_nCtlID);
3387 ATLASSERT(ctl.IsWindow());
3388 RECT rectCtl = { 0 };
3389 ctl.GetWindowRect(&rectCtl);
3390 ::MapWindowPoints(NULL, pT->m_hWnd, (LPPOINT)&rectCtl, 2);
3392 DWORD dwGroupFlag = (nGroupStart != -1 && m_arrData.GetSize() == nGroupStart) ? _DLSZ_BEGIN_GROUP : 0;
3393 _AtlDlgResizeData data = { pMap->m_nCtlID, pMap->m_dwResizeFlags | dwGroupFlag, { rectCtl.left, rectCtl.top, rectCtl.right, rectCtl.bottom } };
3394 m_arrData.Add(data);
3397 ATLASSERT((nGroupStart == -1) && _T(
"No End Group Entry in the DLGRESIZE Map"));
3400 void DlgResize_UpdateLayout(
int cxWidth,
int cyHeight)
3402 T* pT =
static_cast<T*
>(
this);
3403 ATLASSERT(::IsWindow(pT->m_hWnd));
3406 if(((pT->GetStyle() & WS_CHILD) != 0) && m_ptMinTrackSize.x != -1 && m_ptMinTrackSize.y != -1)
3408 if(cxWidth < m_ptMinTrackSize.x)
3409 cxWidth = m_ptMinTrackSize.x;
3410 if(cyHeight < m_ptMinTrackSize.y)
3411 cyHeight = m_ptMinTrackSize.y;
3414 BOOL bVisible = pT->IsWindowVisible();
3416 pT->SetRedraw(FALSE);
3418 for(
int i = 0; i < m_arrData.GetSize(); i++)
3420 if((m_arrData[i].m_dwResizeFlags & _DLSZ_BEGIN_GROUP) != 0)
3422 int nGroupCount = m_arrData[i].GetGroupCount();
3423 ATLASSERT(nGroupCount > 0 && i + nGroupCount - 1 < m_arrData.GetSize());
3424 RECT rectGroup = m_arrData[i].m_rect;
3427 for(j = 1; j < nGroupCount; j++)
3429 rectGroup.left = __min(rectGroup.left, m_arrData[i + j].m_rect.left);
3430 rectGroup.top = __min(rectGroup.top, m_arrData[i + j].m_rect.top);
3431 rectGroup.right = __max(rectGroup.right, m_arrData[i + j].m_rect.right);
3432 rectGroup.bottom = __max(rectGroup.bottom, m_arrData[i + j].m_rect.bottom);
3435 for(j = 0; j < nGroupCount; j++)
3439 pDataPrev = &(m_arrData[i + j - 1]);
3440 pT->DlgResize_PositionControl(cxWidth, cyHeight, rectGroup, m_arrData[i + j],
true, pDataPrev);
3443 i += nGroupCount - 1;
3447 RECT rectGroup = { 0 };
3448 pT->DlgResize_PositionControl(cxWidth, cyHeight, rectGroup, m_arrData[i],
false);
3453 pT->SetRedraw(TRUE);
3455 pT->RedrawWindow(NULL, NULL, RDW_ERASE | RDW_INVALIDATE | RDW_UPDATENOW | RDW_ALLCHILDREN);
3460 MESSAGE_HANDLER(WM_SIZE, OnSize)
3462 MESSAGE_HANDLER(WM_GETMINMAXINFO, OnGetMinMaxInfo)
3463 #endif // _WIN32_WCE 3466 LRESULT OnSize(UINT , WPARAM wParam, LPARAM lParam, BOOL& )
3468 T* pT =
static_cast<T*
>(
this);
3472 ATL::CWindow wndGripper = pT->GetDlgItem(ATL_IDW_STATUS_BAR);
3473 if(wParam == SIZE_MAXIMIZED)
3474 wndGripper.ShowWindow(SW_HIDE);
3475 else if(wParam == SIZE_RESTORED)
3476 wndGripper.ShowWindow(SW_SHOW);
3478 #endif // _WIN32_WCE 3479 if(wParam != SIZE_MINIMIZED)
3481 ATLASSERT(::IsWindow(pT->m_hWnd));
3482 pT->DlgResize_UpdateLayout(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam));
3488 LRESULT OnGetMinMaxInfo(UINT , WPARAM , LPARAM lParam, BOOL& )
3490 if(m_ptMinTrackSize.x != -1 && m_ptMinTrackSize.y != -1)
3492 LPMINMAXINFO lpMMI = (LPMINMAXINFO)lParam;
3493 lpMMI->ptMinTrackSize = m_ptMinTrackSize;
3497 #endif // _WIN32_WCE 3500 bool DlgResize_PositionControl(
int cxWidth,
int cyHeight, RECT& rectGroup,
_AtlDlgResizeData& data,
bool bGroup,
3503 T* pT =
static_cast<T*
>(
this);
3504 ATLASSERT(::IsWindow(pT->m_hWnd));
3506 RECT rectCtl = { 0 };
3508 ctl = pT->GetDlgItem(data.m_nCtlID);
3509 if(!ctl.GetWindowRect(&rectCtl))
3511 ::MapWindowPoints(NULL, pT->m_hWnd, (LPPOINT)&rectCtl, 2);
3515 if((data.m_dwResizeFlags & DLSZ_CENTER_X) != 0)
3517 int cxRight = rectGroup.right + cxWidth - m_sizeDialog.cx;
3518 int cxCtl = data.m_rect.right - data.m_rect.left;
3519 rectCtl.left = rectGroup.left + (cxRight - rectGroup.left - cxCtl) / 2;
3520 rectCtl.right = rectCtl.left + cxCtl;
3522 else if((data.m_dwResizeFlags & (DLSZ_SIZE_X | DLSZ_MOVE_X)) != 0)
3524 rectCtl.left = rectGroup.left + ::MulDiv(data.m_rect.left - rectGroup.left, rectGroup.right - rectGroup.left + (cxWidth - m_sizeDialog.cx), rectGroup.right - rectGroup.left);
3526 if((data.m_dwResizeFlags & DLSZ_SIZE_X) != 0)
3528 rectCtl.right = rectGroup.left + ::MulDiv(data.m_rect.right - rectGroup.left, rectGroup.right - rectGroup.left + (cxWidth - m_sizeDialog.cx), rectGroup.right - rectGroup.left);
3530 if(pDataPrev != NULL)
3532 ATL::CWindow ctlPrev = pT->GetDlgItem(pDataPrev->m_nCtlID);
3533 RECT rcPrev = { 0 };
3534 ctlPrev.GetWindowRect(&rcPrev);
3535 ::MapWindowPoints(NULL, pT->m_hWnd, (LPPOINT)&rcPrev, 2);
3536 int dxAdjust = (rectCtl.left - rcPrev.right) - (data.m_rect.left - pDataPrev->m_rect.right);
3537 rcPrev.right += dxAdjust;
3538 ctlPrev.SetWindowPos(NULL, &rcPrev, SWP_NOZORDER | SWP_NOACTIVATE | SWP_NOMOVE);
3543 rectCtl.right = rectCtl.left + (data.m_rect.right - data.m_rect.left);
3547 if((data.m_dwResizeFlags & DLSZ_CENTER_Y) != 0)
3549 int cyBottom = rectGroup.bottom + cyHeight - m_sizeDialog.cy;
3550 int cyCtl = data.m_rect.bottom - data.m_rect.top;
3551 rectCtl.top = rectGroup.top + (cyBottom - rectGroup.top - cyCtl) / 2;
3552 rectCtl.bottom = rectCtl.top + cyCtl;
3554 else if((data.m_dwResizeFlags & (DLSZ_SIZE_Y | DLSZ_MOVE_Y)) != 0)
3556 rectCtl.top = rectGroup.top + ::MulDiv(data.m_rect.top - rectGroup.top, rectGroup.bottom - rectGroup.top + (cyHeight - m_sizeDialog.cy), rectGroup.bottom - rectGroup.top);
3558 if((data.m_dwResizeFlags & DLSZ_SIZE_Y) != 0)
3560 rectCtl.bottom = rectGroup.top + ::MulDiv(data.m_rect.bottom - rectGroup.top, rectGroup.bottom - rectGroup.top + (cyHeight - m_sizeDialog.cy), rectGroup.bottom - rectGroup.top);
3562 if(pDataPrev != NULL)
3564 ATL::CWindow ctlPrev = pT->GetDlgItem(pDataPrev->m_nCtlID);
3565 RECT rcPrev = { 0 };
3566 ctlPrev.GetWindowRect(&rcPrev);
3567 ::MapWindowPoints(NULL, pT->m_hWnd, (LPPOINT)&rcPrev, 2);
3568 int dxAdjust = (rectCtl.top - rcPrev.bottom) - (data.m_rect.top - pDataPrev->m_rect.bottom);
3569 rcPrev.bottom += dxAdjust;
3570 ctlPrev.SetWindowPos(NULL, &rcPrev, SWP_NOZORDER | SWP_NOACTIVATE | SWP_NOMOVE);
3575 rectCtl.bottom = rectCtl.top + (data.m_rect.bottom - data.m_rect.top);
3581 if((data.m_dwResizeFlags & DLSZ_CENTER_X) != 0)
3583 int cxCtl = data.m_rect.right - data.m_rect.left;
3584 rectCtl.left = (cxWidth - cxCtl) / 2;
3585 rectCtl.right = rectCtl.left + cxCtl;
3587 else if((data.m_dwResizeFlags & (DLSZ_SIZE_X | DLSZ_MOVE_X)) != 0)
3589 rectCtl.right = data.m_rect.right + (cxWidth - m_sizeDialog.cx);
3591 if((data.m_dwResizeFlags & DLSZ_MOVE_X) != 0)
3592 rectCtl.left = rectCtl.right - (data.m_rect.right - data.m_rect.left);
3595 if((data.m_dwResizeFlags & DLSZ_CENTER_Y) != 0)
3597 int cyCtl = data.m_rect.bottom - data.m_rect.top;
3598 rectCtl.top = (cyHeight - cyCtl) / 2;
3599 rectCtl.bottom = rectCtl.top + cyCtl;
3601 else if((data.m_dwResizeFlags & (DLSZ_SIZE_Y | DLSZ_MOVE_Y)) != 0)
3603 rectCtl.bottom = data.m_rect.bottom + (cyHeight - m_sizeDialog.cy);
3605 if((data.m_dwResizeFlags & DLSZ_MOVE_Y) != 0)
3606 rectCtl.top = rectCtl.bottom - (data.m_rect.bottom - data.m_rect.top);
3610 if((data.m_dwResizeFlags & DLSZ_REPAINT) != 0)
3613 if((data.m_dwResizeFlags & (DLSZ_SIZE_X | DLSZ_SIZE_Y | DLSZ_MOVE_X | DLSZ_MOVE_Y | DLSZ_REPAINT | DLSZ_CENTER_X | DLSZ_CENTER_Y)) != 0)
3614 ctl.SetWindowPos(NULL, &rectCtl, SWP_NOZORDER | SWP_NOACTIVATE);
3637 MESSAGE_HANDLER(WM_ERASEBKGND, OnEraseBackground)
3638 MESSAGE_HANDLER(WM_PAINT, OnPaint)
3640 MESSAGE_HANDLER(WM_PRINTCLIENT, OnPaint)
3641 #endif // !_WIN32_WCE 3644 LRESULT OnEraseBackground(UINT , WPARAM , LPARAM , BOOL& )
3649 LRESULT OnPaint(UINT , WPARAM wParam, LPARAM , BOOL& )
3651 T* pT =
static_cast<T*
>(
this);
3652 ATLASSERT(::IsWindow(pT->m_hWnd));
3657 pT->GetClientRect(&rect);
3659 pT->DoPaint(dcMem.m_hDC);
3664 CMemoryDC dcMem(dc.m_hDC, dc.m_ps.rcPaint);
3665 pT->DoPaint(dcMem.m_hDC);
3676 template <
class T,
class TBase = ATL::CWindow,
class TWinTraits = ATL::CControlWinTraits>
3687 #if !defined(__ATLCTRLW_H__) && !defined(_WIN32_WCE) 3689 #undef CBRM_TRACKPOPUPMENU 3690 #undef CBRM_GETCMDBAR 3692 #endif // !defined(__ATLCTRLW_H__) && !defined(_WIN32_WCE) 3696 #endif // __ATLFRAME_H__
Definition: atlframe.h:2052
Definition: atlframe.h:3194
Definition: atlgdi.h:3386
Definition: atlframe.h:49
Definition: atlframe.h:2100
Definition: atlframe.h:3214
Definition: atlframe.h:372
Definition: atlapp.h:1399
Definition: atlframe.h:2077
Definition: atlframe.h:3677
Definition: atlframe.h:2833
Definition: atlframe.h:2087
Definition: atlapp.h:1455
Definition: atlframe.h:1436
Definition: atlgdi.h:1209
Definition: atlwinx.h:432
Definition: atlframe.h:2792
Definition: atlgdi.h:3362
Definition: atlframe.h:3625
Definition: atlframe.h:1295
Definition: atlgdi.h:3428
Definition: atlframe.h:3220
Definition: atlframe.h:1685
Definition: atlframe.h:1146
Definition: atlframe.h:1929
Definition: atlframe.h:2973