void COleDocument::OnIdle() { ASSERT_VALID(this); // determine if any visible views are on this document BOOL bVisible = FALSE; POSITION pos = GetFirstViewPosition(); while (pos != NULL) { CView* pView = GetNextView(pos); ENSURE_VALID(pView); CFrameWnd* pFrameWnd = pView->EnsureParentFrame(); if (pFrameWnd->GetStyle() & WS_VISIBLE) { bVisible = TRUE; break; } } // when state has changed, call OnShowViews if (bVisible != m_bLastVisible) { OnShowViews(bVisible); m_bLastVisible = bVisible; } }
int CMDIChildWnd::OnMouseActivate(CWnd* pDesktopWnd, UINT nHitTest, UINT message) { int nResult = CFrameWnd::OnMouseActivate(pDesktopWnd, nHitTest, message); if (nResult == MA_NOACTIVATE || nResult == MA_NOACTIVATEANDEAT) return nResult; // frame does not want to activate // activate this window if necessary CMDIFrameWnd* pFrameWnd = GetMDIFrame(); ENSURE_VALID(pFrameWnd); CMDIChildWnd* pActive = pFrameWnd->MDIGetActive(); if (pActive != this) MDIActivate(); return nResult; }
void* CPtrList::RemoveHead() { ENSURE_VALID(this); ENSURE(m_pNodeHead != NULL); // throws if called on empty list ASSERT(AfxIsValidAddress(m_pNodeHead, sizeof(CNode))); CNode* pOldNode = m_pNodeHead; void* returnValue = pOldNode->data; m_pNodeHead = pOldNode->pNext; if (m_pNodeHead != NULL) m_pNodeHead->pPrev = NULL; else m_pNodeTail = NULL; FreeNode(pOldNode); return returnValue; }
void COleCntrFrameWnd::RecalcLayout(BOOL /*bNotify*/) { if (!m_bInRecalcLayout) { m_bInRecalcLayout = TRUE; m_nIdleFlags &= ~(idleLayout|idleNotify); ASSERT_VALID(m_pInPlaceFrame); COleServerDoc* pDoc = (COleServerDoc*)m_pInPlaceFrame->GetActiveDocument(); CWinThread *pThread = AfxGetThread(); ENSURE_VALID(pThread); if (pDoc != NULL && pThread->m_pActiveWnd == m_pInPlaceFrame) { ASSERT_VALID(pDoc); ASSERT_KINDOF(COleServerDoc, pDoc); if (this == m_pInPlaceFrame->m_pMainFrame) pDoc->OnResizeBorder(NULL, m_pInPlaceFrame->m_lpFrame, TRUE); if (this == m_pInPlaceFrame->m_pDocFrame) pDoc->OnResizeBorder(NULL, m_pInPlaceFrame->m_lpDocFrame, FALSE); } m_bInRecalcLayout = FALSE; } }
BOOL CMyRectTracker::TrackHandle(int nHandle, CWnd* pWnd, CPoint point, CWnd* pWndClipTo) { ASSERT(nHandle >= 0); ASSERT(nHandle <= 8); // handle 8 is inside the rect // don't handle if capture already set if (::GetCapture() != NULL) return FALSE; AfxLockTempMaps(); // protect maps while looping ASSERT(!m_bFinalErase); // save original width & height in pixels int nWidth = m_rect.Width(); int nHeight = m_rect.Height(); // set capture to the window which received this message pWnd->SetCapture(); ASSERT(pWnd == CWnd::GetCapture()); pWnd->UpdateWindow(); if (pWndClipTo != NULL) pWndClipTo->UpdateWindow(); CRect rectSave = m_rect; // find out what x/y coords we are supposed to modify int *px, *py; int xDiff, yDiff; GetModifyPointers(nHandle, &px, &py, &xDiff, &yDiff); xDiff = point.x - xDiff; yDiff = point.y - yDiff; // get DC for drawing CDC* pDrawDC; if (pWndClipTo != NULL) { // clip to arbitrary window by using adjusted Window DC pDrawDC = pWndClipTo->GetDCEx(NULL, DCX_CACHE); } else { // otherwise, just use normal DC pDrawDC = pWnd->GetDC(); } ENSURE_VALID(pDrawDC); CRect rectOld; BOOL bMoved = FALSE; // get messages until capture lost or cancelled/accepted for (;;) { MSG msg; VERIFY(::GetMessage(&msg, NULL, 0, 0)); if (CWnd::GetCapture() != pWnd) break; switch (msg.message) { // handle movement/accept messages case WM_LBUTTONUP: case WM_MOUSEMOVE: rectOld = m_rect; // handle resize cases (and part of move) if (px != NULL) *px = GET_X_LPARAM(msg.lParam) - xDiff; if (py != NULL) *py = GET_Y_LPARAM(msg.lParam) - yDiff; // handle move case if (nHandle == hitMiddle) { m_rect.right = m_rect.left + nWidth; m_rect.bottom = m_rect.top + nHeight; } // allow caller to adjust the rectangle if necessary AdjustRect(nHandle, &m_rect); // only redraw and callback if the rect actually changed! m_bFinalErase = (msg.message == WM_LBUTTONUP); if (!rectOld.EqualRect(&m_rect) || m_bFinalErase) { if (bMoved) { m_bErase = TRUE; DrawTrackerRect(&rectOld, pWndClipTo, pDrawDC, pWnd); } OnChangedRect(rectOld); if (msg.message != WM_LBUTTONUP) bMoved = TRUE; } if (m_bFinalErase) goto ExitLoop; if (!rectOld.EqualRect(&m_rect)) { m_bErase = FALSE; DrawTrackerRect(&m_rect, pWndClipTo, pDrawDC, pWnd); } break; // handle cancel messages case WM_KEYDOWN: if (msg.wParam != VK_ESCAPE) break; case WM_RBUTTONDOWN: if (bMoved) { m_bErase = m_bFinalErase = TRUE; DrawTrackerRect(&m_rect, pWndClipTo, pDrawDC, pWnd); } m_rect = rectSave; goto ExitLoop; // just dispatch rest of the messages default: DispatchMessage(&msg); break; } } ExitLoop: if (pWndClipTo != NULL) pWndClipTo->ReleaseDC(pDrawDC); else pWnd->ReleaseDC(pDrawDC); ReleaseCapture(); AfxUnlockTempMaps(FALSE); // restore rect in case bMoved is still FALSE if (!bMoved) m_rect = rectSave; m_bFinalErase = FALSE; m_bErase = FALSE; // return TRUE only if rect has changed return !rectSave.EqualRect(&m_rect); }
void CBasePropertySheet::AddPage(CPropertyPage* pPage) { ASSERT_VALID(this); ENSURE_VALID(pPage); ASSERT_KINDOF(CPropertyPage, pPage); // add page to internal list m_pages.Add(pPage); // add page externally if (m_hWnd != NULL) { // determine size of PROPSHEETPAGE array PROPSHEETPAGE* ppsp = const_cast<PROPSHEETPAGE*>(m_psh.ppsp); int nBytes = 0; int nNextBytes; for (UINT i = 0; i < m_psh.nPages; i++) { nNextBytes = nBytes + ppsp->dwSize; if ((nNextBytes < nBytes) || (nNextBytes < (int)ppsp->dwSize)) AfxThrowMemoryException(); nBytes = nNextBytes; (BYTE*&)ppsp += ppsp->dwSize; } nNextBytes = nBytes + pPage->m_psp.dwSize; if ((nNextBytes < nBytes) || (nNextBytes < (int)pPage->m_psp.dwSize)) AfxThrowMemoryException(); // build new prop page array ppsp = (PROPSHEETPAGE*)realloc((void*)m_psh.ppsp, nNextBytes); if (ppsp == NULL) AfxThrowMemoryException(); m_psh.ppsp = ppsp; // copy processed PROPSHEETPAGE struct to end (BYTE*&)ppsp += nBytes; Checked::memcpy_s(ppsp, nNextBytes - nBytes , &pPage->m_psp, pPage->m_psp.dwSize); // pPage->PreProcessPageTemplate(*ppsp, IsWizard()); CPropertyPage_PreProcessPageTemplate((_CCPropertyPage*)pPage, *ppsp, IsWizard()); if (!((_CCPropertyPage*)pPage)->m_strHeaderTitle.IsEmpty()) { ppsp->pszHeaderTitle = ((_CCPropertyPage*)pPage)->m_strHeaderTitle; ppsp->dwFlags |= PSP_USEHEADERTITLE; } if (!((_CCPropertyPage*)pPage)->m_strHeaderSubTitle.IsEmpty()) { ppsp->pszHeaderSubTitle = ((_CCPropertyPage*)pPage)->m_strHeaderSubTitle; ppsp->dwFlags |= PSP_USEHEADERSUBTITLE; } HPROPSHEETPAGE hPSP = AfxCreatePropertySheetPage(ppsp); if (hPSP == NULL) AfxThrowMemoryException(); if (!SendMessage(PSM_ADDPAGE, 0, (LPARAM)hPSP)) { AfxDestroyPropertySheetPage(hPSP); AfxThrowMemoryException(); } ++m_psh.nPages; } }
BOOL CMDIChildWnd::Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CMDIFrameWnd* pParentWnd, CCreateContext* pContext) { if (pParentWnd == NULL) { CWinThread *pThread = AfxGetThread(); ENSURE_VALID(pThread); CWnd* pMainWnd = pThread->m_pMainWnd; ENSURE_VALID(pMainWnd); ASSERT_KINDOF(CMDIFrameWnd, pMainWnd); pParentWnd = (CMDIFrameWnd*)pMainWnd; } ASSERT(::IsWindow(pParentWnd->m_hWndMDIClient)); // insure correct window positioning pParentWnd->RecalcLayout(); // first copy into a CREATESTRUCT for PreCreate CREATESTRUCT cs; cs.dwExStyle = 0L; cs.lpszClass = lpszClassName; cs.lpszName = lpszWindowName; cs.style = dwStyle; cs.x = rect.left; cs.y = rect.top; cs.cx = rect.right - rect.left; cs.cy = rect.bottom - rect.top; cs.hwndParent = pParentWnd->m_hWnd; cs.hMenu = NULL; cs.hInstance = AfxGetInstanceHandle(); cs.lpCreateParams = (LPVOID)pContext; if (!PreCreateWindow(cs)) { PostNcDestroy(); return FALSE; } // extended style must be zero for MDI Children (except under Win4) ASSERT(cs.hwndParent == pParentWnd->m_hWnd); // must not change // now copy into a MDICREATESTRUCT for real create MDICREATESTRUCT mcs; mcs.szClass = cs.lpszClass; mcs.szTitle = cs.lpszName; mcs.hOwner = cs.hInstance; mcs.x = cs.x; mcs.y = cs.y; mcs.cx = cs.cx; mcs.cy = cs.cy; mcs.style = cs.style & ~(WS_MAXIMIZE | WS_VISIBLE); mcs.lParam = (LPARAM)cs.lpCreateParams; // create the window through the MDICLIENT window AfxHookWindowCreate(this); HWND hWnd = (HWND)::SendMessage(pParentWnd->m_hWndMDIClient, WM_MDICREATE, 0, (LPARAM)&mcs); if (!AfxUnhookWindowCreate()) PostNcDestroy(); // cleanup if MDICREATE fails too soon if (hWnd == NULL) return FALSE; // special handling of visibility (always created invisible) if (cs.style & WS_VISIBLE) { // place the window on top in z-order before showing it ::BringWindowToTop(hWnd); // show it as specified if (cs.style & WS_MINIMIZE) ShowWindow(SW_SHOWMINIMIZED); else if (cs.style & WS_MAXIMIZE) ShowWindow(SW_SHOWMAXIMIZED); else ShowWindow(SW_SHOWNORMAL); // make sure it is active (visibility == activation) pParentWnd->MDIActivate(this); // refresh MDI Window menu ::SendMessage(pParentWnd->m_hWndMDIClient, WM_MDIREFRESHMENU, 0, 0); } ASSERT(hWnd == m_hWnd); return TRUE; }
void CFileManagerDlg::OnInitMenuPopup(CMenu* pMenu, UINT nIndex, BOOL bSysMenu) { // CDialogEx::OnInitMenuPopup(pPopupMenu, nIndex, bSysMenu); AfxCancelModes(m_hWnd); if (bSysMenu) return; // don't support system menu ENSURE_VALID(pMenu); // check the enabled state of various menu items CCmdUI state; state.m_pMenu = pMenu; ASSERT(state.m_pOther == NULL); ASSERT(state.m_pParentMenu == NULL); // determine if menu is popup in top-level menu and set m_pOther to // it if so (m_pParentMenu == NULL indicates that it is secondary popup) HMENU hParentMenu; if (AfxGetThreadState()->m_hTrackingMenu == pMenu->m_hMenu) state.m_pParentMenu = pMenu; // parent == child for tracking popup else if ((hParentMenu = ::GetMenu(m_hWnd)) != NULL) { CWnd* pParent = GetTopLevelParent(); // child windows don't have menus -- need to go to the top! if (pParent != NULL && (hParentMenu = pParent->GetMenu()->GetSafeHmenu()) != NULL) { int nIndexMax = ::GetMenuItemCount(hParentMenu); for (int nItemIndex = 0; nItemIndex < nIndexMax; nItemIndex++) { if (::GetSubMenu(hParentMenu, nItemIndex) == pMenu->m_hMenu) { // when popup is found, m_pParentMenu is containing menu state.m_pParentMenu = CMenu::FromHandle(hParentMenu); break; } } } } state.m_nIndexMax = pMenu->GetMenuItemCount(); for (state.m_nIndex = 0; state.m_nIndex < state.m_nIndexMax; state.m_nIndex++) { state.m_nID = pMenu->GetMenuItemID(state.m_nIndex); if (state.m_nID == 0) continue; // menu separator or invalid cmd - ignore it ASSERT(state.m_pOther == NULL); ASSERT(state.m_pMenu != NULL); if (state.m_nID == (UINT)-1) { // possibly a popup menu, route to first item of that popup state.m_pSubMenu = pMenu->GetSubMenu(state.m_nIndex); if (state.m_pSubMenu == NULL || (state.m_nID = state.m_pSubMenu->GetMenuItemID(0)) == 0 || state.m_nID == (UINT)-1) { continue; // first item of popup can't be routed to } state.DoUpdate(this, FALSE); // popups are never auto disabled } else { // normal menu item // Auto enable/disable if frame window has 'm_bAutoMenuEnable' // set and command is _not_ a system command. state.m_pSubMenu = NULL; state.DoUpdate(this, state.m_nID < 0xF000); } // adjust for menu deletions and additions UINT nCount = pMenu->GetMenuItemCount(); if (nCount < state.m_nIndexMax) { state.m_nIndex -= (state.m_nIndexMax - nCount); while (state.m_nIndex < nCount && pMenu->GetMenuItemID(state.m_nIndex) == state.m_nID) { state.m_nIndex++; } } state.m_nIndexMax = nCount; } }