int isTitlebarHit(Display *dsp, mousestate *mousepos){ int titlebarHeight, x, y, junkx, junky; unsigned int wi,h, junkwi, junkh; Window activeWindow, parentWin; getFocusedWindow(dsp,&activeWindow); findParentWindow(dsp,&activeWindow,&parentWin); getNetFrameExtents(dsp,&parentWin,&titlebarHeight); getWindowRect(dsp, &parentWin, &junkx, &junky, &wi, &h); getWindowRect(dsp, &activeWindow, &x, &y, &junkwi, &junkh); // we need the size of the parent win, but the x/y coordinates of the child, don't ask me why, otherwise the values are off a bit if(y==junky){ y-=titlebarHeight; //Qt hack } if(mousepos->x>=x && mousepos->x <= (x+(int)wi) && mousepos->y >= (y-titlebarHeight) && mousepos->y <= y){ return 1; } return 0; }
void CSliderCtrlWithTransformation::substituteControl(CWnd *parent, int id, DoubleInterval &interval, UINT steps, IntervalScale type) { DEFINEMETHODNAME; CSliderCtrl *ctrl = (CSliderCtrl*)parent->GetDlgItem(id); if(ctrl == NULL) { showError(_T("%s:Control %d not found"), method, id); return; } const int style = ctrl->GetStyle(); const int exStyle = ctrl->GetExStyle(); const CRect rect = getWindowRect(ctrl); ctrl->DestroyWindow(); if(!Create(style, rect, parent, id)) { showError(_T("%s:Create failed"), method); return; } ModifyStyleEx(0, exStyle); setTransformation(interval, steps, type); }
//---------------------------------------------- // Process function of dialog // BOOL CALLBACK DockingCont::run_dlgProc(UINT Message, WPARAM wParam, LPARAM lParam) { switch (Message) { case WM_NCACTIVATE: { // Note: lParam to identify the trigger window if ((int)lParam != -1) { ::SendMessage(_hParent, WM_NCACTIVATE, wParam, 0); } break; } case WM_INITDIALOG: { _hContTab = ::GetDlgItem(_hSelf, IDC_TAB_CONT); _hCaption = ::GetDlgItem(_hSelf, IDC_BTN_CAPTION); // intial subclassing of caption ::SetWindowLongPtr(_hCaption, GWLP_USERDATA, (LONG_PTR)this); _hDefaultCaptionProc = reinterpret_cast<WNDPROC>(::SetWindowLongPtr(_hCaption, GWLP_WNDPROC, (LONG_PTR)wndCaptionProc)); // intial subclassing of tab ::SetWindowLongPtr(_hContTab, GWLP_USERDATA, (LONG_PTR)this); _hDefaultTabProc = reinterpret_cast<WNDPROC>(::SetWindowLongPtr(_hContTab, GWLP_WNDPROC, (LONG_PTR)wndTabProc)); // set min tab width ::SendMessage(_hContTab, TCM_SETMINTABWIDTH, 0, (LPARAM)MIN_TABWIDTH); break; } case WM_NCCALCSIZE: case WM_SIZE: { onSize(); break; } case WM_DRAWITEM : { // draw tab or caption if (((DRAWITEMSTRUCT *)lParam)->CtlID == IDC_TAB_CONT) { drawTabItem((DRAWITEMSTRUCT *)lParam); return TRUE; } else { drawCaptionItem((DRAWITEMSTRUCT *)lParam); return TRUE; } break; } case WM_NCLBUTTONDBLCLK : { RECT rcWnd = {0}; RECT rcClient = {0}; POINT pt = {HIWORD(lParam), LOWORD(lParam)}; getWindowRect(rcWnd); getClientRect(rcClient); ClientRectToScreenRect(_hSelf, &rcClient); rcWnd.bottom = rcClient.top; // if in caption if ((rcWnd.top < pt.x) && (rcWnd.bottom > pt.x) && (rcWnd.left < pt.y) && (rcWnd.right > pt.y)) { NotifyParent(DMM_DOCKALL); return TRUE; } break; } case WM_SYSCOMMAND : { switch (wParam & 0xfff0) { case SC_MOVE: NotifyParent(DMM_MOVE); return TRUE; default: break; } return FALSE; } case WM_COMMAND : { switch (LOWORD(wParam)) { case IDCANCEL: doClose(); return TRUE; default : break; } break; } default: break; } return FALSE; }
void DockingCont::onSize() { TCITEM tcItem = {0}; RECT rc = {0}; RECT rcTemp = {0}; UINT iItemCnt = ::SendMessage(_hContTab, TCM_GETITEMCOUNT, 0, 0); UINT iTabOff = 0; getClientRect(rc); if (iItemCnt >= 1) { // resize to docked window if (_isFloating == false) { // draw caption if (_isTopCaption == TRUE) { ::SetWindowPos(_hCaption, NULL, rc.left, rc.top, rc.right, HIGH_CAPTION, SWP_NOZORDER | SWP_NOACTIVATE); rc.top += HIGH_CAPTION; rc.bottom -= HIGH_CAPTION; } else { ::SetWindowPos(_hCaption, NULL, rc.left, rc.top, HIGH_CAPTION, rc.bottom, SWP_NOZORDER | SWP_NOACTIVATE); rc.left += HIGH_CAPTION; rc.right -= HIGH_CAPTION; } if (iItemCnt >= 2) { // resize tab and plugin control if tabs exceeds one // resize tab rcTemp = rc; rcTemp.top = (rcTemp.bottom + rcTemp.top) - (HIGH_TAB+CAPTION_GAP); rcTemp.bottom = HIGH_TAB; iTabOff = HIGH_TAB; ::SetWindowPos(_hContTab, NULL, rcTemp.left, rcTemp.top, rcTemp.right, rcTemp.bottom, SWP_NOZORDER | SWP_SHOWWINDOW | SWP_NOACTIVATE); } // resize client area for plugin rcTemp = rc; if (_isTopCaption == TRUE) { rcTemp.top += CAPTION_GAP; rcTemp.bottom -= (iTabOff + CAPTION_GAP); } else { rcTemp.left += CAPTION_GAP; rcTemp.right -= CAPTION_GAP; rcTemp.bottom -= iTabOff; } // set position of client area ::SetWindowPos(::GetDlgItem(_hSelf, IDC_CLIENT_TAB), NULL, rcTemp.left, rcTemp.top, rcTemp.right, rcTemp.bottom, SWP_NOZORDER | SWP_NOACTIVATE); } // resize to float window else { // update floating size if (_isFloating == true) { for (size_t iTb = 0, len = _vTbData.size(); iTb < len; ++iTb) { getWindowRect(_vTbData[iTb]->rcFloat); } } // draw caption if (iItemCnt >= 2) { // resize tab if size of elements exceeds one rcTemp = rc; rcTemp.top = rcTemp.bottom - (HIGH_TAB+CAPTION_GAP); rcTemp.bottom = HIGH_TAB; ::SetWindowPos(_hContTab, NULL, rcTemp.left, rcTemp.top, rcTemp.right, rcTemp.bottom, SWP_NOZORDER | SWP_SHOWWINDOW); } // resize client area for plugin rcTemp = rc; rcTemp.bottom -= ((iItemCnt == 1)?0:HIGH_TAB); ::SetWindowPos(::GetDlgItem(_hSelf, IDC_CLIENT_TAB), NULL, rcTemp.left, rcTemp.top, rcTemp.right, rcTemp.bottom, SWP_NOZORDER | SWP_NOACTIVATE); } // get active item data UINT iItemCnt = ::SendMessage(_hContTab, TCM_GETITEMCOUNT, 0, 0); // resize visible plugin windows for (UINT iItem = 0; iItem < iItemCnt; ++iItem) { tcItem.mask = TCIF_PARAM; ::SendMessage(_hContTab, TCM_GETITEM, iItem, (LPARAM)&tcItem); if (!tcItem.lParam) continue; ::SetWindowPos(((tTbData*)tcItem.lParam)->hClient, NULL, 0, 0, rcTemp.right, rcTemp.bottom, SWP_NOZORDER); //::SendMessage(((tTbData*)tcItem.lParam)->hClient, WM_SIZE, 0, MAKELONG(rcTemp.right, rcTemp.bottom)); // Notify switch in NMHDR nmhdr; nmhdr.code = DMN_FLOATDROPPED; nmhdr.hwndFrom = _hSelf; nmhdr.idFrom = 0; ::SendMessage(((tTbData*)tcItem.lParam)->hClient, WM_NOTIFY, nmhdr.idFrom, (LPARAM)&nmhdr); } } }
void DockingCont::onSize(void) { TCITEM tcItem = {0}; RECT rc = {0}; RECT rcTemp = {0}; UINT iItemCnt = ::SendMessage(_hContTab, TCM_GETITEMCOUNT, 0, 0); UINT iTabOff = 0; getClientRect(rc); if (iItemCnt >= 1) { /* resize to docked window */ if (_isFloating == false) { /* draw caption */ if (_isTopCaption == TRUE) { ::SetWindowPos(_hCaption, NULL, rc.left, rc.top, rc.right, HIGH_CAPTION, SWP_NOZORDER | SWP_NOACTIVATE); rc.top += HIGH_CAPTION; rc.bottom -= HIGH_CAPTION; } else { ::SetWindowPos(_hCaption, NULL, rc.left, rc.top, HIGH_CAPTION, rc.bottom, SWP_NOZORDER | SWP_NOACTIVATE); rc.left += HIGH_CAPTION; rc.right -= HIGH_CAPTION; } if (iItemCnt >= 2) { /* resize tab and plugin control if tabs exceeds one */ /* resize tab */ rcTemp = rc; rcTemp.top = (rcTemp.bottom + rcTemp.top) - (HIGH_TAB+CAPTION_GAP); rcTemp.bottom = HIGH_TAB; iTabOff = HIGH_TAB; ::SetWindowPos(_hContTab, NULL, rcTemp.left, rcTemp.top, rcTemp.right, rcTemp.bottom, SWP_NOZORDER | SWP_SHOWWINDOW | SWP_NOACTIVATE); } /* resize client area for plugin */ rcTemp = rc; if (_isTopCaption == TRUE) { rcTemp.top += CAPTION_GAP; rcTemp.bottom -= (iTabOff + CAPTION_GAP); } else { rcTemp.left += CAPTION_GAP; rcTemp.right -= CAPTION_GAP; rcTemp.bottom -= iTabOff; } /* set position of client area */ ::SetWindowPos(::GetDlgItem(_hSelf, IDC_CLIENT_TAB), NULL, rcTemp.left, rcTemp.top, rcTemp.right, rcTemp.bottom, SWP_NOZORDER | SWP_NOACTIVATE); } /* resize to float window */ else { /* update floating size */ if (_isFloating == true) { for (size_t iTb = 0; iTb < _vTbData.size(); iTb++) { getWindowRect(_vTbData[iTb]->rcFloat); } } /* draw caption */ if (iItemCnt >= 2) { /* resize tab if size of elements exceeds one */ rcTemp = rc; rcTemp.top = rcTemp.bottom - (HIGH_TAB+CAPTION_GAP); rcTemp.bottom = HIGH_TAB; ::SetWindowPos(_hContTab, NULL, rcTemp.left, rcTemp.top, rcTemp.right, rcTemp.bottom, SWP_NOZORDER | SWP_SHOWWINDOW); } /* resize client area for plugin */ rcTemp = rc; rcTemp.bottom -= ((iItemCnt == 1)?0:HIGH_TAB); ::SetWindowPos(::GetDlgItem(_hSelf, IDC_CLIENT_TAB), NULL, rcTemp.left, rcTemp.top, rcTemp.right, rcTemp.bottom, SWP_NOZORDER | SWP_NOACTIVATE); } /* get active item data */ UINT iItemCnt = ::SendMessage(_hContTab, TCM_GETITEMCOUNT, 0, 0); /* resize visible plugin windows */ for (UINT iItem = 0; iItem < iItemCnt; iItem++) { tcItem.mask = TCIF_PARAM; ::SendMessage(_hContTab, TCM_GETITEM, iItem, (LPARAM)&tcItem); ::SetWindowPos(((tTbData*)tcItem.lParam)->hClient, NULL, 0, 0, rcTemp.right, rcTemp.bottom, SWP_NOZORDER); } } }
CRect LayoutAttribute::getControlRect() const { return getWindowRect(m_manager.getWindow(), m_ctrlId); }