人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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++の経験が少なくお恥ずかしい質問かも
しれませんが、ご存じの方教えてください。

●質問者: pinkymonk
●カテゴリ:コンピュータ ウェブ制作
✍キーワード:br C++ DC FT GDI
○ 状態 :終了
└ 回答数 : 5/5件

▽最新の回答へ

1 ● ysaw
●20ポイント

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

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

あるいは

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

をpublicとかに直す

とよいでしょう。

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

◎質問者からの返答

ありがとうございます。

大変勉強になります。


2 ● kent0608
●20ポイント

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

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

◎質問者からの返答

ありがとうございます。

大変勉強になります。


3 ● mj99
●20ポイント

資料を見る限りでは、

Brush クラス (System.Drawing)

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

となっています。


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

Gdiplus::SolidBrush brush(Gdiplus::Color.Blue);
◎質問者からの返答

ありがとうございます。

大変勉強になります。

おっしゃる通りでした。


4 ● inabatch
●20ポイント

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

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

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

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

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

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

◎質問者からの返答

ありがとうございます。

大変勉強になります。

おっしゃる通りでした。


5 ● so-asano
●20ポイント ベストアンサー

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++ のコード書かなくなって久しいので、ミスがありそうな.....)。

◎質問者からの返答

ありがとうございます。

大変勉強になります。

おっしゃる通りでした。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ