- 題名: グラフが正常に描画されない
- 日時: 2010/10/11 19:18:40
- ID: 27412
- この記事の返信元:
- (なし)
- この記事への返信:
- [27413] Re[1]: グラフが正常に描画されない2010/10/11 22:21:21
- ツリーを表示
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とすれば幅いっぱいにすることが出来ます。
分類:[.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;