seldlg.cpp
来自「MFC编程实例」· C++ 代码 · 共 151 行
CPP
151 行
#include "stdafx.h"
#include "GDI.h"
#include "SelDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
CSelDlg::CSelDlg(CWnd* pParent /*=NULL*/)
: CDialog(CSelDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CSelDlg)
//}}AFX_DATA_INIT
m_bCaptureOn=FALSE;
m_iconCursor=AfxGetApp()->LoadIcon(IDI_ICON_CURSOR);
ASSERT(m_iconCursor);
m_iconBlank=AfxGetApp()->LoadIcon(IDI_ICON_BLANK);
ASSERT(m_iconBlank);
m_curSelect=AfxGetApp()->LoadCursor(IDC_CURSOR_SELECT);
ASSERT(m_curSelect);
m_hWnd=NULL;
}
void CSelDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CSelDlg)
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CSelDlg, CDialog)
//{{AFX_MSG_MAP(CSelDlg)
ON_WM_LBUTTONDOWN()
ON_WM_LBUTTONUP()
ON_WM_MOUSEMOVE()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
BOOL CSelDlg::OnInitDialog()
{
CDialog::OnInitDialog();
return TRUE;
}
void CSelDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
CRect rect;
CDialog::OnLButtonDown(nFlags, point);
GetDlgItem(IDC_STATIC_CURSOR)->GetWindowRect(rect);
ScreenToClient(rect);
if(rect.PtInRect(point))
{
SetCapture();
((CStatic *)GetDlgItem(IDC_STATIC_CURSOR))->SetIcon(m_iconBlank);
GetDlgItem(IDC_STATIC_CURSOR)->Invalidate();
m_curSave=::SetCursor(m_curSelect);
m_bCaptureOn=TRUE;
m_rectSelect=CRect(0, 0, 0, 0);
m_hWnd=NULL;
}
}
void CSelDlg::OnLButtonUp(UINT nFlags, CPoint point)
{
CDialog::OnLButtonUp(nFlags, point);
if(m_bCaptureOn == TRUE)
{
DrawSelection(point, TRUE);
::ReleaseCapture();
((CStatic *)GetDlgItem(IDC_STATIC_CURSOR))->SetIcon(m_iconCursor);
::SetCursor(m_curSave);
m_bCaptureOn=FALSE;
}
}
void CSelDlg::OnMouseMove(UINT nFlags, CPoint point)
{
DrawSelection(point);
CDialog::OnMouseMove(nFlags, point);
}
void CSelDlg::DrawSelection(CPoint point, BOOL bErase)
{
if(m_bCaptureOn == TRUE)
{
CWnd *pWnd;
CWindowDC dc(CWnd::GetDesktopWindow());
int nRop2Mode;
CRgn rgn;
CRgn rgnDesk;
CRect rect;
GetWindowRect(rect);
rgn.CreateRectRgnIndirect(rect);
AfxGetApp()->m_pMainWnd->GetWindowRect(rect);
rgnDesk.CreateRectRgnIndirect(rect);
rgn.CombineRgn(&rgnDesk, &rgn, RGN_OR);
rgnDesk.DeleteObject();
CWnd::GetDesktopWindow()->GetWindowRect(rect);
rgnDesk.CreateRectRgnIndirect(rect);
rgn.CombineRgn(&rgnDesk, &rgn, RGN_DIFF);
dc.SelectClipRgn(&rgn);
nRop2Mode=dc.SetROP2(R2_NOT);
ClientToScreen(&point);
pWnd=WindowFromPoint(point);
if
(
pWnd->GetSafeHwnd() != GetSafeHwnd() &&
pWnd->GetSafeHwnd() != AfxGetApp()->m_pMainWnd->GetSafeHwnd()
)
{
if(pWnd->GetSafeHwnd() != m_hWnd)
{
if(m_rectSelect.IsRectEmpty() != TRUE)
{
dc.Rectangle(m_rectSelect);
}
pWnd->GetWindowRect(m_rectSelect);
dc.Rectangle(m_rectSelect);
m_hWnd=pWnd->GetSafeHwnd();
}
}
else
{
if(m_rectSelect.IsRectEmpty() != TRUE)
{
dc.Rectangle(m_rectSelect);
m_rectSelect=CRect(0, 0, 0, 0);
}
m_hWnd=NULL;
}
if(bErase == TRUE && m_rectSelect.IsRectEmpty() != TRUE)
{
dc.Rectangle(m_rectSelect);
m_rectSelect=CRect(0, 0, 0, 0);
}
dc.SetROP2(nRop2Mode);
dc.SelectClipRgn(NULL);
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?