DOBON.NET DOBON.NETプログラミング掲示板過去ログ

グラフが正常に描画されない

環境/言語:[Windows XP / Visual Studio 2005 / Visual C++ 2005 / .NET Framework 2.0]
分類:[.NET]

2010/10/11(Mon) 19:44:03 編集(投稿者)
2010/10/11(Mon) 19:41:01 編集(投稿者)

現在、すべてのドライブの使用領域、空き領域を横棒グラフに表示させるプログラムを作っています。

下のコードで、フォームのBackgroundImageに設定した場合は正常に表示できたのですが、
PictureBox(StartGraph)に表示させた場合は、グラフがいっぱいまで描画されません。(画像参照)
PictureBoxのプロパティ変更した個所は、「BorderStyle」を「FixedSingle」にしただけです。
しかし、プロパティに関係なく、この現象が発生します。

また、A〜Zまでの繰り返し処理や、int配列は初めて作ったものですので、簡略化できる箇所があればお知らせいただけると幸いです。
どなたか分かる方、回答お願いします。

以下C++/CLIのコード

array<String^>^Alpha = {"A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"};
int n = Alpha->Length;
array<int>^ data1 = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
array<int>^ data2 = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
int maxvalue = 0;
for (int i=0;i<n;i++) {
System::IO::DriveInfo di(Alpha[i] + ":\\");
try {
double total = di.TotalSize / 1048576;
double free = di.TotalFreeSpace / 1048576;
double used = total - free;
data1[i] = used;
data2[i] = free;
if (maxvalue < total) {
maxvalue = total;
}
}
catch (Exception^) {
}
}
int iw = this->StartGraph->ClientSize.Width;
int ih = this->StartGraph->ClientSize.Height;
Bitmap^ bmp = gcnew Bitmap(iw,ih);
Image^ image = bmp;
Graphics^ g = Graphics::FromImage(image);
for (int i=0;i<n;i++) {
int w = iw * data1[i] / maxvalue;
int h = ih / n;
int freew = iw * data2[i] / maxvalue;
g->FillRectangle(Brushes::Red,0,i * h,w,h);
g->FillRectangle(Brushes::Blue,w,i * h,freew,h);
g->DrawLine(Pens::Black,0,i * h,iw,i * h);
}
this->StartGraph->Image = image;
添付ファイル: 1286792319.png (6 KB)
2010/10/11(Mon) 22:27:37 編集(投稿者)

■No27412に返信(masaさんの記事)
> int freew = iw * data2[i] / maxvalue;
 int freew = iw - w ;

にしないと横いっぱいには埋まらないです。

例)
used = 24, free = 26,  iw = 70
=> w = (int)(iw * used / 50) = (int)(70 * 24 / 50) = (int)(33.6) = 33
   freew = (int)(iw * free / 50) = (int)(70 * 26 / 50) = (int)(36.4) = 36
   w + freew = 69 <> 70  となってしまう。

そこでfreewの方は残りという事でfreew = 70 - w = 37とすれば幅いっぱいにすることが出来ます。
ありがとうございました。解決しました!
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板