UINT CEnEdit::TrackPopupMenu(UINT nID, CMenu* pMenu, BOOL bBelow) { if (ButtonHitTest(nID) == -1) { ASSERT(0); return 0; } ASSERT_VALID(pMenu); CRect rButton = GetButtonRect(nID); TPMPARAMS tpmp; tpmp.cbSize = sizeof(TPMPARAMS); tpmp.rcExclude = rButton; int nX = bBelow ? rButton.left : rButton.right; int nY = bBelow ? rButton.bottom : rButton.top; UINT nCmdID = ::TrackPopupMenuEx(pMenu->GetSafeHmenu(), TPM_LEFTALIGN | TPM_LEFTBUTTON | TPM_RETURNCMD, nX, nY, ::GetParent(*this), &tpmp); return nCmdID; }
BOOL CEnEdit::SetButtonCaption(UINT nID, LPCTSTR szCaption) { int nBtn = ButtonHitTest(nID); if (nBtn < 0) return FALSE; EDITBTN& eb = m_aButtons[nBtn]; if (eb.sCaption.Compare(szCaption) != 0) { eb.sCaption = szCaption; // recalc width? if (eb.nWidth == CALC_BTNWIDTH) RecalcBtnRects(); if (GetSafeHwnd()) { // force WM_NCCALCSIZE SetWindowPos(NULL, 0, 0, 0, 0, SWP_FRAMECHANGED | SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER); SendMessage(WM_NCPAINT); } } return TRUE; }
void CEnEdit::OnLButtonUp(UINT nFlags, CPoint point) { CMaskEdit::OnLButtonUp(nFlags, point); if (m_nButtonDown == -1) return; ClientToScreen(&point); int nBtnDown = m_nButtonDown; int nBtnUp = ButtonHitTest(point); // update UI ReleaseCapture(); m_nButtonDown = -1; SendMessage(WM_NCPAINT); // process if (nBtnDown == nBtnUp) { // call derived class first OnBtnClick(m_aButtons[nBtnUp].nID); // then parent GetParent()->SendMessage(WM_EE_BTNCLICK, GetDlgCtrlID(), m_aButtons[nBtnUp].nID); } SendMessage(WM_NCPAINT); }
CRect CEnEdit::GetButtonRect(UINT nID) { int nBtn = ButtonHitTest(nID); if (nBtn >= 0) return GetButtonRectByIndex(nBtn); return CRect(0, 0, 0, 0); }
UINT CEnEdit::OnNcHitTest(CPoint point) #endif { int nBtn = ButtonHitTest(point); if (nBtn >= 0) return HTBORDER; return (LRESULT)CMaskEdit::OnNcHitTest(point); }
BOOL CEnEdit::CheckButton(UINT nID, BOOL bChecked) { int nBtn = ButtonHitTest(nID); if (nBtn < 0) return FALSE; if (m_aButtons[nBtn].bChecked != bChecked) { m_aButtons[nBtn].bChecked = bChecked; SendMessage(WM_NCPAINT); } return TRUE; }
BOOL CEnEdit::EnableButton(UINT nID, BOOL bEnable) { int nBtn = ButtonHitTest(nID); if (nBtn < 0) return FALSE; if (m_aButtons[nBtn].bEnabled != bEnable) { m_aButtons[nBtn].bEnabled = bEnable; SendMessage(WM_NCPAINT); } return TRUE; }
void CEnEdit::OnMouseMove(UINT nFlags, CPoint point) { CMaskEdit::OnMouseMove(nFlags, point); if (m_nButtonDown != -1) { ClientToScreen(&point); if (ButtonHitTest(point) != m_nButtonDown) { ReleaseCapture(); m_nButtonDown = -1; SendMessage(WM_NCPAINT); } } }
BOOL CEnEdit::SetDropMenuButton(UINT nID, BOOL bDropMenu) { int nBtn = ButtonHitTest(nID); if (nBtn < 0) return FALSE; if (m_aButtons[nBtn].bDropMenu != bDropMenu) { m_aButtons[nBtn].bDropMenu = bDropMenu; if (GetSafeHwnd()) SendMessage(WM_NCPAINT); } return TRUE; }
BOOL CEnEdit::SetButtonTip(UINT nID, LPCTSTR szTip) { int nBtn = ButtonHitTest(nID); if (nBtn < 0) return FALSE; if (m_aButtons[nBtn].sTip.Compare(szTip) != 0) { m_aButtons[nBtn].sTip = szTip; if (GetSafeHwnd()) { m_tooltip.UpdateTipText(szTip, this, m_aButtons[nBtn].nID); SendMessage(WM_NCPAINT); } } return TRUE; }
void CEnEdit::OnNcLButtonDown(UINT nHitTest, CPoint point) { CMaskEdit::OnNcLButtonDown(nHitTest, point); if (IsWindowEnabled()) { int nBtn = ButtonHitTest(point); if (nBtn >= 0) { if (m_aButtons[nBtn].bEnabled) { SetCapture(); m_nButtonDown = nBtn; SendMessage(WM_NCPAINT); } } else SetFocus(); } }
BOOL CEnEdit::SetButtonWidth(UINT nID, int nWidth) { int nBtn = ButtonHitTest(nID); if (nBtn < 0) return FALSE; if (m_aButtons[nBtn].nWidth != nWidth) { m_aButtons[nBtn].nWidth = nWidth; if (GetSafeHwnd()) { // force WM_NCCALCSIZE SetWindowPos(NULL, 0, 0, 0, 0, SWP_FRAMECHANGED | SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER); RecalcBtnRects(); SendMessage(WM_NCPAINT); } } return TRUE; }
LRESULT CInformationPanel::OnMessage(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam) { switch (uMsg) { case WM_CREATE: { InitializeUI(); m_BackBrush.Create(m_Theme.Style.Back.Fill.GetSolidColor()); m_ProgramInfoBackBrush.Create(m_Theme.ProgramInfoStyle.Back.Fill.GetSolidColor()); m_HotButton.Item=-1; m_HotButton.Button=-1; m_Tooltip.Create(hwnd); m_Tooltip.SetFont(m_Font.GetHandle()); for (int i=0;i<NUM_ITEMS;i++) { const CItem *pItem=m_ItemList[i]; const int ButtonCount=pItem->GetButtonCount(); for (int j=0;j<ButtonCount;j++) { RECT rc; TCHAR szText[CCommandList::MAX_COMMAND_NAME]; pItem->GetButtonRect(j,&rc); pItem->GetButtonTipText(j,szText,lengthof(szText)); m_Tooltip.AddTool(GetTooltipID(i,j),rc,szText); } } CProgramInfoItem *pProgramInfoItem= static_cast<CProgramInfoItem*>(GetItem(ITEM_PROGRAMINFO)); CreateProgramInfoEdit(); if (pProgramInfoItem->IsVisible()) ::ShowWindow(m_hwndProgramInfo,SW_SHOW); } return 0; HANDLE_MSG(hwnd,WM_COMMAND,OnCommand); case WM_SIZE: { for (int i=0;i<NUM_ITEMS;i++) { const CItem *pItem=m_ItemList[i]; const int ButtonCount=pItem->GetButtonCount(); for (int j=0;j<ButtonCount;j++) { RECT rc; pItem->GetButtonRect(j,&rc); m_Tooltip.SetToolRect(GetTooltipID(i,j),rc); } } } if (IsItemVisible(ITEM_PROGRAMINFO)) { TVTest::Theme::BorderStyle Style=m_Theme.ProgramInfoStyle.Back.Border; ConvertBorderWidthsInPixels(&Style); RECT rc; GetItemRect(ITEM_PROGRAMINFO,&rc); TVTest::Theme::SubtractBorderRect(Style,&rc); ::MoveWindow(m_hwndProgramInfo,rc.left,rc.top, rc.right-rc.left,rc.bottom-rc.top,TRUE); } return 0; case WM_PAINT: { PAINTSTRUCT ps; ::BeginPaint(hwnd,&ps); Draw(ps.hdc,ps.rcPaint); ::EndPaint(hwnd,&ps); } return 0; case WM_CTLCOLORSTATIC: { HDC hdc=reinterpret_cast<HDC>(wParam); ::SetTextColor(hdc,m_Theme.ProgramInfoStyle.Fore.Fill.GetSolidColor()); ::SetBkColor(hdc,m_Theme.ProgramInfoStyle.Back.Fill.GetSolidColor()); return reinterpret_cast<LRESULT>(m_ProgramInfoBackBrush.GetHandle()); } case WM_LBUTTONDOWN: { ItemButtonNumber Button=ButtonHitTest(GET_X_LPARAM(lParam),GET_Y_LPARAM(lParam)); if (Button.Item>=0) { SetHotButton(Button); ::SetCapture(hwnd); } } return 0; case WM_LBUTTONUP: if (::GetCapture()==hwnd) { if (m_HotButton.IsValid()) { SetHotButton(ButtonHitTest(GET_X_LPARAM(lParam),GET_Y_LPARAM(lParam))); ItemButtonNumber Button=m_HotButton; ::ReleaseCapture(); if (Button.IsValid()) m_ItemList[Button.Item]->OnButtonPushed(Button.Button); } else { ::ReleaseCapture(); } } return 0; case WM_RBUTTONUP: { HMENU hmenu; POINT pt; hmenu=::LoadMenu(m_hinst,MAKEINTRESOURCE(IDM_INFORMATIONPANEL)); for (int i=0;i<NUM_ITEMS;i++) CheckMenuItem(hmenu,CM_INFORMATIONPANEL_ITEM_FIRST+i, MF_BYCOMMAND | (IsItemVisible(i)?MFS_CHECKED:MFS_UNCHECKED)); pt.x=GET_X_LPARAM(lParam); pt.y=GET_Y_LPARAM(lParam); ::ClientToScreen(hwnd,&pt); ::TrackPopupMenu(::GetSubMenu(hmenu,0),TPM_RIGHTBUTTON,pt.x,pt.y,0,hwnd,NULL); ::DestroyMenu(hmenu); } return TRUE; case WM_MOUSEMOVE: { SetHotButton(ButtonHitTest(GET_X_LPARAM(lParam),GET_Y_LPARAM(lParam))); if (::GetCapture()==NULL) { TRACKMOUSEEVENT tme; tme.cbSize=sizeof(TRACKMOUSEEVENT); tme.dwFlags=TME_LEAVE; tme.hwndTrack=hwnd; ::TrackMouseEvent(&tme); } } return 0; case WM_MOUSELEAVE: case WM_CAPTURECHANGED: if (m_HotButton.IsValid()) { SetHotButton(ItemButtonNumber()); } return 0; case WM_SETCURSOR: if ((HWND)wParam==hwnd) { if (LOWORD(lParam)==HTCLIENT && m_HotButton.IsValid()) { ::SetCursor(GetActionCursor()); return TRUE; } } else if ((HWND)wParam==m_hwndProgramInfo && LOWORD(lParam)==HTCLIENT && m_fUseRichEdit && m_fProgramInfoCursorOverLink) { ::SetCursor(GetLinkCursor()); return TRUE; } break; case WM_NOTIFY: switch (reinterpret_cast<LPNMHDR>(lParam)->code) { case EN_MSGFILTER: { MSGFILTER *pMsgFilter=reinterpret_cast<MSGFILTER*>(lParam); switch (pMsgFilter->msg) { case WM_RBUTTONUP: TVTest::EventInfoUtil::EventInfoContextMenu(hwnd,m_hwndProgramInfo); break; case WM_LBUTTONDOWN: m_ProgramInfoClickPos.x=GET_X_LPARAM(pMsgFilter->lParam); m_ProgramInfoClickPos.y=GET_Y_LPARAM(pMsgFilter->lParam); break; case WM_MOUSEMOVE: m_ProgramInfoClickPos.x=-1; m_ProgramInfoClickPos.y=-1; { POINT pt={GET_X_LPARAM(pMsgFilter->lParam),GET_Y_LPARAM(pMsgFilter->lParam)}; if (CRichEditUtil::LinkHitTest(m_hwndProgramInfo,pt,m_ProgramInfoLinkList)>=0) { m_fProgramInfoCursorOverLink=true; ::SetCursor(GetLinkCursor()); } else { m_fProgramInfoCursorOverLink=false; } } break; case WM_LBUTTONUP: { POINT pt={GET_X_LPARAM(pMsgFilter->lParam),GET_Y_LPARAM(pMsgFilter->lParam)}; if (m_ProgramInfoClickPos.x==pt.x && m_ProgramInfoClickPos.y==pt.y) CRichEditUtil::HandleLinkClick(m_hwndProgramInfo,pt,m_ProgramInfoLinkList); } break; } } return 0; #if 0 case EN_LINK: { ENLINK *penl=reinterpret_cast<ENLINK*>(lParam); if (penl->msg==WM_LBUTTONUP) CRichEditUtil::HandleLinkClick(penl); } return 0; #endif } break; case WM_DISPLAYCHANGE: m_Offscreen.Destroy(); return 0; case WM_DESTROY: m_BackBrush.Destroy(); m_ProgramInfoBackBrush.Destroy(); m_Offscreen.Destroy(); m_IconFont.Destroy(); m_hwndProgramInfo=NULL; return 0; } return ::DefWindowProc(hwnd,uMsg,wParam,lParam); }