BOOL CWnd::SubclassWindow(HWND hWnd) { if (!Attach(hWnd)) return FALSE; // allow any other subclassing to occur PreSubclassWindow(); // now hook into the AFX WndProc WNDPROC* lplpfn = GetSuperWndProcAddr(); WNDPROC oldWndProc = (WNDPROC)::SetWindowLong(hWnd, GWL_WNDPROC, (DWORD)AfxGetAfxWndProc()); ASSERT(oldWndProc != (WNDPROC)AfxGetAfxWndProc); if (*lplpfn == NULL) *lplpfn = oldWndProc; // the first control of that type created #ifdef _DEBUG else if (*lplpfn != oldWndProc) { TRACE0("Error: Trying to use SubclassWindow with incorrect CWnd\n"); TRACE0("\tderived class.\n"); TRACE3("\thWnd = $%04X (nIDC=$%04X) is not a %hs.\n", (UINT)hWnd, _AfxGetDlgCtrlID(hWnd), GetRuntimeClass()->m_lpszClassName); ASSERT(FALSE); // undo the subclassing if continuing after assert ::SetWindowLong(hWnd, GWL_WNDPROC, (DWORD)oldWndProc); } #endif return TRUE; }
CScrollBar* CView::GetScrollBarCtrl(int nBar) const { ASSERT(nBar == SB_HORZ || nBar == SB_VERT); if (GetStyle() & ((nBar == SB_HORZ) ? WS_HSCROLL : WS_VSCROLL)) { // it has a regular windows style scrollbar (no control) return NULL; } CWnd* pParent = GetParentSplitter(this, TRUE); if (pParent == NULL) return NULL; // no splitter UINT nID = _AfxGetDlgCtrlID(m_hWnd); if (nID < AFX_IDW_PANE_FIRST || nID > AFX_IDW_PANE_LAST) return NULL; // not a standard pane ID // appropriate PANE id - look for sibling (splitter, or just frame) UINT nIDScroll; if (nBar == SB_HORZ) nIDScroll = AFX_IDW_HSCROLL_FIRST + (nID - AFX_IDW_PANE_FIRST) % 16; else nIDScroll = AFX_IDW_VSCROLL_FIRST + (nID - AFX_IDW_PANE_FIRST) / 16; // return shared scroll bars that are immediate children of splitter return (CScrollBar*)pParent->GetDlgItem(nIDScroll); }
LRESULT CControlBar::OnHelpHitTest(WPARAM, LPARAM lParam) { ASSERT_VALID(this); INT_PTR nID = OnToolHitTest((DWORD)lParam, NULL); if (nID != -1) return HID_BASE_COMMAND+nID; nID = _AfxGetDlgCtrlID(m_hWnd); return nID != 0 ? HID_BASE_CONTROL+nID : 0; }
void CFrameWnd::ReDockControlBar(CControlBar* pBar, CDockBar* pDockBar, LPCRECT lpRect) { ASSERT(pBar != NULL); // make sure CControlBar::EnableDocking has been called ASSERT(pBar->m_pDockContext != NULL); if (pDockBar == NULL) { // Search for the place holder. // In case we don't find a place holder, find a bar with the correct alignment // and keep it in pPossibleBar. CDockBar* pPossibleBar = NULL; for (int i = 0; i < 4; i++) { CDockBar* pTempBar = (CDockBar*)GetControlBar(dwDockBarMap[i][0]); if (pTempBar != NULL) { // Is this the same bar we docked with before? if (pTempBar->FindBar((CControlBar*)_AfxGetDlgCtrlID(pBar->m_hWnd)) > 0) { pDockBar = pTempBar; break; } } if ((dwDockBarMap[i][1] & CBRS_ALIGN_ANY) == (pBar->m_dwStyle & CBRS_ALIGN_ANY)) { pPossibleBar = (CDockBar*)GetControlBar(dwDockBarMap[i][0]); ASSERT(pPossibleBar != NULL); // assert fails when initial CBRS_ of bar does not // match available docking sites, as set by EnableDocking() } } // Did we find the place holder? if (pDockBar == NULL) pDockBar = pPossibleBar; } ASSERT(pDockBar != NULL); ASSERT(m_listControlBars.Find(pBar) != NULL); ASSERT(pBar->m_pDockSite == this); // if this assertion occurred it is because the parent of pBar was not initially // this CFrameWnd when pBar's OnCreate was called // i.e. this control bar should have been created with a different parent initially pDockBar->ReDockControlBar(pBar, lpRect); }
void COleResizeBar::OnLButtonDown(UINT /*nFlags*/, CPoint point) { // track to parent of the parent CWnd* pFrameWnd = GetParentFrame(); ASSERT_VALID(pFrameWnd); CWnd* pParent = pFrameWnd->GetParent(); pFrameWnd->UpdateWindow(); // update ourselves // limit tracking to parent client rectangle if (pParent != NULL) { pParent->UpdateWindow(); // always update before tracking // clip cursor to parent window CRect rect; pParent->GetClientRect(&rect); pParent->ClientToScreen(&rect); ::ClipCursor(&rect); } // save the rect, track, then restore CRect rectSave = m_tracker.m_rect; BOOL bNotify = m_tracker.Track(this, point, FALSE, pParent); CRect rectNew = m_tracker.m_rect; m_tracker.m_rect = rectSave; // allow full mouse movement again ::ClipCursor(NULL); // notify owner window if tracker changed if (bNotify) { CWnd* pOwner = GetOwner(); ASSERT_VALID(pOwner); // convert relative to parent coordinates ClientToScreen(&rectNew); pOwner->ScreenToClient(&rectNew); // send notification to owner pOwner->SendMessage(WM_SIZECHILD, (WPARAM)_AfxGetDlgCtrlID(m_hWnd), (LPARAM)(LPCRECT)&rectNew); } }
void CGuiDockContext::EndDrag() { CancelLoop(); if (m_dwOverDockStyle != 0) { CDockBar* pDockBar = GetDockBar(m_dwOverDockStyle); ASSERT(pDockBar != NULL); CRect rect = (m_dwOverDockStyle & CBRS_ORIENT_VERT) ? m_rectDragVert : m_rectDragHorz; UINT uID = _AfxGetDlgCtrlID(pDockBar->m_hWnd); if (uID >= AFX_IDW_DOCKBAR_TOP && uID <= AFX_IDW_DOCKBAR_BOTTOM) { m_uMRUDockID = uID; m_rectMRUDockPos = rect; pDockBar->ScreenToClient(&m_rectMRUDockPos); } // dock it at the specified position, RecalcLayout will snap m_pDockSite->DockControlBar(m_pBar, pDockBar, &rect); m_pDockSite->RecalcLayout(); } else if ((m_dwStyle & CBRS_SIZE_DYNAMIC) || (HORZF(m_dwStyle) && !m_bFlip) || (VERTF(m_dwStyle) && m_bFlip)) { m_dwMRUFloatStyle = CBRS_ALIGN_TOP | (m_dwDockStyle & CBRS_FLOAT_MULTI); m_ptMRUFloatPos = m_rectFrameDragHorz.TopLeft(); m_pDockSite->FloatControlBar(m_pBar, m_ptMRUFloatPos, m_dwMRUFloatStyle); } else // vertical float { m_dwMRUFloatStyle = CBRS_ALIGN_LEFT | (m_dwDockStyle & CBRS_FLOAT_MULTI); m_ptMRUFloatPos = m_rectFrameDragVert.TopLeft(); m_pDockSite->FloatControlBar(m_pBar, m_ptMRUFloatPos, m_dwMRUFloatStyle); } }
HWND AFXAPI _AfxChildWindowFromPoint(HWND hWnd, POINT pt) { ASSERT(hWnd != NULL); // check child windows ::ClientToScreen(hWnd, &pt); HWND hWndChild = ::GetWindow(hWnd, GW_CHILD); for (; hWndChild != NULL; hWndChild = ::GetWindow(hWndChild, GW_HWNDNEXT)) { if (_AfxGetDlgCtrlID(hWndChild) != (WORD)-1 && (::GetWindowLong(hWndChild, GWL_STYLE) & WS_VISIBLE)) { // see if point hits the child window CRect rect; ::GetWindowRect(hWndChild, rect); if (rect.PtInRect(pt)) return hWndChild; } } return NULL; // not found }
void CCJDockContext::EndDragDockBar() { CancelLoop(); if (m_dwOverDockStyle != 0) { CCJSizeDockBar* pDockBar = GetDockBar(m_dwOverDockStyle); ASSERT(pDockBar != NULL); CRect rect = (m_dwOverDockStyle & CBRS_ORIENT_VERT) ? m_rectDragVert : m_rectDragHorz; UINT uID = _AfxGetDlgCtrlID(pDockBar->m_hWnd); m_uMRUDockID = uID; m_rectMRUDockPos = rect; pDockBar->ScreenToClient(&m_rectMRUDockPos); DockSizeBar(m_pBar, pDockBar, &rect); m_pDockSite->RecalcLayout(); } else if ((m_dwStyle & CBRS_SIZE_DYNAMIC) || (HORZF(m_dwStyle) && !m_bFlip) || (VERTF(m_dwStyle) && m_bFlip)) { m_dwMRUFloatStyle = CBRS_ALIGN_TOP | (m_dwDockStyle & CBRS_FLOAT_MULTI); m_ptMRUFloatPos = m_rectFrameDragHorz.TopLeft(); m_pDockSite->FloatControlBar(m_pBar, m_ptMRUFloatPos, m_dwMRUFloatStyle); m_pDockSite->RecalcLayout(); } else { m_dwMRUFloatStyle = CBRS_ALIGN_LEFT | (m_dwDockStyle & CBRS_FLOAT_MULTI); m_ptMRUFloatPos = m_rectFrameDragVert.TopLeft(); m_pDockSite->FloatControlBar(m_pBar, m_ptMRUFloatPos, m_dwMRUFloatStyle); m_pDockSite->RecalcLayout(); } }
UINT CControlBar::OnCmdHitTest(CPoint point, CPoint* pCenter) // point is in client relative coords { // convert point to screen coordinates ::ClientToScreen(m_hWnd, &point); // walk through all child windows // (don't use WindowFromPoint, because it ignores disabled windows) HWND hWndChild = ::GetWindow(m_hWnd, GW_CHILD); while (hWndChild != NULL) { if (GetWindowLong(hWndChild, GWL_STYLE) & WS_VISIBLE) { // see if point is inside window rect of child CRect rect; ::GetWindowRect(hWndChild, &rect); if (rect.PtInRect(point)) { // return positive hit if control ID isn't -1 UINT nHit = _AfxGetDlgCtrlID(hWndChild); if (nHit != (WORD)-1) { if (pCenter != NULL) { // center tip along x axis pCenter->x = rect.left + rect.Width()/2; } return nHit; } } } hWndChild = ::GetWindow(hWndChild, GW_HWNDNEXT); } return (UINT)-1; // not found }