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;
		}
	}
}
示例#2
0
	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();	
	}
示例#3
0
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);
}
示例#4
0
// 重置消息框样式和外观
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函数中实现
}
示例#5
0
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;
	}
}
示例#6
0
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
}
示例#7
0
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;
}
示例#8
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 );
	}
	
}
示例#9
0
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;
  }
}
示例#10
0
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;
}
示例#11
0
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);
}
示例#12
0
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;
}
示例#13
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();
}
示例#14
0
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;
	}
}
示例#17
0
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;
}
示例#18
0
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;
        }
    }
}
示例#20
0
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);
}
示例#22
0
/*
*--------------------------------------------------------------------------------
*  成员函数名   : 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;
}
示例#23
0
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);

	}
}
示例#24
0
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;

		}
	}
}
示例#25
0
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);

	
}
示例#26
0
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);
}
示例#27
0
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);
}
示例#28
0
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);
}
示例#29
0
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);
}
示例#30
0
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;
	}
}