C++でGDI+を使用して画面に描画するプログラムを作成しています。


画面に文字を描画したいのですが、コンパイルエラーがとれません。

// フォーム情報取得
CClientDC dc(this);
// フォームをグラフィックスに割り当てる
Graphics graphics(dc.m_hDC);
// アンチエイリアス設定
graphics.SetSmoothingMode(SmoothingModeAntiAlias);
StringFormat sf;
PointF rf;
Gdiplus::Font ft(dc.m_hDC);
Gdiplus::Brush br;
~~~~~~~~~~~~~~~~~~~~
graphics.DrawString(ptr,3,&ft,rf,br);


このようなソースになっておりまして、
コンパイルエラーは以下の通りです。
C:\edge5\edge5View.cpp(115) : error C2248: 'Brush::Brush' : protected メンバ (クラス 'Gdiplus::Brush' で宣言されている)にアクセスできません。
c:\progra~1\microsoft platform sdk\include\gdiplusbrush.h(70) : 'Brush::Brush' の宣言を確認してください。

何が問題なのでしょうか。


初歩的な事だと思うのですが、C++の経験が少なくお恥ずかしい質問かも
しれませんが、ご存じの方教えてください。

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:
  • 終了:2008/01/08 15:22:34
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:so-asano No.5

回答回数40ベストアンサー獲得回数5

ポイント20pt

http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja...

によれば、

> これは抽象基本クラスであり、インスタンス化できません。ブラシオブジェクトを作成するには、SolidBrush、TextureBrush、LinearGradientBrush など、Brush から派生したクラスを使用します。

ってこと。なので、

# Gdiplus::Font ft(dc.m_hDC);

# SolidBrush* myBrush = new SolidBrush(Color::Red);

# Gdiplus::SolidBrush* br = new Gdiplus::SolidBrush(Color::Red);

とかで動くんではないかと(c++ のコード書かなくなって久しいので、ミスがありそうな.....)。

id:pinkymonk

ありがとうございます。

大変勉強になります。

おっしゃる通りでした。

2008/01/08 15:22:00

その他の回答4件)

id:ysaw No.1

回答回数13ベストアンサー獲得回数0

ポイント20pt

エラーの通り、"protected メンバ"を使おうとしているのでは?

a)"protected メンバ"を使おうとしている間違いを直す

あるいは

b)gdiplusbrush.h(70) : 'Brush::Brush' の宣言

 をpublicとかに直す

とよいでしょう。

http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200204...

id:pinkymonk

ありがとうございます。

大変勉強になります。

2008/01/08 15:21:47
id:kent0608 No.2

回答回数220ベストアンサー獲得回数23

ポイント20pt

問題は”アクセス修飾子”にあります。

http://msdn2.microsoft.com/ja-jp/library/tsbce2bh(VS.80).aspx

id:pinkymonk

ありがとうございます。

大変勉強になります。

2008/01/08 15:21:52
id:mj99 No.3

回答回数138ベストアンサー獲得回数38

ポイント20pt

資料を見る限りでは、

Brush クラス (System.Drawing)

これは抽象基本クラスであり、インスタンス化できません。ブラシ オブジェクトを作成するには、SolidBrush、TextureBrush、LinearGradientBrush など、Brush から派生したクラスを使用します。

となっています。


例えば、こんな感じで宣言するとよいでしょうか(下記コードが動作するかどうか検証していません)

Gdiplus::SolidBrush brush(Gdiplus::Color.Blue);
id:pinkymonk

ありがとうございます。

大変勉強になります。

おっしゃる通りでした。

2008/01/08 15:21:55
id:inabatch No.4

回答回数6ベストアンサー獲得回数0

ポイント20pt

(GDI+に詳しくないので的を射ていなかったら、すみません。。)

GDI+のリファレンス(http://msdn2.microsoft.com/en-us/library/ms534424(VS.85).aspx)を読んで見たところ、

Brushクラスが抽象クラスだから「Gdiplus::Brush br;」のようにインスタンス化できないエラーだと思います。

抽象クラスではなく具象クラス(SolidBrush, HatchBrushなど)を使って、「Gdiplus::HatchBrush br;」とインスタンス化するようにコードを修正してみるといかがでしょうか?

個人的な考えでは、ライブラリを使っていて筋が通らないようなエラーに遭遇した場合、はじめに「ライブラリ作者の意図にそぐわない使い方なのかも?」と考えることが多いです。

今回のソース・エラーを見ると、作者が「例えばBrushだと、どのように塗れば良いのか分からないから、具体的にどんなブラシ(ソリッドなのか、ハッチスタイルなのか)で塗るのか決めてね。」と言っているような気がします。(個人的な感覚なので伝わりにくくてすみません)

id:pinkymonk

ありがとうございます。

大変勉強になります。

おっしゃる通りでした。

2008/01/08 15:21:57
id:so-asano No.5

回答回数40ベストアンサー獲得回数5ここでベストアンサー

ポイント20pt

http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja...

によれば、

> これは抽象基本クラスであり、インスタンス化できません。ブラシオブジェクトを作成するには、SolidBrush、TextureBrush、LinearGradientBrush など、Brush から派生したクラスを使用します。

ってこと。なので、

# Gdiplus::Font ft(dc.m_hDC);

# SolidBrush* myBrush = new SolidBrush(Color::Red);

# Gdiplus::SolidBrush* br = new Gdiplus::SolidBrush(Color::Red);

とかで動くんではないかと(c++ のコード書かなくなって久しいので、ミスがありそうな.....)。

id:pinkymonk

ありがとうございます。

大変勉強になります。

おっしゃる通りでした。

2008/01/08 15:22:00

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません