12 #ifndef __ATLFRAME_H__ 13 #define __ATLFRAME_H__ 18 #error atlframe.h requires atlapp.h to be included first 22 #error atlframe.h requires atlwin.h to be included first 56 enum { cchAutoName = 5 +
sizeof(
void*) * 2 };
59 enum { cchAutoName = MAX_PATH };
62 LPCTSTR m_lpszOrigName;
64 LPCTSTR m_lpszCursorID;
67 TCHAR m_szAutoName[cchAutoName];
68 UINT m_uCommonResourceID;
71 ATOM Register(WNDPROC* pProc)
76 if(FAILED(lock.Lock()))
78 ATLTRACE2(atlTraceUI, 0, _T(
"ERROR : Unable to lock critical section in CFrameWndClassInfo::Register.\n"));
85 HINSTANCE hInst = ModuleHelper::GetModuleInstance();
87 if (m_lpszOrigName != NULL)
89 ATLASSERT(pProc != NULL);
90 LPCTSTR lpsz = m_wc.lpszClassName;
91 WNDPROC proc = m_wc.lpfnWndProc;
93 WNDCLASSEX wc = {
sizeof(WNDCLASSEX) };
95 if(!::GetClassInfoEx(ModuleHelper::GetModuleInstance(), m_lpszOrigName, &wc))
98 if(!::GetClassInfoEx(NULL, m_lpszOrigName, &wc))
105 pWndProc = m_wc.lpfnWndProc;
106 m_wc.lpszClassName = lpsz;
107 m_wc.lpfnWndProc = proc;
111 m_wc.hCursor = ::LoadCursor(m_bSystemCursor ? NULL : hInst, m_lpszCursorID);
114 m_wc.hInstance = hInst;
115 m_wc.style &= ~CS_GLOBALCLASS;
116 if (m_wc.lpszClassName == NULL)
118 #if (_WIN32_WINNT >= 0x0500) || defined(_WIN64) 119 SecureHelper::wsprintf_x(m_szAutoName, cchAutoName, _T(
"ATL:%p"), &m_wc);
120 #else // !((_WIN32_WINNT >= 0x0500) || defined(_WIN64)) 121 SecureHelper::wsprintf_x(m_szAutoName, cchAutoName, _T(
"ATL:%8.8X"), (DWORD_PTR)&m_wc);
122 #endif // !((_WIN32_WINNT >= 0x0500) || defined(_WIN64)) 123 m_wc.lpszClassName = m_szAutoName;
126 WNDCLASSEX wcTemp = m_wc;
127 m_atom = (ATOM)::GetClassInfoEx(m_wc.hInstance, m_wc.lpszClassName, &wcTemp);
130 if(m_uCommonResourceID != 0)
132 m_wc.hIcon = (HICON)::LoadImage(ModuleHelper::GetResourceInstance(), MAKEINTRESOURCE(m_uCommonResourceID), IMAGE_ICON, 32, 32, LR_DEFAULTCOLOR);
133 m_wc.hIconSm = (HICON)::LoadImage(ModuleHelper::GetResourceInstance(), MAKEINTRESOURCE(m_uCommonResourceID), IMAGE_ICON, 16, 16, LR_DEFAULTCOLOR);
135 m_atom = ::RegisterClassEx(&m_wc);
142 if (m_lpszOrigName != NULL)
144 ATLASSERT(pProc != NULL);
145 ATLASSERT(pWndProc != NULL);
152 ATOM Register(WNDPROC* pProc)
157 if(FAILED(lock.Lock()))
159 ATLTRACE2(atlTraceUI, 0, _T(
"ERROR : Unable to lock critical section in CFrameWndClassInfo::Register.\n"));
166 HINSTANCE hInst = ModuleHelper::GetModuleInstance();
168 if (m_lpszOrigName != NULL)
170 ATLASSERT(pProc != NULL);
171 LPCTSTR lpsz = m_wc.lpszClassName;
172 WNDPROC proc = m_wc.lpfnWndProc;
176 if(!::GetClassInfo(ModuleHelper::GetModuleInstance(), m_lpszOrigName, &wc))
179 if(!::GetClassInfo(NULL, m_lpszOrigName, &wc))
186 pWndProc = m_wc.lpfnWndProc;
187 m_wc.lpszClassName = lpsz;
188 m_wc.lpfnWndProc = proc;
192 #if defined(GWES_CURSOR) || defined(GWES_MCURSOR) 193 m_wc.hCursor = ::LoadCursor(m_bSystemCursor ? NULL : hInst, m_lpszCursorID);
194 #else // !(defined(GWES_CURSOR) || defined(GWES_MCURSOR)) 196 #endif // !(defined(GWES_CURSOR) || defined(GWES_MCURSOR)) 199 m_wc.hInstance = hInst;
200 m_wc.style &= ~CS_GLOBALCLASS;
201 if (m_wc.lpszClassName == NULL)
203 wsprintf(m_szAutoName, _T(
"ATL:%8.8X"), (DWORD_PTR)&m_wc);
204 m_wc.lpszClassName = m_szAutoName;
207 WNDCLASS wcTemp = m_wc;
208 m_atom = (ATOM)::GetClassInfo(m_wc.hInstance, m_wc.lpszClassName, &wcTemp);
211 if(m_uCommonResourceID != 0)
212 m_wc.hIcon = (HICON)::LoadImage(ModuleHelper::GetResourceInstance(), MAKEINTRESOURCE(m_uCommonResourceID), IMAGE_ICON, 32, 32, LR_DEFAULTCOLOR);
213 m_atom = ::RegisterClass(&m_wc);
220 if (m_lpszOrigName != NULL)
222 ATLASSERT(pProc != NULL);
223 ATLASSERT(pWndProc != NULL);
238 #define DECLARE_FRAME_WND_CLASS(WndClassName, uCommonResourceID) \ 239 static WTL::CFrameWndClassInfo& GetWndClassInfo() \ 241 static WTL::CFrameWndClassInfo wc = \ 243 { sizeof(WNDCLASSEX), 0, StartWindowProc, \ 244 0, 0, NULL, NULL, NULL, (HBRUSH)(COLOR_WINDOW + 1), NULL, WndClassName, NULL }, \ 245 NULL, NULL, IDC_ARROW, TRUE, 0, _T(""), uCommonResourceID \ 250 #define DECLARE_FRAME_WND_CLASS_EX(WndClassName, uCommonResourceID, style, bkgnd) \ 251 static WTL::CFrameWndClassInfo& GetWndClassInfo() \ 253 static WTL::CFrameWndClassInfo wc = \ 255 { sizeof(WNDCLASSEX), style, StartWindowProc, \ 256 0, 0, NULL, NULL, NULL, (HBRUSH)(bkgnd + 1), NULL, WndClassName, NULL }, \ 257 NULL, NULL, IDC_ARROW, TRUE, 0, _T(""), uCommonResourceID \ 262 #define DECLARE_FRAME_WND_SUPERCLASS(WndClassName, OrigWndClassName, uCommonResourceID) \ 263 static WTL::CFrameWndClassInfo& GetWndClassInfo() \ 265 static WTL::CFrameWndClassInfo wc = \ 267 { sizeof(WNDCLASSEX), 0, StartWindowProc, \ 268 0, 0, NULL, NULL, NULL, NULL, NULL, WndClassName, NULL }, \ 269 OrigWndClassName, NULL, NULL, TRUE, 0, _T(""), uCommonResourceID \ 276 #define DECLARE_FRAME_WND_CLASS(WndClassName, uCommonResourceID) \ 277 static WTL::CFrameWndClassInfo& GetWndClassInfo() \ 279 static WTL::CFrameWndClassInfo wc = \ 281 { 0, StartWindowProc, \ 282 0, 0, NULL, NULL, NULL, (HBRUSH)(COLOR_WINDOW + 1), NULL, WndClassName }, \ 283 NULL, NULL, IDC_ARROW, TRUE, 0, _T(""), uCommonResourceID \ 288 #define DECLARE_FRAME_WND_CLASS_EX(WndClassName, uCommonResourceID, style, bkgnd) \ 289 static WTL::CFrameWndClassInfo& GetWndClassInfo() \ 291 static WTL::CFrameWndClassInfo wc = \ 293 { style, StartWindowProc, \ 294 0, 0, NULL, NULL, NULL, (HBRUSH)(bkgnd + 1), NULL, WndClassName }, \ 295 NULL, NULL, IDC_ARROW, TRUE, 0, _T(""), uCommonResourceID \ 300 #define DECLARE_FRAME_WND_SUPERCLASS(WndClassName, OrigWndClassName, uCommonResourceID) \ 301 static WTL::CFrameWndClassInfo& GetWndClassInfo() \ 303 static WTL::CFrameWndClassInfo wc = \ 305 { NULL, StartWindowProc, \ 306 0, 0, NULL, NULL, NULL, NULL, NULL, WndClassName }, \ 307 OrigWndClassName, NULL, IDC_ARROW, TRUE, 0, _T(""), uCommonResourceID \ 312 #endif // !_WIN32_WCE 319 #define CHAIN_CLIENT_COMMANDS() \ 320 if(uMsg == WM_COMMAND && m_hWndClient != NULL) \ 321 ::SendMessage(m_hWndClient, uMsg, wParam, lParam); 324 #define ATL_SIMPLE_TOOLBAR_STYLE \ 325 (WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | TBSTYLE_TOOLTIPS) 327 #define ATL_SIMPLE_TOOLBAR_PANE_STYLE \ 328 (WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | CCS_NODIVIDER | CCS_NORESIZE | CCS_NOPARENTALIGN | TBSTYLE_TOOLTIPS | TBSTYLE_FLAT) 330 #if (_WIN32_IE >= 0x0400) 331 #define ATL_SIMPLE_REBAR_STYLE \ 332 (WS_CHILD | WS_VISIBLE | WS_BORDER | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | RBS_VARHEIGHT | RBS_BANDBORDERS | RBS_AUTOSIZE) 334 #define ATL_SIMPLE_REBAR_STYLE \ 335 (WS_CHILD | WS_VISIBLE | WS_BORDER | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | RBS_VARHEIGHT | RBS_BANDBORDERS) 336 #endif // !(_WIN32_IE >= 0x0400) 338 #if (_WIN32_IE >= 0x0400) 339 #define ATL_SIMPLE_REBAR_NOBORDER_STYLE \ 340 (WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | RBS_VARHEIGHT | RBS_BANDBORDERS | RBS_AUTOSIZE | CCS_NODIVIDER) 342 #define ATL_SIMPLE_REBAR_NOBORDER_STYLE \ 343 (WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | RBS_VARHEIGHT | RBS_BANDBORDERS | CCS_NODIVIDER) 344 #endif // !(_WIN32_IE >= 0x0400) 347 #if !defined(__ATLCTRLW_H__) && !defined(_WIN32_WCE) 349 #define CBRM_GETCMDBAR (WM_USER + 301) // returns command bar HWND 350 #define CBRM_GETMENU (WM_USER + 302) // returns loaded or attached menu 351 #define CBRM_TRACKPOPUPMENU (WM_USER + 303) // displays a popup menu 363 #define CBRPOPUPMENU _AtlFrameWnd_CmdBarPopupMenu 365 #endif // !defined(__ATLCTRLW_H__) && !defined(_WIN32_WCE) 368 template <
class TBase = ATL::CWindow,
class TWinTraits = ATL::CFrameWinTraits>
372 DECLARE_FRAME_WND_CLASS(NULL, 0)
374 #if (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE) 375 struct _ChevronMenuInfo
378 LPNMREBARCHEVRON lpnm;
381 #endif // (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE) 385 HWND m_hWndStatusBar;
389 HWND m_hWndCECommandBar;
397 m_hWndStatusBar(NULL),
400 m_hWndCECommandBar(NULL),
406 HWND Create(HWND hWndParent,
ATL::_U_RECT rect, LPCTSTR szWindowName, DWORD dwStyle, DWORD dwExStyle,
ATL::_U_MENUorID MenuOrID, ATOM atom, LPVOID lpCreateParam)
408 ATLASSERT(m_hWnd == NULL);
413 ModuleHelper::AddCreateWndData(&m_thunk.cd,
this);
415 if(MenuOrID.m_hMenu == NULL && (dwStyle & WS_CHILD))
416 MenuOrID.m_hMenu = (HMENU)(UINT_PTR)
this;
417 if(rect.m_lpRect == NULL)
418 rect.m_lpRect = &TBase::rcDefault;
420 HWND hWnd = ::CreateWindowEx(dwExStyle, MAKEINTATOM(atom), szWindowName,
421 dwStyle, rect.m_lpRect->left, rect.m_lpRect->top, rect.m_lpRect->right - rect.m_lpRect->left,
422 rect.m_lpRect->bottom - rect.m_lpRect->top, hWndParent, MenuOrID.m_hMenu,
423 ModuleHelper::GetModuleInstance(), lpCreateParam);
425 ATLASSERT(hWnd == NULL || m_hWnd == hWnd);
430 static HWND CreateSimpleToolBarCtrl(HWND hWndParent, UINT nResourceID, BOOL bInitialSeparator = FALSE,
431 DWORD dwStyle = ATL_SIMPLE_TOOLBAR_STYLE, UINT nID = ATL_IDW_TOOLBAR)
433 HINSTANCE hInst = ModuleHelper::GetResourceInstance();
434 HRSRC hRsrc = ::FindResource(hInst, MAKEINTRESOURCE(nResourceID), RT_TOOLBAR);
438 HGLOBAL hGlobal = ::LoadResource(hInst, hRsrc);
445 ATLASSERT(pData->wVersion == 1);
447 WORD* pItems = pData->items();
448 int nItems = pData->wItemCount + (bInitialSeparator ? 1 : 0);
450 TBBUTTON* pTBBtn = buff.Allocate(nItems);
451 ATLASSERT(pTBBtn != NULL);
455 const int cxSeparator = 8;
458 if(bInitialSeparator)
460 pTBBtn[0].iBitmap = cxSeparator / 2;
461 pTBBtn[0].idCommand = 0;
462 pTBBtn[0].fsState = 0;
463 pTBBtn[0].fsStyle = TBSTYLE_SEP;
464 pTBBtn[0].dwData = 0;
465 pTBBtn[0].iString = 0;
469 for(
int i = 0, j = bInitialSeparator ? 1 : 0; i < pData->wItemCount; i++, j++)
473 pTBBtn[j].iBitmap = nBmp++;
474 pTBBtn[j].idCommand = pItems[i];
475 pTBBtn[j].fsState = TBSTATE_ENABLED;
476 pTBBtn[j].fsStyle = TBSTYLE_BUTTON;
477 pTBBtn[j].dwData = 0;
478 pTBBtn[j].iString = 0;
482 pTBBtn[j].iBitmap = cxSeparator;
483 pTBBtn[j].idCommand = 0;
484 pTBBtn[j].fsState = 0;
485 pTBBtn[j].fsStyle = TBSTYLE_SEP;
486 pTBBtn[j].dwData = 0;
487 pTBBtn[j].iString = 0;
492 HWND hWnd = ::CreateWindowEx(0, TOOLBARCLASSNAME, NULL, dwStyle, 0, 0, 100, 100, hWndParent, (HMENU)LongToHandle(nID), ModuleHelper::GetModuleInstance(), NULL);
502 HWND hWnd = hWndParent;
505 ::SendMessage(hWnd, TB_BUTTONSTRUCTSIZE,
sizeof(TBBUTTON), 0L);
508 CFontHandle font = (HFONT)::SendMessage(hWnd, WM_GETFONT, 0, 0L);
510 font = (HFONT)::GetStockObject(SYSTEM_FONT);
513 WORD cyFontHeight = (WORD)abs(lf.lfHeight);
516 WORD bitsPerPixel = AtlGetBitmapResourceBitsPerPixel(nResourceID);
519 COLORREF crMask = CLR_DEFAULT;
520 if(bitsPerPixel == 32)
525 HIMAGELIST hImageList = ImageList_LoadImage(ModuleHelper::GetResourceInstance(), MAKEINTRESOURCE(nResourceID), pData->wWidth, 1, crMask, IMAGE_BITMAP, LR_CREATEDIBSECTION | LR_DEFAULTSIZE);
526 ATLASSERT(hImageList != NULL);
527 ::SendMessage(hWnd, TB_SETIMAGELIST, 0, (LPARAM)hImageList);
530 #endif // !_WIN32_WCE 532 TBADDBITMAP tbab = { 0 };
534 tbab.nID = nResourceID;
535 ::SendMessage(hWnd, TB_ADDBITMAP, nBmp, (LPARAM)&tbab);
538 ::SendMessage(hWnd, TB_ADDBUTTONS, nItems, (LPARAM)pTBBtn);
539 ::SendMessage(hWnd, TB_SETBITMAPSIZE, 0, MAKELONG(pData->wWidth, max(pData->wHeight, cyFontHeight)));
540 const int cxyButtonMargin = 7;
541 ::SendMessage(hWnd, TB_SETBUTTONSIZE, 0, MAKELONG(pData->wWidth + cxyButtonMargin, max(pData->wHeight, cyFontHeight) + cxyButtonMargin));
547 static HWND CreateSimpleReBarCtrl(HWND hWndParent, DWORD dwStyle = ATL_SIMPLE_REBAR_STYLE, UINT nID = ATL_IDW_TOOLBAR)
550 if(dwStyle & CCS_NODIVIDER && dwStyle & WS_BORDER)
551 dwStyle &= ~WS_BORDER;
552 else if(!(dwStyle & WS_BORDER) && !(dwStyle & CCS_NODIVIDER))
553 dwStyle |= CCS_NODIVIDER;
556 HWND hWndReBar = ::CreateWindowEx(0, REBARCLASSNAME, NULL, dwStyle, 0, 0, 100, 100, hWndParent, (HMENU)LongToHandle(nID), ModuleHelper::GetModuleInstance(), NULL);
557 if(hWndReBar == NULL)
559 ATLTRACE2(atlTraceUI, 0, _T(
"Failed to create rebar.\n"));
564 REBARINFO rbi = {
sizeof(REBARINFO), 0 };
565 if(::SendMessage(hWndReBar, RB_SETBARINFO, 0, (LPARAM)&rbi) == 0)
567 ATLTRACE2(atlTraceUI, 0, _T(
"Failed to initialize rebar.\n"));
568 ::DestroyWindow(hWndReBar);
575 BOOL CreateSimpleReBar(DWORD dwStyle = ATL_SIMPLE_REBAR_STYLE, UINT nID = ATL_IDW_TOOLBAR)
577 ATLASSERT(!::IsWindow(m_hWndToolBar));
578 m_hWndToolBar = CreateSimpleReBarCtrl(m_hWnd, dwStyle, nID);
579 return (m_hWndToolBar != NULL);
582 static BOOL AddSimpleReBarBandCtrl(HWND hWndReBar, HWND hWndBand,
int nID = 0, LPCTSTR lpstrTitle = NULL, BOOL bNewRow = FALSE,
int cxWidth = 0, BOOL bFullWidthAlways = FALSE)
584 ATLASSERT(::IsWindow(hWndReBar));
588 TCHAR lpszClassName[
sizeof(REBARCLASSNAME)] = { 0 };
589 ::GetClassName(hWndReBar, lpszClassName,
sizeof(REBARCLASSNAME));
590 ATLASSERT(lstrcmp(lpszClassName, REBARCLASSNAME) == 0);
593 ATLASSERT(::IsWindow(hWndBand));
596 int nBtnCount = (int)::SendMessage(hWndBand, TB_BUTTONCOUNT, 0, 0L);
599 REBARBANDINFO rbBand = { RunTimeHelper::SizeOf_REBARBANDINFO() };
600 #if (_WIN32_IE >= 0x0400) 601 rbBand.fMask = RBBIM_CHILD | RBBIM_CHILDSIZE | RBBIM_STYLE | RBBIM_ID | RBBIM_SIZE | RBBIM_IDEALSIZE;
603 rbBand.fMask = RBBIM_CHILD | RBBIM_CHILDSIZE | RBBIM_STYLE | RBBIM_ID | RBBIM_SIZE;
604 #endif // !(_WIN32_IE >= 0x0400) 605 if(lpstrTitle != NULL)
606 rbBand.fMask |= RBBIM_TEXT;
607 rbBand.fStyle = RBBS_CHILDEDGE;
608 #if (_WIN32_IE >= 0x0500) 610 rbBand.fStyle |= RBBS_USECHEVRON;
611 #endif // (_WIN32_IE >= 0x0500) 613 rbBand.fStyle |= RBBS_BREAK;
615 rbBand.lpText = (LPTSTR)lpstrTitle;
616 rbBand.hwndChild = hWndBand;
618 nID = ATL_IDW_BAND_FIRST + (int)::SendMessage(hWndReBar, RB_GETBANDCOUNT, 0, 0L);
626 bRet = (BOOL)::SendMessage(hWndBand, TB_GETITEMRECT, nBtnCount - 1, (LPARAM)&rcTmp);
628 rbBand.cx = (cxWidth != 0) ? cxWidth : rcTmp.right;
629 rbBand.cyMinChild = rcTmp.bottom - rcTmp.top;
632 rbBand.cxMinChild = rbBand.cx;
634 else if(lpstrTitle == NULL)
636 bRet = (BOOL)::SendMessage(hWndBand, TB_GETITEMRECT, 0, (LPARAM)&rcTmp);
638 rbBand.cxMinChild = rcTmp.right;
642 rbBand.cxMinChild = 0;
647 bRet = ::GetWindowRect(hWndBand, &rcTmp);
649 rbBand.cx = (cxWidth != 0) ? cxWidth : (rcTmp.right - rcTmp.left);
650 rbBand.cxMinChild = bFullWidthAlways ? rbBand.cx : 0;
651 rbBand.cyMinChild = rcTmp.bottom - rcTmp.top;
654 #if (_WIN32_IE >= 0x0400) 655 rbBand.cxIdeal = rbBand.cx;
656 #endif // (_WIN32_IE >= 0x0400) 659 LRESULT lRes = ::SendMessage(hWndReBar, RB_INSERTBAND, (WPARAM)-1, (LPARAM)&rbBand);
662 ATLTRACE2(atlTraceUI, 0, _T(
"Failed to add a band to the rebar.\n"));
666 #if (_WIN32_IE >= 0x0501) 667 DWORD dwExStyle = (DWORD)::SendMessage(hWndBand, TB_GETEXTENDEDSTYLE, 0, 0L);
668 ::SendMessage(hWndBand, TB_SETEXTENDEDSTYLE, 0, dwExStyle | TBSTYLE_EX_HIDECLIPPEDBUTTONS);
669 #endif // (_WIN32_IE >= 0x0501) 674 BOOL AddSimpleReBarBand(HWND hWndBand, LPCTSTR lpstrTitle = NULL, BOOL bNewRow = FALSE,
int cxWidth = 0, BOOL bFullWidthAlways = FALSE)
676 ATLASSERT(::IsWindow(m_hWndToolBar));
677 ATLASSERT(::IsWindow(hWndBand));
678 return AddSimpleReBarBandCtrl(m_hWndToolBar, hWndBand, 0, lpstrTitle, bNewRow, cxWidth, bFullWidthAlways);
681 #if (_WIN32_IE >= 0x0400) 682 void SizeSimpleReBarBands()
684 ATLASSERT(::IsWindow(m_hWndToolBar));
686 int nCount = (int)::SendMessage(m_hWndToolBar, RB_GETBANDCOUNT, 0, 0L);
688 for(
int i = 0; i < nCount; i++)
690 REBARBANDINFO rbBand = { RunTimeHelper::SizeOf_REBARBANDINFO() };
691 rbBand.fMask = RBBIM_SIZE;
692 BOOL bRet = (BOOL)::SendMessage(m_hWndToolBar, RB_GETBANDINFO, i, (LPARAM)&rbBand);
694 RECT rect = { 0, 0, 0, 0 };
695 ::SendMessage(m_hWndToolBar, RB_GETBANDBORDERS, i, (LPARAM)&rect);
696 rbBand.cx += rect.left + rect.right;
697 bRet = (BOOL)::SendMessage(m_hWndToolBar, RB_SETBANDINFO, i, (LPARAM)&rbBand);
701 #endif // (_WIN32_IE >= 0x0400) 705 BOOL CreateSimpleStatusBar(LPCTSTR lpstrText, DWORD dwStyle = WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | SBARS_SIZEGRIP, UINT nID = ATL_IDW_STATUS_BAR)
707 BOOL CreateSimpleStatusBar(LPCTSTR lpstrText, DWORD dwStyle = WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS, UINT nID = ATL_IDW_STATUS_BAR)
710 ATLASSERT(!::IsWindow(m_hWndStatusBar));
711 m_hWndStatusBar = ::CreateStatusWindow(dwStyle, lpstrText, m_hWnd, nID);
712 return (m_hWndStatusBar != NULL);
716 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)
718 BOOL CreateSimpleStatusBar(UINT nTextID = ATL_IDS_IDLEMESSAGE, DWORD dwStyle = WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS, UINT nID = ATL_IDW_STATUS_BAR)
721 const int cchMax = 128;
722 TCHAR szText[cchMax] = { 0 };
723 ::LoadString(ModuleHelper::GetResourceInstance(), nTextID, szText, cchMax);
724 return CreateSimpleStatusBar(szText, dwStyle, nID);
728 BOOL CreateSimpleCECommandBar(LPTSTR pszMenu = NULL, WORD iButton = 0, DWORD dwFlags = 0,
int nCmdBarID = 1)
730 ATLASSERT(m_hWndCECommandBar == NULL);
731 ATLASSERT(m_hWndToolBar == NULL);
733 m_hWndCECommandBar = ::CommandBar_Create(ModuleHelper::GetModuleInstance(), m_hWnd, nCmdBarID);
734 if(m_hWndCECommandBar == NULL)
737 m_hWndToolBar = m_hWndCECommandBar;
742 bRet &= ::CommandBar_InsertMenubarEx(m_hWndCECommandBar, IS_INTRESOURCE(pszMenu) ? ModuleHelper::GetResourceInstance() : NULL, pszMenu, iButton);
744 bRet &= ::CommandBar_AddAdornments(m_hWndCECommandBar, dwFlags, 0);
749 #if defined(_AYGSHELL_H_) || defined(__AYGSHELL_H__) 750 BOOL CreateSimpleCEMenuBar(UINT nToolBarId = ATL_IDW_MENU_BAR, DWORD dwFlags = 0,
int nBmpId = 0,
int cBmpImages = 0)
752 ATLASSERT(m_hWndCECommandBar == NULL);
754 SHMENUBARINFO mbi = { 0 };
755 mbi.cbSize =
sizeof(mbi);
756 mbi.hwndParent = m_hWnd;
757 mbi.dwFlags = dwFlags;
758 mbi.nToolBarId = nToolBarId;
759 mbi.hInstRes = ModuleHelper::GetResourceInstance();
761 mbi.cBmpImages = cBmpImages;
764 BOOL bRet = ::SHCreateMenuBar(&mbi);
767 m_hWndCECommandBar = mbi.hwndMB;
776 ATLASSERT(::IsWindow(m_hWnd));
777 ATLASSERT(::IsWindow(m_hWndCECommandBar));
780 GetWindowRect(&rect);
782 ::GetWindowRect(m_hWndCECommandBar, &rectMB);
783 int cy = ::IsWindowVisible(m_hWndCECommandBar) ? rectMB.top - rect.top : rectMB.bottom - rect.top;
784 SetWindowPos(NULL, 0, 0, rect.right - rect.left, cy, SWP_NOZORDER | SWP_NOMOVE);
786 #endif // defined(_AYGSHELL_H_) || defined(__AYGSHELL_H__) 789 void UpdateLayout(BOOL bResizeBars = TRUE)
792 GetClientRect(&rect);
795 UpdateBarsPosition(rect, bResizeBars);
798 if(m_hWndClient != NULL)
799 ::SetWindowPos(m_hWndClient, NULL, rect.left, rect.top,
800 rect.right - rect.left, rect.bottom - rect.top,
801 SWP_NOZORDER | SWP_NOACTIVATE);
804 void UpdateBarsPosition(RECT& rect, BOOL bResizeBars = TRUE)
807 if(m_hWndToolBar != NULL && ((DWORD)::GetWindowLong(m_hWndToolBar, GWL_STYLE) & WS_VISIBLE))
809 if(bResizeBars != FALSE)
811 ::SendMessage(m_hWndToolBar, WM_SIZE, 0, 0);
812 ::InvalidateRect(m_hWndToolBar, NULL, TRUE);
815 ::GetWindowRect(m_hWndToolBar, &rectTB);
816 rect.top += rectTB.bottom - rectTB.top;
820 if(m_hWndStatusBar != NULL && ((DWORD)::GetWindowLong(m_hWndStatusBar, GWL_STYLE) & WS_VISIBLE))
822 if(bResizeBars != FALSE)
823 ::SendMessage(m_hWndStatusBar, WM_SIZE, 0, 0);
825 ::GetWindowRect(m_hWndStatusBar, &rectSB);
826 rect.bottom -= rectSB.bottom - rectSB.top;
830 BOOL PreTranslateMessage(MSG* pMsg)
832 if(m_hAccel != NULL && ::TranslateAccelerator(m_hWnd, m_hAccel, pMsg))
838 MESSAGE_HANDLER(WM_ERASEBKGND, OnEraseBackground)
840 MESSAGE_HANDLER(WM_MENUSELECT, OnMenuSelect)
841 #endif // !_WIN32_WCE 842 MESSAGE_HANDLER(WM_SETFOCUS, OnSetFocus)
843 MESSAGE_HANDLER(WM_DESTROY, OnDestroy)
845 NOTIFY_CODE_HANDLER(TTN_GETDISPINFOA, OnToolTipTextA)
846 NOTIFY_CODE_HANDLER(TTN_GETDISPINFOW, OnToolTipTextW)
847 #endif // !_WIN32_WCE 850 LRESULT OnEraseBackground(UINT , WPARAM , LPARAM , BOOL& bHandled)
852 if(m_hWndClient != NULL)
860 LRESULT OnMenuSelect(UINT , WPARAM wParam, LPARAM lParam, BOOL& bHandled)
864 if(m_hWndStatusBar == NULL)
867 WORD wFlags = HIWORD(wParam);
868 if(wFlags == 0xFFFF && lParam == NULL)
870 ::SendMessage(m_hWndStatusBar, SB_SIMPLE, FALSE, 0L);
874 const int cchBuff = 256;
875 TCHAR szBuff[cchBuff] = { 0 };
876 if(!(wFlags & MF_POPUP))
878 WORD wID = LOWORD(wParam);
880 if(wID >= 0xF000 && wID < 0xF1F0)
881 wID = (WORD)(((wID - 0xF000) >> 4) + ATL_IDS_SCFIRST);
882 else if(wID >= ID_FILE_MRU_FIRST && wID <= ID_FILE_MRU_LAST)
883 wID = ATL_IDS_MRU_FILE;
884 else if(wID >= ATL_IDM_FIRST_MDICHILD && wID <= ATL_IDM_LAST_MDICHILD)
885 wID = ATL_IDS_MDICHILD;
887 int nRet = ::LoadString(ModuleHelper::GetResourceInstance(), wID, szBuff, cchBuff);
888 for(
int i = 0; i < nRet; i++)
890 if(szBuff[i] == _T(
'\n'))
897 ::SendMessage(m_hWndStatusBar, SB_SIMPLE, TRUE, 0L);
898 ::SendMessage(m_hWndStatusBar, SB_SETTEXT, (255 | SBT_NOBORDERS), (LPARAM)szBuff);
903 #endif // !_WIN32_WCE 905 LRESULT OnSetFocus(UINT, WPARAM, LPARAM, BOOL& bHandled)
907 if(m_hWndClient != NULL)
908 ::SetFocus(m_hWndClient);
914 LRESULT OnDestroy(UINT, WPARAM, LPARAM, BOOL& bHandled)
916 if((GetStyle() & (WS_CHILD | WS_POPUP)) == 0)
917 ::PostQuitMessage(1);
924 LRESULT OnToolTipTextA(
int idCtrl, LPNMHDR pnmh, BOOL& )
926 LPNMTTDISPINFOA pDispInfo = (LPNMTTDISPINFOA)pnmh;
927 pDispInfo->szText[0] = 0;
929 if((idCtrl != 0) && !(pDispInfo->uFlags & TTF_IDISHWND))
931 const int cchBuff = 256;
932 char szBuff[cchBuff] = { 0 };
933 int nRet = ::LoadStringA(ModuleHelper::GetResourceInstance(), idCtrl, szBuff, cchBuff);
934 for(
int i = 0; i < nRet; i++)
936 if(szBuff[i] ==
'\n')
938 SecureHelper::strncpyA_x(pDispInfo->szText, _countof(pDispInfo->szText), &szBuff[i + 1], _TRUNCATE);
942 #if (_WIN32_IE >= 0x0300) 944 pDispInfo->uFlags |= TTF_DI_SETITEM;
945 #endif // (_WIN32_IE >= 0x0300) 951 LRESULT OnToolTipTextW(
int idCtrl, LPNMHDR pnmh, BOOL& )
953 LPNMTTDISPINFOW pDispInfo = (LPNMTTDISPINFOW)pnmh;
954 pDispInfo->szText[0] = 0;
956 if((idCtrl != 0) && !(pDispInfo->uFlags & TTF_IDISHWND))
958 const int cchBuff = 256;
959 wchar_t szBuff[cchBuff] = { 0 };
960 int nRet = ::LoadStringW(ModuleHelper::GetResourceInstance(), idCtrl, szBuff, cchBuff);
961 for(
int i = 0; i < nRet; i++)
963 if(szBuff[i] == L
'\n')
965 SecureHelper::strncpyW_x(pDispInfo->szText, _countof(pDispInfo->szText), &szBuff[i + 1], _TRUNCATE);
969 #if (_WIN32_IE >= 0x0300) 971 pDispInfo->uFlags |= TTF_DI_SETITEM;
972 #endif // (_WIN32_IE >= 0x0300) 977 #endif // !_WIN32_WCE 980 #if (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE) 981 bool PrepareChevronMenu(_ChevronMenuInfo& cmi)
984 REBARBANDINFO rbbi = { RunTimeHelper::SizeOf_REBARBANDINFO() };
985 rbbi.fMask = RBBIM_CHILD;
986 BOOL bRet = (BOOL)::SendMessage(cmi.lpnm->hdr.hwndFrom, RB_GETBANDINFO, cmi.lpnm->uBand, (LPARAM)&rbbi);
990 ATL::CWindow wnd = rbbi.hwndChild;
991 int nCount = (int)wnd.SendMessage(TB_BUTTONCOUNT);
996 CMenuHandle menuCmdBar = (HMENU)wnd.SendMessage(CBRM_GETMENU);
997 cmi.bCmdBar = (menuCmdBar.m_hMenu != NULL);
1001 bRet = menu.CreatePopupMenu();
1003 RECT rcClient = { 0 };
1004 bRet = wnd.GetClientRect(&rcClient);
1006 for(
int i = 0; i < nCount; i++)
1008 TBBUTTON tbb = { 0 };
1009 bRet = (BOOL)wnd.SendMessage(TB_GETBUTTON, i, (LPARAM)&tbb);
1012 if((tbb.fsState & TBSTATE_HIDDEN) != 0)
1014 RECT rcButton = { 0 };
1015 bRet = (BOOL)wnd.SendMessage(TB_GETITEMRECT, i, (LPARAM)&rcButton);
1017 bool bEnabled = ((tbb.fsState & TBSTATE_ENABLED) != 0);
1018 if(rcButton.right > rcClient.right)
1020 if(tbb.fsStyle & BTNS_SEP)
1022 if(menu.GetMenuItemCount() > 0)
1023 menu.AppendMenu(MF_SEPARATOR);
1025 else if(cmi.bCmdBar)
1027 const int cchBuff = 200;
1028 TCHAR szBuff[cchBuff] = { 0 };
1030 mii.fMask = MIIM_TYPE | MIIM_SUBMENU;
1031 mii.dwTypeData = szBuff;
1033 bRet = menuCmdBar.GetMenuItemInfo(i, TRUE, &mii);
1036 ATLASSERT(::IsMenu(mii.hSubMenu));
1037 bRet = menu.AppendMenu(MF_STRING | MF_POPUP | (bEnabled ? MF_ENABLED : MF_GRAYED), (UINT_PTR)mii.hSubMenu, mii.dwTypeData);
1043 const int cchBuff = 200;
1044 TCHAR szBuff[cchBuff] = { 0 };
1045 LPTSTR lpstrText = szBuff;
1046 TBBUTTONINFO tbbi = { 0 };
1047 tbbi.cbSize =
sizeof(TBBUTTONINFO);
1048 tbbi.dwMask = TBIF_TEXT;
1049 tbbi.pszText = szBuff;
1050 tbbi.cchText = cchBuff;
1051 if(wnd.SendMessage(TB_GETBUTTONINFO, tbb.idCommand, (LPARAM)&tbbi) == -1 || lstrlen(szBuff) == 0)
1055 int nRet = ::LoadString(ModuleHelper::GetResourceInstance(), tbb.idCommand, szBuff, cchBuff);
1056 for(
int n = 0; n < nRet; n++)
1058 if(szBuff[n] == _T(
'\n'))
1060 lpstrText = &szBuff[n + 1];
1065 bRet = menu.AppendMenu(MF_STRING | (bEnabled ? MF_ENABLED : MF_GRAYED), tbb.idCommand, lpstrText);
1071 if(menu.GetMenuItemCount() == 0)
1074 ::MessageBeep((UINT)-1);
1082 void DisplayChevronMenu(_ChevronMenuInfo& cmi)
1084 #ifndef TPM_VERPOSANIMATION 1085 const UINT TPM_VERPOSANIMATION = 0x1000L;
1088 ATL::CWindow wndFrom = cmi.lpnm->hdr.hwndFrom;
1089 POINT pt = { cmi.lpnm->rc.left, cmi.lpnm->rc.bottom };
1090 wndFrom.MapWindowPoints(NULL, &pt, 1);
1091 RECT rc = cmi.lpnm->rc;
1092 wndFrom.MapWindowPoints(NULL, &rc);
1094 UINT uMenuFlags = TPM_LEFTBUTTON | TPM_VERTICAL | TPM_LEFTALIGN | TPM_TOPALIGN | (!AtlIsOldWindows() ? TPM_VERPOSANIMATION : 0);
1095 TPMPARAMS TPMParams = { 0 };
1096 TPMParams.cbSize =
sizeof(TPMPARAMS);
1097 TPMParams.rcExclude = rc;
1099 HWND hWndCmdBar = (HWND)::SendMessage(m_hWnd, CBRM_GETCMDBAR, 0, 0L);
1100 if(::IsWindow(hWndCmdBar))
1103 ::SendMessage(hWndCmdBar, CBRM_TRACKPOPUPMENU, 0, (LPARAM)&CBRPopupMenu);
1108 menu.TrackPopupMenuEx(uMenuFlags, pt.x, pt.y, m_hWnd, &TPMParams);
1112 void CleanupChevronMenu(_ChevronMenuInfo& cmi)
1118 for(
int i = menu.GetMenuItemCount() - 1; i >=0; i--)
1119 menu.RemoveMenu(i, MF_BYPOSITION);
1124 ATL::CWindow wndFrom = cmi.lpnm->hdr.hwndFrom;
1125 RECT rc = cmi.lpnm->rc;
1126 wndFrom.MapWindowPoints(NULL, &rc);
1129 if(::PeekMessage(&msg, m_hWnd, WM_LBUTTONDOWN, WM_LBUTTONDOWN, PM_NOREMOVE) && ::PtInRect(&rc, msg.pt))
1130 ::PeekMessage(&msg, m_hWnd, WM_LBUTTONDOWN, WM_LBUTTONDOWN, PM_REMOVE);
1132 #endif // (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE) 1136 template <
class T,
class TBase = ATL::CWindow,
class TWinTraits = ATL::CFrameWinTraits>
1140 HWND Create(HWND hWndParent = NULL,
ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL,
1141 DWORD dwStyle = 0, DWORD dwExStyle = 0,
1142 HMENU hMenu = NULL, LPVOID lpCreateParam = NULL)
1144 ATOM atom = T::GetWndClassInfo().Register(&m_pfnSuperWindowProc);
1146 dwStyle = T::GetWndStyle(dwStyle);
1147 dwExStyle = T::GetWndExStyle(dwExStyle);
1149 if(rect.m_lpRect == NULL)
1150 rect.m_lpRect = &TBase::rcDefault;
1155 HWND CreateEx(HWND hWndParent = NULL,
ATL::_U_RECT rect = NULL, DWORD dwStyle = 0, DWORD dwExStyle = 0, LPVOID lpCreateParam = NULL)
1157 const int cchName = 256;
1158 TCHAR szWindowName[cchName] = { 0 };
1160 ::LoadString(ModuleHelper::GetResourceInstance(), T::GetWndClassInfo().m_uCommonResourceID, szWindowName, cchName);
1161 HMENU hMenu = ::LoadMenu(ModuleHelper::GetResourceInstance(), MAKEINTRESOURCE(T::GetWndClassInfo().m_uCommonResourceID));
1162 #else // CE specific 1163 ::LoadString(ModuleHelper::GetResourceInstance(), T::GetWndClassInfo().m_uCommonResourceID, szWindowName, cchName);
1169 #endif // _WIN32_WCE 1171 T* pT =
static_cast<T*
>(
this);
1172 HWND hWnd = pT->Create(hWndParent, rect, szWindowName, dwStyle, dwExStyle, hMenu, lpCreateParam);
1175 m_hAccel = ::LoadAccelerators(ModuleHelper::GetResourceInstance(), MAKEINTRESOURCE(T::GetWndClassInfo().m_uCommonResourceID));
1180 BOOL CreateSimpleToolBar(UINT nResourceID = 0, DWORD dwStyle = ATL_SIMPLE_TOOLBAR_STYLE, UINT nID = ATL_IDW_TOOLBAR)
1182 if(nResourceID == 0)
1183 nResourceID = T::GetWndClassInfo().m_uCommonResourceID;
1185 ATLASSERT(!::IsWindow(m_hWndToolBar));
1186 m_hWndToolBar = T::CreateSimpleToolBarCtrl(m_hWnd, nResourceID, TRUE, dwStyle, nID);
1187 return (m_hWndToolBar != NULL);
1188 #else // CE specific 1189 HWND hWnd= T::CreateSimpleToolBarCtrl(m_hWndCECommandBar, nResourceID, TRUE, dwStyle, nID);
1190 return (hWnd != NULL);
1191 #endif // _WIN32_WCE 1196 HWND CreateSimpleCEToolBar(UINT nResourceID = 0, DWORD dwStyle = ATL_SIMPLE_TOOLBAR_STYLE, UINT nID = ATL_IDW_TOOLBAR)
1198 if(nResourceID == 0)
1199 nResourceID = T::GetWndClassInfo().m_uCommonResourceID;
1201 return T::CreateSimpleToolBarCtrl(m_hWndCECommandBar, nResourceID, TRUE, dwStyle, nID);
1203 #endif // _WIN32_WCE 1209 MESSAGE_HANDLER(WM_SIZE, OnSize)
1210 #ifndef _ATL_NO_REBAR_SUPPORT 1211 #if (_WIN32_IE >= 0x0400) 1212 NOTIFY_CODE_HANDLER(RBN_AUTOSIZE, OnReBarAutoSize)
1213 #endif // (_WIN32_IE >= 0x0400) 1214 #if (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE) 1215 NOTIFY_CODE_HANDLER(RBN_CHEVRONPUSHED, OnChevronPushed)
1216 #endif // (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE) 1217 #endif // !_ATL_NO_REBAR_SUPPORT 1218 CHAIN_MSG_MAP(_baseClass)
1221 LRESULT OnSize(UINT , WPARAM wParam, LPARAM , BOOL& bHandled)
1223 if(wParam != SIZE_MINIMIZED)
1225 T* pT =
static_cast<T*
>(
this);
1232 #ifndef _ATL_NO_REBAR_SUPPORT 1233 #if (_WIN32_IE >= 0x0400) 1234 LRESULT OnReBarAutoSize(
int , LPNMHDR , BOOL& )
1236 T* pT =
static_cast<T*
>(
this);
1237 pT->UpdateLayout(FALSE);
1240 #endif // (_WIN32_IE >= 0x0400) 1242 #if (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE) 1243 LRESULT OnChevronPushed(
int , LPNMHDR pnmh, BOOL& bHandled)
1245 T* pT =
static_cast<T*
>(
this);
1246 _ChevronMenuInfo cmi = { NULL, (LPNMREBARCHEVRON)pnmh,
false };
1247 if(!pT->PrepareChevronMenu(cmi))
1253 pT->DisplayChevronMenu(cmi);
1255 pT->CleanupChevronMenu(cmi);
1258 #endif // (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE) 1259 #endif // !_ATL_NO_REBAR_SUPPORT 1268 inline HWND AtlCreateSimpleToolBar(HWND hWndParent, UINT nResourceID, BOOL bInitialSeparator = FALSE,
1269 DWORD dwStyle = ATL_SIMPLE_TOOLBAR_STYLE, UINT nID = ATL_IDW_TOOLBAR)
1274 #endif // !_WIN32_WCE 1282 #ifndef _WTL_MDIWINDOWMENU_TEXT 1283 #define _WTL_MDIWINDOWMENU_TEXT _T("&Window") 1290 HWND m_hWndMDIClient;
1294 CMDIWindow(HWND hWnd = NULL) : ATL::CWindow(hWnd), m_hWndMDIClient(NULL), m_hMenu(NULL)
1304 HWND MDIGetActive(BOOL* lpbMaximized = NULL)
1306 ATLASSERT(::IsWindow(m_hWndMDIClient));
1307 return (HWND)::SendMessage(m_hWndMDIClient, WM_MDIGETACTIVE, 0, (LPARAM)lpbMaximized);
1310 void MDIActivate(HWND hWndChildToActivate)
1312 ATLASSERT(::IsWindow(m_hWndMDIClient));
1313 ATLASSERT(::IsWindow(hWndChildToActivate));
1314 ::SendMessage(m_hWndMDIClient, WM_MDIACTIVATE, (WPARAM)hWndChildToActivate, 0);
1317 void MDINext(HWND hWndChild, BOOL bPrevious = FALSE)
1319 ATLASSERT(::IsWindow(m_hWndMDIClient));
1320 ATLASSERT(hWndChild == NULL || ::IsWindow(hWndChild));
1321 ::SendMessage(m_hWndMDIClient, WM_MDINEXT, (WPARAM)hWndChild, (LPARAM)bPrevious);
1324 void MDIMaximize(HWND hWndChildToMaximize)
1326 ATLASSERT(::IsWindow(m_hWndMDIClient));
1327 ATLASSERT(::IsWindow(hWndChildToMaximize));
1328 ::SendMessage(m_hWndMDIClient, WM_MDIMAXIMIZE, (WPARAM)hWndChildToMaximize, 0);
1331 void MDIRestore(HWND hWndChildToRestore)
1333 ATLASSERT(::IsWindow(m_hWndMDIClient));
1334 ATLASSERT(::IsWindow(hWndChildToRestore));
1335 ::SendMessage(m_hWndMDIClient, WM_MDIRESTORE, (WPARAM)hWndChildToRestore, 0);
1338 void MDIDestroy(HWND hWndChildToDestroy)
1340 ATLASSERT(::IsWindow(m_hWndMDIClient));
1341 ATLASSERT(::IsWindow(hWndChildToDestroy));
1342 ::SendMessage(m_hWndMDIClient, WM_MDIDESTROY, (WPARAM)hWndChildToDestroy, 0);
1345 BOOL MDICascade(UINT uFlags = 0)
1347 ATLASSERT(::IsWindow(m_hWndMDIClient));
1348 return (BOOL)::SendMessage(m_hWndMDIClient, WM_MDICASCADE, (WPARAM)uFlags, 0);
1351 BOOL MDITile(UINT uFlags = MDITILE_HORIZONTAL)
1353 ATLASSERT(::IsWindow(m_hWndMDIClient));
1354 return (BOOL)::SendMessage(m_hWndMDIClient, WM_MDITILE, (WPARAM)uFlags, 0);
1357 void MDIIconArrange()
1359 ATLASSERT(::IsWindow(m_hWndMDIClient));
1360 ::SendMessage(m_hWndMDIClient, WM_MDIICONARRANGE, 0, 0);
1363 HMENU MDISetMenu(HMENU hMenuFrame, HMENU hMenuWindow)
1365 ATLASSERT(::IsWindow(m_hWndMDIClient));
1366 return (HMENU)::SendMessage(m_hWndMDIClient, WM_MDISETMENU, (WPARAM)hMenuFrame, (LPARAM)hMenuWindow);
1369 HMENU MDIRefreshMenu()
1371 ATLASSERT(::IsWindow(m_hWndMDIClient));
1372 return (HMENU)::SendMessage(m_hWndMDIClient, WM_MDIREFRESHMENU, 0, 0);
1376 static HMENU GetStandardWindowMenu(HMENU hMenu)
1378 int nCount = ::GetMenuItemCount(hMenu);
1381 int nLen = ::GetMenuString(hMenu, nCount - 2, NULL, 0, MF_BYPOSITION);
1385 LPTSTR lpszText = buff.Allocate(nLen + 1);
1386 if(lpszText == NULL)
1388 if(::GetMenuString(hMenu, nCount - 2, lpszText, nLen + 1, MF_BYPOSITION) != nLen)
1390 if(lstrcmp(lpszText, _WTL_MDIWINDOWMENU_TEXT) != 0)
1392 return ::GetSubMenu(hMenu, nCount - 2);
1395 void SetMDIFrameMenu()
1397 HMENU hWindowMenu = GetStandardWindowMenu(m_hMenu);
1398 MDISetMenu(m_hMenu, hWindowMenu);
1400 ::DrawMenuBar(GetMDIFrame());
1403 HWND GetMDIFrame()
const 1405 return ::GetParent(m_hWndMDIClient);
1409 #endif // !_WIN32_WCE 1418 #define CHAIN_MDI_CHILD_COMMANDS() \ 1419 if(uMsg == WM_COMMAND) \ 1421 HWND hWndChild = MDIGetActive(); \ 1422 if(hWndChild != NULL) \ 1423 ::SendMessage(hWndChild, uMsg, wParam, lParam); \ 1426 template <
class T,
class TBase = CMDIWindow,
class TWinTraits = ATL::CFrameWinTraits>
1430 HWND Create(HWND hWndParent = NULL,
ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL,
1431 DWORD dwStyle = 0, DWORD dwExStyle = 0,
1432 HMENU hMenu = NULL, LPVOID lpCreateParam = NULL)
1435 ATOM atom = T::GetWndClassInfo().Register(&m_pfnSuperWindowProc);
1437 dwStyle = T::GetWndStyle(dwStyle);
1438 dwExStyle = T::GetWndExStyle(dwExStyle);
1440 if(rect.m_lpRect == NULL)
1441 rect.m_lpRect = &TBase::rcDefault;
1446 HWND CreateEx(HWND hWndParent = NULL,
ATL::_U_RECT rect = NULL, DWORD dwStyle = 0, DWORD dwExStyle = 0, LPVOID lpCreateParam = NULL)
1448 const int cchName = 256;
1449 TCHAR szWindowName[cchName] = { 0 };
1450 ::LoadString(ModuleHelper::GetResourceInstance(), T::GetWndClassInfo().m_uCommonResourceID, szWindowName, cchName);
1451 HMENU hMenu = ::LoadMenu(ModuleHelper::GetResourceInstance(), MAKEINTRESOURCE(T::GetWndClassInfo().m_uCommonResourceID));
1453 T* pT =
static_cast<T*
>(
this);
1454 HWND hWnd = pT->Create(hWndParent, rect, szWindowName, dwStyle, dwExStyle, hMenu, lpCreateParam);
1457 m_hAccel = ::LoadAccelerators(ModuleHelper::GetResourceInstance(), MAKEINTRESOURCE(T::GetWndClassInfo().m_uCommonResourceID));
1462 BOOL CreateSimpleToolBar(UINT nResourceID = 0, DWORD dwStyle = ATL_SIMPLE_TOOLBAR_STYLE, UINT nID = ATL_IDW_TOOLBAR)
1464 ATLASSERT(!::IsWindow(m_hWndToolBar));
1465 if(nResourceID == 0)
1466 nResourceID = T::GetWndClassInfo().m_uCommonResourceID;
1467 m_hWndToolBar = T::CreateSimpleToolBarCtrl(m_hWnd, nResourceID, TRUE, dwStyle, nID);
1468 return (m_hWndToolBar != NULL);
1471 virtual WNDPROC GetWindowProc()
1473 return MDIFrameWindowProc;
1476 static LRESULT CALLBACK MDIFrameWindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
1480 #if (_ATL_VER >= 0x0700) 1481 ATL::_ATL_MSG msg(pThis->m_hWnd, uMsg, wParam, lParam);
1482 const ATL::_ATL_MSG* pOldMsg = pThis->m_pCurrentMsg;
1483 #else // !(_ATL_VER >= 0x0700) 1484 MSG msg = { pThis->m_hWnd, uMsg, wParam, lParam, 0, { 0, 0 } };
1485 const MSG* pOldMsg = pThis->m_pCurrentMsg;
1486 #endif // !(_ATL_VER >= 0x0700) 1487 pThis->m_pCurrentMsg = &msg;
1490 BOOL bRet = pThis->ProcessWindowMessage(pThis->m_hWnd, uMsg, wParam, lParam, lRes, 0);
1492 ATLASSERT(pThis->m_pCurrentMsg == &msg);
1493 pThis->m_pCurrentMsg = pOldMsg;
1497 if(uMsg != WM_NCDESTROY)
1498 lRes = pThis->DefWindowProc(uMsg, wParam, lParam);
1502 LONG_PTR pfnWndProc = ::GetWindowLongPtr(pThis->m_hWnd, GWLP_WNDPROC);
1503 lRes = pThis->DefWindowProc(uMsg, wParam, lParam);
1504 if(pThis->m_pfnSuperWindowProc != ::DefWindowProc && ::GetWindowLongPtr(pThis->m_hWnd, GWLP_WNDPROC) == pfnWndProc)
1505 ::SetWindowLongPtr(pThis->m_hWnd, GWLP_WNDPROC, (LONG_PTR)pThis->m_pfnSuperWindowProc);
1506 #if (_ATL_VER >= 0x0700) 1508 pThis->m_dwState |= WINSTATE_DESTROYED;
1509 #else // !(_ATL_VER >= 0x0700) 1511 HWND hWnd = pThis->m_hWnd;
1512 pThis->m_hWnd = NULL;
1514 pThis->OnFinalMessage(hWnd);
1515 #endif // !(_ATL_VER >= 0x0700) 1518 #if (_ATL_VER >= 0x0700) 1519 if(pThis->m_dwState & WINSTATE_DESTROYED && pThis->m_pCurrentMsg == NULL)
1522 HWND hWnd = pThis->m_hWnd;
1523 pThis->m_hWnd = NULL;
1524 pThis->m_dwState &= ~WINSTATE_DESTROYED;
1526 pThis->OnFinalMessage(hWnd);
1528 #endif // (_ATL_VER >= 0x0700) 1533 LRESULT DefWindowProc()
1535 const MSG* pMsg = m_pCurrentMsg;
1538 lRes = DefWindowProc(pMsg->message, pMsg->wParam, pMsg->lParam);
1542 LRESULT DefWindowProc(UINT uMsg, WPARAM wParam, LPARAM lParam)
1544 return ::DefFrameProc(m_hWnd, m_hWndMDIClient, uMsg, wParam, lParam);
1547 BOOL PreTranslateMessage(MSG* pMsg)
1551 return ::TranslateMDISysAccel(m_hWndMDIClient, pMsg);
1554 HWND CreateMDIClient(HMENU hWindowMenu = NULL, UINT nID = ATL_IDW_CLIENT, UINT nFirstChildID = ATL_IDM_FIRST_MDICHILD)
1556 DWORD dwStyle = WS_VISIBLE | WS_CHILD | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | MDIS_ALLCHILDSTYLES;
1557 DWORD dwExStyle = WS_EX_CLIENTEDGE;
1559 CLIENTCREATESTRUCT ccs = { 0 };
1560 ccs.hWindowMenu = hWindowMenu;
1561 ccs.idFirstChild = nFirstChildID;
1563 if((GetStyle() & (WS_HSCROLL | WS_VSCROLL)) != 0)
1566 dwStyle |= (GetStyle() & (WS_HSCROLL | WS_VSCROLL));
1569 ModifyStyle(WS_HSCROLL | WS_VSCROLL, 0, SWP_NOREDRAW | SWP_FRAMECHANGED);
1573 m_hWndClient = ::CreateWindowEx(dwExStyle, _T(
"MDIClient"), NULL,
1574 dwStyle, 0, 0, 1, 1, m_hWnd, (HMENU)LongToHandle(nID),
1575 ModuleHelper::GetModuleInstance(), (LPVOID)&ccs);
1576 if (m_hWndClient == NULL)
1578 ATLTRACE2(atlTraceUI, 0, _T(
"MDI Frame failed to create MDICLIENT.\n"));
1583 ::BringWindowToTop(m_hWndClient);
1586 m_hWndMDIClient = m_hWndClient;
1589 T* pT =
static_cast<T*
>(
this);
1592 return m_hWndClient;
1598 MESSAGE_HANDLER(WM_SIZE, OnSize)
1599 MESSAGE_HANDLER(WM_SETFOCUS, OnSetFocus)
1600 MESSAGE_HANDLER(WM_MDISETMENU, OnMDISetMenu)
1601 #ifndef _ATL_NO_REBAR_SUPPORT 1602 #if (_WIN32_IE >= 0x0400) 1603 NOTIFY_CODE_HANDLER(RBN_AUTOSIZE, OnReBarAutoSize)
1604 #endif // (_WIN32_IE >= 0x0400) 1605 #if (_WIN32_IE >= 0x0500) 1606 NOTIFY_CODE_HANDLER(RBN_CHEVRONPUSHED, OnChevronPushed)
1607 #endif // (_WIN32_IE >= 0x0500) 1608 #endif // !_ATL_NO_REBAR_SUPPORT 1609 CHAIN_MSG_MAP(_baseClass)
1612 LRESULT OnSize(UINT , WPARAM wParam, LPARAM , BOOL& )
1614 if(wParam != SIZE_MINIMIZED)
1616 T* pT =
static_cast<T*
>(
this);
1623 LRESULT OnSetFocus(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& )
1626 return DefWindowProc(uMsg, wParam, lParam);
1629 LRESULT OnMDISetMenu(UINT , WPARAM , LPARAM , BOOL& )
1635 #ifndef _ATL_NO_REBAR_SUPPORT 1636 #if (_WIN32_IE >= 0x0400) 1637 LRESULT OnReBarAutoSize(
int , LPNMHDR , BOOL& )
1639 T* pT =
static_cast<T*
>(
this);
1640 pT->UpdateLayout(FALSE);
1643 #endif // (_WIN32_IE >= 0x0400) 1645 #if (_WIN32_IE >= 0x0500) 1646 LRESULT OnChevronPushed(
int , LPNMHDR pnmh, BOOL& bHandled)
1648 T* pT =
static_cast<T*
>(
this);
1649 _ChevronMenuInfo cmi = { NULL, (LPNMREBARCHEVRON)pnmh,
false };
1650 if(!pT->PrepareChevronMenu(cmi))
1656 pT->DisplayChevronMenu(cmi);
1658 pT->CleanupChevronMenu(cmi);
1661 #endif // (_WIN32_IE >= 0x0500) 1662 #endif // !_ATL_NO_REBAR_SUPPORT 1665 #endif // !_WIN32_WCE 1673 template <
class T,
class TBase = CMDIWindow,
class TWinTraits = ATL::CMDIChildWinTraits>
1677 HWND Create(HWND hWndParent,
ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL,
1678 DWORD dwStyle = 0, DWORD dwExStyle = 0,
1679 UINT nMenuID = 0, LPVOID lpCreateParam = NULL)
1681 ATOM atom = T::GetWndClassInfo().Register(&m_pfnSuperWindowProc);
1684 m_hMenu = ::LoadMenu(ModuleHelper::GetResourceInstance(), MAKEINTRESOURCE(nMenuID));
1686 dwStyle = T::GetWndStyle(dwStyle);
1687 dwExStyle = T::GetWndExStyle(dwExStyle);
1689 dwExStyle |= WS_EX_MDICHILD;
1690 m_pfnSuperWindowProc = ::DefMDIChildProc;
1691 m_hWndMDIClient = hWndParent;
1692 ATLASSERT(::IsWindow(m_hWndMDIClient));
1694 if(rect.m_lpRect == NULL)
1695 rect.m_lpRect = &TBase::rcDefault;
1698 ATL::CWindow wndParent = hWndParent;
1699 BOOL bMaximized = FALSE;
1700 wndParent.SendMessage(WM_MDIGETACTIVE, 0, (LPARAM)&bMaximized);
1702 wndParent.SetRedraw(FALSE);
1711 wndParent.SetRedraw(TRUE);
1712 wndParent.RedrawWindow(NULL, NULL, RDW_INVALIDATE | RDW_ALLCHILDREN);
1713 ::SetFocus(GetMDIFrame());
1715 else if(hWnd != NULL && ::IsWindowVisible(m_hWnd) && !::IsChild(hWnd, ::GetFocus()))
1723 HWND CreateEx(HWND hWndParent,
ATL::_U_RECT rect = NULL, LPCTSTR lpcstrWindowName = NULL, DWORD dwStyle = 0, DWORD dwExStyle = 0, LPVOID lpCreateParam = NULL)
1725 const int cchName = 256;
1726 TCHAR szWindowName[cchName] = { 0 };
1727 if(lpcstrWindowName == NULL)
1729 ::LoadString(ModuleHelper::GetResourceInstance(), T::GetWndClassInfo().m_uCommonResourceID, szWindowName, cchName);
1730 lpcstrWindowName = szWindowName;
1733 T* pT =
static_cast<T*
>(
this);
1734 HWND hWnd = pT->Create(hWndParent, rect, lpcstrWindowName, dwStyle, dwExStyle, T::GetWndClassInfo().m_uCommonResourceID, lpCreateParam);
1737 m_hAccel = ::LoadAccelerators(ModuleHelper::GetResourceInstance(), MAKEINTRESOURCE(T::GetWndClassInfo().m_uCommonResourceID));
1742 BOOL CreateSimpleToolBar(UINT nResourceID = 0, DWORD dwStyle = ATL_SIMPLE_TOOLBAR_STYLE, UINT nID = ATL_IDW_TOOLBAR)
1744 ATLASSERT(!::IsWindow(m_hWndToolBar));
1745 if(nResourceID == 0)
1746 nResourceID = T::GetWndClassInfo().m_uCommonResourceID;
1747 m_hWndToolBar = T::CreateSimpleToolBarCtrl(m_hWnd, nResourceID, TRUE, dwStyle, nID);
1748 return (m_hWndToolBar != NULL);
1751 BOOL UpdateClientEdge(LPRECT lpRect = NULL)
1754 HWND hWndChild = MDIGetActive();
1755 if(hWndChild != NULL && hWndChild != m_hWnd)
1759 DWORD dwStyle = ::GetWindowLong(m_hWndMDIClient, GWL_EXSTYLE);
1760 DWORD dwNewStyle = dwStyle;
1761 if(hWndChild != NULL && ((GetExStyle() & WS_EX_CLIENTEDGE) == 0) && ((GetStyle() & WS_MAXIMIZE) != 0))
1762 dwNewStyle &= ~(WS_EX_CLIENTEDGE);
1764 dwNewStyle |= WS_EX_CLIENTEDGE;
1766 if(dwStyle != dwNewStyle)
1769 ::RedrawWindow(m_hWndMDIClient, NULL, NULL,
1770 RDW_INVALIDATE | RDW_ALLCHILDREN);
1772 ::SetWindowLong(m_hWndMDIClient, GWL_EXSTYLE, dwNewStyle);
1773 ::SetWindowPos(m_hWndMDIClient, NULL, 0, 0, 0, 0,
1774 SWP_FRAMECHANGED | SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE |
1775 SWP_NOZORDER | SWP_NOCOPYBITS);
1779 ::GetClientRect(m_hWndMDIClient, lpRect);
1789 MESSAGE_HANDLER(WM_SIZE, OnSize)
1790 MESSAGE_HANDLER(WM_WINDOWPOSCHANGED, OnWindowPosChanged)
1791 MESSAGE_HANDLER(WM_MOUSEACTIVATE, OnMouseActivate)
1792 MESSAGE_HANDLER(WM_MENUSELECT, OnMenuSelect)
1793 MESSAGE_HANDLER(WM_MDIACTIVATE, OnMDIActivate)
1794 MESSAGE_HANDLER(WM_DESTROY, OnDestroy)
1795 #ifndef _ATL_NO_REBAR_SUPPORT 1796 #if (_WIN32_IE >= 0x0400) 1797 NOTIFY_CODE_HANDLER(RBN_AUTOSIZE, OnReBarAutoSize)
1798 #endif // (_WIN32_IE >= 0x0400) 1799 #if (_WIN32_IE >= 0x0500) 1800 NOTIFY_CODE_HANDLER(RBN_CHEVRONPUSHED, OnChevronPushed)
1801 #endif // (_WIN32_IE >= 0x0500) 1802 #endif // !_ATL_NO_REBAR_SUPPORT 1803 CHAIN_MSG_MAP(_baseClass)
1806 LRESULT OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& )
1808 DefWindowProc(uMsg, wParam, lParam);
1809 if(wParam != SIZE_MINIMIZED)
1811 T* pT =
static_cast<T*
>(
this);
1817 LRESULT OnWindowPosChanged(UINT , WPARAM , LPARAM lParam, BOOL& bHandled)
1820 LPWINDOWPOS lpWndPos = (LPWINDOWPOS)lParam;
1822 if(!(lpWndPos->flags & SWP_NOSIZE))
1825 if(UpdateClientEdge(&rectClient) && ((GetStyle() & WS_MAXIMIZE) != 0))
1827 ::AdjustWindowRectEx(&rectClient, GetStyle(), FALSE, GetExStyle());
1828 lpWndPos->x = rectClient.left;
1829 lpWndPos->y = rectClient.top;
1830 lpWndPos->cx = rectClient.right - rectClient.left;
1831 lpWndPos->cy = rectClient.bottom - rectClient.top;
1839 LRESULT OnMouseActivate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& )
1841 LRESULT lRes = DefWindowProc(uMsg, wParam, lParam);
1844 if(lRes == MA_ACTIVATE || lRes == MA_ACTIVATEANDEAT)
1846 if(MDIGetActive() != m_hWnd)
1847 MDIActivate(m_hWnd);
1853 LRESULT OnMenuSelect(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& )
1855 return ::SendMessage(GetMDIFrame(), uMsg, wParam, lParam);
1858 LRESULT OnMDIActivate(UINT , WPARAM , LPARAM lParam, BOOL& bHandled)
1860 if((HWND)lParam == m_hWnd && m_hMenu != NULL)
1862 else if((HWND)lParam == NULL)
1863 ::SendMessage(GetMDIFrame(), WM_MDISETMENU, 0, 0);
1869 LRESULT OnDestroy(UINT , WPARAM , LPARAM , BOOL& bHandled)
1873 ::DestroyMenu(m_hMenu);
1881 #ifndef _ATL_NO_REBAR_SUPPORT 1882 #if (_WIN32_IE >= 0x0400) 1883 LRESULT OnReBarAutoSize(
int , LPNMHDR , BOOL& )
1885 T* pT =
static_cast<T*
>(
this);
1886 pT->UpdateLayout(FALSE);
1889 #endif // (_WIN32_IE >= 0x0400) 1891 #if (_WIN32_IE >= 0x0500) 1892 LRESULT OnChevronPushed(
int , LPNMHDR pnmh, BOOL& bHandled)
1894 T* pT =
static_cast<T*
>(
this);
1895 _ChevronMenuInfo cmi = { NULL, (LPNMREBARCHEVRON)pnmh,
false };
1896 if(!pT->PrepareChevronMenu(cmi))
1902 pT->DisplayChevronMenu(cmi);
1904 pT->CleanupChevronMenu(cmi);
1907 #endif // (_WIN32_IE >= 0x0500) 1908 #endif // !_ATL_NO_REBAR_SUPPORT 1911 #endif // !_WIN32_WCE 1921 #if (_ATL_VER < 0x0700) 1924 BOOL IsMsgHandled()
const 1926 return m_bHandledOD;
1928 void SetMsgHandled(BOOL bHandled)
1930 m_bHandledOD = bHandled;
1932 #endif // (_ATL_VER < 0x0700) 1936 MESSAGE_HANDLER(WM_DRAWITEM, OnDrawItem)
1937 MESSAGE_HANDLER(WM_MEASUREITEM, OnMeasureItem)
1938 MESSAGE_HANDLER(WM_COMPAREITEM, OnCompareItem)
1939 MESSAGE_HANDLER(WM_DELETEITEM, OnDeleteItem)
1941 MESSAGE_HANDLER(OCM_DRAWITEM, OnDrawItem)
1942 MESSAGE_HANDLER(OCM_MEASUREITEM, OnMeasureItem)
1943 MESSAGE_HANDLER(OCM_COMPAREITEM, OnCompareItem)
1944 MESSAGE_HANDLER(OCM_DELETEITEM, OnDeleteItem)
1947 LRESULT OnDrawItem(UINT , WPARAM , LPARAM lParam, BOOL& bHandled)
1949 T* pT =
static_cast<T*
>(
this);
1950 pT->SetMsgHandled(TRUE);
1951 pT->DrawItem((LPDRAWITEMSTRUCT)lParam);
1952 bHandled = pT->IsMsgHandled();
1953 return (LRESULT)TRUE;
1956 LRESULT OnMeasureItem(UINT , WPARAM , LPARAM lParam, BOOL& bHandled)
1958 T* pT =
static_cast<T*
>(
this);
1959 pT->SetMsgHandled(TRUE);
1960 pT->MeasureItem((LPMEASUREITEMSTRUCT)lParam);
1961 bHandled = pT->IsMsgHandled();
1962 return (LRESULT)TRUE;
1965 LRESULT OnCompareItem(UINT , WPARAM , LPARAM lParam, BOOL& bHandled)
1967 T* pT =
static_cast<T*
>(
this);
1968 pT->SetMsgHandled(TRUE);
1969 bHandled = pT->IsMsgHandled();
1970 return (LRESULT)pT->CompareItem((LPCOMPAREITEMSTRUCT)lParam);
1973 LRESULT OnDeleteItem(UINT , WPARAM , LPARAM lParam, BOOL& bHandled)
1975 T* pT =
static_cast<T*
>(
this);
1976 pT->SetMsgHandled(TRUE);
1977 pT->DeleteItem((LPDELETEITEMSTRUCT)lParam);
1978 bHandled = pT->IsMsgHandled();
1979 return (LRESULT)TRUE;
1983 void DrawItem(LPDRAWITEMSTRUCT )
1989 void MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct)
1991 if(lpMeasureItemStruct->CtlType != ODT_MENU)
1994 T* pT =
static_cast<T*
>(
this);
1995 HWND hWnd = pT->GetDlgItem(lpMeasureItemStruct->CtlID);
1997 TEXTMETRIC tm = { 0 };
1998 dc.GetTextMetrics(&tm);
2000 lpMeasureItemStruct->itemHeight = tm.tmHeight;
2003 lpMeasureItemStruct->itemHeight = ::GetSystemMetrics(SM_CYMENU);
2006 int CompareItem(LPCOMPAREITEMSTRUCT )
2012 void DeleteItem(LPDELETEITEMSTRUCT )
2023 #define BEGIN_UPDATE_UI_MAP(thisClass) \ 2024 static const CUpdateUIBase::_AtlUpdateUIMap* GetUpdateUIMap() \ 2026 static const _AtlUpdateUIMap theMap[] = \ 2029 #define UPDATE_ELEMENT(nID, wType) \ 2032 #define END_UPDATE_UI_MAP() \ 2048 UPDUI_MENUPOPUP = 0x0001,
2049 UPDUI_MENUBAR = 0x0002,
2050 UPDUI_CHILDWINDOW = 0x0004,
2051 UPDUI_TOOLBAR = 0x0008,
2052 UPDUI_STATUSBAR = 0x0010,
2054 UPDUI_ENABLED = 0x0000,
2055 UPDUI_DISABLED = 0x0100,
2056 UPDUI_CHECKED = 0x0200,
2057 UPDUI_CHECKED2 = 0x0400,
2058 UPDUI_RADIO = 0x0800,
2059 UPDUI_DEFAULT = 0x1000,
2060 UPDUI_TEXT = 0x2000,
2062 UPDUI_CLEARDEFAULT = 0x4000,
2072 {
return (m_hWnd == e.m_hWnd && m_wType == e.m_wType); }
2082 {
return (m_nID == e.m_nID && m_wType == e.m_wType); }
2101 {
return (m_wState == e.m_wState && m_lpData == e.m_lpData); }
2104 ATL::CSimpleArray<_AtlUpdateUIElement> m_UIElements;
2109 bool m_bBlockAccelerators;
2113 CUpdateUIBase() : m_pUIMap(NULL), m_pUIData(NULL), m_wDirtyType(0), m_bBlockAccelerators(
false)
2118 if(m_pUIMap != NULL && m_pUIData != NULL)
2122 while(pUIMap->m_nID != (WORD)-1)
2124 if(pUIData->m_wState & UPDUI_TEXT)
2125 delete [] pUIData->m_lpstrText;
2129 delete [] m_pUIData;
2134 bool UIGetBlockAccelerators()
const 2136 return m_bBlockAccelerators;
2139 bool UISetBlockAccelerators(
bool bBlock)
2141 bool bOld = m_bBlockAccelerators;
2142 m_bBlockAccelerators = bBlock;
2147 BOOL UIAddMenuBar(HWND hWnd)
2153 e.m_wType = UPDUI_MENUBAR;
2154 return m_UIElements.Add(e);
2157 BOOL UIAddToolBar(HWND hWnd)
2163 e.m_wType = UPDUI_TOOLBAR;
2164 return m_UIElements.Add(e);
2167 BOOL UIAddStatusBar(HWND hWnd)
2173 e.m_wType = UPDUI_STATUSBAR;
2174 return m_UIElements.Add(e);
2177 BOOL UIAddChildWindowContainer(HWND hWnd)
2183 e.m_wType = UPDUI_CHILDWINDOW;
2184 return m_UIElements.Add(e);
2189 MESSAGE_HANDLER(WM_INITMENUPOPUP, OnInitMenuPopup)
2190 MESSAGE_HANDLER(WM_COMMAND, OnCommand)
2193 LRESULT OnInitMenuPopup(UINT , WPARAM wParam, LPARAM , BOOL& bHandled)
2196 HMENU hMenu = (HMENU)wParam;
2203 while(pMap->m_nID != (WORD)-1)
2205 if(pMap->m_wType & UPDUI_MENUPOPUP)
2207 UIUpdateMenuBarElement(pMap->m_nID, pUIData, hMenu);
2209 if((pUIData->m_wState & UPDUI_RADIO) != 0)
2210 ::CheckMenuRadioItem(hMenu, pUIData->m_nIDFirst, pUIData->m_nIDLast, pMap->m_nID, MF_BYCOMMAND);
2218 LRESULT OnCommand(UINT , WPARAM wParam, LPARAM , BOOL& bHandled)
2221 if(m_bBlockAccelerators && HIWORD(wParam) == 1)
2223 int nID = LOWORD(wParam);
2224 if((UIGetState(nID) & UPDUI_DISABLED) == UPDUI_DISABLED)
2226 ATLTRACE2(atlTraceUI, 0, _T(
"CUpdateUIBase::OnCommand - blocked disabled command 0x%4.4X\n"), nID);
2234 BOOL UIEnable(
int nID, BOOL bEnable, BOOL bForceUpdate = FALSE)
2241 for( ; pMap->m_nID != (WORD)-1; pMap++, pUIData++)
2243 if(nID == (
int)pMap->m_nID)
2247 if(pUIData->m_wState & UPDUI_DISABLED)
2249 pUIData->m_wState |= pMap->m_wType;
2250 pUIData->m_wState &= ~UPDUI_DISABLED;
2255 if(!(pUIData->m_wState & UPDUI_DISABLED))
2257 pUIData->m_wState |= pMap->m_wType;
2258 pUIData->m_wState |= UPDUI_DISABLED;
2263 pUIData->m_wState |= pMap->m_wType;
2264 if(pUIData->m_wState & pMap->m_wType)
2265 m_wDirtyType |= pMap->m_wType;
2274 BOOL UISetCheck(
int nID,
int nCheck, BOOL bForceUpdate = FALSE)
2281 for( ; pMap->m_nID != (WORD)-1; pMap++, pUIData++)
2283 if(nID == (
int)pMap->m_nID)
2288 if((pUIData->m_wState & UPDUI_CHECKED) || (pUIData->m_wState & UPDUI_CHECKED2))
2290 pUIData->m_wState |= pMap->m_wType;
2291 pUIData->m_wState &= ~(UPDUI_CHECKED | UPDUI_CHECKED2);
2295 if(!(pUIData->m_wState & UPDUI_CHECKED))
2297 pUIData->m_wState |= pMap->m_wType;
2298 pUIData->m_wState &= ~UPDUI_CHECKED2;
2299 pUIData->m_wState |= UPDUI_CHECKED;
2303 if(!(pUIData->m_wState & UPDUI_CHECKED2))
2305 pUIData->m_wState |= pMap->m_wType;
2306 pUIData->m_wState &= ~UPDUI_CHECKED;
2307 pUIData->m_wState |= UPDUI_CHECKED2;
2313 pUIData->m_wState |= pMap->m_wType;
2314 if(pUIData->m_wState & pMap->m_wType)
2315 m_wDirtyType |= pMap->m_wType;
2325 BOOL UISetCheck(
int nID,
bool bCheck, BOOL bForceUpdate = FALSE)
2327 return UISetCheck(nID, bCheck ? 1 : 0, bForceUpdate);
2330 BOOL UISetRadio(
int nID, BOOL bRadio, BOOL bForceUpdate = FALSE)
2337 for( ; pMap->m_nID != (WORD)-1; pMap++, pUIData++)
2339 if(nID == (
int)pMap->m_nID)
2343 if(!(pUIData->m_wState & UPDUI_RADIO))
2345 pUIData->m_wState |= pMap->m_wType;
2346 pUIData->m_wState |= UPDUI_RADIO;
2351 if(pUIData->m_wState & UPDUI_RADIO)
2353 pUIData->m_wState |= pMap->m_wType;
2354 pUIData->m_wState &= ~UPDUI_RADIO;
2359 pUIData->m_wState |= pMap->m_wType;
2360 if(pUIData->m_wState & pMap->m_wType)
2361 m_wDirtyType |= pMap->m_wType;
2371 BOOL UISetRadioMenuItem(
int nID,
int nIDFirst,
int nIDLast, BOOL bForceUpdate = FALSE)
2378 for( ; pMap->m_nID != (WORD)-1; pMap++, pUIData++)
2380 if(nID == (
int)pMap->m_nID)
2382 pUIData->m_wState |= pMap->m_wType;
2383 pUIData->m_wState |= UPDUI_RADIO;
2384 pUIData->m_nIDFirst = (WORD)nIDFirst;
2385 pUIData->m_nIDLast = (WORD)nIDLast;
2388 pUIData->m_wState |= pMap->m_wType;
2389 if(pUIData->m_wState & pMap->m_wType)
2390 m_wDirtyType |= pMap->m_wType;
2392 else if(pMap->m_nID >= nIDFirst && pMap->m_nID <= nIDLast)
2394 if(pUIData->m_wState & UPDUI_RADIO)
2396 pUIData->m_wState &= ~pMap->m_wType;
2397 pUIData->m_wState &= ~UPDUI_RADIO;
2398 pUIData->m_nIDFirst = 0;
2399 pUIData->m_nIDLast = 0;
2403 if(pMap->m_nID == nIDLast)
2410 BOOL UISetText(
int nID, LPCTSTR lpstrText, BOOL bForceUpdate = FALSE)
2416 if(lpstrText == NULL)
2419 for( ; pMap->m_nID != (WORD)-1; pMap++, pUIData++)
2421 if(nID == (
int)pMap->m_nID)
2423 if(pUIData->m_lpstrText == NULL || lstrcmp(pUIData->m_lpstrText, lpstrText))
2425 delete [] pUIData->m_lpstrText;
2426 pUIData->m_lpstrText = NULL;
2427 int nStrLen = lstrlen(lpstrText);
2428 ATLTRY(pUIData->m_lpstrText =
new TCHAR[nStrLen + 1]);
2429 if(pUIData->m_lpstrText == NULL)
2431 ATLTRACE2(atlTraceUI, 0, _T(
"UISetText - memory allocation failed\n"));
2434 SecureHelper::strcpy_x(pUIData->m_lpstrText, nStrLen + 1, lpstrText);
2435 pUIData->m_wState |= (UPDUI_TEXT | pMap->m_wType);
2439 pUIData->m_wState |= (UPDUI_TEXT | pMap->m_wType);
2440 if(pUIData->m_wState & pMap->m_wType)
2441 m_wDirtyType |= pMap->m_wType;
2450 BOOL UISetDefault(
int nID, BOOL bDefault, BOOL bForceUpdate = FALSE)
2457 for( ; pMap->m_nID != (WORD)-1; pMap++, pUIData++)
2459 if(nID == (
int)pMap->m_nID)
2463 if((pUIData->m_wState & UPDUI_DEFAULT) == 0)
2465 pUIData->m_wState |= pMap->m_wType;
2466 pUIData->m_wState |= UPDUI_DEFAULT;
2471 if((pUIData->m_wState & UPDUI_DEFAULT) != 0)
2473 pUIData->m_wState |= pMap->m_wType;
2474 pUIData->m_wState &= ~UPDUI_DEFAULT;
2475 pUIData->m_wState |= UPDUI_CLEARDEFAULT;
2480 pUIData->m_wState |= pMap->m_wType;
2481 if(pUIData->m_wState & pMap->m_wType)
2482 m_wDirtyType |= pMap->m_wType;
2492 BOOL UISetState(
int nID, DWORD dwState)
2498 for( ; pMap->m_nID != (WORD)-1; pMap++, pUIData++)
2500 if(nID == (
int)pMap->m_nID)
2502 pUIData->m_wState = (WORD)(dwState | pMap->m_wType);
2503 m_wDirtyType |= pMap->m_wType;
2510 DWORD UIGetState(
int nID)
2516 for( ; pMap->m_nID != (WORD)-1; pMap++, pUIData++)
2518 if(nID == (
int)pMap->m_nID)
2519 return pUIData->m_wState;
2526 BOOL UIUpdateMenuBar(BOOL bForceUpdate = FALSE, BOOL bMainMenu = FALSE)
2528 if(!(m_wDirtyType & UPDUI_MENUBAR) && !bForceUpdate)
2536 while(pMap->m_nID != (WORD)-1)
2538 for(
int i = 0; i < m_UIElements.GetSize(); i++)
2540 if(m_UIElements[i].m_wType == UPDUI_MENUBAR)
2542 HMENU hMenu = ::GetMenu(m_UIElements[i].m_hWnd);
2543 if(hMenu != NULL && (pUIData->m_wState & UPDUI_MENUBAR) && (pMap->m_wType & UPDUI_MENUBAR))
2544 UIUpdateMenuBarElement(pMap->m_nID, pUIData, hMenu);
2547 ::DrawMenuBar(m_UIElements[i].m_hWnd);
2550 pUIData->m_wState &= ~UPDUI_MENUBAR;
2551 if(pUIData->m_wState & UPDUI_TEXT)
2553 delete [] pUIData->m_lpstrText;
2554 pUIData->m_lpstrText = NULL;
2555 pUIData->m_wState &= ~UPDUI_TEXT;
2560 m_wDirtyType &= ~UPDUI_MENUBAR;
2563 #endif // !_WIN32_WCE 2565 BOOL UIUpdateToolBar(BOOL bForceUpdate = FALSE)
2567 if(!(m_wDirtyType & UPDUI_TOOLBAR) && !bForceUpdate)
2575 while(pMap->m_nID != (WORD)-1)
2577 for(
int i = 0; i < m_UIElements.GetSize(); i++)
2579 if(m_UIElements[i].m_wType == UPDUI_TOOLBAR)
2581 if((pUIData->m_wState & UPDUI_TOOLBAR) && (pMap->m_wType & UPDUI_TOOLBAR))
2582 UIUpdateToolBarElement(pMap->m_nID, pUIData, m_UIElements[i].m_hWnd);
2586 pUIData->m_wState &= ~UPDUI_TOOLBAR;
2590 m_wDirtyType &= ~UPDUI_TOOLBAR;
2594 BOOL UIUpdateStatusBar(BOOL bForceUpdate = FALSE)
2596 if(!(m_wDirtyType & UPDUI_STATUSBAR) && !bForceUpdate)
2604 while(pMap->m_nID != (WORD)-1)
2606 for(
int i = 0; i < m_UIElements.GetSize(); i++)
2608 if(m_UIElements[i].m_wType == UPDUI_STATUSBAR)
2610 if((pUIData->m_wState & UPDUI_STATUSBAR) && (pMap->m_wType & UPDUI_STATUSBAR))
2611 UIUpdateStatusBarElement(pMap->m_nID, pUIData, m_UIElements[i].m_hWnd);
2615 pUIData->m_wState &= ~UPDUI_STATUSBAR;
2616 if(pUIData->m_wState & UPDUI_TEXT)
2618 delete [] pUIData->m_lpstrText;
2619 pUIData->m_lpstrText = NULL;
2620 pUIData->m_wState &= ~UPDUI_TEXT;
2625 m_wDirtyType &= ~UPDUI_STATUSBAR;
2629 BOOL UIUpdateChildWindows(BOOL bForceUpdate = FALSE)
2631 if(!(m_wDirtyType & UPDUI_CHILDWINDOW) && !bForceUpdate)
2639 while(pMap->m_nID != (WORD)-1)
2641 for(
int i = 0; i < m_UIElements.GetSize(); i++)
2643 if(m_UIElements[i].m_wType == UPDUI_CHILDWINDOW)
2645 if((pUIData->m_wState & UPDUI_CHILDWINDOW) && (pMap->m_wType & UPDUI_CHILDWINDOW))
2646 UIUpdateChildWindow(pMap->m_nID, pUIData, m_UIElements[i].m_hWnd);
2650 pUIData->m_wState &= ~UPDUI_CHILDWINDOW;
2651 if(pUIData->m_wState & UPDUI_TEXT)
2653 delete [] pUIData->m_lpstrText;
2654 pUIData->m_lpstrText = NULL;
2655 pUIData->m_wState &= ~UPDUI_TEXT;
2660 m_wDirtyType &= ~UPDUI_CHILDWINDOW;
2665 static void UIUpdateMenuBarElement(
int nID,
_AtlUpdateUIData* pUIData, HMENU hMenu)
2668 if((pUIData->m_wState & UPDUI_CLEARDEFAULT) != 0)
2670 ::SetMenuDefaultItem(hMenu, (UINT)-1, 0);
2671 pUIData->m_wState &= ~UPDUI_CLEARDEFAULT;
2673 #endif // !_WIN32_WCE 2676 mii.fMask = MIIM_STATE;
2680 if((pUIData->m_wState & UPDUI_DISABLED) != 0)
2681 mii.fState |= MFS_DISABLED | MFS_GRAYED;
2683 mii.fState |= MFS_ENABLED;
2685 if((pUIData->m_wState & UPDUI_CHECKED) != 0)
2686 mii.fState |= MFS_CHECKED;
2688 mii.fState |= MFS_UNCHECKED;
2690 if((pUIData->m_wState & UPDUI_DEFAULT) != 0)
2691 mii.fState |= MFS_DEFAULT;
2692 #else // CE specific 2695 UINT uEnable = MF_BYCOMMAND;
2696 if((pUIData->m_wState & UPDUI_DISABLED) != 0)
2697 uEnable |= MF_GRAYED;
2699 uEnable |= MF_ENABLED;
2700 ::EnableMenuItem(hMenu, nID, uEnable);
2702 UINT uCheck = MF_BYCOMMAND;
2703 if((pUIData->m_wState & UPDUI_CHECKED) != 0)
2704 uCheck |= MF_CHECKED;
2706 uCheck |= MF_UNCHECKED;
2707 ::CheckMenuItem(hMenu, nID, uCheck);
2708 #endif // _WIN32_WCE 2710 if((pUIData->m_wState & UPDUI_TEXT) != 0)
2713 miiNow.fMask = MIIM_TYPE;
2715 if(::GetMenuItemInfo(hMenu, nID, FALSE, &miiNow))
2717 mii.fMask |= MIIM_TYPE;
2720 mii.fType |= (miiNow.fType & ~(MFT_BITMAP | MFT_SEPARATOR)) | MFT_STRING;
2721 #else // CE specific 2722 mii.fType |= (miiNow.fType & ~(MFT_SEPARATOR)) | MFT_STRING;
2723 #endif // _WIN32_WCE 2724 mii.dwTypeData = pUIData->m_lpstrText;
2728 ::SetMenuItemInfo(hMenu, nID, FALSE, &mii);
2731 static void UIUpdateToolBarElement(
int nID,
_AtlUpdateUIData* pUIData, HWND hWndToolBar)
2734 ::SendMessage(hWndToolBar, TB_ENABLEBUTTON, nID, (LPARAM)(pUIData->m_wState & UPDUI_DISABLED) ? FALSE : TRUE);
2735 ::SendMessage(hWndToolBar, TB_CHECKBUTTON, nID, (LPARAM)(pUIData->m_wState & UPDUI_CHECKED) ? TRUE : FALSE);
2736 ::SendMessage(hWndToolBar, TB_INDETERMINATE, nID, (LPARAM)(pUIData->m_wState & UPDUI_CHECKED2) ? TRUE : FALSE);
2737 ::SendMessage(hWndToolBar, TB_PRESSBUTTON, nID, (LPARAM)(pUIData->m_wState & UPDUI_RADIO) ? TRUE : FALSE);
2740 static void UIUpdateStatusBarElement(
int nID,
_AtlUpdateUIData* pUIData, HWND hWndStatusBar)
2743 if(pUIData->m_wState & UPDUI_TEXT)
2744 ::SendMessage(hWndStatusBar, SB_SETTEXT, nID, (LPARAM)pUIData->m_lpstrText);
2747 static void UIUpdateChildWindow(
int nID,
_AtlUpdateUIData* pUIData, HWND hWnd)
2749 HWND hChild = ::GetDlgItem(hWnd, nID);
2751 ::EnableWindow(hChild, (pUIData->m_wState & UPDUI_DISABLED) ? FALSE : TRUE);
2753 int nCheck = BST_UNCHECKED;
2754 if(pUIData->m_wState & UPDUI_CHECKED || pUIData->m_wState & UPDUI_RADIO)
2755 nCheck = BST_CHECKED;
2756 else if(pUIData->m_wState & UPDUI_CHECKED2)
2757 nCheck = BST_INDETERMINATE;
2758 ::SendMessage(hChild, BM_SETCHECK, nCheck, 0L);
2759 if(pUIData->m_wState & UPDUI_DEFAULT)
2761 DWORD dwRet = (DWORD)::SendMessage(hWnd, DM_GETDEFID, 0, 0L);
2762 if(HIWORD(dwRet) == DC_HASDEFID)
2764 HWND hOldDef = ::GetDlgItem(hWnd, (
int)(
short)LOWORD(dwRet));
2766 ::SendMessage(hOldDef, BM_SETSTYLE, BS_PUSHBUTTON, MAKELPARAM(TRUE, 0));
2768 ::SendMessage(hWnd, DM_SETDEFID, nID, 0L);
2770 if(pUIData->m_wState & UPDUI_TEXT)
2771 ::SetWindowText(hChild, pUIData->m_lpstrText);
2781 T* pT =
static_cast<T*
>(
this);
2785 ATLASSERT(m_pUIMap != NULL);
2787 for(nCount = 1; pMap->m_nID != (WORD)-1; nCount++)
2792 for(
int i = 0; i < nCount; i++)
2794 for(
int j = 0; j < nCount; j++)
2798 ATLASSERT(m_pUIMap[j].m_nID != m_pUIMap[i].m_nID);
2804 ATLASSERT(m_pUIData != NULL);
2806 if(m_pUIData != NULL)
2821 ATL::CSimpleArray<_AtlUpdateUIMap> m_arrUIMap;
2822 ATL::CSimpleArray<_AtlUpdateUIData> m_arrUIData;
2827 T* pT =
static_cast<T*
>(
this);
2830 ATLASSERT(pMap != NULL);
2839 _AtlUpdateUIData data = { 0, NULL };
2840 bRet = m_arrUIData.Add(data);
2844 if(pMap->m_nID == (WORD)-1)
2850 ATLASSERT(m_arrUIMap.GetSize() == m_arrUIData.GetSize());
2854 for(
int i = 0; i < m_arrUIMap.GetSize(); i++)
2856 for(
int j = 0; j < m_arrUIMap.GetSize(); j++)
2860 ATLASSERT(m_arrUIMap[j].m_nID != m_arrUIMap[i].m_nID);
2866 m_pUIMap = m_arrUIMap.m_aT;
2867 m_pUIData = m_arrUIData.m_aT;
2872 for(
int i = 0; i < m_arrUIData.GetSize(); i++)
2874 if((m_arrUIData[i].m_wState & UPDUI_TEXT) != 0)
2875 delete [] m_arrUIData[i].m_lpstrText;
2884 bool UIAddUpdateElement(WORD nID, WORD wType)
2887 for(
int i = 0; i < m_arrUIMap.GetSize(); i++)
2890 ATLASSERT(m_arrUIMap[i].m_nID != nID);
2891 if(m_arrUIMap[i].m_nID == nID)
2895 bool bRetVal =
false;
2899 BOOL bRet = m_arrUIMap.Add(uumEnd);
2904 _AtlUpdateUIData uud = { 0, NULL };
2905 bRet = m_arrUIData.Add(uud);
2911 int nSize = m_arrUIMap.GetSize();
2913 m_arrUIMap.SetAtIndex(nSize - 2, uum);
2914 m_arrUIData.SetAtIndex(nSize - 2, uud);
2917 m_pUIMap = m_arrUIMap.m_aT;
2918 m_pUIData = m_arrUIData.m_aT;
2927 bool UIRemoveUpdateElement(WORD nID)
2929 bool bRetVal =
false;
2931 for(
int i = 0; i < m_arrUIMap.GetSize(); i++)
2933 if(m_arrUIMap[i].m_nID == nID)
2935 BOOL bRet = m_arrUIMap.RemoveAt(i);
2937 bRet = m_arrUIData.RemoveAt(i);
2957 LPCTSTR UIGetText(
int nID)
2959 for(
int i = 0; i < m_arrUIMap.GetSize(); i++)
2961 if(m_arrUIMap[i].m_nID == nID)
2962 return m_arrUIData[i].m_lpstrText;
2969 template <WORD t_wType>
2970 bool UIAddElement(UINT nID)
2973 for(
int i = 0; i < m_arrUIMap.GetSize(); i++)
2975 if(m_arrUIMap[i].m_nID == nID)
2978 m_arrUIMap[i].m_wType |= t_wType;
2984 return UIAddUpdateElement((WORD)nID, t_wType);
2987 template <WORD t_wType>
2988 bool UIRemoveElement(UINT nID)
2990 for(
int i = 0; i < m_arrUIMap.GetSize(); i++)
2992 if(m_arrUIMap[i].m_nID == nID)
2994 WORD wType = m_arrUIMap[i].m_wType & ~t_wType;
2997 m_arrUIMap[i].m_wType = wType;
3002 return UIRemoveUpdateElement((WORD)nID);
3011 bool UIAddMenu(HMENU hMenu,
bool bSetText =
false)
3013 #if defined(_WIN32_WCE) && (_ATL_VER >= 0x0800) 3014 using ATL::GetMenuString;
3016 ATLASSERT(::IsMenu(hMenu));
3017 MENUITEMINFO mii = {
sizeof(MENUITEMINFO), MIIM_TYPE | MIIM_ID | MIIM_SUBMENU};
3020 for (INT uItem = 0;
CMenuHandle(hMenu).GetMenuItemInfo(uItem, TRUE, &mii); uItem++)
3025 UIAddMenu(mii.hSubMenu, bSetText);
3030 UIAddElement<UPDUI_MENUPOPUP>(mii.wID);
3031 #if !defined(_WIN32_WCE) || (_ATL_VER >= 0x0800) 3034 TCHAR sText[64] = { 0 };
3035 if (GetMenuString(hMenu, uItem, sText, 64, MF_BYPOSITION))
3036 UISetText(mii.wID, sText);
3040 #endif // !defined(_WIN32_WCE) || (_ATL_VER >= 0x0800) 3047 bool UIAddMenu(UINT uID,
bool bSetText =
false)
3050 ATLVERIFY(menu.LoadMenu(uID));
3051 return UIAddMenu(menu, bSetText);
3056 #define BTNS_SEP TBSTYLE_SEP 3057 #endif // BTNS_SEP compatibility 3059 #if !defined(_WIN32_WCE) || (defined(_AUTOUI_CE_TOOLBAR) && defined(TBIF_BYINDEX)) 3060 bool UIAddToolBar(HWND hWndToolBar)
3062 ATLASSERT(::IsWindow(hWndToolBar));
3063 TBBUTTONINFO tbbi = {
sizeof TBBUTTONINFO, TBIF_COMMAND | TBIF_STYLE | TBIF_BYINDEX};
3066 for (
int uItem = 0; ::SendMessage(hWndToolBar, TB_GETBUTTONINFO, uItem, (LPARAM)&tbbi) != -1; uItem++)
3068 if (tbbi.fsStyle ^ BTNS_SEP)
3069 UIAddElement<UPDUI_TOOLBAR>(tbbi.idCommand);
3073 if (::GetWindow(hWndToolBar, GW_CHILD))
3074 UIAddChildWindowContainer(hWndToolBar);
3076 return (CUpdateUIBase::UIAddToolBar(hWndToolBar) != FALSE);
3078 #endif // !defined(_WIN32_WCE) || (defined(_AUTOUI_CE_TOOLBAR) && defined(TBIF_BYINDEX)) 3081 bool UIAddChildWindowContainer(HWND hWnd)
3083 ATLASSERT(::IsWindow(hWnd));
3086 for (ATL::CWindow wCtl = ::GetWindow(hWnd, GW_CHILD); wCtl.IsWindow(); wCtl = wCtl.GetWindow(GW_HWNDNEXT))
3088 if (
int id = wCtl.GetDlgCtrlID())
3089 UIAddElement<UPDUI_CHILDWINDOW>(
id);
3092 return (CUpdateUIBase::UIAddChildWindowContainer(hWnd) != FALSE);
3096 BOOL UIUpdateStatusBar(BOOL bForceUpdate = FALSE)
3098 if(!(m_wDirtyType & UPDUI_STATUSBAR) && !bForceUpdate)
3101 for(
int i = 0; i < m_arrUIMap.GetSize(); i++)
3103 for(
int e = 0; e < m_UIElements.GetSize(); e++)
3105 if((m_UIElements[e].m_wType == UPDUI_STATUSBAR) &&
3106 (m_arrUIMap[i].m_wType & UPDUI_STATUSBAR) &&
3107 (m_arrUIData[i].m_wState & UPDUI_STATUSBAR))
3109 UIUpdateStatusBarElement(m_arrUIMap[i].m_nID, &m_arrUIData[i], m_UIElements[e].m_hWnd);
3110 m_arrUIData[i].m_wState &= ~UPDUI_STATUSBAR;
3111 if(m_arrUIData[i].m_wState & UPDUI_TEXT)
3112 m_arrUIData[i].m_wState &= ~UPDUI_TEXT;
3117 m_wDirtyType &= ~UPDUI_STATUSBAR;
3121 bool UIAddStatusBar(HWND hWndStatusBar, INT nPanes = 1)
3123 ATLASSERT(::IsWindow(hWndStatusBar));
3126 for (
int iPane = 0; iPane < nPanes; iPane++)
3127 UIAddElement<UPDUI_STATUSBAR>(ID_DEFAULT_PANE + iPane);
3129 return (CUpdateUIBase::UIAddStatusBar(hWndStatusBar) != FALSE);
3155 #define BEGIN_DLGRESIZE_MAP(thisClass) \ 3156 static const _AtlDlgResizeMap* GetDlgResizeMap() \ 3158 static const _AtlDlgResizeMap theMap[] = \ 3161 #define END_DLGRESIZE_MAP() \ 3167 #define DLGRESIZE_CONTROL(id, flags) \ 3170 #define BEGIN_DLGRESIZE_GROUP() \ 3171 { -1, _DLSZ_BEGIN_GROUP }, 3173 #define END_DLGRESIZE_GROUP() \ 3174 { -1, _DLSZ_END_GROUP }, 3184 DLSZ_SIZE_X = 0x00000001,
3185 DLSZ_SIZE_Y = 0x00000002,
3186 DLSZ_MOVE_X = 0x00000004,
3187 DLSZ_MOVE_Y = 0x00000008,
3188 DLSZ_REPAINT = 0x00000010,
3189 DLSZ_CENTER_X = 0x00000020,
3190 DLSZ_CENTER_Y = 0x00000040,
3193 _DLSZ_BEGIN_GROUP = 0x00001000,
3194 _DLSZ_END_GROUP = 0x00002000,
3195 _DLSZ_GRIPPER = 0x00004000
3201 DWORD m_dwResizeFlags;
3207 DWORD m_dwResizeFlags;
3210 int GetGroupCount()
const 3212 return (
int)LOBYTE(HIWORD(m_dwResizeFlags));
3215 void SetGroupCount(
int nCount)
3217 ATLASSERT(nCount > 0 && nCount < 256);
3218 DWORD dwCount = (DWORD)MAKELONG(0, MAKEWORD(nCount, 0));
3219 m_dwResizeFlags &= 0xFF00FFFF;
3220 m_dwResizeFlags |= dwCount;
3224 {
return (m_nCtlID == r.m_nCtlID && m_dwResizeFlags == r.m_dwResizeFlags); }
3227 ATL::CSimpleArray<_AtlDlgResizeData> m_arrData;
3229 POINT m_ptMinTrackSize;
3236 m_sizeDialog.cx = 0;
3237 m_sizeDialog.cy = 0;
3238 m_ptMinTrackSize.x = -1;
3239 m_ptMinTrackSize.y = -1;
3243 void DlgResize_Init(
bool bAddGripper =
true,
bool bUseMinTrackSize =
true, DWORD dwForceStyle = WS_CLIPCHILDREN)
3245 T* pT =
static_cast<T*
>(
this);
3246 ATLASSERT(::IsWindow(pT->m_hWnd));
3248 DWORD dwStyle = pT->GetStyle();
3252 if(((dwStyle & WS_CHILD) == 0) && ((dwStyle & WS_THICKFRAME) == 0))
3253 ATLTRACE2(atlTraceUI, 0, _T(
"DlgResize_Init - warning: top level dialog without the WS_THICKFRAME style - user cannot resize it\n"));
3257 if((dwStyle & dwForceStyle) != dwForceStyle)
3258 pT->ModifyStyle(0, dwForceStyle);
3263 if((dwStyle & WS_CHILD) == 0)
3265 pT->ModifyStyleEx(0, WS_EX_DLGMODALFRAME);
3266 if(pT->GetIcon(FALSE) == NULL)
3267 pT->SetIcon(NULL, FALSE);
3273 ATL::CWindow wndGripper = pT->GetDlgItem(ATL_IDW_STATUS_BAR);
3274 if(wndGripper.IsWindow() && m_arrData.GetSize() > 0 && (m_arrData[0].m_dwResizeFlags & _DLSZ_GRIPPER) != 0)
3275 wndGripper.DestroyWindow();
3278 m_arrData.RemoveAll();
3279 m_sizeDialog.cx = 0;
3280 m_sizeDialog.cy = 0;
3281 m_ptMinTrackSize.x = -1;
3282 m_ptMinTrackSize.y = -1;
3285 RECT rectDlg = { 0 };
3286 pT->GetClientRect(&rectDlg);
3287 m_sizeDialog.cx = rectDlg.right;
3288 m_sizeDialog.cy = rectDlg.bottom;
3296 ATLASSERT(!::IsWindow(pT->GetDlgItem(ATL_IDW_STATUS_BAR)));
3297 if(!::IsWindow(pT->GetDlgItem(ATL_IDW_STATUS_BAR)))
3299 ATL::CWindow wndGripper;
3300 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);
3301 ATLASSERT(wndGripper.IsWindow());
3302 if(wndGripper.IsWindow())
3305 RECT rectCtl = { 0 };
3306 wndGripper.GetWindowRect(&rectCtl);
3307 ::MapWindowPoints(NULL, pT->m_hWnd, (LPPOINT)&rectCtl, 2);
3308 _AtlDlgResizeData data = { ATL_IDW_STATUS_BAR, DLSZ_MOVE_X | DLSZ_MOVE_Y | DLSZ_REPAINT | _DLSZ_GRIPPER, { rectCtl.left, rectCtl.top, rectCtl.right, rectCtl.bottom } };
3309 m_arrData.Add(data);
3313 #else // CE specific 3315 #endif // _WIN32_WCE 3318 if(bUseMinTrackSize)
3320 if((dwStyle & WS_CHILD) != 0)
3323 pT->GetClientRect(&rect);
3324 m_ptMinTrackSize.x = rect.right - rect.left;
3325 m_ptMinTrackSize.y = rect.bottom - rect.top;
3330 pT->GetWindowRect(&rect);
3331 m_ptMinTrackSize.x = rect.right - rect.left;
3332 m_ptMinTrackSize.y = rect.bottom - rect.top;
3338 ATLASSERT(pMap != NULL);
3339 int nGroupStart = -1;
3340 for(
int nCount = 1; !(pMap->m_nCtlID == -1 && pMap->m_dwResizeFlags == 0); nCount++, pMap++)
3342 if(pMap->m_nCtlID == -1)
3344 switch(pMap->m_dwResizeFlags)
3346 case _DLSZ_BEGIN_GROUP:
3347 ATLASSERT(nGroupStart == -1);
3348 nGroupStart = m_arrData.GetSize();
3350 case _DLSZ_END_GROUP:
3352 ATLASSERT(nGroupStart != -1);
3353 int nGroupCount = m_arrData.GetSize() - nGroupStart;
3354 m_arrData[nGroupStart].SetGroupCount(nGroupCount);
3359 ATLASSERT(FALSE && _T(
"Invalid DLGRESIZE Map Entry"));
3366 ATLASSERT(m_bGripper ? (pMap->m_nCtlID != ATL_IDW_STATUS_BAR) : TRUE);
3368 ATL::CWindow ctl = pT->GetDlgItem(pMap->m_nCtlID);
3369 ATLASSERT(ctl.IsWindow());
3370 RECT rectCtl = { 0 };
3371 ctl.GetWindowRect(&rectCtl);
3372 ::MapWindowPoints(NULL, pT->m_hWnd, (LPPOINT)&rectCtl, 2);
3374 DWORD dwGroupFlag = (nGroupStart != -1 && m_arrData.GetSize() == nGroupStart) ? _DLSZ_BEGIN_GROUP : 0;
3375 _AtlDlgResizeData data = { pMap->m_nCtlID, pMap->m_dwResizeFlags | dwGroupFlag, { rectCtl.left, rectCtl.top, rectCtl.right, rectCtl.bottom } };
3376 m_arrData.Add(data);
3379 ATLASSERT((nGroupStart == -1) && _T(
"No End Group Entry in the DLGRESIZE Map"));
3382 void DlgResize_UpdateLayout(
int cxWidth,
int cyHeight)
3384 T* pT =
static_cast<T*
>(
this);
3385 ATLASSERT(::IsWindow(pT->m_hWnd));
3388 if(((pT->GetStyle() & WS_CHILD) != 0) && m_ptMinTrackSize.x != -1 && m_ptMinTrackSize.y != -1)
3390 if(cxWidth < m_ptMinTrackSize.x)
3391 cxWidth = m_ptMinTrackSize.x;
3392 if(cyHeight < m_ptMinTrackSize.y)
3393 cyHeight = m_ptMinTrackSize.y;
3396 BOOL bVisible = pT->IsWindowVisible();
3398 pT->SetRedraw(FALSE);
3400 for(
int i = 0; i < m_arrData.GetSize(); i++)
3402 if((m_arrData[i].m_dwResizeFlags & _DLSZ_BEGIN_GROUP) != 0)
3404 int nGroupCount = m_arrData[i].GetGroupCount();
3405 ATLASSERT(nGroupCount > 0 && i + nGroupCount - 1 < m_arrData.GetSize());
3406 RECT rectGroup = m_arrData[i].m_rect;
3409 for(j = 1; j < nGroupCount; j++)
3411 rectGroup.left = min(rectGroup.left, m_arrData[i + j].m_rect.left);
3412 rectGroup.top = min(rectGroup.top, m_arrData[i + j].m_rect.top);
3413 rectGroup.right = max(rectGroup.right, m_arrData[i + j].m_rect.right);
3414 rectGroup.bottom = max(rectGroup.bottom, m_arrData[i + j].m_rect.bottom);
3417 for(j = 0; j < nGroupCount; j++)
3421 pDataPrev = &(m_arrData[i + j - 1]);
3422 pT->DlgResize_PositionControl(cxWidth, cyHeight, rectGroup, m_arrData[i + j],
true, pDataPrev);
3425 i += nGroupCount - 1;
3429 RECT rectGroup = { 0, 0, 0, 0 };
3430 pT->DlgResize_PositionControl(cxWidth, cyHeight, rectGroup, m_arrData[i],
false);
3435 pT->SetRedraw(TRUE);
3437 pT->RedrawWindow(NULL, NULL, RDW_ERASE | RDW_INVALIDATE | RDW_UPDATENOW | RDW_ALLCHILDREN);
3442 MESSAGE_HANDLER(WM_SIZE, OnSize)
3444 MESSAGE_HANDLER(WM_GETMINMAXINFO, OnGetMinMaxInfo)
3445 #endif // _WIN32_WCE 3448 LRESULT OnSize(UINT , WPARAM wParam, LPARAM lParam, BOOL& )
3450 T* pT =
static_cast<T*
>(
this);
3454 ATL::CWindow wndGripper = pT->GetDlgItem(ATL_IDW_STATUS_BAR);
3455 if(wParam == SIZE_MAXIMIZED)
3456 wndGripper.ShowWindow(SW_HIDE);
3457 else if(wParam == SIZE_RESTORED)
3458 wndGripper.ShowWindow(SW_SHOW);
3460 #endif // _WIN32_WCE 3461 if(wParam != SIZE_MINIMIZED)
3463 ATLASSERT(::IsWindow(pT->m_hWnd));
3464 pT->DlgResize_UpdateLayout(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam));
3470 LRESULT OnGetMinMaxInfo(UINT , WPARAM , LPARAM lParam, BOOL& )
3472 if(m_ptMinTrackSize.x != -1 && m_ptMinTrackSize.y != -1)
3474 LPMINMAXINFO lpMMI = (LPMINMAXINFO)lParam;
3475 lpMMI->ptMinTrackSize = m_ptMinTrackSize;
3479 #endif // _WIN32_WCE 3482 bool DlgResize_PositionControl(
int cxWidth,
int cyHeight, RECT& rectGroup,
_AtlDlgResizeData& data,
bool bGroup,
3485 T* pT =
static_cast<T*
>(
this);
3486 ATLASSERT(::IsWindow(pT->m_hWnd));
3488 RECT rectCtl = { 0 };
3490 ctl = pT->GetDlgItem(data.m_nCtlID);
3491 if(!ctl.GetWindowRect(&rectCtl))
3493 ::MapWindowPoints(NULL, pT->m_hWnd, (LPPOINT)&rectCtl, 2);
3497 if((data.m_dwResizeFlags & DLSZ_CENTER_X) != 0)
3499 int cxRight = rectGroup.right + cxWidth - m_sizeDialog.cx;
3500 int cxCtl = data.m_rect.right - data.m_rect.left;
3501 rectCtl.left = rectGroup.left + (cxRight - rectGroup.left - cxCtl) / 2;
3502 rectCtl.right = rectCtl.left + cxCtl;
3504 else if((data.m_dwResizeFlags & (DLSZ_SIZE_X | DLSZ_MOVE_X)) != 0)
3506 rectCtl.left = rectGroup.left + ::MulDiv(data.m_rect.left - rectGroup.left, rectGroup.right - rectGroup.left + (cxWidth - m_sizeDialog.cx), rectGroup.right - rectGroup.left);
3508 if((data.m_dwResizeFlags & DLSZ_SIZE_X) != 0)
3510 rectCtl.right = rectGroup.left + ::MulDiv(data.m_rect.right - rectGroup.left, rectGroup.right - rectGroup.left + (cxWidth - m_sizeDialog.cx), rectGroup.right - rectGroup.left);
3512 if(pDataPrev != NULL)
3514 ATL::CWindow ctlPrev = pT->GetDlgItem(pDataPrev->m_nCtlID);
3515 RECT rcPrev = { 0 };
3516 ctlPrev.GetWindowRect(&rcPrev);
3517 ::MapWindowPoints(NULL, pT->m_hWnd, (LPPOINT)&rcPrev, 2);
3518 int dxAdjust = (rectCtl.left - rcPrev.right) - (data.m_rect.left - pDataPrev->m_rect.right);
3519 rcPrev.right += dxAdjust;
3520 ctlPrev.SetWindowPos(NULL, &rcPrev, SWP_NOZORDER | SWP_NOACTIVATE | SWP_NOMOVE);
3525 rectCtl.right = rectCtl.left + (data.m_rect.right - data.m_rect.left);
3529 if((data.m_dwResizeFlags & DLSZ_CENTER_Y) != 0)
3531 int cyBottom = rectGroup.bottom + cyHeight - m_sizeDialog.cy;
3532 int cyCtl = data.m_rect.bottom - data.m_rect.top;
3533 rectCtl.top = rectGroup.top + (cyBottom - rectGroup.top - cyCtl) / 2;
3534 rectCtl.bottom = rectCtl.top + cyCtl;
3536 else if((data.m_dwResizeFlags & (DLSZ_SIZE_Y | DLSZ_MOVE_Y)) != 0)
3538 rectCtl.top = rectGroup.top + ::MulDiv(data.m_rect.top - rectGroup.top, rectGroup.bottom - rectGroup.top + (cyHeight - m_sizeDialog.cy), rectGroup.bottom - rectGroup.top);
3540 if((data.m_dwResizeFlags & DLSZ_SIZE_Y) != 0)
3542 rectCtl.bottom = rectGroup.top + ::MulDiv(data.m_rect.bottom - rectGroup.top, rectGroup.bottom - rectGroup.top + (cyHeight - m_sizeDialog.cy), rectGroup.bottom - rectGroup.top);
3544 if(pDataPrev != NULL)
3546 ATL::CWindow ctlPrev = pT->GetDlgItem(pDataPrev->m_nCtlID);
3547 RECT rcPrev = { 0 };
3548 ctlPrev.GetWindowRect(&rcPrev);
3549 ::MapWindowPoints(NULL, pT->m_hWnd, (LPPOINT)&rcPrev, 2);
3550 int dxAdjust = (rectCtl.top - rcPrev.bottom) - (data.m_rect.top - pDataPrev->m_rect.bottom);
3551 rcPrev.bottom += dxAdjust;
3552 ctlPrev.SetWindowPos(NULL, &rcPrev, SWP_NOZORDER | SWP_NOACTIVATE | SWP_NOMOVE);
3557 rectCtl.bottom = rectCtl.top + (data.m_rect.bottom - data.m_rect.top);
3563 if((data.m_dwResizeFlags & DLSZ_CENTER_X) != 0)
3565 int cxCtl = data.m_rect.right - data.m_rect.left;
3566 rectCtl.left = (cxWidth - cxCtl) / 2;
3567 rectCtl.right = rectCtl.left + cxCtl;
3569 else if((data.m_dwResizeFlags & (DLSZ_SIZE_X | DLSZ_MOVE_X)) != 0)
3571 rectCtl.right = data.m_rect.right + (cxWidth - m_sizeDialog.cx);
3573 if((data.m_dwResizeFlags & DLSZ_MOVE_X) != 0)
3574 rectCtl.left = rectCtl.right - (data.m_rect.right - data.m_rect.left);
3577 if((data.m_dwResizeFlags & DLSZ_CENTER_Y) != 0)
3579 int cyCtl = data.m_rect.bottom - data.m_rect.top;
3580 rectCtl.top = (cyHeight - cyCtl) / 2;
3581 rectCtl.bottom = rectCtl.top + cyCtl;
3583 else if((data.m_dwResizeFlags & (DLSZ_SIZE_Y | DLSZ_MOVE_Y)) != 0)
3585 rectCtl.bottom = data.m_rect.bottom + (cyHeight - m_sizeDialog.cy);
3587 if((data.m_dwResizeFlags & DLSZ_MOVE_Y) != 0)
3588 rectCtl.top = rectCtl.bottom - (data.m_rect.bottom - data.m_rect.top);
3592 if((data.m_dwResizeFlags & DLSZ_REPAINT) != 0)
3595 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)
3596 ctl.SetWindowPos(NULL, &rectCtl, SWP_NOZORDER | SWP_NOACTIVATE);
3619 MESSAGE_HANDLER(WM_ERASEBKGND, OnEraseBackground)
3620 MESSAGE_HANDLER(WM_PAINT, OnPaint)
3622 MESSAGE_HANDLER(WM_PRINTCLIENT, OnPaint)
3623 #endif // !_WIN32_WCE 3626 LRESULT OnEraseBackground(UINT , WPARAM , LPARAM , BOOL& )
3631 LRESULT OnPaint(UINT , WPARAM wParam, LPARAM , BOOL& )
3633 T* pT =
static_cast<T*
>(
this);
3634 ATLASSERT(::IsWindow(pT->m_hWnd));
3639 pT->GetClientRect(&rect);
3641 pT->DoPaint(dcMem.m_hDC);
3646 CMemoryDC dcMem(dc.m_hDC, dc.m_ps.rcPaint);
3647 pT->DoPaint(dcMem.m_hDC);
3658 template <
class T,
class TBase = ATL::CWindow,
class TWinTraits = ATL::CControlWinTraits>
3669 #if !defined(__ATLCTRLW_H__) && !defined(_WIN32_WCE) 3671 #undef CBRM_TRACKPOPUPMENU 3672 #undef CBRM_GETCMDBAR 3674 #endif // !defined(__ATLCTRLW_H__) && !defined(_WIN32_WCE) 3678 #endif // __ATLFRAME_H__
Definition: atlframe.h:2041
Definition: atlframe.h:3178
Definition: atlgdi.h:3388
Definition: atlframe.h:52
Definition: atlframe.h:2086
Definition: atlframe.h:3198
Definition: atlframe.h:369
Definition: atlapp.h:1262
Definition: atlframe.h:2066
Definition: atlframe.h:3659
Definition: atlframe.h:2817
Definition: atlframe.h:2076
Definition: atlapp.h:1317
Definition: atlframe.h:1427
Definition: atlgdi.h:1211
Definition: atlwinx.h:435
Definition: atlframe.h:2776
Definition: atlgdi.h:3364
Definition: atlframe.h:3607
Definition: atlframe.h:1286
Definition: atlgdi.h:3430
Definition: atlframe.h:3204
Definition: atlframe.h:1674
Definition: atlframe.h:1137
Definition: atlframe.h:1918
Definition: atlframe.h:2954