直接上代碼,
void Ccurve::addtaxis(int data,int *path) //data為畫圖資料的幀數
{
if(vec.size()>0)
deepth=vec[vec_start][12];
for(int i=0;i<12;i++)
{
picline[i]= arrline[i]; //將庫資料選擇12個資料用于畫圖
pen[i] = new Pen(picline[i].return_color(),picline[i].return_width()); //設定12只畫筆的顏色與線寬
}
int dpi; //列印機像素
float flat; //列印影像比例1:200?1:50 要放入全域變數
//記憶體繪圖相關
pWnd1 = GetDlgItem(IDC_STATIC_view);//控制元件ID
pDC1=pWnd1->GetDC();
pWnd1->GetWindowRect(&rect1);//rc為控制元件的大小
ScreenToClient(&rect1);
W=rect1.Width()-20;
H=rect1.Height();
m=H/40;
bmp1=new Bitmap(W+20-2,H-1); //記憶體位圖H
Tite_W=W-100; //去除深度顯示的曲線繪圖區域
left_W=Tite_W/2+100;
Pen pen2(Color(0,0, 0), 3);//邊框粗線
Pen spen(Color(0,0, 0), 1);//邊框細線
Gdiplus::Font myFont(L"Arial", 15);
SolidBrush brushB(Color(255,0,0,0));
Graphics graphics(bmp1);
HatchBrush newBrush( HatchStyleCross, Color(2555, 255, 255, 255), Color(255, 255, 255,255));//白色
graphics.FillRectangle(&newBrush, 0, 0, rect1.Width(),H);//給畫圖區域填充白色背
StringFormat stringformat;
stringformat.SetAlignment(StringAlignmentCenter);
//豎線區域
for(int i=0;i<4;i++)
{
graphics.DrawLine(&pen2,Tite_W*i/6+20,0, Tite_W*i/6+20,H); //前面4條縱線,分三個區域
graphics.DrawLine(&pen2,left_W+Tite_W*i/6,0,left_W+Tite_W*i/6,H); //后面4條縱線,分三個區域
for(int j=1;j<4;j++) //每兩條黑線中間3條細線
{
if(i) //第一條前面的線不畫
{
graphics.DrawLine(&spen,Tite_W*i/6-Tite_W*j/24+20,0, Tite_W*i/6-Tite_W*j/24+20,H); //前半部分細線
graphics.DrawLine(&spen,left_W+Tite_W*i/6-Tite_W*j/24,0, left_W+Tite_W*i/6-Tite_W*j/24,H); //后半部分細線
}
}
}
for(int j=1;j<=(meter*10);j++)
{
if(0==(deepth-j)%10) //整數米的位置
{
graphics.DrawLine(&spen,20,H-H*j/(meter*10),Tite_W/2+20,H-H*j/(meter*10)); //左側橫細線
graphics.DrawLine(&spen,left_W,H-H*j/(meter*10),left_W+Tite_W/2,H-H*j/(meter*10)); //右側橫細線
if((deepth-j)%100==0) //十米整的位置
{
graphics.DrawLine(&pen2,20,H-H*j/(meter*10),Tite_W/2+20,H-H*j/(meter*10)); //左側橫粗線
graphics.DrawLine(&pen2,left_W,H-H*j/(meter*10),left_W+Tite_W/2,H-H*j/(meter*10)); //右側橫粗線
WCHAR buf[160];
wsprintfW(buf, L"%d", (deepth- j)/10); //注意是反圖,上面數字大,下面數字小,+40是因最開始一屏是空的,附加上去沒用
graphics.DrawString(buf, -1, &myFont, PointF(Tite_W/2+50+10,H-H*j/(meter*10)-10),&stringformat, &brushB); //每一個格十米,添加縱向坐標資料
}
}
}
//上面為背景網格部分
if(vec.size()>0)
{
if(float(deepth-10)>=vec[vec.size()-1][12]) //當畫線資料大于399個得時候,重繪翻頁30米。
{
vec_start=vec.size()-1; //起始位置點
for(int i=vec_start;i<vec.size();i++)
{
if(float(deepth-10)>=vec[i][12]) //資料超過滿屏就取深度小于等于螢屏最上面的點
vec_end=i;
}
}
else //資料不滿屏就取容器最上面一個點
vec_end=vec.size()-1;
for(int i=0;i<12;i++)
addcurve(graphics , pen[i],i,picline[i].return_path(),data); //此處為資料曲線部分
}
Graphics gr(pDC1->m_hDC);
gr.DrawImage(bmp1,1,1,0,0,W+50,H-2,UnitPixel);
ReleaseDC(pDC1); //釋放DC;
delete bmp1;
bmp1 =NULL;
}
void Ccurve::addcurve(Graphics &g ,Pen *pen,int j,int path,int data) //畫曲線,j=0為第1條,
{ //pos=0表示實時測井,pos為滾輪位置
CString st;
int z= path; //判斷繪圖區域,
PointF point[400];
/* if(data>400)
{*/
for(int i=vec_start;i<vec_end+1;i++) //30米翻頁。
{
if(z<3)
(point[i-vec_start]).X=(vec[i][j]-picline[j].return_min())/(picline[j].return_max()-picline[j].return_min())*Tite_W/6+20+Tite_W*z/6;
else
(point[i-vec_start]).X=(vec[i][j]-picline[j].return_min())/(picline[j].return_max()-picline[j].return_min())*Tite_W/6+Tite_W*(z-3)/6+left_W;
//(point[i]).Y=H-0.1*i*m;
(point[i-vec_start]).Y=H-(deepth-vec[i][12])*H/(meter*10); //其中deepth-300*turn_page為繪圖最螢屏最下邊深
}
g.DrawCurve(pen,point,vec_end+1-vec_start,1.0f);
}
我得背景網格和資料曲線都在一個函式里面繪制,當資料清零得時候曲線首先消失,但是背景網格還在,等下一幀資料來了背景網格才重繪,我想要得效果是資料清空了曲線跟網格同步
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/244895.html
標籤:界面
上一篇:跪請高手指教!用陣列給變數賦值,達到想要的結果,謝謝!
下一篇:怎么呼叫一個類物件成員的容器值
