void CFilePatchesDlg::OnNMRclickFilelist(NMHDR * /*pNMHDR*/, LRESULT *pResult) { *pResult = 0; if (m_sPath.IsEmpty()) return; CString temp; CMenu popup; POINT point; DWORD ptW = GetMessagePos(); point.x = GET_X_LPARAM(ptW); point.y = GET_Y_LPARAM(ptW); if (popup.CreatePopupMenu()) { UINT nFlags; nFlags = MF_STRING | (m_cFileList.GetSelectedCount()==1 ? MF_ENABLED : MF_DISABLED | MF_GRAYED); temp.LoadString(IDS_PATCH_REVIEW); popup.AppendMenu(nFlags, ID_PATCH_REVIEW, temp); popup.SetDefaultItem(ID_PATCH_REVIEW, FALSE); temp.LoadString(IDS_PATCH_PREVIEW); popup.AppendMenu(nFlags, ID_PATCHPREVIEW, temp); temp.LoadString(IDS_PATCH_ALL); popup.AppendMenu(MF_STRING | MF_ENABLED, ID_PATCHALL, temp); nFlags = MF_STRING | (m_cFileList.GetSelectedCount()>0 ? MF_ENABLED : MF_DISABLED | MF_GRAYED); temp.LoadString(IDS_PATCH_SELECTED); popup.AppendMenu(nFlags, ID_PATCHSELECTED, temp); // if the context menu is invoked through the keyboard, we have to use // a calculated position on where to anchor the menu on if ((point.x == -1) && (point.y == -1)) { CRect rect; GetWindowRect(&rect); point = rect.CenterPoint(); } bool bReview=false; int cmd = popup.TrackPopupMenu(TPM_RETURNCMD | TPM_LEFTALIGN | TPM_NONOTIFY, point.x, point.y, this, 0); switch (cmd) { case ID_PATCH_REVIEW: bReview = true; //go through case case ID_PATCHPREVIEW: { if (m_pCallBack) { int nIndex = m_cFileList.GetSelectionMark(); if ( m_arFileStates.GetAt(nIndex)!=FPDLG_FILESTATE_PATCHED) { m_pCallBack->PatchFile(GetFullPath(nIndex), m_pPatch->GetRevision(nIndex),false,bReview); } } } break; case ID_PATCHALL: { if (m_pCallBack) { CSysProgressDlg progDlg; progDlg.SetTitle(IDR_MAINFRAME); progDlg.SetShowProgressBar(true); progDlg.SetLine(1, CString(MAKEINTRESOURCE(IDS_PATCH_ALL))); progDlg.ShowModeless(m_hWnd); for (int i=0; i<m_arFileStates.GetCount() && !progDlg.HasUserCancelled(); i++) { if (m_arFileStates.GetAt(i)!= FPDLG_FILESTATE_PATCHED) { progDlg.SetLine(2, GetFullPath(i), true); m_pCallBack->PatchFile(GetFullPath(i), m_pPatch->GetRevision(i), TRUE); } progDlg.SetProgress64(i, m_arFileStates.GetCount()); } progDlg.Stop(); } } break; case ID_PATCHSELECTED: { if (m_pCallBack) { CSysProgressDlg progDlg; progDlg.SetTitle(IDR_MAINFRAME); progDlg.SetShowProgressBar(true); progDlg.SetLine(1, CString(MAKEINTRESOURCE(IDS_PATCH_SELECTED))); progDlg.ShowModeless(m_hWnd); // The list cannot be sorted by user, so the order of the // items in the list is identical to the order in the array // m_arFileStates. int selCount = m_cFileList.GetSelectedCount(); int count = 1; POSITION pos = m_cFileList.GetFirstSelectedItemPosition(); int index; while (((index = m_cFileList.GetNextSelectedItem(pos)) >= 0) && (!progDlg.HasUserCancelled())) { if (m_arFileStates.GetAt(index)!= FPDLG_FILESTATE_PATCHED) { progDlg.SetLine(2, GetFullPath(index), true); m_pCallBack->PatchFile(GetFullPath(index), m_pPatch->GetRevision(index), TRUE); } progDlg.SetProgress64(count++, selCount); } progDlg.Stop(); } } break; default: break; } } }
void CLayoutMapZoomout::LButtonDownEvent (UINT nFlags, CPoint point) { //获取活动地图控件 Framework::IMapCtrl *pMapCtrl = Framework::IMapCtrl::GetActiveMapCtrl(); if(!pMapCtrl) return; Carto::CMapPtr pMap = pMapCtrl->GetMap(); if(!pMap) return; Framework::ILayoutCtrl *pLayoutCtrl = Framework::ILayoutCtrl::GetActiveLayoutCtrl(); if(!pLayoutCtrl) return; Carto::CPageLayoutPtr pPageLayout = pLayoutCtrl->GetPageLayout(); if(!pPageLayout) return; Element::CMapFrame* pMapFrame = NULL; Element::IElementPtr pElement = pPageLayout->GetGraphicLayer()->Reset(); while(pElement) { if(pElement->GetType() != Element::ET_MAP_FRAME_ELEMENT) { pElement = pPageLayout->GetGraphicLayer()->Next(); continue; } Element::CMapFrame* pTmpMapFrm = dynamic_cast<Element::CMapFrame*>(pElement.get()); if(pTmpMapFrm->GetMap() != pMap) { pElement = pPageLayout->GetGraphicLayer()->Next(); continue; } pMapFrame = pTmpMapFrm; break; } if(!pMapFrame) return; DIS_RECT* mapFrameBound = NULL; CreateDisplayRect(mapFrameBound); mapFrameBound = pPageLayout->GetDisplay()->GetDisplayTransformation().TransformToDisplay(pMapFrame->GetGeometry()->getEnvelopeInternal()); //Selection Box CRectTracker selectBox = CRectTracker(CRect(0,0,0,0), CRectTracker::solidLine + CRectTracker::resizeOutside ); selectBox.m_sizeMin = 0; bool selected = selectBox.TrackRubberBand(dynamic_cast<CWnd*>(pLayoutCtrl), point, FALSE ); CRect rect = selectBox.m_rect; rect.NormalizeRect(); if( ( rect.BottomRight().x - rect.TopLeft().x ) < 10 && ( rect.BottomRight().y - rect.TopLeft().y ) < 10 ) selected = false; if( selected == true ) { GEOMETRY::geom::Envelope envelop; pMap->GetDisplay()->GetDisplayTransformation().GetGeoBound(envelop); long lWidth = rect.Width(); long lHeight = rect.Height(); double rx = envelop.getWidth()/ lWidth; double ry = envelop.getHeight()/ lHeight; double dbScale = (rx > ry) ? rx : ry; pMap->GetDisplay()->GetDisplayTransformation().ZoomToFixScale(dbScale); CRect viewRect =pMap->GetDisplay()->GetDisplayTransformation().GetViewBound().GetRect(); double dx=(rect.CenterPoint().x - mapFrameBound->left - viewRect.CenterPoint().x)*dbScale; double dy=(viewRect.CenterPoint().y - (rect.CenterPoint().y - mapFrameBound->top))*dbScale; pMap->GetDisplay()->GetDisplayTransformation().MoveViewBound(dx,dy); } else { double geoCenterX, geoCenterY; long x,y; x = point.x - mapFrameBound->left; y = point.y - mapFrameBound->top; pMap->GetDisplay()->GetDisplayTransformation().ConvertDisplayToGeo(x,y,geoCenterX, geoCenterY); pMap->GetDisplay()->GetDisplayTransformation().SetGeoCenterX(geoCenterX); pMap->GetDisplay()->GetDisplayTransformation().SetGeoCenterY(geoCenterY); pMap->GetDisplay()->GetDisplayTransformation().ZoomViewPosScale(1.5); } GEOMETRY::geom::Envelope viewGeo; pMap->GetDisplay()->GetDisplayTransformation().GetGeoBound(viewGeo); pMap->SetViewEnvelope(viewGeo); FreeDisplayObj(mapFrameBound); pLayoutCtrl->UpdateControl(); }
void CGitProgressList::OnContextMenu(CWnd* pWnd, CPoint point) { if (m_options & ProgOptDryRun) return; // don't do anything in a dry-run. if (pWnd != this) return; int selIndex = GetSelectionMark(); if ((point.x == -1) && (point.y == -1)) { // Menu was invoked from the keyboard rather than by right-clicking CRect rect; GetItemRect(selIndex, &rect, LVIR_LABEL); ClientToScreen(&rect); point = rect.CenterPoint(); } if ((selIndex < 0) || m_bThreadRunning || GetSelectedCount() == 0) return; // entry is selected, thread has finished with updating so show the popup menu CIconMenu popup; if (!popup.CreatePopupMenu()) return; ContextMenuActionList actions; NotificationData* data = m_arData[selIndex]; if (data && GetSelectedCount() == 1) data->GetContextMenu(popup, actions); if (!actions.empty()) popup.AppendMenu(MF_SEPARATOR, NULL); actions.push_back([&]() { CString sLines; POSITION pos = GetFirstSelectedItemPosition(); while (pos) { int nItem = GetNextSelectedItem(pos); NotificationData* data = m_arData[nItem]; if (data) { sLines += data->sPathColumnText; sLines += _T("\r\n"); } } sLines.TrimRight(); if (!sLines.IsEmpty()) CStringUtils::WriteAsciiStringToClipboard(sLines, GetSafeHwnd()); }); popup.AppendMenuIcon(actions.size(), IDS_LOG_POPUP_COPYTOCLIPBOARD, IDI_COPYCLIP); if (actions.empty()) return; int cmd = popup.TrackPopupMenu(TPM_RETURNCMD | TPM_LEFTALIGN | TPM_NONOTIFY, point.x, point.y, this, 0); if (cmd <= 0 || (size_t)cmd > actions.size()) return; theApp.DoWaitCursor(1); actions.at(cmd - 1)(); theApp.DoWaitCursor(-1); }
// 重置消息框样式和外观 void CRMessageBox::ResetMessageBox() { // 根据信息的多少重置对话框窗口大小 CRect rcWnd; CRect rcPromptMessage; CRect rcButton; CSize size; CDC* pDC; int iOffsetY; // 按钮控件需要在垂直方向上的移位距离 GetWindowRect(&rcWnd); // 根据提示文字的多少计算窗口大小 pDC = m_stcPromptMessage.GetDC(); size = pDC->GetTextExtent(m_sPromptMessage); m_stcPromptMessage.ReleaseDC(pDC); if (size.cx < 200) { size.cx = 200; } else if (size.cx > 500) { size.cy = size.cx / 500 * size.cy; size.cx = 500; } if (size.cy < 32) { size.cy = 32; } rcWnd.right = rcWnd.left + size.cx + 100; rcWnd.bottom = rcWnd.top + size.cy + 155; // 如果要显示复选框,要加上复选框的高度 if (!m_sOptionPromptMessage1.IsEmpty()) { rcWnd.bottom += 18; } if (!m_sOptionPromptMessage2.IsEmpty()) { rcWnd.bottom += 18; } // 将窗口移动到屏幕中间 CRect rcScreen; ::SystemParametersInfo(SPI_GETWORKAREA, 0, &rcScreen, 0); // 取得屏幕大小 rcWnd.OffsetRect(rcScreen.CenterPoint() - rcWnd.CenterPoint()); MoveWindow(&rcWnd); // 重置提示信息标签的大小 m_stcPromptMessage.GetWindowRect(&rcPromptMessage); ScreenToClient(&rcPromptMessage); rcPromptMessage.right = rcPromptMessage.left + size.cx; rcPromptMessage.bottom = rcPromptMessage.top + size.cy + 5; m_stcPromptMessage.MoveWindow(&rcPromptMessage); // 重置复选框控件的大小 m_chkOption1.GetWindowRect(&rcPromptMessage); ScreenToClient(&rcPromptMessage); rcPromptMessage.right = rcPromptMessage.left + size.cx; m_chkOption1.MoveWindow(&rcPromptMessage); m_chkOption2.GetWindowRect(&rcPromptMessage); ScreenToClient(&rcPromptMessage); rcPromptMessage.right = rcPromptMessage.left + size.cx; m_chkOption2.MoveWindow(&rcPromptMessage); // 显示提示信息 m_stcPromptMessage.SetWindowText(m_sPromptMessage); // 根据类型显示不同的按钮,并将它们移动到对话框中间 m_btnOK.GetWindowRect(&rcButton); ScreenToClient(&rcButton); iOffsetY = rcWnd.Height() - rcButton.top - 48; switch (m_iType & 0xF) { case MB_OK: m_btnOK.ShowWindow(SW_SHOW); rcButton.OffsetRect((rcWnd.Width() - rcButton.Width()) / 2 - rcButton.left, iOffsetY); m_btnOK.MoveWindow(&rcButton); break; case MB_OKCANCEL: m_btnOK.ShowWindow(SW_SHOW); m_btnCancel.ShowWindow(SW_SHOW); rcButton.OffsetRect(rcWnd.Width() / 2 - rcButton.Width() - 2 - rcButton.left, iOffsetY); m_btnOK.MoveWindow(&rcButton); rcButton.OffsetRect(rcButton.Width() + 4, 0); m_btnCancel.MoveWindow(&rcButton); break; case MB_YESNO: m_btnYes.ShowWindow(SW_SHOW); m_btnNo.ShowWindow(SW_SHOW); rcButton.OffsetRect(rcWnd.Width() / 2 - rcButton.Width() - 2 - rcButton.left, iOffsetY); m_btnYes.MoveWindow(&rcButton); rcButton.OffsetRect(rcButton.Width() + 4, 0); m_btnNo.MoveWindow(&rcButton); break; case MB_YESNOCANCEL: m_btnYes.ShowWindow(SW_SHOW); m_btnNo.ShowWindow(SW_SHOW); m_btnCancel.ShowWindow(SW_SHOW); rcButton.OffsetRect((rcWnd.Width() - rcButton.Width()) / 2 - 2 - rcButton.Width() - rcButton.left, iOffsetY); m_btnYes.MoveWindow(&rcButton); rcButton.OffsetRect(rcButton.Width() + 4, 0); m_btnNo.MoveWindow(&rcButton); rcButton.OffsetRect(rcButton.Width() + 4, 0); m_btnCancel.MoveWindow(&rcButton); break; case MB_RETRYCANCEL: m_btnRetry.ShowWindow(SW_SHOW); m_btnCancel.ShowWindow(SW_SHOW); rcButton.OffsetRect(rcWnd.Width() / 2 - rcButton.Width() - 2 - rcButton.left, iOffsetY); m_btnRetry.MoveWindow(&rcButton); rcButton.OffsetRect(rcButton.Width() + 4, 0); m_btnCancel.MoveWindow(&rcButton); break; // case MB_CANCELTRYCONTINUE: // m_btnCancel.ShowWindow(SW_SHOW); // m_btnContinue.ShowWindow(SW_SHOW); // rcButton.OffsetRect(rcWnd.Width() / 2 - rcButton.Width() - 2 - rcButton.left, iOffsetY); // m_btnCancel.MoveWindow(&rcButton); // rcButton.OffsetRect(rcButton.Width() + 4, 0); // m_btnContinue.MoveWindow(&rcButton); // break; case MB_ABORTRETRYIGNORE: m_btnAbort.ShowWindow(SW_SHOW); m_btnRetry.ShowWindow(SW_SHOW); m_btnIganore.ShowWindow(SW_SHOW); rcButton.OffsetRect((rcWnd.Width() - rcButton.Width()) / 2 - 2 - rcButton.Width() - rcButton.left, iOffsetY); m_btnAbort.MoveWindow(&rcButton); rcButton.OffsetRect(rcButton.Width() + 4, 0); m_btnRetry.MoveWindow(&rcButton); rcButton.OffsetRect(rcButton.Width() + 4, 0); m_btnIganore.MoveWindow(&rcButton); break; default: break; } // 图标的显示在OnPaint函数中实现 }
void CFilePatchesDlg::OnNMRclickFilelist(NMHDR * /*pNMHDR*/, LRESULT *pResult) { *pResult = 0; if (m_sPath.IsEmpty()) return; CString temp; CMenu popup; POINT point; DWORD ptW = GetMessagePos(); point.x = GET_X_LPARAM(ptW); point.y = GET_Y_LPARAM(ptW); if (!popup.CreatePopupMenu()) return; UINT nFlags = MF_STRING | (m_cFileList.GetSelectedCount()==1 ? MF_ENABLED : MF_DISABLED | MF_GRAYED); temp.LoadString(IDS_PATCH_PREVIEW); popup.AppendMenu(nFlags, ID_PATCHPREVIEW, temp); popup.SetDefaultItem(ID_PATCHPREVIEW, FALSE); temp.LoadString(IDS_PATCH_ALL); popup.AppendMenu(MF_STRING | MF_ENABLED, ID_PATCHALL, temp); nFlags = MF_STRING | (m_cFileList.GetSelectedCount() > 0 ? MF_ENABLED : MF_DISABLED | MF_GRAYED); temp.LoadString(IDS_PATCH_SELECTED); popup.AppendMenu(nFlags, ID_PATCHSELECTED, temp); // if the context menu is invoked through the keyboard, we have to use // a calculated position on where to anchor the menu on if ((point.x == -1) && (point.y == -1)) { CRect rect; GetWindowRect(&rect); point = rect.CenterPoint(); } int cmd = popup.TrackPopupMenu(TPM_RETURNCMD | TPM_LEFTALIGN | TPM_NONOTIFY | TPM_RIGHTBUTTON, point.x, point.y, this, 0); switch (cmd) { case ID_PATCHPREVIEW: if (m_pCallBack) { int nIndex = m_cFileList.GetSelectionMark(); if (m_arFileStates.GetAt(nIndex) == FPDLG_FILESTATE_ERROR) { MessageBox(m_pPatch->GetPatchRejects(nIndex), NULL, MB_ICONERROR); } else if ( m_arFileStates.GetAt(nIndex)!=FPDLG_FILESTATE_PATCHED) { m_pCallBack->PatchFile(m_pPatch->GetStrippedPath(nIndex), m_pPatch->GetContentMods(nIndex), m_pPatch->GetPropMods(nIndex), _T("")); m_ShownIndex = nIndex; m_cFileList.Invalidate(); } } break; case ID_PATCHALL: PatchAll(); break; case ID_PATCHSELECTED: PatchSelected(); break; default: break; } }
void CPlayerSeekBar::OnPaint() { CPaintDC dc(this); // device context for painting bool fEnabled = m_fEnabled && m_start < m_stop; COLORREF white = GetSysColor(COLOR_WINDOW), shadow = GetSysColor(COLOR_3DSHADOW), light = GetSysColor(COLOR_3DHILIGHT), bkg = GetSysColor(COLOR_BTNFACE); // thumb { CRect r = GetThumbRect(), r2 = GetInnerThumbRect(); CRect rt = r, rit = r2; dc.Draw3dRect(&r, light, 0); r.DeflateRect(0, 0, 1, 1); dc.Draw3dRect(&r, light, shadow); r.DeflateRect(1, 1, 1, 1); CBrush b(bkg); dc.FrameRect(&r, &b); r.DeflateRect(0, 1, 0, 1); dc.FrameRect(&r, &b); r.DeflateRect(1, 1, 0, 0); dc.Draw3dRect(&r, shadow, bkg); if(fEnabled) { r.DeflateRect(1, 1, 1, 2); CPen white(PS_INSIDEFRAME, 1, white); CPen* old = dc.SelectObject(&white); dc.MoveTo(r.left, r.top); dc.LineTo(r.right, r.top); dc.MoveTo(r.left, r.bottom); dc.LineTo(r.right, r.bottom); dc.SelectObject(old); dc.SetPixel(r.CenterPoint().x, r.top, 0); dc.SetPixel(r.CenterPoint().x, r.bottom, 0); } dc.SetPixel(r.CenterPoint().x+5, r.top-4, bkg); { CRgn rgn1, rgn2; rgn1.CreateRectRgnIndirect(&rt); rgn2.CreateRectRgnIndirect(&rit); ExtSelectClipRgn(dc, rgn1, RGN_DIFF); ExtSelectClipRgn(dc, rgn2, RGN_OR); } } // channel { CRect r = GetChannelRect(); dc.FillSolidRect(&r, fEnabled ? white : bkg); r.InflateRect(1, 1); dc.Draw3dRect(&r, shadow, light); dc.ExcludeClipRect(&r); } // background { CRect r; GetClientRect(&r); CBrush b(bkg); dc.FillRect(&r, &b); } // Do not call CDialogBar::OnPaint() for painting messages }
DWORD WINAPI WorkThread(PVOID pParam) { HWND hTopWnd = FindWindow(L"Qt5QWindowIcon",L"夜神安卓模拟器"); if ( NULL == hTopWnd ) { hTopWnd = FindWindow(L"Qt5QWindowIcon",L"夜神模拟器"); } HWND hWndWork = NULL; EnumChildWindows(hTopWnd,MY_WNDENUMPROC,(LPARAM)&hWndWork); if (IsWindow(hWndWork)) { while (1) { CRect rcWin; GetClientRect(hWndWork,&rcWin); int nWidth = rcWin.Width(); int nHeight = rcWin.Height(); //点击进攻 CRect rcJinGong; rcJinGong.left = (float)nWidth/60.25f; rcJinGong.top = (float)nHeight/1.186f; rcJinGong.right = rcJinGong.left +(float)nWidth/11.296875f; rcJinGong.bottom = rcJinGong.top +(float)nWidth/11.296875f; PostClickWindow(hWndWork,rcJinGong.CenterPoint().x,rcJinGong.CenterPoint().y); Sleep(500); //点击搜索 CRect rcSouSuo; rcSouSuo.left = (float)nWidth/8.65f; rcSouSuo.top = (float)nHeight/1.4591; rcSouSuo.right = rcSouSuo.left +(float)nWidth/5.1488f; rcSouSuo.bottom = rcSouSuo.top +(float)nHeight/3.8795f; rcSouSuo.top-=20; rcSouSuo.bottom-=20; PostClickWindow(hWndWork,rcSouSuo.CenterPoint().x,rcSouSuo.CenterPoint().y); Sleep(5000); //释放一个小兵 PostClickWindow(hWndWork,10,10); Sleep(500); //点击放弃 CRect rcFangQi; rcFangQi.left = (float)nWidth/63.00f; rcFangQi.top = (float)nHeight/1.35f; rcFangQi.right = rcFangQi.left +(float)nWidth/9.21f; rcFangQi.bottom = rcFangQi.top +(float)nHeight/16.31f; PostClickWindow(hWndWork,rcFangQi.CenterPoint().x,rcFangQi.CenterPoint().y); Sleep(500); //点击确定 CRect rcQueDing; rcQueDing.left = (float)nWidth/1.95f; rcQueDing.top = (float)nHeight/1.80f; rcQueDing.right = rcQueDing.left +(float)nWidth/7.2f; rcQueDing.bottom = rcQueDing.top +(float)nHeight/9.65f; PostClickWindow(hWndWork,rcQueDing.CenterPoint().x,rcQueDing.CenterPoint().y); Sleep(500); //点击回营 CRect rcHuiYing; rcHuiYing.left = (float)nWidth/2.33f; rcHuiYing.top = (float)nHeight/1.28f; rcHuiYing.right = rcHuiYing.left +(float)nWidth/7.2f; rcHuiYing.bottom = rcHuiYing.top +(float)nHeight/10.51f; PostClickWindow(hWndWork,rcHuiYing.CenterPoint().x,rcHuiYing.CenterPoint().y); Sleep(4000); } } return 0; }
void CPicViewDialog::UpdateLayout( LPCRECT prcClient /* = NULL */ ) { if( !this->GetSafeHwnd() ) { return; } CRect rcClient; if ( prcClient ) { rcClient = *prcClient; } else { this->GetClientRect( rcClient ); } // 剩余的空间。 CRect rcLeftSpace = rcClient; // 是否显示除图片外的其它控件。 BOOL bShowCtrls = !m_bFullScreen; // logo. if ( m_logoDlg.GetSafeHwnd() && bShowCtrls ) { int nLogoHeight = m_logoDlg.GetHeight(); CRect rcLogoDlg = rcClient; rcLogoDlg.bottom = nLogoHeight; this->m_logoDlg.MoveWindow( rcLogoDlg ); // 在剩余空间中去除logo占用的空间。 rcLeftSpace.top += nLogoHeight; } // 屏幕长度(宽和高中更长的那个)作为控件比例的基数。 int nScreenLong = GetScreenLong(); int nScreenWidth = ::GetScreenWidth(); // 调整菜单条的位置。 if ( m_stBottomBg.GetSafeHwnd() && m_btnDelete.GetSafeHwnd() && m_btnReturn.GetSafeHwnd() && bShowCtrls ) { // 底部按钮条(替代以前的菜单)的高度 const float conFMenubarHeight = 0.082; int nMenubarHeight = int( conFMenubarHeight * nScreenLong ); CRect rcBottomBg = rcClient; rcBottomBg.top = rcBottomBg.bottom - nMenubarHeight; m_stBottomBg.MoveWindow( rcBottomBg ); CRect rcBtnDelete; BOOL bResult = this->m_btnDelete.GetImageSize( rcBtnDelete ); if ( bResult ) { int nNewWidth = nMenubarHeight * rcBtnDelete.Width() / rcBtnDelete.Height(); rcBtnDelete = rcBottomBg; rcBtnDelete.right = rcBtnDelete.left + nNewWidth; this->m_btnDelete.SetWindowPos( &CWnd::wndTop, rcBtnDelete.left, rcBtnDelete.top, rcBtnDelete.Width(), rcBtnDelete.Height(), NULL ); } CRect rcBtnReturn; bResult = this->m_btnReturn.GetImageSize( rcBtnReturn ); if ( bResult ) { int nNewWidth = nMenubarHeight * rcBtnReturn.Width() / rcBtnReturn.Height(); rcBtnReturn = rcBottomBg; rcBtnReturn.left = rcBtnReturn.right - nNewWidth; this->m_btnReturn.SetWindowPos( &CWnd::wndTop, rcBtnReturn.left, rcBtnReturn.top, rcBtnReturn.Width(), rcBtnReturn.Height(), NULL ); } // 在剩余空间中去除菜单条占用的空间。 rcLeftSpace.bottom -= nMenubarHeight; } // 图片控件。 // 三个按钮。 // 放大按钮,图片信息,缩小按钮,三个控件贴近程序客户区的下边显示。 // 全部都与屏幕大小成正比,按钮固定图片的长宽比例进行伸缩变化。 // 应该在事先已经将按钮控件大小调节为图片的长宽比。 // 对话框下部控制按钮高度。 const float conFControlHeight = 0.097; const float conFControlWidth = 0.116; const float conFPicInfoStWidth = 0.625; int nNewHeight = int( nScreenLong * conFControlHeight ); int nNewBtnWidth = int( nScreenLong * conFControlWidth ); CRect rcZoomIn, rcZoomOut, rcPicInfo; int nNewPicInfoWidth = int( nScreenWidth * conFPicInfoStWidth ); int nNewTop = rcLeftSpace.bottom - nNewHeight; int nNewBottom = rcLeftSpace.bottom; CRect rcNewPicInfo( 0, nNewTop, nNewPicInfoWidth, nNewBottom ); rcNewPicInfo.OffsetRect( ( nScreenWidth - nNewPicInfoWidth ) / 2, 0 ); CRect rcNewZoomIn( 0, nNewTop, nNewBtnWidth, nNewBottom ); rcNewZoomIn.OffsetRect( rcNewPicInfo.left - rcNewZoomIn.right, 0 ); CRect rcNewZoomOut( 0, nNewTop, nNewBtnWidth, nNewBottom ); rcNewZoomOut.OffsetRect( rcNewPicInfo.right - rcNewZoomOut.left, 0 ); BOOL bStPicInfoShow = m_stPicInfo.GetSafeHwnd() && bShowCtrls; BOOL bBtnZoomInShow = m_btnZoomIn.GetSafeHwnd() && bShowCtrls; BOOL bBtnZoomOutShow = m_btnZoomOut.GetSafeHwnd() && bShowCtrls; if ( bStPicInfoShow ) { m_stPicInfo.MoveWindow( rcNewPicInfo ); } if ( bBtnZoomInShow ) { m_btnZoomIn.MoveWindow( rcNewZoomIn ); } if( bBtnZoomOutShow ) { m_btnZoomOut.MoveWindow( rcNewZoomOut ); } // 在剩余空间中去除信息显示。 if ( bStPicInfoShow || bBtnZoomInShow || bBtnZoomOutShow ) { rcLeftSpace.bottom -= nNewHeight; } if ( m_stPic.GetSafeHwnd() ) { CRect rcPicOriginal; m_stPic.GetImageSize( rcPicOriginal ); CRect rcPicOld = rcPicOriginal; CRect rcMaxPicSpace; int nPicSpaceHeight = 0; int nPicSpaceWidth = 0; if ( m_bFullScreen ) { nPicSpaceWidth = rcClient.Width(); nPicSpaceHeight = rcClient.Height(); rcMaxPicSpace = rcClient; } else { //rcMaxPicSpace = rcClient; //rcMaxPicSpace.top = m_logoDlg.GetHeight(); //rcMaxPicSpace.bottom -= nNewHeight; rcMaxPicSpace = rcLeftSpace; nPicSpaceHeight = int( rcMaxPicSpace.Height() * m_fZoomRadio ); nPicSpaceWidth = int( rcMaxPicSpace.Width() * m_fZoomRadio ); } // 保持图片长宽比例,将图片放入。 CRect rcNewPic( 0,0,0,0 ); if ( rcPicOld.Width() * nPicSpaceHeight > rcPicOld.Height() * nPicSpaceWidth ) { // 图片的宽:高大与图片显示空间的宽高比。图片的横向将占满,纵向不满。 rcNewPic.right = nPicSpaceWidth; rcNewPic.bottom = rcPicOld.Height() * nPicSpaceWidth / rcPicOld.Width(); } else { // 与之相反。 rcNewPic.right = rcPicOld.Width() * nPicSpaceHeight / rcPicOld.Height(); rcNewPic.bottom = nPicSpaceHeight; } // 将图片rect移至图片空间中心。 CPoint offset = rcMaxPicSpace.CenterPoint() - rcNewPic.CenterPoint(); rcNewPic.OffsetRect( offset ); this->m_stPic.MoveWindow( rcNewPic ); } }
void CRichEditExtn::OnContextMenu(CWnd* pWnd, CPoint point) { if (m_vmenu_items.empty()) { CRichEditExtn::OnContextMenu(pWnd, point); return; } SetFocus(); CMenu menu; menu.CreatePopupMenu(); BOOL bReadOnly = GetStyle() & ES_READONLY; DWORD flags = CanUndo() && !bReadOnly ? 0 : MF_GRAYED; int iPos(0); menu.InsertMenu(iPos++, MF_BYPOSITION | flags, EM_UNDO, CString(MAKEINTRESOURCE(IDS_MENUSTRING_UNDO))); menu.InsertMenu(iPos++, MF_BYPOSITION | MF_SEPARATOR); long lStart, lEnd; GetSel(lStart, lEnd); flags = lStart == lEnd ? MF_GRAYED : 0; menu.InsertMenu(iPos++, MF_BYPOSITION | flags, WM_COPY, CString(MAKEINTRESOURCE(IDS_MENUSTRING_COPY))); flags = (flags == MF_GRAYED || bReadOnly) ? MF_GRAYED : 0; menu.InsertMenu(iPos++, MF_BYPOSITION | flags, WM_CUT, CString(MAKEINTRESOURCE(IDS_MENUSTRING_CUT))); flags = (flags == MF_GRAYED || bReadOnly) ? MF_GRAYED : 0; menu.InsertMenu(iPos++, MF_BYPOSITION | flags, WM_CLEAR, CString(MAKEINTRESOURCE(IDS_MENUSTRING_DELETE))); flags = IsClipboardFormatAvailable(EDIT_CLIPBOARD_TEXT_FORMAT) && !bReadOnly ? 0 : MF_GRAYED; menu.InsertMenu(iPos++, MF_BYPOSITION | flags, WM_PASTE, CString(MAKEINTRESOURCE(IDS_MENUSTRING_PASTE))); menu.InsertMenu(iPos++, MF_BYPOSITION | MF_SEPARATOR); int len = GetWindowTextLength(); flags = (!len || (lStart == 0 && lEnd == len)) ? MF_GRAYED : 0; menu.InsertMenu(iPos++, MF_BYPOSITION | flags, EM_SELECTALL, CString(MAKEINTRESOURCE(IDS_MENUSTRING_SELECTALL))); menu.InsertMenu(iPos++, MF_BYPOSITION | MF_SEPARATOR); for (size_t i = 0; i < m_vmenu_items.size(); i++) { menu.InsertMenu((int)i + iPos, MF_BYPOSITION | m_vmenu_items[i].flags, m_vmenu_items[i].message_number, m_vmenu_items[i].menu_string.c_str()); if (!m_vmenu_items[i].bEnable) menu.EnableMenuItem((int)i + iPos, MF_BYPOSITION | MF_GRAYED); } if (point.x == -1 || point.y == -1) { CRect rc; GetClientRect(&rc); point = rc.CenterPoint(); ClientToScreen(&point); } // For some reason - weird cursor m_bContextMenu = true; // Now show menu UINT_PTR nCmd = menu.TrackPopupMenu(TPM_LEFTALIGN | TPM_LEFTBUTTON | TPM_RETURNCMD | TPM_RIGHTBUTTON, point.x, point.y, this); // Restore cursor m_bContextMenu = false; if (nCmd == 0) return; std::vector<st_context_menu>::iterator iter; iter = std::find_if(m_vmenu_items.begin(), m_vmenu_items.end(), equal_cmd(nCmd)); if (iter != m_vmenu_items.end()) { this->GetParent()->SendMessage((UINT)nCmd, iter->wParam, iter->lParam); return; } switch (nCmd) { case EM_UNDO: case WM_CUT: case WM_COPY: case WM_CLEAR: SendMessage((UINT)nCmd); break; case WM_PASTE: SendMessage(EM_PASTESPECIAL, CF_UNICODETEXT, NULL); break; case EM_SELECTALL: SendMessage(EM_SETSEL, 0, -1); break; default: break; } }
int CNSChartCtrl::HitTest(CPoint &pt) { if(m_dTotal <= 0.0) { return -1; } if(m_dwStyle & NSCS_BAR ) { int iValues = m_ChartValues.GetSize(); CRect rect,rcBar; CString str; GetClientRect(&rect); double t = 1.0L; if(m_dMax >= 1.0L){ str.Format(TEXT("%.0f"),m_dMax); int d = 1; for(int i = 0;i<str.GetLength()-1;i++) d*=10; t = max((((double)str.GetAt(0)-48)+1)*d,m_dMax); } rect.DeflateRect(40,30,20,20); rcBar = rect; rcBar.bottom = rect.bottom+1; int scale = rcBar.Width()/iValues; int height = rcBar.Height(); CNSChartValue* pTmp; for (int i = 0; i < iValues; i++ ) { pTmp = m_ChartValues.GetAt(i); rcBar.left = rect.left + scale*i + 2; rcBar.right = rcBar.left + scale - 4; rcBar.top = (rcBar.bottom - (long)(pTmp->m_dValue*height/t)); if(rcBar.PtInRect(pt)) { return i; } } } if(m_dwStyle & NSCS_PIE ) { CRect rect; GetClientRect(&rect); double pi = 3.1415926535; double r = min((rect.Width()/2)-50,(rect.Height()/2)-40); CPoint p1 = rect.CenterPoint(); p1.y += 15; double x = (pt.x - p1.x); double y = (pt.y - p1.y); double h = sqrt(x*x + y*y); if(h > 0.0 && h < r) { double dClickAngle = -asin(y/h); if(p1.x > pt.x) dClickAngle = pi - dClickAngle; if(dClickAngle < 0.0) dClickAngle = pi*2 + dClickAngle; int iValues = m_ChartValues.GetSize(); int iColors = m_BrushArray.GetSize(); CNSChartValue* pTmp; double dCurrAngle = 0; double dLastAngle = 0; for (int i = 0; i < iValues; i++ ) { pTmp = m_ChartValues.GetAt(i); dCurrAngle = dLastAngle + pTmp->m_dValue * 2*pi / m_dTotal; if(dClickAngle >= dLastAngle && dClickAngle <= dCurrAngle ) { return i; } dLastAngle = dCurrAngle; } } } return -1; }
void CMyButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) { //从lpDrawItemStruct获取控件的相关信息 CRect rect = lpDrawItemStruct->rcItem; CDC *pDC=CDC::FromHandle(lpDrawItemStruct->hDC); int nSaveDC=pDC->SaveDC(); UINT state = lpDrawItemStruct->itemState; TCHAR strText[MAX_PATH + 1]; ::GetWindowText(m_hWnd, strText, MAX_PATH); BOOL bFocus=m_bOver; //按钮是否被选中(点击或tab或默认) CString strImgPath = "" ; //获取按钮的状态 if (state & ODS_FOCUS || state & ODS_SELECTED || state & ODS_DEFAULT) { bFocus = TRUE; } if (m_bIsDrawImgBtn) { if (bFocus) //有焦点或鼠标经过 { strImgPath = m_strPathHover; } else { strImgPath = m_strPathNormal; } Graphics gs(pDC->m_hDC); Image img(strImgPath.AllocSysString()); gs.DrawImage(&img,0,0,rect.Width(),rect.Height()); } else { Color clrStart,clrEnd; COLORREF clrBorder; if (bFocus) { clrStart=m_clrTodStartHover; clrEnd=m_clrBottomEndHover; clrBorder=m_clrBorderHover; } else { clrStart=m_clrTodStartNormal; clrEnd=m_clrBottomEndNormal; clrBorder=m_clrBorderNormal; } int cxBorder=GetSystemMetrics(SM_CXEDGE); int cyBorder=GetSystemMetrics(SM_CYEDGE); Graphics myGraphics(pDC->m_hDC); LinearGradientBrush linGrBrush( Rect(0,0,rect.Width()/*-cxBorder*/,rect.Height()/*-cyBorder*/), clrStart,//Color(255, 238, 238, 238), clrEnd,//Color(200, 208,208,208), LinearGradientModeVertical); myGraphics.FillRectangle(&linGrBrush, 1,1,rect.Width()-cxBorder,rect.Height()-cyBorder); // CRgn rgn; // rgn.CreateRoundRectRgn(rect.left,rect.top,rect.right,rect.bottom,2,2); // myGraphics.FillRegion(&linGrBrush,&Region((HRGN)rgn.m_hObject)); CPen pen; pen.CreatePen(PS_SOLID,1,clrBorder);//RGB(162,203,236) pDC->SelectObject(&pen); pDC->SelectStockObject(NULL_BRUSH); pDC->RoundRect(&rect,CPoint(3,3)); // pDC->SetPixel(rect.right-2,rect.bottom-2,clrEnd.ToCOLORREF()); } //显示按钮的文本 if (strText!=NULL) { CFont* pFont = GetFont(); CFont* pOldFont = pDC->SelectObject(pFont); CSize szExtent = pDC->GetTextExtent(strText, lstrlen(strText)); CPoint pt( rect.CenterPoint().x - szExtent.cx / 2+1, rect.CenterPoint().y - szExtent.cy / 2+1); if (state & ODS_SELECTED) pt.Offset(1, 1); int nMode = pDC->SetBkMode(TRANSPARENT); //输出首字母带下划线效果文本 if (state & ODS_DISABLED) pDC->DrawState(pt, szExtent, strText, DSS_DISABLED, TRUE, 0, (HBRUSH)NULL); else pDC->DrawState(pt, szExtent, strText, DSS_NORMAL, TRUE, 0, (HBRUSH)NULL); pDC->SelectObject(pOldFont); pDC->SetBkMode(nMode); } pDC->RestoreDC(nSaveDC); }
DWORD WINAPI WorkThread(PVOID pParam) { HWND hTopWnd = FindWindow(L"Qt5QWindowIcon",L"夜神安卓模拟器"); if ( NULL == hTopWnd ) { hTopWnd = FindWindow(L"Qt5QWindowIcon",L"夜神模拟器"); } HWND hWndWork = NULL; HWND hSubWin = NULL; EnumChildWindows(hTopWnd,MY_WNDENUMPROC,(LPARAM)&hSubWin); hWndWork = GetParent(hSubWin); int nScanR = 150; int nScanSpace = 5; int nCurAngle = 0; int nStartOffset = 10; int nPrintWidth = nScanR*2+10; HDC hScreenDc = GetDC(NULL); HDC hMemDC = CreateCompatibleDC(hScreenDc); HBITMAP hMemBmp = CreateCompatibleBitmap(hScreenDc,nPrintWidth,nPrintWidth); SelectObject(hMemDC,hMemBmp); ReleaseDC(NULL,hScreenDc); while (IsWindow(hWndWork)) { CRect rcClient; GetClientRect(hWndWork,&rcClient); CRect rcWin; GetWindowRect(hWndWork,&rcWin); CPoint ptCenter; ptCenter = rcClient.CenterPoint(); hScreenDc = GetDC(NULL); BitBlt(hMemDC,0,0,nPrintWidth,nPrintWidth,hScreenDc,rcWin.left + ptCenter.x - nPrintWidth/2,rcWin.top + ptCenter.y -nPrintWidth/2,SRCCOPY); ReleaseDC(NULL,hScreenDc); int nX = 0; int nY = 0; BOOL bAllClearLeft = TRUE; for (int i=nStartOffset;i<nScanR;i+=nScanSpace ) { AngleToXY(nCurAngle-4,i,nX,nY); COLORREF clrRef = GetPixel(hMemDC,nPrintWidth/2+nX,nPrintWidth/2+nY); if ( !CheckBg(clrRef)) { bAllClearLeft = FALSE; break; } } BOOL bAllClearRight = TRUE; for (int i=nStartOffset;i<nScanR;i+=nScanSpace ) { AngleToXY(nCurAngle+4,i,nX,nY); COLORREF clrRef = GetPixel(hMemDC,nPrintWidth/2+nX,nPrintWidth/2+nY); if ( !CheckBg(clrRef)) { bAllClearRight = FALSE; break; } } if ( !bAllClearLeft || !bAllClearRight ) { while (TRUE) { int nX = 0; int nY = 0; int nAngle = GetRandValue( 0 ,359 ); BOOL bAllClearLeft = TRUE; for (int i=nStartOffset;i<nScanR;i+=nScanSpace ) { AngleToXY(nAngle-4,i,nX,nY); COLORREF clrRef = GetPixel(hMemDC,nPrintWidth/2+nX,nPrintWidth/2+nY); if ( !CheckBg(clrRef)) { bAllClearLeft = FALSE; break; } } BOOL bAllClearRight = TRUE; for (int i=nStartOffset;i<nScanR;i+=nScanSpace ) { AngleToXY(nAngle+4,i,nX,nY); COLORREF clrRef = GetPixel(hMemDC,nPrintWidth/2+nX,nPrintWidth/2+nY); if ( !CheckBg(clrRef)) { bAllClearRight = FALSE; break; } } if (bAllClearLeft && bAllClearRight) { nCurAngle = nAngle; ChangeMoveAngle(hWndWork,nAngle); break; } } } Sleep(50); } return 0; }
BalloonMsg::BalloonMsg(CWnd* wnd, const TCHAR* title, const TCHAR* msg, MsgIcon icon, CPoint pos) { if (wnd == 0) { ASSERT(false); delete this; return; } ASSERT(msg && title); if (!wnd->IsWindowVisible()) // it only makes sense to display balloon for visible windows { MessageBox(msg, title); delete this; return; } closing_ = false; Create(0, WS_POPUP | TTS_NOPREFIX | TTS_BALLOON | TTS_ALWAYSTIP); if (m_hWnd == 0) return; msg_ = msg; title_ = title; const TCHAR* text= msg_; struct OLDTOOLINFO { UINT cbSize; UINT uFlags; HWND hwnd; UINT uId; RECT rect; HINSTANCE hinst; LPTSTR lpszText; } ti; // new TOOLINFO with extra reserved field changes the way balloons work rendering them useless... // TOOLINFO ti; ti.cbSize = sizeof ti; ti.uFlags = TTF_TRACK | TTF_IDISHWND; ti.hwnd = wnd->m_hWnd; ti.uId = 1; ti.hinst = NULL; ti.lpszText = const_cast<TCHAR*>(text); //LPSTR_TEXTCALLBACK; ti.rect.left = 0; ti.rect.top = 0; ti.rect.right = 0; ti.rect.bottom = 0; // ti.lParam = 0; SendMessage(TTM_ADDTOOL, 0, LPARAM(&ti)); SetMaxTipWidth(300); // SetTitle(icon, title_); const TCHAR* ttl= title_; SendMessage(TTM_SETTITLE, icon, LPARAM(ttl)); if (pos.x == 0 && pos.y == 0) { CRect rect; wnd->GetWindowRect(rect); pos = rect.CenterPoint(); } SendMessage(TTM_TRACKPOSITION, 0, MAKELONG(pos.x, pos.y)); SendMessage(TTM_TRACKACTIVATE, true, LPARAM(&ti)); ::MessageBeep(MB_OK); SetTimer(TIMER_ID, 10000, 0); wnd->SetFocus(); SubclassWnd(*wnd); InstallMouseHook(); }
Figure* CDanmoojiPaintDoc::Selected_obj(CPoint point) // 객체를 선택하는 함수 { // 리스트의 끝위치를 얻는다. POSITION pos = obj_list.GetTailPosition(); // 구조체 포인터를 생성한다. Figure* p_data = NULL; // 등록된 객체들에 대해 클릭 된 포인트와 가장 가까운 객체를 선택한다. while (pos != NULL) { // 위치 값이 있는 경우 // 현재 위치값에 해당하는 구조체를 반환하고 위치값은 다음 구조체를 가리킨다. p_data = (Figure *)obj_list.GetPrev(pos); CPoint tmp = p_data->GetPrevPoint(); CPoint tmp2 = p_data->GetAftPoint(); switch (p_data->thisobject()) { case LINE: { CRect rec = p_data->getBoundary(); p_data->SetPrevPoint(rec.TopLeft()); p_data->SetAtfPoint(rec.BottomRight()); if ((rec.left - point.x <= 5 && rec.left - point.x >= -5) && (rec.top - point.y <= 5 && rec.top - point.y >= -5))// 왼쪽 위 점 선택 p_data->setMovemode(1); else if ((rec.left - point.x <= 5 && rec.left - point.x >= -5) && (rec.bottom - point.y <= 5 && rec.bottom - point.y >= -5))// 왼쪽 아래 점 선택 p_data->setMovemode(7); else if ((rec.right - point.x <= 5 && rec.right - point.x >= -5) && (rec.top - point.y <= 5 && rec.top - point.y >= -5))// 오른쪽 위 점 선택 p_data->setMovemode(3); else if ((rec.right - point.x <= 5 && rec.right - point.x >= -5) && (rec.bottom - point.y <= 5 && rec.bottom - point.y >= -5))// 오른쪽 아래 점 선택 p_data->setMovemode(5); else if ((rec.CenterPoint().x - point.x <= 5 && rec.CenterPoint().x - point.x >= -5) && (rec.top - point.y <= 5 && rec.top - point.y >= -5)) // 가운데 윗점 선택 p_data->setMovemode(2); else if ((rec.CenterPoint().x - point.x <= 5 && rec.CenterPoint().x - point.x >= -5) && (rec.bottom - point.y <= 5 && rec.bottom - point.y >= -5))// 가운데 아래점 선택 p_data->setMovemode(6); else if ((rec.left - point.x <= 5 && rec.left - point.x >= -5) && (rec.CenterPoint().y - point.y <= 5 && rec.CenterPoint().y - point.y >= -5))// 왼쪽 가운데점 선택 p_data->setMovemode(8); else if ((rec.right - point.x <= 5 && rec.right - point.x >= -5) && (rec.CenterPoint().y - point.y <= 5 && rec.CenterPoint().y - point.y >= -5))// 오른쪽 가운데점 선택 p_data->setMovemode(4); else if (rec.PtInRect(point)) p_data->setMovemode(0); else p_data->setMovemode(9); if (p_data->getMovemode() == 9) ; else return p_data; break; } case POLYLINE: { CRect rect = p_data->getBoundary(); if ((rect.left - 5 <= point.x && point.x <= rect.right + 5) && (rect.top - 5 <= point.y && point.y <= rect.bottom + 5)) { // 사각형 내부 클릭 for (int i = 0; i < PolyArr.GetCount(); i++) { if (PolyArr.GetAt(i).x - 5 < point.x && point.x < PolyArr.GetAt(i).x + 5 && PolyArr.GetAt(i).y - 5 < point.y && point.y < PolyArr.GetAt(i).y + 5) { // 클릭한 좌표가 꼭지점인지 체크 if (i == 0) { // 클릭한 좌표가 배열의 맨 처음 값일때(이동할 좌표가 맨 처음 값일때) moveIndex = i; moveAll = FALSE; p_data->setMovemode(0); return p_data; } else if (i == PolyArr.GetCount() - 1) { // 이동할 좌표가 맨 끝 값일때 moveIndex = i; moveAll = FALSE; p_data->setMovemode(1); return p_data; } else { // 이동할 좌표가 안에 있을때 moveIndex = i; moveAll = FALSE; p_data->setMovemode(2); return p_data; } } else { // 클릭한 좌표가 꼭지점이 아닐때 (객체 자체를 이동) moveAll = TRUE; p_data->setMovemode(3); } } return p_data; } break; } case RECTANGLE: { CRect rec = p_data->getBoundary(); p_data->SetPrevPoint(rec.TopLeft()); p_data->SetAtfPoint(rec.BottomRight()); if ((rec.left - point.x <= 5 && rec.left - point.x >= -5) && (rec.top - point.y <= 5 && rec.top - point.y >= -5))// 왼쪽 위 점 선택 p_data->setMovemode(1); else if ((rec.left - point.x <= 5 && rec.left - point.x >= -5) && (rec.bottom - point.y <= 5 && rec.bottom - point.y >= -5))// 왼쪽 아래 점 선택 p_data->setMovemode(7); else if ((rec.right - point.x <= 5 && rec.right - point.x >= -5) && (rec.top - point.y <= 5 && rec.top - point.y >= -5))// 오른쪽 위 점 선택 p_data->setMovemode(3); else if ((rec.right - point.x <= 5 && rec.right - point.x >= -5) && (rec.bottom - point.y <= 5 && rec.bottom - point.y >= -5))// 오른쪽 아래 점 선택 p_data->setMovemode(5); else if ((rec.CenterPoint().x - point.x <= 5 && rec.CenterPoint().x - point.x >= -5) && (rec.top - point.y <= 5 && rec.top - point.y >= -5)) // 가운데 윗점 선택 p_data->setMovemode(2); else if ((rec.CenterPoint().x - point.x <= 5 && rec.CenterPoint().x - point.x >= -5) && (rec.bottom - point.y <= 5 && rec.bottom - point.y >= -5))// 가운데 아래점 선택 p_data->setMovemode(6); else if ((rec.left - point.x <= 5 && rec.left - point.x >= -5) && (rec.CenterPoint().y - point.y <= 5 && rec.CenterPoint().y - point.y >= -5))// 왼쪽 가운데점 선택 p_data->setMovemode(8); else if ((rec.right - point.x <= 5 && rec.right - point.x >= -5) && (rec.CenterPoint().y - point.y <= 5 && rec.CenterPoint().y - point.y >= -5))// 오른쪽 가운데점 선택 p_data->setMovemode(4); else if (rec.PtInRect(point)) p_data->setMovemode(0); else p_data->setMovemode(9); if (p_data->getMovemode() == 9) ; else return p_data; break; } case ELIPSE: {// 선택 한 것이 어떤 객체인지, 만약 움직이거나 크기조절을 한다고하면 Movemode의 변수를 변경 0 일때 움직이기 나머지는 크기 변경 CRect rec = p_data->getBoundary(); p_data->SetPrevPoint(rec.TopLeft()); p_data->SetAtfPoint(rec.BottomRight()); if ((rec.left - point.x <= 5 && rec.left - point.x >= -5) && (rec.top - point.y <= 5 && rec.top - point.y >= -5))// 왼쪽 위 점 선택 p_data->setMovemode(1); else if ((rec.left - point.x <= 5 && rec.left - point.x >= -5) && (rec.bottom - point.y <= 5 && rec.bottom - point.y >= -5))// 왼쪽 아래 점 선택 p_data->setMovemode(7); else if ((rec.right - point.x <= 5 && rec.right - point.x >= -5) && (rec.top - point.y <= 5 && rec.top - point.y >= -5))// 오른쪽 위 점 선택 p_data->setMovemode(3); else if ((rec.right - point.x <= 5 && rec.right - point.x >= -5) && (rec.bottom - point.y <= 5 && rec.bottom - point.y >= -5))// 오른쪽 아래 점 선택 p_data->setMovemode(5); else if ((rec.CenterPoint().x - point.x <= 5 && rec.CenterPoint().x - point.x >= -5) && (rec.top - point.y <= 5 && rec.top - point.y >= -5)) // 가운데 윗점 선택 p_data->setMovemode(2); else if ((rec.CenterPoint().x - point.x <= 5 && rec.CenterPoint().x - point.x >= -5) && (rec.bottom - point.y <= 5 && rec.bottom - point.y >= -5))// 가운데 아래점 선택 p_data->setMovemode(6); else if ((rec.left - point.x <= 5 && rec.left - point.x >= -5) && (rec.CenterPoint().y - point.y <= 5 && rec.CenterPoint().y - point.y >= -5))// 왼쪽 가운데점 선택 p_data->setMovemode(8); else if ((rec.right - point.x <= 5 && rec.right - point.x >= -5) && (rec.CenterPoint().y - point.y <= 5 && rec.CenterPoint().y - point.y >= -5))// 오른쪽 가운데점 선택 p_data->setMovemode(4); else if (rec.PtInRect(point)) p_data->setMovemode(0); else p_data->setMovemode(9); if (p_data->getMovemode() == 9) ; else return p_data; break; } case TEXT: { CRect rect = p_data->getBoundary(); if ((rect.left - 5 <= point.x && point.x <= rect.right + 5) && (rect.top - 5 <= point.y && point.y <= rect.bottom + 5)) return p_data; break; } case FREECURVE: { CRect rect = p_data->getBoundary(); if ((rect.left - 5 <= point.x && point.x <= rect.right + 5) && (rect.top - 5 <= point.y && point.y <= rect.bottom + 5)) return p_data; break; } } } return NULL; }
//********************************************************************************* void CBCGPVisualManagerVS2005::OnDrawAutoHideButtonBorder (CDC* pDC, CRect rect, CRect /*rectBorderSize*/, CBCGPAutoHideButton* pButton) { ASSERT_VALID (pDC); ASSERT_VALID (pButton); CPen pen (PS_SOLID, 1, GetAutoHideButtonBorderColor(pButton)); CPen* pOldPen = pDC->SelectObject (&pen); ASSERT (pOldPen != NULL); LPPOINT points; int nPoints = CreateAutoHideButtonRegion (rect, pButton->GetAlignment (), points); if (!m_bRoundedAutohideButtons) { pDC->Polyline (points, nPoints); } else { BOOL bIsHorz ((pButton->GetAlignment () & CBRS_ALIGN_ANY) == CBRS_ALIGN_LEFT || (pButton->GetAlignment () & CBRS_ALIGN_ANY) == CBRS_ALIGN_RIGHT); for (int i = 0; i < nPoints; i++) { if ((i % 2) != 0) { int x1 = points [i - 1].x; int y1 = points [i - 1].y; int x2 = points [i].x; int y2 = points [i].y; if (bIsHorz) { if (y1 > rect.CenterPoint ().y && y2 > rect.CenterPoint ().y) { y1--; y2--; } } else { if (x1 > rect.CenterPoint ().x && x2 > rect.CenterPoint ().x) { x1--; x2--; } } if (y2 >= y1) { pDC->MoveTo (x1, y1); pDC->LineTo (x2, y2); } else { pDC->MoveTo (x2, y2); pDC->LineTo (x1, y1); } } } } pDC->SelectObject (pOldPen); delete [] points; }
//******************************************************************************** void CBCGPDlgImpl::OnGetMinMaxInfo (MINMAXINFO FAR* lpMMI) { ASSERT (lpMMI != NULL); if ((m_Dlg.GetStyle () & WS_CAPTION) == 0 || (m_Dlg.GetStyle () & WS_BORDER) == 0) { CRect rectWindow; m_Dlg.GetWindowRect (&rectWindow); if (m_Dlg.IsIconic ()) { WINDOWPLACEMENT wp; wp.length = sizeof (WINDOWPLACEMENT); m_Dlg.GetWindowPlacement (&wp); rectWindow = wp.rcNormalPosition; } CRect rect (0, 0, 0, 0); MONITORINFO mi; mi.cbSize = sizeof (MONITORINFO); if (GetMonitorInfo (MonitorFromPoint (rectWindow.CenterPoint (), MONITOR_DEFAULTTONEAREST), &mi)) { CRect rectWork = mi.rcWork; CRect rectScreen = mi.rcMonitor; rect.left = rectWork.left - rectScreen.left; rect.top = rectWork.top - rectScreen.top; rect.right = rect.left + rectWork.Width (); rect.bottom = rect.top + rectWork.Height (); } else { ::SystemParametersInfo (SPI_GETWORKAREA, 0, &rect, 0); } #ifdef _BCGSUITE_ int nShellAutohideBars = globalData.m_nShellAutohideBars; #else int nShellAutohideBars = globalData.GetShellAutohideBars (); #endif if (nShellAutohideBars & BCGP_AUTOHIDE_BOTTOM) { rect.bottom -= 2; } if (nShellAutohideBars & BCGP_AUTOHIDE_TOP) { rect.top += 2; } if (nShellAutohideBars & BCGP_AUTOHIDE_RIGHT) { rect.right -= 2; } if (nShellAutohideBars & BCGP_AUTOHIDE_LEFT) { rect.left += 2; } lpMMI->ptMaxPosition.x = rect.left; lpMMI->ptMaxPosition.y = rect.top; lpMMI->ptMaxSize.x = rect.Width (); lpMMI->ptMaxSize.y = rect.Height (); } if (m_pLayout != NULL && m_LayoutMMI.ptMinTrackSize.x > 0 && m_LayoutMMI.ptMinTrackSize.y > 0) { lpMMI->ptMinTrackSize = m_LayoutMMI.ptMinTrackSize; } }
void CModuleWnd::GetDragInfoData(LPSTGMEDIUM lpStgMedium) { ASSERT_VALID(this); ASSERT(AfxIsValidAddress(lpStgMedium, sizeof(STGMEDIUM))); int nItem; CModuleDoc::CModule* pModule; CRect rcBound; rcBound.SetRectEmpty(); CClientDC dc(this); dc.BeginPath(); POSITION pos = GetListCtrl()->GetFirstSelectedItemPosition(); while (pos) { nItem = GetListCtrl()->GetNextSelectedItem(pos); pModule = m_pCurrentDocument->GetModule(nItem); CRect rcObj = pModule->m_rcPosition.GetRECT(); rcObj.NormalizeRect(); rcBound.UnionRect(rcBound, rcObj); dc.MoveTo(rcObj.left, rcObj.top); dc.LineTo(rcObj.right, rcObj.top); dc.LineTo(rcObj.right, rcObj.bottom); dc.LineTo(rcObj.left, rcObj.bottom); dc.LineTo(rcObj.left, rcObj.top); } dc.EndPath(); CPoint ptStart = rcBound.CenterPoint(); theApp.AlignToGrid(ptStart); LPSTREAM lpStream; if (::CreateStreamOnHGlobal(NULL, TRUE, &lpStream) != S_OK) AfxThrowMemoryException(); ASSERT(lpStream != NULL); lpStream->Write(&rcBound, sizeof(CRect), NULL); lpStream->Write(&ptStart, sizeof(CPoint), NULL); int iNumPoints = dc.GetPath(NULL, NULL, 0); CPoint* pPoints = new CPoint[iNumPoints]; if (pPoints == NULL) AfxThrowMemoryException(); BYTE* pTypes = new BYTE[iNumPoints]; if (pTypes == NULL) AfxThrowMemoryException(); iNumPoints = dc.GetPath(pPoints, pTypes, iNumPoints); lpStream->Write(&iNumPoints, sizeof(int), NULL); lpStream->Write(pPoints, sizeof(CPoint) * iNumPoints, NULL); lpStream->Write(pTypes, sizeof(BYTE) * iNumPoints, NULL); if (pPoints != NULL) delete pPoints; if (pTypes != NULL) delete pTypes; // setup the STGMEDIUM lpStgMedium->tymed = TYMED_ISTREAM; lpStgMedium->pstm = lpStream; lpStgMedium->pUnkForRelease = NULL; }
BOOL CAutoBrowser::GetVisibleElemRect( IHTMLElement *pElem,RECT &elemRect) { #define COM_CHECK_FAILED(_hr_) if( (_hr_)!=S_OK ) {break;} BOOL bOK = FALSE; do { if(pElem == NULL) { break; } IHTMLRect *pRect = NULL; CComQIPtr<IHTMLElement2> pqElem2(pElem); if(pqElem2) { HRESULT hr = pqElem2->getBoundingClientRect(&pRect); COM_CHECK_FAILED(hr) hr = pRect->get_left(&elemRect.left); COM_CHECK_FAILED(hr) hr = pRect->get_top(&elemRect.top); COM_CHECK_FAILED(hr) hr = pRect->get_right(&elemRect.right); COM_CHECK_FAILED(hr) hr = pRect->get_bottom(&elemRect.bottom); COM_CHECK_FAILED(hr) bOK = TRUE; } else { LONG lOffsetX = 0; LONG lOffsetY = 0; LONG lWidth = 0; LONG lHeight = 0; IHTMLElement *pTempElem = pElem; HRESULT hr = pElem->get_offsetWidth(&lWidth); COM_CHECK_FAILED(hr) hr = pElem->get_offsetHeight(&lHeight); COM_CHECK_FAILED(hr) BOOL bGetLeftTop = TRUE; do { HRESULT hr; long dwLeft = 0; long dwTop = 0; hr = pTempElem->get_offsetLeft(&dwLeft); if(hr != S_OK) { bGetLeftTop = FALSE; break; } lOffsetX+=dwLeft; hr = pTempElem->get_offsetTop(&dwTop); if(hr != S_OK) { bGetLeftTop = FALSE; break; } lOffsetY+=dwTop; hr = pTempElem->get_parentElement(&pTempElem); CComQIPtr<IHTMLBodyElement> pqBodyElem(pTempElem); if(pqBodyElem) { bGetLeftTop = TRUE; break; } } while (pTempElem); if(bGetLeftTop) { elemRect.left = lOffsetX; elemRect.top = lOffsetY; elemRect.right= elemRect.left+lWidth; elemRect.bottom= elemRect.top+lHeight; bOK = TRUE; } } } while(FALSE); if (bOK) { //元素不可见 CRect rcElem; rcElem = elemRect; if (/*rcElem.left > 0 && rcElem.top > 0 && */rcElem.Width() > 0 && rcElem.Height() > 0 ) { } else { bOK = FALSE; } CPoint ptElemCenter; ptElemCenter = rcElem.CenterPoint(); } if(!bOK) { elemRect.left=0; elemRect.top=0; elemRect.right=0; elemRect.bottom=0; } return bOK; }
void CEditPropExternals::OnContextMenu(CWnd* /*pWnd*/, CPoint point) { int selIndex = m_ExtList.GetSelectionMark(); if (selIndex < 0) return; // nothing selected, nothing to do with a context menu int selCount = m_ExtList.GetSelectedCount(); if (selCount <= 0) return; // nothing selected, nothing to do with a context menu // if the context menu is invoked through the keyboard, we have to use // a calculated position on where to anchor the menu on if ((point.x == -1) && (point.y == -1)) { CRect rect; m_ExtList.GetItemRect(selIndex, &rect, LVIR_LABEL); m_ExtList.ClientToScreen(&rect); point = rect.CenterPoint(); } bool haveHead = true; POSITION pos = m_ExtList.GetFirstSelectedItemPosition(); while (pos) { int index = m_ExtList.GetNextSelectedItem(pos); if ((index >= 0)&&(index < (int)m_externals.size())) { if (m_externals[index].headrev == SVN_INVALID_REVNUM) { haveHead = false; break; } } } CIconMenu popup; if (popup.CreatePopupMenu()) { if (haveHead) popup.AppendMenuIcon(CMD_ADJUST, IDS_EDITPROPS_ADJUST_TO_HEAD); else popup.AppendMenuIcon(CMD_FETCH_AND_ADJUST, IDS_EDITPROPS_FETCH_AND_ADJUST_TO_HEAD); int cmd = popup.TrackPopupMenu(TPM_RETURNCMD | TPM_LEFTALIGN | TPM_NONOTIFY | TPM_RIGHTBUTTON, point.x, point.y, this, 0); switch (cmd) { case CMD_FETCH_AND_ADJUST: { SVN svn; svn.SetPromptParentWindow(m_hWnd); SVNInfo svnInfo; svnInfo.SetPromptParentWindow(m_hWnd); SVNLogHelper logHelper; CProgressDlg progDlg; progDlg.ShowModal(m_hWnd, TRUE); progDlg.SetTitle(IDS_EDITPROPS_PROG_FINDHEADTITLE); progDlg.SetLine(1, CString(MAKEINTRESOURCE(IDS_EDITPROPS_PROG_FINDHEADREVS))); DWORD count = 0; DWORD total = m_ExtList.GetSelectedCount(); POSITION p = m_ExtList.GetFirstSelectedItemPosition(); while (p) { int index = m_ExtList.GetNextSelectedItem(p); progDlg.SetProgress(count++, total); if ((index >= 0)&&(index < (int)m_externals.size())) { progDlg.SetLine(2, m_externals[index].url, true); if (m_externals[index].headrev == SVN_INVALID_REVNUM) { if (m_externals[index].root.IsEmpty()) { CTSVNPath path_ = m_externals[index].path; path_.AppendPathString(m_externals[index].targetDir); m_externals[index].root = svn.GetRepositoryRoot(path_); } auto fullurl = CTSVNPath(m_externals[index].fullurl); auto youngestRev = logHelper.GetYoungestRev(fullurl); if (!youngestRev.IsValid()) m_externals[index].headrev = svn.GetHEADRevision(fullurl, true); else m_externals[index].headrev = youngestRev; } } } progDlg.Stop(); } // intentional fall through case CMD_ADJUST: { POSITION p = m_ExtList.GetFirstSelectedItemPosition(); while (p) { int index = m_ExtList.GetNextSelectedItem(p); if ((index >= 0)&&(index < (int)m_externals.size())) { if (m_externals[index].headrev != SVN_INVALID_REVNUM) { if (m_externals[index].revision.kind == svn_opt_revision_number) { m_externals[index].revision.value.number = -1; m_externals[index].revision.kind = svn_opt_revision_unspecified; } m_externals[index].pegrevision.value.number = m_externals[index].headrev; m_externals[index].pegrevision.kind = svn_opt_revision_number; } } } m_ExtList.Invalidate(); } break; } } }
void CButtonXP::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) { //从lpDrawItemStruct获取控件的相关信息 CRect rect = lpDrawItemStruct->rcItem; CDC *pDC = CDC::FromHandle(lpDrawItemStruct->hDC); int nSaveDC = pDC->SaveDC(); UINT state = lpDrawItemStruct->itemState; POINT pt ; TCHAR strText[MAX_PATH + 1]; ::GetWindowText(m_hWnd, strText, MAX_PATH); //画按钮的外边框,它是一个半径为5的圆角矩形 pt.x = 5; pt.y = 5; CPen* hOldPen = pDC->SelectObject(&m_BoundryPen); pDC->RoundRect(&rect, pt); //获取按钮的状态 if (state & ODS_FOCUS) { m_bFocus = TRUE; m_bSelected = TRUE; } else { m_bFocus = FALSE; m_bSelected = FALSE; } if (state & ODS_SELECTED || state & ODS_DEFAULT) { m_bFocus = TRUE; } pDC->SelectObject(hOldPen); rect.DeflateRect(CSize(GetSystemMetrics(SM_CXEDGE), GetSystemMetrics(SM_CYEDGE))); //根据按钮的状态填充按钮的底色 CBrush* pOldBrush; if (m_bOver) { pOldBrush = pDC->SelectObject(&m_FillActive); DoGradientFill(pDC, &rect); } else { pOldBrush = pDC->SelectObject(&m_FillInactive); DoGradientFill(pDC, &rect); } //根据按钮的状态绘制内边框 if (m_bOver || m_bSelected) DrawInsideBorder(pDC, &rect); pDC->SelectObject(pOldBrush); //显示按钮的文本 if (strText!=NULL) { CFont* hFont = GetFont(); CFont* hOldFont = pDC->SelectObject(hFont); CSize szExtent = pDC->GetTextExtent(strText, lstrlen(strText)); CPoint pt( rect.CenterPoint().x - szExtent.cx / 2, rect.CenterPoint().y - szExtent.cy / 2); if (state & ODS_SELECTED) pt.Offset(1, 1); int nMode = pDC->SetBkMode(TRANSPARENT); if (state & ODS_DISABLED) pDC->DrawState(pt, szExtent, strText, DSS_DISABLED, TRUE, 0, (HBRUSH)NULL); else pDC->DrawState(pt, szExtent, strText, DSS_NORMAL, TRUE, 0, (HBRUSH)NULL); pDC->SelectObject(hOldFont); pDC->SetBkMode(nMode); } pDC->RestoreDC(nSaveDC); }
void CXTPReportInplaceList::Create(XTP_REPORTRECORDITEM_ARGS* pItemArgs, CXTPReportRecordItemConstraints* pConstaints) { SetItemArgs(pItemArgs); CRect rect(pItemArgs->rcItem); if (!m_hWnd) { CListBox::CreateEx(WS_EX_TOOLWINDOW | (pControl->GetExStyle() & WS_EX_LAYOUTRTL), _T("LISTBOX"), _T(""), LBS_NOTIFY | WS_CHILD | WS_BORDER | WS_VSCROLL, CRect(0, 0, 0, 0), pControl, 0); SetOwner(pControl); } SetFont(pControl->GetPaintManager()->GetTextFont()); ResetContent(); int dx = rect.right - rect.left + 1; CWindowDC dc(pControl); CXTPFontDC font(&dc, GetFont()); int nThumbLength = GetSystemMetrics(SM_CXHTHUMB); CString strCaption = pItem->GetCaption(pColumn); DWORD dwData = pItem->GetSelectedConstraintData(pItemArgs); for (int i = 0; i < pConstaints->GetCount(); i++) { CXTPReportRecordItemConstraint* pConstaint = pConstaints->GetAt(i); CString str = pConstaint->m_strConstraint; int nIndex = AddString(str); SetItemDataPtr(nIndex, pConstaint); dx = max(dx, dc.GetTextExtent(str).cx + nThumbLength); if ((dwData == (DWORD)-1 && strCaption == str) || (dwData == pConstaint->m_dwData)) SetCurSel(nIndex); } int nHeight = GetItemHeight(0); rect.top = rect.bottom; //rect.bottom += nHeight * min(10, GetCount()) + 2; rect.bottom += nHeight * min(m_Items2Show, GetCount()) + 2; rect.left = rect.right - dx; pControl->ClientToScreen(&rect); CRect rcWork = XTPMultiMonitor()->GetWorkArea(rect); if (rect.bottom > rcWork.bottom && rect.top > rcWork.CenterPoint().y) rect.OffsetRect(0, - rect.Height() - pItemArgs->rcItem.Height()); if (rect.left < rcWork.left) rect.OffsetRect(rcWork.left - rect.left, 0); if (rect.right > rcWork.right) rect.OffsetRect(rcWork.right - rect.right, 0); SetFocus(); if (!m_hWnd) // Can be destroyed after focus set return; SetWindowLongPtr(m_hWnd, GWLP_HWNDPARENT, 0); ModifyStyle(WS_CHILD, WS_POPUP); SetWindowLongPtr(m_hWnd, GWLP_HWNDPARENT, (LONG_PTR)pControl->m_hWnd); SetWindowPos(&CWnd::wndTopMost, rect.left, rect.top, rect.Width(), rect.Height(), SWP_SHOWWINDOW | SWP_NOACTIVATE | SWP_NOOWNERZORDER); CXTPMouseMonitor::SetupHook(this); }
/* *-------------------------------------------------------------------------------- * 成员函数名 : GetRotateAngle * 功能描述 : 根据三条边长计算旋转的角度(角度),扫描角,顺时针为正角 * 输入参数描述 : CPoint ptEnd - 旋转终止点终止 * 返回变量说明 : * 算法描述 : 以浮动窗口最右下角点为基准点,计算终止点与基准点边线与水平线之间的角度 * 附加说明 : 坐标是相对于父窗口客户区的坐标,顺时针旋转为正角 *-------------------------------------------------------------------------------- */ DOUBLE CFloatDibWnd::GetRotateAngle(CPoint ptEnd) { // 弧度转角度常量 const double pitoa = 180 / 3.1415926535l; // 窗口矩形 CRect rect; rect = RectToParentClient(); // 最右下角点为基准点 CPoint ptCenter, ptBottomRight; // 以图像中心为角度计算基准点 ptCenter = rect.CenterPoint(); ptBottomRight = rect.BottomRight(); double nx, ny, angle, dblStartAngle; // 计算起始旋转角 nx = abs(ptBottomRight.x - ptCenter.x); ny = abs(ptBottomRight.y - ptCenter.y); dblStartAngle = atan(ny / nx) * pitoa; // 计算旋转过后的右下角点与中心点边线与水平线的夹角 nx = abs(ptEnd.x - ptCenter.x); ny = abs(ptEnd.y - ptCenter.y); angle = atan(ny / nx) * pitoa; if (ptEnd.x > ptCenter.x && ptEnd.y > ptCenter.y) { // 四象限,为正角 angle = angle; } else if (ptEnd.x > ptCenter.x && ptEnd.y < ptCenter.y) { // 一象限,为负角 angle = -angle; } else if (ptEnd.x < ptCenter.x && ptEnd.y > ptCenter.y) { // 三象限 angle = 180 - angle; } else if (ptEnd.x < ptCenter.x && ptEnd.y < ptCenter.y) { // 二象限 angle = 180 + angle; } else if (ptEnd.x == ptCenter.x && ptEnd.y < ptCenter.y) { // 垂直线正轴 angle = 270; } else if (ptEnd.x == ptCenter.x && ptEnd.y > ptCenter.y) { // 垂直线负轴 angle = 90; } else if (ptEnd.y == ptCenter.y && ptEnd.x > ptCenter.x) { // 水平线正轴 angle = 0; } else if (ptEnd.y == ptCenter.y && ptEnd.x < ptCenter.x) { // 水平线负轴 angle = 180; } else if (ptEnd.y == ptCenter.y && ptEnd.x == ptCenter.x) { // 原点 angle = 0; } // 图片旋转角度 angle -= dblStartAngle; return angle; }
void CPage_Node_LaneTurn::DrawMovements(CPaintDC* pDC,CRect PlotRect) { m_MovementBezierVector.clear(); CPen NormalPen(PS_SOLID,2,RGB(0,0,0)); CPen TimePen(PS_DOT,1,RGB(0,0,0)); CPen DataPen(PS_SOLID,0,RGB(0,0,0)); CPen SelectedPen(PS_SOLID,4,RGB(255,0,0)); CPen SelectedPhasePen(PS_SOLID,4,RGB(0,0,255)); CBrush WhiteBrush(RGB(255,255,255)); pDC->SetBkMode(TRANSPARENT); pDC->SelectObject(&DataPen); pDC->SelectObject(&WhiteBrush); pDC->Rectangle (PlotRect); CBrush BrushLinkBand(RGB(152,245,255)); pDC->SelectObject(&BrushLinkBand); DTANode* pNode = m_pDoc->m_NodeIDMap [m_CurrentNodeID]; int node_size = 10; int node_set_back = 50; int link_length = 150; int lane_width = 10; int text_length = link_length+ 20; CString str; str.Format("%d",m_CurrentNodeName); pDC->TextOutA( PlotRect.CenterPoint().x-5, PlotRect.CenterPoint().y-5,str); for (unsigned int i=0;i< pNode->m_MovementVector .size();i++) { DTANodeMovement movement = pNode->m_MovementVector[i]; DTALink* pInLink = m_pDoc->m_LinkNoMap [movement.IncomingLinkID]; DTALink* pOutLink = m_pDoc->m_LinkNoMap [movement.OutgoingLinkID ]; GDPoint p1, p2, p3; // 1: fetch all data p1 = m_pDoc->m_NodeIDMap[movement.in_link_from_node_id ]->pt; p2 = m_pDoc->m_NodeIDMap[movement.in_link_to_node_id ]->pt; p3 = m_pDoc->m_NodeIDMap[movement.out_link_to_node_id]->pt; double DeltaX = p2.x - p1.x ; double DeltaY = p2.y - p1.y ; double theta = atan2(DeltaY, DeltaX); GDPoint p1_new, p2_new, p3_new; GDPoint p1_text, p3_text; GDPoint pt_movement[3]; // 2. set new origin p2_new.x = (-1)*node_set_back*cos(theta); p2_new.y = (-1)*node_set_back*sin(theta); int link_mid_offset = (pInLink->m_NumberOfLanes/2 +1)*lane_width; // mid pt_movement[0].x = p2_new.x + link_mid_offset* cos(theta-PI/2.0f); pt_movement[0].y = p2_new.y + link_mid_offset* sin(theta-PI/2.0f); // 3 determine the control point for PolyBezier float control_point_ratio = 0; if(movement.movement_turn == DTA_Through ) { control_point_ratio = 0; }else if(movement.movement_turn == DTA_LeftTurn ) { control_point_ratio = 1.2; }else { control_point_ratio = 0.5; } pt_movement[1].x = pt_movement[0].x + node_set_back*control_point_ratio*cos(theta); pt_movement[1].y = pt_movement[0].y + node_set_back*control_point_ratio*sin(theta); p1_new.x = (-1)*link_length*cos(theta); p1_new.y = (-1)*link_length*sin(theta); p1_text.x= (-1)*(text_length)*cos(theta); p1_text.y= (-1)*(text_length)*sin(theta); // 4: draw from node name str.Format("%d",m_pDoc->m_NodeIDtoNameMap [movement.in_link_from_node_id]); if(p1_text.y < -50) p1_text.y +=10; CPoint pt_text = NPtoSP(p1_text); pDC->TextOutA(pt_text.x-10,pt_text.y,str); DrawLink(pDC,p1_new,p2_new,pInLink->m_NumberOfLanes,theta,lane_width); //////////////////////////////////////////// //5: outgoing link DeltaX = p3.x - p2.x ; DeltaY = p3.y - p2.y ; theta = atan2(DeltaY, DeltaX); // set new origin p2_new.x = node_set_back*cos(theta); p2_new.y = node_set_back*sin(theta); link_mid_offset = (pOutLink->m_NumberOfLanes/2+1)*lane_width; pt_movement[2].x = p2_new.x + link_mid_offset* cos(theta-PI/2.0f); pt_movement[2].y = p2_new.y + link_mid_offset* sin(theta-PI/2.0f); p3_new.x = link_length*cos(theta); p3_new.y = link_length*sin(theta); p3_text.x= text_length*cos(theta); p3_text.y= text_length*sin(theta); //draw to node name str.Format("%d",m_pDoc->m_NodeIDtoNameMap [movement.out_link_to_node_id]); if(p3_text.y < -100) p3_text.y +=10; pt_text = NPtoSP(p3_text); pDC->TextOutA(pt_text.x-10 ,pt_text.y,str); DrawLink(pDC,p2_new,p3_new,pOutLink->m_NumberOfLanes,theta,lane_width); // draw movement CPoint Point_Movement[4]; if(i == m_SelectedMovementIndex) pDC->SelectObject(&SelectedPen); else pDC->SelectObject(&NormalPen); Point_Movement[0]= NPtoSP(pt_movement[0]); Point_Movement[1]= NPtoSP(pt_movement[1]); Point_Movement[2]= NPtoSP(pt_movement[1]); Point_Movement[3]= NPtoSP(pt_movement[2]); Point_Movement[0]= NPtoSP(pt_movement[0]); Point_Movement[1]= NPtoSP(pt_movement[1]); Point_Movement[2]= NPtoSP(pt_movement[1]); Point_Movement[3]= NPtoSP(pt_movement[2]); MovementBezier element(Point_Movement[0], Point_Movement[1],Point_Movement[3]); m_MovementBezierVector.push_back (element); pDC->PolyBezier(Point_Movement,4); //restore pen pDC->SelectObject(&DataPen); } }
void CFileDiffDlg::OnContextMenu(CWnd* pWnd, CPoint point) { if ((pWnd==0)||(pWnd != &m_cFileList)) return; if (m_cFileList.GetSelectedCount() == 0) return; // if the context menu is invoked through the keyboard, we have to use // a calculated position on where to anchor the menu on if ((point.x == -1) && (point.y == -1)) { CRect rect; m_cFileList.GetItemRect(m_cFileList.GetSelectionMark(), &rect, LVIR_LABEL); m_cFileList.ClientToScreen(&rect); point = rect.CenterPoint(); } CIconMenu popup; if (popup.CreatePopupMenu()) { CString menuText; popup.AppendMenuIcon(ID_COMPARE, IDS_LOG_POPUP_COMPARETWO, IDI_DIFF); popup.AppendMenuIcon(ID_GNUDIFFCOMPARE, IDS_LOG_POPUP_GNUDIFF, IDI_DIFF); popup.AppendMenu(MF_SEPARATOR, NULL); menuText.Format(IDS_FILEDIFF_POPREVERTTOREV, m_rev1.m_CommitHash.ToString().Left(g_Git.GetShortHASHLength())); popup.AppendMenuIcon(ID_REVERT1, menuText, IDI_REVERT); menuText.Format(IDS_FILEDIFF_POPREVERTTOREV, m_rev2.m_CommitHash.ToString().Left(g_Git.GetShortHASHLength())); popup.AppendMenuIcon(ID_REVERT2, menuText, IDI_REVERT); popup.AppendMenu(MF_SEPARATOR, NULL); popup.AppendMenuIcon(ID_LOG, IDS_FILEDIFF_LOG, IDI_LOG); popup.AppendMenuIcon(ID_BLAME, IDS_FILEDIFF_POPBLAME, IDI_BLAME); popup.AppendMenu(MF_SEPARATOR, NULL); popup.AppendMenuIcon(ID_EXPORT, IDS_FILEDIFF_POPEXPORT, IDI_EXPORT); popup.AppendMenu(MF_SEPARATOR, NULL); popup.AppendMenuIcon(ID_SAVEAS, IDS_FILEDIFF_POPSAVELIST, IDI_SAVEAS); popup.AppendMenuIcon(ID_CLIPBOARD_PATH, IDS_STATUSLIST_CONTEXT_COPY, IDI_COPYCLIP); popup.AppendMenuIcon(ID_CLIPBOARD_ALL, IDS_STATUSLIST_CONTEXT_COPYEXT, IDI_COPYCLIP); int cmd = popup.TrackPopupMenu(TPM_RETURNCMD | TPM_LEFTALIGN | TPM_NONOTIFY, point.x, point.y, this, 0); m_bCancelled = false; switch (cmd) { case ID_COMPARE: { POSITION pos = m_cFileList.GetFirstSelectedItemPosition(); while (pos) { int index = m_cFileList.GetNextSelectedItem(pos); DoDiff(index, false); } } break; case ID_GNUDIFFCOMPARE: { POSITION pos = m_cFileList.GetFirstSelectedItemPosition(); while (pos) { CTGitPath *fd2 = m_arFilteredList[m_cFileList.GetNextSelectedItem(pos)]; CTGitPath *fd1 = fd2; if (fd2->m_Action & CTGitPath::LOGACTIONS_REPLACED) fd1 = new CTGitPath(fd2->GetGitOldPathString()); CAppUtils::StartShowUnifiedDiff(m_hWnd, *fd2, m_rev2.m_CommitHash.ToString(), *fd1, m_rev1.m_CommitHash.ToString()); } } break; case ID_REVERT1: RevertSelectedItemToVersion(m_rev1.m_CommitHash.ToString()); break; case ID_REVERT2: RevertSelectedItemToVersion(m_rev2.m_CommitHash.ToString()); break; case ID_BLAME: { POSITION pos = m_cFileList.GetFirstSelectedItemPosition(); while (pos) { int index = m_cFileList.GetNextSelectedItem(pos); CAppUtils::LaunchTortoiseBlame(m_arFilteredList[index]->GetWinPathString(), m_rev1.m_CommitHash.ToString()); } } break; case ID_LOG: { POSITION pos = m_cFileList.GetFirstSelectedItemPosition(); while (pos) { int index = m_cFileList.GetNextSelectedItem(pos); CString cmd = _T("/command:log"); cmd += _T(" /path:\"")+m_arFilteredList[index]->GetWinPathString()+_T("\" "); cmd += _T(" /endrev:")+m_rev1.m_CommitHash.ToString(); CAppUtils::RunTortoiseGitProc(cmd); } } break; case ID_SAVEAS: { if (m_cFileList.GetSelectedCount() > 0) { CString temp; CTGitPath savePath; CString pathSave; if (!CAppUtils::FileOpenSave(pathSave, NULL, IDS_REPOBROWSE_SAVEAS, IDS_COMMONFILEFILTER, false, m_hWnd)) { break; } savePath = CTGitPath(pathSave); // now open the selected file for writing try { CStdioFile file(savePath.GetWinPathString(), CFile::typeBinary | CFile::modeReadWrite | CFile::modeCreate); // temp.Format(IDS_FILEDIFF_CHANGEDLISTINTRO, (LPCTSTR)m_path1.GetGitPathString(), (LPCTSTR)m_rev1.ToString(), (LPCTSTR)m_path2.GetGitPathString(), (LPCTSTR)m_rev2.ToString()); file.WriteString(temp + _T("\n")); POSITION pos = m_cFileList.GetFirstSelectedItemPosition(); while (pos) { int index = m_cFileList.GetNextSelectedItem(pos); CTGitPath* fd = m_arFilteredList[index]; file.WriteString(fd->GetGitPathString()); file.WriteString(_T("\n")); } file.Close(); } catch (CFileException* pE) { pE->ReportError(); } } } break; case ID_CLIPBOARD_PATH: { CopySelectionToClipboard(); } break; case ID_CLIPBOARD_ALL: { CopySelectionToClipboard(TRUE); } break; case ID_EXPORT: { // export all changed files to a folder CBrowseFolder browseFolder; browseFolder.m_style = BIF_EDITBOX | BIF_NEWDIALOGSTYLE | BIF_RETURNFSANCESTORS | BIF_RETURNONLYFSDIRS; if (browseFolder.Show(GetSafeHwnd(), m_strExportDir) == CBrowseFolder::OK) { POSITION pos = m_cFileList.GetFirstSelectedItemPosition(); while (pos) { int index = m_cFileList.GetNextSelectedItem(pos); CTGitPath* fd = m_arFilteredList[index]; // we cannot export directories or folders if (fd->m_Action == CTGitPath::LOGACTIONS_DELETED || fd->IsDirectory()) continue; CAppUtils::CreateMultipleDirectory(m_strExportDir + _T("\\") + fd->GetContainingDirectory().GetWinPathString()); CString filename = m_strExportDir + _T("\\") + fd->GetWinPathString(); if(m_rev1.m_CommitHash.ToString() == GIT_REV_ZERO) { if(!CopyFile(g_Git.m_CurrentDir + _T("\\") + fd->GetWinPath(), filename, false)) { MessageBox(CFormatMessageWrapper(), _T("TortoiseGit"), MB_OK | MB_ICONERROR); return; } } else { if(g_Git.GetOneFile(m_rev1.m_CommitHash, *fd, filename)) { CString out; out.Format(IDS_STATUSLIST_CHECKOUTFILEFAILED, fd->GetGitPathString(), m_rev1.m_CommitHash.ToString(), filename); if (CMessageBox::Show(NULL, out, _T("TortoiseGit"), 2, IDI_WARNING, CString(MAKEINTRESOURCE(IDS_IGNOREBUTTON)), CString(MAKEINTRESOURCE(IDS_ABORTBUTTON))) == 2) return; } } } } } break; } } }
void CLayoutZoomoutTool::LButtonDownEvent (UINT nFlags, CPoint point) { if(!m_pLayoutCtrl) return; if(!m_pLayoutCtrl->GetPageLayout()) return; //Selection Box CRectTracker selectBox = CRectTracker(CRect(0,0,0,0), CRectTracker::solidLine + CRectTracker::resizeOutside ); selectBox.m_sizeMin = 0; bool selected = selectBox.TrackRubberBand(dynamic_cast<CWnd*>(m_pLayoutCtrl), point, FALSE ); CRect rect = selectBox.m_rect; rect.NormalizeRect(); if( ( rect.BottomRight().x - rect.TopLeft().x ) < 10 && ( rect.BottomRight().y - rect.TopLeft().y ) < 10 ) selected = false; if( selected == true ) { GEOMETRY::geom::Envelope envelop; m_pLayoutCtrl->GetPageLayout()->GetDisplay()->GetDisplayTransformation().GetGeoBound(envelop); long lWidth = rect.Width(); long lHeight = rect.Height(); double rx = envelop.getWidth()/ lWidth; double ry = envelop.getHeight()/ lHeight; double dbScale = (rx > ry) ? rx : ry; m_pLayoutCtrl->GetPageLayout()->GetDisplay()->GetDisplayTransformation().ZoomToFixScale(dbScale); CRect viewRect =m_pLayoutCtrl->GetPageLayout()->GetDisplay()->GetDisplayTransformation().GetViewBound().GetRect(); double dx=(rect.CenterPoint().x-viewRect.CenterPoint().x)*dbScale; double dy=(viewRect.CenterPoint().y-rect.CenterPoint().y)*dbScale; m_pLayoutCtrl->GetPageLayout()->GetDisplay()->GetDisplayTransformation().MoveViewBound(dx,dy); } else { double geoCenterX, geoCenterY; m_pLayoutCtrl->GetPageLayout()->GetDisplay()->GetDisplayTransformation().ConvertDisplayToGeo(point.x,point.y,geoCenterX, geoCenterY); m_pLayoutCtrl->GetPageLayout()->GetDisplay()->GetDisplayTransformation().SetGeoCenterX(geoCenterX); m_pLayoutCtrl->GetPageLayout()->GetDisplay()->GetDisplayTransformation().SetGeoCenterY(geoCenterY); m_pLayoutCtrl->GetPageLayout()->GetDisplay()->GetDisplayTransformation().ZoomViewPosScale(1.5); } m_pLayoutCtrl->UpdateControl(drawAll); }
void CSXSView::OnTimer(UINT_PTR nIDEvent) { CAutoBrowser AutoBrowser((IWebBrowser2 *)GetApplication(),GetIEServerWnd()); if (nIDEvent == TIME_ID_INPUT_LOGIN) { KillTimer(nIDEvent); //输入用户名 { CElementInformation ElemInfo; ElemInfo.SetTagName(L"input"); ElemInfo.AddElementAttribute(L"id",L"edit-name",TRUE); CElemRectList ElemList; AutoBrowser.GetAllMatchElemRect(&ElemList,&ElemInfo); if (ElemList.GetElemRectCount() == 1) { ELEM_RECT ElemRect; ElemList.GetElemRectByIndex(0,&ElemRect); CComQIPtr<IHTMLInputElement> pInput; ElemRect.pElem->QueryInterface(IID_IHTMLInputElement,(void **)&pInput); pInput->put_value(theApp.m_strUserName.AllocSysString()); } } //输入密码 { CElementInformation ElemInfo; ElemInfo.SetTagName(L"input"); ElemInfo.AddElementAttribute(L"id",L"edit-pass",TRUE); CElemRectList ElemList; AutoBrowser.GetAllMatchElemRect(&ElemList,&ElemInfo); if (ElemList.GetElemRectCount() == 1) { ELEM_RECT ElemRect; ElemList.GetElemRectByIndex(0,&ElemRect); CComQIPtr<IHTMLInputElement> pInput; ElemRect.pElem->QueryInterface(IID_IHTMLInputElement,(void **)&pInput); pInput->put_value(theApp.m_strPassWord.AllocSysString()); } } //选中验证码框 { CElementInformation ElemInfo; ElemInfo.SetTagName(L"input"); ElemInfo.AddElementAttribute(L"id",L"edit-captcha-response",TRUE); AutoBrowser.ClickFirstMatchWebPageElement(&ElemInfo); } } if (nIDEvent == TIME_ID_MOUSE_MOVE) { CRect rcClient; GetClientRect(&rcClient); AutoBrowser.SetWebPageMousePos(CAutoBrowser::GetRandValue(0,rcClient.Width()),CAutoBrowser::GetRandValue(0,rcClient.Height())); } if ( nIDEvent == TIME_ID_QUERY_USER_INFO ) { KillTimer(nIDEvent); CString strUserRealName; CElementInformation ElemInfo; ElemInfo.SetTagName(L"a"); ElemInfo.AddElementAttribute(L"href",L"/admin/std/info",TRUE); CElementInformation *pParentInfo = ElemInfo.CreateParentInfo(); pParentInfo->SetTagName(L"span"); pParentInfo->AddElementAttribute(L"class",L"user-title",TRUE); CElemRectList ElemList; AutoBrowser.GetAllMatchElemRect(&ElemList,&ElemInfo); if (ElemList.GetElemRectCount() == 1) { ELEM_RECT ElemRect; ElemList.GetElemRectByIndex(0,&ElemRect); CComQIPtr<IHTMLElement> pElem; ElemRect.pElem->QueryInterface(IID_IHTMLElement,(void **)&pElem); if (pElem) { CComBSTR bstrInnerText; pElem->get_innerText(&bstrInnerText); strUserRealName = bstrInnerText; } } CMainFrame *pParentFrame = (CMainFrame *)GetParent(); if (pParentFrame) { pParentFrame->UpdateFrameTitle(theApp.m_strUserName+L" "+strUserRealName); g_loger.StatusOut(L"获取用户信息:%s %s",theApp.m_strUserName,strUserRealName); } } if( nIDEvent == TIME_ID_CLICK_WATCH_CONTINE ) { KillTimer(nIDEvent); CElementInformation ElemInfo; ElemInfo.SetTagName(L"a"); ElemInfo.SetTextName(L"继续观看",FALSE); ElemInfo.AddElementAttribute(L"href",L"/admin/std/training/",FALSE); AutoBrowser.ClickFirstMatchWebPageElement(&ElemInfo); g_loger.StatusOut(L"点击继续学习按钮"); } if ( nIDEvent == TIME_ID_CLICK_RESUME ) { KillTimer(nIDEvent); CElementInformation ElemInfo; CElemRectList ElemList; ElemInfo.SetTagName(L"object"); ElemInfo.AddElementAttribute(L"id",L"VMSPlayer",TRUE); AutoBrowser.GetAllMatchElemRect(&ElemList,&ElemInfo); if ( ElemList.GetElemRectCount() == 1 ) { // 51 382 ELEM_RECT ElemRect; ElemList.GetElemRectByIndex(0,&ElemRect); AutoBrowser.ClickWebPagePoint(ElemRect.rcElem.left+51,ElemRect.rcElem.top+382); g_loger.StatusOut(L"点击重新观看按钮 X:%d Y:%d",ElemRect.rcElem.left+51,ElemRect.rcElem.top+382); } } if ( nIDEvent == TIME_ID_CHECK_VIDEO_PAUSE ) { CElementInformation ElemInfo; CElemRectList ElemList; ElemInfo.SetTagName(L"object"); ElemInfo.AddElementAttribute(L"id",L"VMSPlayer",TRUE); AutoBrowser.GetAllMatchElemRect(&ElemList,&ElemInfo); if ( ElemList.GetElemRectCount() == 1 ) { // 51 382 ELEM_RECT ElemRect; ElemList.GetElemRectByIndex(0,&ElemRect); CRect rcElem; rcElem = ElemRect.rcElem; CPoint ptCenter; ptCenter = rcElem.CenterPoint(); COLORREF refColor = 0; HDC hDc = ::GetDC(GetIEServerWnd()); refColor = GetPixel(hDc,ptCenter.x,ptCenter.y); ::ReleaseDC(GetIEServerWnd(),hDc); if ( m_refPreColor == refColor ) { m_nColorSameCount++; } else { m_nColorSameCount=0; } m_refPreColor = refColor; if ( m_nColorSameCount > 20 ) { g_loger.StatusOut(L"窗口定点颜色 %x 超过 20*5 秒没有变化",m_refPreColor); KillTimer(nIDEvent); CElementInformation ElemInfo; ElemInfo.SetTagName(L"input"); ElemInfo.AddElementAttribute(L"value",L"退出学习",FALSE); //ElemInfo.AddElementAttribute(L"type",L"submit",TRUE); AutoBrowser.ClickFirstMatchWebPageElement(&ElemInfo); } #ifdef DEBUG CString strMsgOut; strMsgOut.Format(L"0x%x\r\n",refColor); OutputDebugStringW(strMsgOut); #endif } } CIECoreView::OnTimer(nIDEvent); }
void CTexViewer::OnLButtonUp(UINT nFlags, CPoint point) { if (m_bDrag) { m_bDrag = FALSE; if (EDITMODE_SELECT == m_eEditMode) { if (DRAGTYPE_SELECT == m_eDragType) { if (m_bDeselect) m_rcSelectedRect.SetRect(-1,-1,-1,-1); // deselect else { CPoint pt = point; ScreenToImage(&pt); // image 좌표로 변환 // 사각형의 left,top은 작은 좌표 right, bottom은 큰 좌표로 정리하기 if (m_rcSelectedRect.left > pt.x) { m_rcSelectedRect.right = m_rcSelectedRect.left; m_rcSelectedRect.left = pt.x; } else m_rcSelectedRect.right = pt.x; if (m_rcSelectedRect.top > pt.y) { m_rcSelectedRect.bottom = m_rcSelectedRect.top; m_rcSelectedRect.top = pt.y; } else m_rcSelectedRect.bottom = pt.y; } } else { ProcessDrag(point); } m_eDragType = DRAGTYPE_NONE; if (m_iCurSelectedImage>=0) m_ImageRects[m_iCurSelectedImage] = m_rcSelectedRect; // 만약 ImageType별로 저장한다면 선택된 사각형을 copy해주기 Invalidate(); } else if (EDITMODE_ZOOM == m_eEditMode) { if (m_ptMouseOld == point) { CRect rc; GetClientRect(&rc); CPoint ptPrev = point; ScreenToImage(&ptPrev); // zoom 하기 전의 image좌표 저장 Zoom((GetAsyncKeyState(VK_MENU) & 0xff00) ? FALSE : TRUE); CPoint ptNext = ptPrev; ImageToScreen(&ptNext); // zoom 한 후의 image좌표를 screen좌표로 전환 ptNext.x = int((ptNext.x-rc.CenterPoint().x)/m_fScale); //화면 가운데로 오게끔 설정 ptNext.y = int((ptNext.y-rc.CenterPoint().y)/m_fScale); SetLeftTopInImage( m_ptLeftTopInImage + ptNext); //차이만큼 옮기기 } else { } } else if (EDITMODE_HAND == m_eEditMode) { CPoint ptDiff = m_ptMouseOld - point; ptDiff.x = (int)(ptDiff.x / m_fScale); ptDiff.y = (int)(ptDiff.y / m_fScale); SetLeftTopInImage(m_ptLeftTopInImage+ptDiff); } } m_ptMouseOld = point; ReleaseCapture(); GetParent()->PostMessage(UM_UPDATE_INFO, TRUE, MAKELPARAM((short)point.y,(short)point.x)); CWnd::OnLButtonUp(nFlags, point); }
void CNewHeaderCtrl::DoPaint(CDC *pDC) { CRect rect, rcItem; GetClientRect(&rect); CDC memDC; CBitmap bmp; memDC.CreateCompatibleDC(pDC); bmp.CreateCompatibleBitmap(pDC,rect.Width(),rect.Height()); CBitmap* pOldBmp = memDC.SelectObject(&bmp); memDC.SetBkMode(TRANSPARENT); memDC.SetTextColor(m_colorText); memDC.SetStretchBltMode(HALFTONE); CFont* pOldFont = memDC.SelectObject(&m_font); // Ìî³ä±³¾° if (m_imgHeader.IsNull()) { memDC.FillRect(&rect, &m_brushBack); } else { m_imgHeader.Draw(memDC, rect); } CPen *pOldPen; int nItems = GetItemCount(); for (int i = 0; i < nItems; ++i) { TCHAR buf[256]; HDITEM hditem; hditem.mask = HDI_TEXT | HDI_FORMAT | HDI_ORDER; hditem.pszText = buf; hditem.cchTextMax = 255; GetItem(i, &hditem); GetItemRect(i, &rcItem); if (rcItem.IsRectEmpty()) { continue; } // »·Ö¸îÏß pOldPen = memDC.SelectObject(&m_penVerticalLine); memDC.MoveTo(rcItem.right-1, 0); memDC.LineTo(rcItem.right-1, rcItem.bottom); memDC.SelectObject(pOldPen); //image.LoadFromResource(AfxGetResourceHandle(), IDB_BITMAP_HEADER_SPLIT); //image.Draw(memDC, rcItem.right - 1, rcItem.top); //image.Destroy(); CRect rcText = rcItem; rcText.DeflateRect(4, 0, 10, 0); if (i == m_nCheckColumn) { CPen pen(PS_SOLID, 1, RGB(0,0,0)); pOldPen = memDC.SelectObject(&pen); CRect rcCheck = rcText; rcCheck.right = rcCheck.left + 12; rcCheck.top = rcCheck.top + rcCheck.Height()/2 - 5; rcCheck.bottom = rcCheck.top + 12; memDC.Rectangle(&rcCheck); if (m_bAllCheck) { int nArray[] = {1,7,1,8, 2,6,2,8, 3,7,3,9, 4,8,4,10, 5,8,5,10, 6,6,6,9, 7,4,7,7, 8,2,8,5, 9,2,9,3}; int nCount = sizeof(nArray) / sizeof(nArray[0]) / 4; int nPot = 0; for (int n=0; n<nCount; ++n) { nPot = n * 4; memDC.MoveTo(rcCheck.left+nArray[nPot], rcCheck.top+nArray[nPot+1]); memDC.LineTo(rcCheck.left+nArray[nPot+2], rcCheck.top+nArray[nPot+3]); } } memDC.SelectObject(pOldPen); rcText.left = rcCheck.right + 2; } // »ÎÄ×ÖºÍÅÅÐò¼ýÍ· UINT uFormat = DT_SINGLELINE | DT_VCENTER | DT_NOPREFIX; if (hditem.fmt & HDF_RIGHT) { uFormat |= DT_RIGHT; } else if (hditem.fmt & HDF_CENTER) { uFormat |= DT_CENTER; } memDC.DrawText(buf, static_cast<int> (_tcslen(buf)), &rcText, uFormat); rcText.right = rcItem.right; rcText.left = rcText.right - 15; if (rcText.left >= rcItem.left) { if (hditem.fmt & HDF_SORTUP) { pOldPen = memDC.SelectObject(&m_penArrow); CPoint pt = rcText.CenterPoint(); pt.Offset(0, -2); for (int j=0; j<5; ++j) { memDC.MoveTo(pt.x-j, pt.y); memDC.LineTo(pt.x+j, pt.y); ++pt.y; } memDC.SelectObject(pOldPen); } else if (hditem.fmt & HDF_SORTDOWN) { pOldPen = memDC.SelectObject(&m_penArrow); CPoint pt = rcText.CenterPoint(); pt.Offset(0, 2); for (int j=0; j<5; ++j) { memDC.MoveTo(pt.x-j, pt.y); memDC.LineTo(pt.x+j, pt.y); --pt.y; } memDC.SelectObject(pOldPen); } } } memDC.SelectObject(pOldFont); pDC->BitBlt(0,0,rect.Width(),rect.Height(),&memDC,0,0,SRCCOPY); memDC.SelectObject(pOldBmp); }
void CNSChartCtrl::DrawPieChart(CDC *pDC) { ASSERT(m_dTotal > 0.0L); double pi = 3.1415926535*2; int iValues = m_ChartValues.GetSize(); int iColors = m_BrushArray.GetSize(); CNSChartValue* pTmp; CString str; CRect rect; GetClientRect(&rect); double dAngle = 0; double dMidAngle = 0; double r = min((rect.Width()/2)-50,(rect.Height()/2)-40); CPoint p1 = rect.CenterPoint(); p1.y += 15; CPoint p2(p1.x + (int)r ,p1.y); CPoint p3; CPoint p4; pDC->Ellipse(p1.x-(int)r,p1.y-(int)r,p1.x+(int)r,p2.y+(int)r); pDC->MoveTo(p1); pDC->LineTo(p2); CFont *oldFont = pDC->SelectObject(&m_txtFont); for (int i = 0; i < iValues; i++ ) { pTmp = m_ChartValues.GetAt(i); dMidAngle = pTmp->m_dValue * pi / m_dTotal; dAngle += dMidAngle; p2.x = (int)(cos(dAngle)*r + p1.x); p2.y = (int)(p1.y - sin(dAngle)*r ); pDC->MoveTo(p1); pDC->LineTo(p2); dMidAngle = dAngle - dMidAngle/2; p3.x = (int)(cos(dMidAngle)*r + p1.x); p3.y = (int)(p1.y - sin(dMidAngle)*r ); p4.x = (int)(cos(dMidAngle)*(r*1.2) + p1.x); p4.y = (int)(p1.y - sin(dMidAngle)*(r*1.2) ); pDC->MoveTo(p3); pDC->LineTo(p4); pDC->MoveTo(p4); p4.x += 40*((p4.x > p1.x)?(1):(-1)); pDC->LineTo(p4); rect.left = p4.x - 60; rect.right = p4.x + 60; rect.top = p4.y - 15; rect.bottom = p4.y + 15; str.Format(_T("%s\n%.1f%%"),pTmp->m_sLabel,(pTmp->m_dValue*100.0)/m_dTotal); if(m_iCurSel == i) { CFont *tmpFont = pDC->SelectObject(&m_boldFont); rect.InflateRect(2,0); pDC->DrawText(str,&rect,DT_CENTER|DT_VCENTER); pDC->SelectObject(tmpFont); }else{ pDC->DrawText(str,&rect,DT_CENTER|DT_VCENTER); } p4.x = (int)(cos(dMidAngle)*(r*0.8) + p1.x); p4.y = (int)(p1.y - sin(dMidAngle)*(r*0.8) ); if(pDC->GetPixel(p4) > 0x0) { CBrush* tmpBr = pDC->SelectObject((CBrush*)m_BrushArray.GetAt(i%iColors)); pDC->FloodFill(p4.x,p4.y,0x0); pDC->SelectObject(tmpBr); } } pDC->SelectObject(oldFont); }
void CFileDiffDlg::OnContextMenu(CWnd* pWnd, CPoint point) { if ((pWnd==0)||(pWnd != &m_cFileList)) return; if (m_cFileList.GetSelectedCount() == 0) return; // if the context menu is invoked through the keyboard, we have to use // a calculated position on where to anchor the menu on if ((point.x == -1) && (point.y == -1)) { CRect rect; m_cFileList.GetItemRect(m_cFileList.GetSelectionMark(), &rect, LVIR_LABEL); m_cFileList.ClientToScreen(&rect); point = rect.CenterPoint(); } CIconMenu popup; if (!popup.CreatePopupMenu()) return; popup.AppendMenuIcon(ID_COMPARE, IDS_LOG_POPUP_COMPARETWO, IDI_DIFF); popup.AppendMenuIcon(ID_UNIFIEDDIFF, IDS_LOG_POPUP_GNUDIFF, IDI_DIFF); popup.AppendMenuIcon(ID_BLAME, IDS_FILEDIFF_POPBLAME, IDI_BLAME); popup.AppendMenu(MF_SEPARATOR, NULL); popup.AppendMenuIcon(ID_SAVEAS, IDS_FILEDIFF_POPSAVELIST, IDI_SAVEAS); popup.AppendMenuIcon(ID_CLIPBOARD, IDS_FILEDIFF_POPCLIPBOARD, IDI_COPYCLIP); popup.AppendMenuIcon(ID_EXPORT, IDS_FILEDIFF_POPEXPORT, IDI_EXPORT); int cmd = popup.TrackPopupMenu(TPM_RETURNCMD | TPM_LEFTALIGN | TPM_NONOTIFY, point.x, point.y, this, 0); m_bCancelled = false; switch (cmd) { case ID_COMPARE: { POSITION pos = m_cFileList.GetFirstSelectedItemPosition(); while (pos) { int index = m_cFileList.GetNextSelectedItem(pos); DoDiff(index, false); } } break; case ID_UNIFIEDDIFF: { CTSVNPath diffFile = CTempFiles::Instance().GetTempFilePath(false); POSITION pos = m_cFileList.GetFirstSelectedItemPosition(); while (pos) { int index = m_cFileList.GetNextSelectedItem(pos); CFileDiffDlg::FileDiff fd = m_arFilteredList[index]; CTSVNPath url1 = CTSVNPath(m_path1.GetSVNPathString() + _T("/") + fd.path.GetSVNPathString()); CTSVNPath url2 = m_bDoPegDiff ? url1 : CTSVNPath(m_path2.GetSVNPathString() + _T("/") + fd.path.GetSVNPathString()); if (m_bDoPegDiff) { PegDiff(url1, m_peg, m_rev1, m_rev2, CTSVNPath(), m_depth, m_bIgnoreancestry, false, true, CString(), true, diffFile); } else { Diff(url1, m_rev1, url2, m_rev2, CTSVNPath(), m_depth, m_bIgnoreancestry, false, true, CString(), true, diffFile); } } CAppUtils::StartUnifiedDiffViewer(diffFile, CString(), false); } break; case ID_BLAME: { POSITION pos = m_cFileList.GetFirstSelectedItemPosition(); while (pos) { int index = m_cFileList.GetNextSelectedItem(pos); DoDiff(index, true); } } break; case ID_SAVEAS: if (m_cFileList.GetSelectedCount() > 0) { CTSVNPath savePath; CString pathSave; if (!CAppUtils::FileOpenSave(pathSave, NULL, IDS_REPOBROWSE_SAVEAS, IDS_COMMONFILEFILTER, false, m_hWnd)) { break; } savePath = CTSVNPath(pathSave); // now open the selected file for writing try { CStdioFile file(savePath.GetWinPathString(), CFile::typeBinary | CFile::modeReadWrite | CFile::modeCreate); CString temp; temp.FormatMessage(IDS_FILEDIFF_CHANGEDLISTINTRO, (LPCTSTR)m_path1.GetSVNPathString(), (LPCTSTR)m_rev1.ToString(), (LPCTSTR)m_path2.GetSVNPathString(), (LPCTSTR)m_rev2.ToString()); file.WriteString(temp + _T("\n")); POSITION pos = m_cFileList.GetFirstSelectedItemPosition(); while (pos) { int index = m_cFileList.GetNextSelectedItem(pos); FileDiff fd = m_arFilteredList[index]; file.WriteString(fd.path.GetSVNPathString()); file.WriteString(_T("\n")); } file.Close(); } catch (CFileException* pE) { pE->ReportError(); pE->Delete(); } } break; case ID_CLIPBOARD: CopySelectionToClipboard(); break; case ID_EXPORT: { // export all changed files to a folder CBrowseFolder browseFolder; browseFolder.m_style = BIF_EDITBOX | BIF_NEWDIALOGSTYLE | BIF_RETURNFSANCESTORS | BIF_RETURNONLYFSDIRS; if (browseFolder.Show(GetSafeHwnd(), m_strExportDir) == CBrowseFolder::OK) { m_arSelectedFileList.RemoveAll(); POSITION pos = m_cFileList.GetFirstSelectedItemPosition(); while (pos) { int index = m_cFileList.GetNextSelectedItem(pos); CFileDiffDlg::FileDiff fd = m_arFilteredList[index]; m_arSelectedFileList.Add(fd); } m_pProgDlg = new CProgressDlg(); InterlockedExchange(&m_bThreadRunning, TRUE); if (AfxBeginThread(ExportThreadEntry, this)==NULL) { InterlockedExchange(&m_bThreadRunning, FALSE); OnCantStartThread(); } } } break; } }