• ベストアンサー

MFC C++

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.とはどういう意味でしょうか? どなたかお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • titokani
  • ベストアンサー率19% (341/1726)
回答No.2

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

その他の回答 (1)

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

広い意味では関数ですが 本来はコンストラクタといいます コンストラクタにはそのオブジェクトを宣言する際に引数を伴うものと不要なもの(または省略可能なもの)があります お示しのコードの中の 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が呼ばれて 必要な初期化が行われます

関連するQ&A