dポイントプレゼントキャンペーン実施中!

MFCでソリューションを新規作成した時に作られるプログラムにちょこちょこと手を加えています。
以下のプログラムは、画面の中心に黒い円を描くプログラムの一部です。
void CChildView::OnPaint()
{
CPaintDC dc(this); // 描画のデバイス コンテキスト

CRect rect;
GetClientRect(&rect);
CPoint center = rect.CenterPoint();

const int sizeCircle = 60;
CSize offset(sizeCircle / 2, sizeCircle / 2);
CSize size(sizeCircle, sizeCircle);
CRect rectCircle(center - offset, size);

CBrush brush(RGB(0, 0, 0));
CBrush* pBrushOrg = dc.SelectObject(&brush);
dc.Ellipse(rectCircle);
dc.SelectObject(pBrushOrg);
}
どなたか以下のことを教もらえないでしょうか。
(1)CSize size(sizeCircle, sizeCircle);の部分ですが、size()はCSizeのメンバ変数ではないと思うのですが、size()の型がCSizeになっているのはどうしてでしょうか?
(2)上の続きで、size()関数は見る限りどこにも定義されていなかったのですが、どこかに元々定義があるのでしょうか?(元々というのは、Microsoft側で定義してくれているということです。)
(3)dc.Ellipse(rectCircle);の部分で、dc.とはどういう意味でしょうか?
どなたかお願いします。

A 回答 (2件)

sizeは変数名であって、関数名ではありません。


C++では変数を定義する際、変数名の後ろに引数を書くことができるのです。
CSize size(sizeCircle, sizeCircle);
と書くのは、
CSize size;
size.cx=sizeCircle;
size.cy=sizeCircle;
と書くのと同じ動作をします。
なぜ同じ動作になるかというと、
CSize( int initCX, int initCY );
という「コンストラクタ」が定義されているからです。
これ以上の詳しい話は、「コンストラクタ」を調べるといろいろ書いてあるはずです。
    • good
    • 0

広い意味では関数ですが 本来はコンストラクタといいます



コンストラクタにはそのオブジェクトを宣言する際に引数を伴うものと不要なもの(または省略可能なもの)があります

お示しのコードの中の
CRect rect;
CRect rectCircle(center - offset, size);
のrectやrectCircleはともに CRect型ですが rectは引数がありません
rectCircleは引数ありで 関数のような表記になっています

CRect型でいえば
CRect( int l, int t, int r, int b ); //4個の点
CRect( const RECT& srcRect );    // 元になる CRectから
CRect( LPCRECT lpSrcRect );     // RECT構造体を元にする
CRect( POINT topLeft, POINT bottomRight ); // 左上と右下のPOINT構造体
といった具合に ほかの方法で構築することも可能です

同様に CSizeについても
CSize( );
CSize( int initCX, int initCY );
CSize( SIZE initSize );
CSize( POINT initPt );
CSize( DWORD dwSize );
といった種類のコンストラクタがあります

2番目のCSize( int initCX, int initCY )を使って構築しているのですよ
CSize::CSize(int initCX, int initCY )
として定義されていて
CSize objSize( 50, 50 );
と定義すると objSizeが生成される際に CSize::CSizeが呼ばれて
必要な初期化が行われます
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!