这几个结构容易混淆:
SIZE:The
SIZE structure specifies the width and height of a rectangle.
typedef struct tagSIZE {
LONG cx;
LONG cy;
}SIZE, *PSIZE;
|
再看看POINT结构:
Represents an ordered pair of integer x- and y-coordinates that defines a point in a two-dimensional plane.它主要有两个成员了。
typedef struct tagPOINT {
LONG x;
LONG y;
} POINT;
|
由此我们再看MFC中的CPoint:
class CPoint : public tagPOINT
|
它直接从结构当中继承而来,x, y成员都是public属性。
当然CPoint是相当强大的,我们从MSDN可以看出一二:
1.结构函数:
CPoint(
int initX,
int initY
) throw( );
CPoint(
POINT initPt
) throw( );
CPoint(
SIZE initSize
) throw( );
|
所有的构造函数都要求不会抛出任何异常,我们可以用x,y来初始化一个点,从另一个CPoint类,甚至从SIZE结构来初始化,不可谓不强大。
2.运算符重载
(1) ==, !=
BOOL operator !=(
POINT point
) const throw( );
BOOL operator ==(
POINT point
) const throw( );
|
写个例子?
pointDemo.h
class CMyApp : public CWinApp {
virtual BOOL InitInstance();
};
class CMainWindow : public CFrameWnd {
public:
CMainWindow();
protected:
afx_msg void OnPaint();
DECLARE_MESSAGE_MAP()
};
|
pointDemo.cpp
#include <afxwin.h>
#include "pointDemo.h"
CMyApp myApp;
BOOL CMyApp::InitInstance() {
m_pMainWnd = new CMainWindow;
m_pMainWnd->ShowWindow(m_nCmdShow);
m_pMainWnd->UpdateWindow();
return TRUE;
}
BEGIN_MESSAGE_MAP(CMainWindow, CFrameWnd)
ON_WM_PAINT()
END_MESSAGE_MAP()
CMainWindow::CMainWindow() {
Create(NULL, _T("看看点的属性"));
}
void CMainWindow::OnPaint() {
CPaintDC dc(this);
RECT rect;
GetClientRect(&rect);
CPoint p1(rect.right / 4, rect.bottom / 4);
CPoint p2(p1);
p2.Offset(rect.right / 2, rect.bottom / 2);
dc.MoveTo(p1);
dc.LineTo(p2);
if(p1 == p2) {
DrawText(dc, "这两个点是相同的!", -1, &rect, 0);
} else {
DrawText(dc, "\n\n这两个点不相同!", -1, &rect, 0);
}
}
|
运行结果:
(2)+,-,+=,-+
+:
CPoint operator +(
SIZE size
) const throw( );
CPoint operator +(
POINT point
) const throw( );
CRect operator +(
const RECT* lpRect
) const throw( );
|
两个点相加是一个点,一个点和一个长度相加是一个点,一个lprect加一个点是一个rect.
-:
CSize operator -(
POINT point
) const throw( );
CPoint operator -(
SIZE size
) const throw( );
CRect operator -(
const RECT* lpRect
) const throw( );
|
两个点相减是一个长度,一个点减一个长度是一个点,一个点减一个lprect是一个rect(关于这点,请看msdn:
Subtracting a rectangle from a point returns the rectangle offset by the negatives of the x and y values specified in the point. For example, using the last overload to offset the rectangle CRect(125, 200, 325, 400) by the point CPoint(25, -19) returns CRect(100, 219, 300, 419).)
+=:The first overload adds a size to the
CPoint.
void operator +=(
SIZE size
) throw( );
void operator +=(
POINT point
) throw( );
|
看清楚了返回的是一个void
-=:
void operator -=(
SIZE size
) throw( );
void operator -=(
POINT point
) throw( );
|
我靠,得写一个例子了:我们以上面为例:
头文件:
class CMyApp : public CWinApp {
virtual BOOL InitInstance();
};
class CMainWindow : public CFrameWnd {
public:
CMainWindow();
protected:
afx_msg void OnPaint();
DECLARE_MESSAGE_MAP()
};
|
cpp:
#include <afxwin.h>
#include <string>
#include "pointDemo.h"
using namespace std;
CMyApp myApp;
BOOL CMyApp::InitInstance() {
m_pMainWnd = new CMainWindow;
m_pMainWnd->ShowWindow(m_nCmdShow);
m_pMainWnd->UpdateWindow();
return TRUE;
}
BEGIN_MESSAGE_MAP(CMainWindow, CFrameWnd)
ON_WM_PAINT()
END_MESSAGE_MAP()
CMainWindow::CMainWindow() {
Create(NULL, _T("看看点的属性"));
}
void CMainWindow::OnPaint() {
CPaintDC dc(this);
RECT rect;
GetClientRect(&rect);
CPoint p1(rect.right / 4, rect.bottom / 4);
CPoint p2(p1);
CPoint p3 = p1 + p2;
string str = "我在这里!";
string strP3("p3: " + str);
TextOut(dc, p3.x, p3.y, strP3.c_str(), strP3.size());
p1 += p3;
string strP1("p1: " + str);
dc.TextOut(p1.x, p1.y, strP1.c_str(), strP3.size());
p1 -= p3;
strP1.append(", 这是我-=后的新位置");
dc.TextOut(p1.x, p1.y, strP1.c_str(), strP1.size());
}
|
运行结果:
CPoint就到此吧。
CSize?还是看MSDN吧,写不了这么多,呼呼
阅读(5747) | 评论(0) | 转发(0) |