关于数据和显示界面分离

倚栏|听风 2018-01-09 11:42:26
给出一组数据,根据这些数据绘图,例如给出一组整型数据,长度为10000,绘制成柱形图,此时绘图区域是100 * 100,我将数据量成100份,取极大值,然后根据数据大小继续量化Y轴坐标。

我想问的问题是这个量化的算法到底应该怎么写,数据的长度对应X轴,数据的大小对应Y轴,这就造成了数据对界面的依赖,
如果显示区域不变,也没啥问题,可是一旦界面变化,相对应的X轴,Y轴长度都会发生变化,这个时候应该怎么办...
各位大神,提供个思路可好,怎么样能将数据和显示界面彻底分离开来..........求教
...全文
628 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
TyiTguoQ 2018-01-24
  • 打赏
  • 举报
回复
引用 9 楼 qq_33462307 的回复:
[quote=引用 7 楼 TyiTguoQ 的回复:] 柱状图,不可能每个像素宽就一个柱子吧?你完全可以量化的时候就设定好几个柱子嘛,数据就可以存下了,哪怕是一百个柱子,每个柱子的最值可以存下,以后重绘就按照这个数据绘制就好了啊,柱子数目干嘛要动态的。。。
一开始就设好柱子是什么意思? 你的意思是以开始就把量化幅度设置好,比如10000个长度数据,分成100份,保存100个数据,以后绘这100个数据?[/quote] 是这样
ooolinux 2018-01-10
  • 打赏
  • 举报
回复
不懂的东西,边做,边查资料、看书,逐渐就懂了。好比古代没有汽车飞机,不知道怎么日行千里,只能想到马,了解了有先进交通工具后,就会有很多想法,去周游列国,去做各种事。
倚栏|听风 2018-01-10
  • 打赏
  • 举报
回复
引用 11 楼 u010165006 的回复:
重绘的时候肯定要原始数据,重新计算画图的比例,原始数据可以存为文件。
换个问题来问,比如利用MFC设计贪吃蛇游戏, 我把窗口大小设计成蛇的行动区域,然后把区域均匀分割有限小块,每一个区域都可以是蛇的身体的一个组成部分或者是食物, 这个时候绘图比较简单,我刷背景,绘制蛇以及食物
倚栏|听风 2018-01-10
  • 打赏
  • 举报
回复
引用 11 楼 u010165006 的回复:
重绘的时候肯定要原始数据,重新计算画图的比例,原始数据可以存为文件。
哎,真能保存原始数据就好了,问题是我要保存的是坐标以及坐标上的点的出现次数,画好图,保存下来,下次怎么打开我现在也没想明白.... 数据的保存格式是固定的,连大小都有限制
ooolinux 2018-01-10
  • 打赏
  • 举报
回复
重绘的时候肯定要原始数据,重新计算画图的比例,原始数据可以存为文件。
倚栏|听风 2018-01-10
  • 打赏
  • 举报
回复
引用 14 楼 u010165006 的回复:
不懂的东西,边做,边查资料、看书,逐渐就懂了。好比古代没有汽车飞机,不知道怎么日行千里,只能想到马,了解了有先进交通工具后,就会有很多想法,去周游列国,去做各种事。
不懂哎...
赵4老师 2018-01-09
  • 打赏
  • 举报
回复
仅供参考: 显示大于32767行数据对应的折线图VC源代码 http://download.csdn.net/download/zhao4zhong1/7610833
倚栏|听风 2018-01-09
  • 打赏
  • 举报
回复
[/quote]重新进行你说的量化[/quote] 原始数据很大,量化之后就该直接丢弃了,这样的话我得一直留着原始数据,很有可能内存不够...那该怎么办呀
倚栏|听风 2018-01-09
  • 打赏
  • 举报
回复
引用 1 楼 paschen 的回复:
界面变化时会发送WM_PAINT消息,在消息中重绘你的图即可
如果数据保存的是100 * 100的位置信息,现在界面大小变成了200 * 200, 这个时候该怎么绘?
paschen 版主 2018-01-09
  • 打赏
  • 举报
回复
引用 2楼我是你的主体 的回复:
[quote=引用 1 楼 paschen 的回复:] 界面变化时会发送WM_PAINT消息,在消息中重绘你的图即可
如果数据保存的是100 * 100的位置信息,现在界面大小变成了200 * 200, 这个时候该怎么绘?[/quote]重新进行你说的量化
paschen 版主 2018-01-09
  • 打赏
  • 举报
回复
界面变化时会发送WM_PAINT消息,在消息中重绘你的图即可
倚栏|听风 2018-01-09
  • 打赏
  • 举报
回复
引用 8 楼 zhao4zhong1 的回复:
[quote=引用 6 楼 qq_33462307 的回复:] [quote=引用 5 楼 zhao4zhong1 的回复:] 仅供参考: 显示大于32767行数据对应的折线图VC源代码 http://download.csdn.net/download/zhao4zhong1/7610833
赵老师,我穷的连5个积分都没有啊..不如你直接给个思路,我捉摸琢磨[/quote]
#pragma comment(lib,"user32")
#pragma comment(lib,"gdi32")
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
double *d[7],mind[7],maxd[7];
int i,nn,h,x,y,mx=0,my=0,idx,cc,n,r,j,L,L1,jj=0,cc2,cb;
FILE *f;
char str[1024],*p;
RECT cr,vr,br;
COLORREF cj[7]={//第j列数据的颜色
    0x00FF0000,
    0x00005000,
    0x000000FF,
    0x00FF00FF,
    0x0000FFFF,
    0x00FFFFFF,
    0x00FFFF00,
};
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
    PAINTSTRUCT ps;
    HDC hdc;
    HFONT hfont,ohfont;
    COLORREF oc;
    HBRUSH hbrush;//,ob;
    HPEN hpen,op;
    HANDLE hData;
    LPSTR lpData;

    switch (message) {
    case WM_CLOSE://按Alt+F4退出
        PostQuitMessage(0);
        break;
    case WM_KEYUP://按Esc退出
        if (wParam==VK_ESCAPE) PostQuitMessage(0);
        break;
    case WM_LBUTTONUP://鼠标左键点击时显示附近图形对应信息
        mx=LOWORD(lParam);
        my=HIWORD(lParam);
        if (my>cr.bottom-13) {//在底部信息提示行单击
            jj=(jj+1)%cc;//轮换最后显示(最上面显示)那列数据
            InvalidateRect(hWnd,&cr,TRUE);
        } else InvalidateRect(hWnd,&vr,TRUE);
        break;
    case WM_PAINT:
        BeginPaint(hWnd, &ps);
        hdc = ps.hdc;
        GetClientRect(hWnd, &cr);
        br.left=cr.left;
        br.right=cr.right;
        h=(cr.bottom-13-cr.top)/(1+nn/(cr.right-cr.left));//每行像素高度
        if (h==0) h=1;
        hbrush=CreateSolidBrush((COLORREF)0x00B0B0B0);
//      ob=(HBRUSH)SelectObject(hdc,hbrush);
        for (i=0;i<nn;i+=cr.right-cr.left) {
            if (0==i%(cr.right-cr.left)) {
                if (0==i/(cr.right-cr.left)%2) {
                    br.bottom=h-1+cr.top+i/(cr.right-cr.left)*h;
                    br.top=br.bottom-h;
                    FillRect(hdc,&br,hbrush);
                }
            }
        }
        if (0==i/(cr.right-cr.left)%2) {
            br.bottom=h-1+cr.top+i/(cr.right-cr.left)*h;
            br.top=br.bottom-h;
            if (br.top<cr.bottom-13) {
                br.bottom=cr.bottom-13;
                FillRect(hdc,&br,hbrush);//如有必要,在最下面一行的下面填充亮灰,确保最下面一行的高度为h
            }
        }
        for (j=cc-1;j>=0;j--) {
            if (j==jj) continue;//跳过第jj列数据
            hpen=CreatePen(PS_SOLID,0,cj[(cb+j)%7]);
            op=(HPEN)SelectObject(hdc,hpen);
            for (i=0;i<nn;i++) {
                x=cr.left+i%(cr.right-cr.left);
                y=h-2+cr.top+i/(cr.right-cr.left)*h-((maxd[j]==mind[j])?0:((int)((d[j][i]-mind[j])/(maxd[j]-mind[j])*h)));
                if (0==i%(cr.right-cr.left)) {
                    MoveToEx(hdc,x,y,NULL);
                }
                else LineTo(hdc,x,y);
            }
            SelectObject(hdc,op);
            DeleteObject(hpen);
        }
        j=jj;//将第jj列数据最后显示(最上面显示)
        hpen=CreatePen(PS_SOLID,0,cj[(cb+j)%7]);
        op=(HPEN)SelectObject(hdc,hpen);
        for (i=0;i<nn;i++) {
            x=cr.left+i%(cr.right-cr.left);
            y=h-2+cr.top+i/(cr.right-cr.left)*h-((maxd[j]==mind[j])?0:((int)((d[j][i]-mind[j])/(maxd[j]-mind[j])*h)));
            if (0==i%(cr.right-cr.left)) {
                MoveToEx(hdc,x,y,NULL);
            }
            else LineTo(hdc,x,y);
        }
        SelectObject(hdc,op);
        DeleteObject(hpen);

        vr.top=cr.bottom-13;
        vr.bottom=cr.bottom;
        vr.left=cr.left;
        vr.right=cr.right;
        FillRect(hdc,&vr,hbrush);
        hfont = CreateFont(12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "宋体");
        ohfont=(HFONT)SelectObject(hdc,hfont);
        SetBkMode(hdc, TRANSPARENT);
        oc=SetTextColor(hdc,(COLORREF)0x00000000);
        idx=(my+1)/h*(cr.right-cr.left)+mx;
        if (idx>=nn) idx=0;
        L=sprintf(str,"共%d行×%d列 各列最小,最大值=",nn,cc);
        TextOut(hdc,vr.left+8,vr.top+1,str,L);
        for (j=0;j<cc;j++) {
            SetTextColor(hdc,cj[(cb+j)%7]);
            L1=sprintf(str,"%lg,%lg ",mind[j],maxd[j]);
            TextOut(hdc,vr.left+8+L*6,vr.top+1,str,L1);
            if (j==jj) TextOut(hdc,vr.left+8+L*6+1,vr.top+1,str,L1);
            L+=L1;
        }
        SetTextColor(hdc,(COLORREF)0x00000000);
        L1=sprintf(str,"第%d行: ",idx+1);
        TextOut(hdc,vr.left+8+L*6,vr.top+1,str,L1);
        L+=L1;
        for (j=0;j<cc;j++) {
            SetTextColor(hdc,cj[(cb+j)%7]);
            L1=sprintf(str,"%lg ",d[j][idx]);
            TextOut(hdc,vr.left+8+L*6,vr.top+1,str,L1);
            if (j==jj) TextOut(hdc,vr.left+8+L*6+1,vr.top+1,str,L1);
            L+=L1;
        }
        if (idx>0) {
            if (OpenClipboard(hWnd)) {
                EmptyClipboard();
                hData=GlobalAlloc(GMEM_MOVEABLE|GMEM_DDESHARE,16);
                lpData=(char *)GlobalLock(hData);
                sprintf(lpData,"%d",idx+1);//将当前行行号放入剪贴板,方便外部程序定位光标到当前行。
                GlobalUnlock(hData);
                SetClipboardData(CF_TEXT,hData);
                CloseClipboard();
            }
        }
        SetTextColor(hdc,oc);
        SelectObject(hdc,ohfont);
        DeleteObject(hfont);

//      SelectObject(hdc,ob);
        DeleteObject(hbrush);

        EndPaint(hWnd, &ps);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
    MSG msg             = {0};
    WNDCLASS wc         = {0};
    HBRUSH hbrh;

    if ('/'==lpCmdLine[0] && '?'==lpCmdLine[1]) {
        MessageBox(NULL,
            "·可大于32767行,最多7列\n"
            "·鼠标左键点击折线图时在底部提示行显示对应第几行和对应数值并将当前行行号放入剪贴板\n"
            "·鼠标左键点击底部提示行轮换在最上面显示某列折线并以粗体字显示其对应数值\n"
            "·可在命令行参数中用1~6另外指定第一列数据使用的颜色,默认蓝色\n"
            "·按Esc或Alt+F4键退出\n"
            "设计者:赵中 zhao4zhong1@163.com 2014-10-30",
            "全屏分行显示c:\\data.txt文件中的数据折线图",
            MB_OK
        );
        return 7;
    }
    cb=atoi(lpCmdLine);if (cb<0||6<cb) cb=0;//命令行指定第一种颜色
    f=fopen("c:\\data.txt","r");
    if (NULL==f) return 3;
    if (NULL==fgets(str,1024,f)) {fclose(f);return 5;}
    cc=0;
    p=str;
    while (1) {
        r=sscanf(p,"%lf%n",&mind[0],&n);
        if (1==r) {
            cc++;
            p+=n;
        } else if (0==r) {
            p++;
        } else break;//
    }
    cc2=0;
    if (NULL!=fgets(str,1024,f)) {
        p=str;
        while (1) {
            r=sscanf(p,"%lf%n",&mind[0],&n);
            if (1==r) {
                cc2++;
                p+=n;
            } else if (0==r) {
                p++;
            } else break;//
        }
    }
    if (0==cc && 0==cc2) {fclose(f);return 6;}//第1行有cc列数据,第2行有cc2列数据
    cc=__max(cc,cc2);
    if (cc>7) cc=7;//忽略大于7列的数据
    rewind(f);
    nn=0;
    while (1) {
        if (NULL==fgets(str,1024,f)) break;//
        nn++;
    }
    for (j=0;j<cc;j++) {
        d[j]=(double *)malloc(nn*sizeof(double));
        if (NULL==d[j]) {fclose(f);return 4;}
    }
    rewind(f);
    for (i=0;i<nn;i++) {
        fgets(str,1024,f);
        j=0;
        p=str;
        while (1) {
            r=sscanf(p,"%lf%n",&d[j][i],&n);
            if (1==r) {
                if (0==i) {
                    mind[j]=d[j][0];
                    maxd[j]=d[j][0];
                } else {
                    if (d[j][i]<mind[j]) mind[j]=d[j][i];
                    if (d[j][i]>maxd[j]) maxd[j]=d[j][i];
                }
                j++;
                if (j>=cc) break;// //忽略大于cc列的数据
                p+=n;
            } else if (0==r) {
                p++;
            } else break;//
        }
        for (;j<cc;j++) d[j][i]=d[0][0]; //本行数据若少于cc列,将其余列填写为本文件第1个数据
    }
    fclose(f);
    hbrh=CreateSolidBrush(0x00999999);
    wc.lpfnWndProc      = WndProc;
    wc.hInstance        = hInstance;
    wc.hbrBackground    = hbrh;
    wc.lpszClassName    = "zzChart2";
    wc.hCursor          = LoadCursor(NULL,IDC_CROSS);
    if( FAILED(RegisterClass(&wc)) ) return 1;
    if(FAILED(CreateWindow(wc.lpszClassName,
                        "zzChart2",
                        WS_POPUP|WS_VISIBLE,
                        0,
                        0,
                        GetSystemMetrics(SM_CXSCREEN),
                        GetSystemMetrics(SM_CYSCREEN),
                        0,
                        0,
                        hInstance,
                        NULL)))
        return 2;

    while( GetMessage( &msg, NULL, 0, 0 ) > 0 ) {
        DispatchMessage( &msg );
    }
    DeleteObject(hbrh);
    for (j=0;j<cc;j++) free(d[j]);
    return 0;
}
[/quote] 谢谢 谢谢!!! 明天研究研究 ! 下班了 ~~~
倚栏|听风 2018-01-09
  • 打赏
  • 举报
回复
引用 7 楼 TyiTguoQ 的回复:
柱状图,不可能每个像素宽就一个柱子吧?你完全可以量化的时候就设定好几个柱子嘛,数据就可以存下了,哪怕是一百个柱子,每个柱子的最值可以存下,以后重绘就按照这个数据绘制就好了啊,柱子数目干嘛要动态的。。。
一开始就设好柱子是什么意思? 你的意思是以开始就把量化幅度设置好,比如10000个长度数据,分成100份,保存100个数据,以后绘这100个数据?
赵4老师 2018-01-09
  • 打赏
  • 举报
回复
引用 6 楼 qq_33462307 的回复:
[quote=引用 5 楼 zhao4zhong1 的回复:] 仅供参考: 显示大于32767行数据对应的折线图VC源代码 http://download.csdn.net/download/zhao4zhong1/7610833
赵老师,我穷的连5个积分都没有啊..不如你直接给个思路,我捉摸琢磨[/quote]
#pragma comment(lib,"user32")
#pragma comment(lib,"gdi32")
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
double *d[7],mind[7],maxd[7];
int i,nn,h,x,y,mx=0,my=0,idx,cc,n,r,j,L,L1,jj=0,cc2,cb;
FILE *f;
char str[1024],*p;
RECT cr,vr,br;
COLORREF cj[7]={//第j列数据的颜色
    0x00FF0000,
    0x00005000,
    0x000000FF,
    0x00FF00FF,
    0x0000FFFF,
    0x00FFFFFF,
    0x00FFFF00,
};
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
    PAINTSTRUCT ps;
    HDC hdc;
    HFONT hfont,ohfont;
    COLORREF oc;
    HBRUSH hbrush;//,ob;
    HPEN hpen,op;
    HANDLE hData;
    LPSTR lpData;

    switch (message) {
    case WM_CLOSE://按Alt+F4退出
        PostQuitMessage(0);
        break;
    case WM_KEYUP://按Esc退出
        if (wParam==VK_ESCAPE) PostQuitMessage(0);
        break;
    case WM_LBUTTONUP://鼠标左键点击时显示附近图形对应信息
        mx=LOWORD(lParam);
        my=HIWORD(lParam);
        if (my>cr.bottom-13) {//在底部信息提示行单击
            jj=(jj+1)%cc;//轮换最后显示(最上面显示)那列数据
            InvalidateRect(hWnd,&cr,TRUE);
        } else InvalidateRect(hWnd,&vr,TRUE);
        break;
    case WM_PAINT:
        BeginPaint(hWnd, &ps);
        hdc = ps.hdc;
        GetClientRect(hWnd, &cr);
        br.left=cr.left;
        br.right=cr.right;
        h=(cr.bottom-13-cr.top)/(1+nn/(cr.right-cr.left));//每行像素高度
        if (h==0) h=1;
        hbrush=CreateSolidBrush((COLORREF)0x00B0B0B0);
//      ob=(HBRUSH)SelectObject(hdc,hbrush);
        for (i=0;i<nn;i+=cr.right-cr.left) {
            if (0==i%(cr.right-cr.left)) {
                if (0==i/(cr.right-cr.left)%2) {
                    br.bottom=h-1+cr.top+i/(cr.right-cr.left)*h;
                    br.top=br.bottom-h;
                    FillRect(hdc,&br,hbrush);
                }
            }
        }
        if (0==i/(cr.right-cr.left)%2) {
            br.bottom=h-1+cr.top+i/(cr.right-cr.left)*h;
            br.top=br.bottom-h;
            if (br.top<cr.bottom-13) {
                br.bottom=cr.bottom-13;
                FillRect(hdc,&br,hbrush);//如有必要,在最下面一行的下面填充亮灰,确保最下面一行的高度为h
            }
        }
        for (j=cc-1;j>=0;j--) {
            if (j==jj) continue;//跳过第jj列数据
            hpen=CreatePen(PS_SOLID,0,cj[(cb+j)%7]);
            op=(HPEN)SelectObject(hdc,hpen);
            for (i=0;i<nn;i++) {
                x=cr.left+i%(cr.right-cr.left);
                y=h-2+cr.top+i/(cr.right-cr.left)*h-((maxd[j]==mind[j])?0:((int)((d[j][i]-mind[j])/(maxd[j]-mind[j])*h)));
                if (0==i%(cr.right-cr.left)) {
                    MoveToEx(hdc,x,y,NULL);
                }
                else LineTo(hdc,x,y);
            }
            SelectObject(hdc,op);
            DeleteObject(hpen);
        }
        j=jj;//将第jj列数据最后显示(最上面显示)
        hpen=CreatePen(PS_SOLID,0,cj[(cb+j)%7]);
        op=(HPEN)SelectObject(hdc,hpen);
        for (i=0;i<nn;i++) {
            x=cr.left+i%(cr.right-cr.left);
            y=h-2+cr.top+i/(cr.right-cr.left)*h-((maxd[j]==mind[j])?0:((int)((d[j][i]-mind[j])/(maxd[j]-mind[j])*h)));
            if (0==i%(cr.right-cr.left)) {
                MoveToEx(hdc,x,y,NULL);
            }
            else LineTo(hdc,x,y);
        }
        SelectObject(hdc,op);
        DeleteObject(hpen);

        vr.top=cr.bottom-13;
        vr.bottom=cr.bottom;
        vr.left=cr.left;
        vr.right=cr.right;
        FillRect(hdc,&vr,hbrush);
        hfont = CreateFont(12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "宋体");
        ohfont=(HFONT)SelectObject(hdc,hfont);
        SetBkMode(hdc, TRANSPARENT);
        oc=SetTextColor(hdc,(COLORREF)0x00000000);
        idx=(my+1)/h*(cr.right-cr.left)+mx;
        if (idx>=nn) idx=0;
        L=sprintf(str,"共%d行×%d列 各列最小,最大值=",nn,cc);
        TextOut(hdc,vr.left+8,vr.top+1,str,L);
        for (j=0;j<cc;j++) {
            SetTextColor(hdc,cj[(cb+j)%7]);
            L1=sprintf(str,"%lg,%lg ",mind[j],maxd[j]);
            TextOut(hdc,vr.left+8+L*6,vr.top+1,str,L1);
            if (j==jj) TextOut(hdc,vr.left+8+L*6+1,vr.top+1,str,L1);
            L+=L1;
        }
        SetTextColor(hdc,(COLORREF)0x00000000);
        L1=sprintf(str,"第%d行: ",idx+1);
        TextOut(hdc,vr.left+8+L*6,vr.top+1,str,L1);
        L+=L1;
        for (j=0;j<cc;j++) {
            SetTextColor(hdc,cj[(cb+j)%7]);
            L1=sprintf(str,"%lg ",d[j][idx]);
            TextOut(hdc,vr.left+8+L*6,vr.top+1,str,L1);
            if (j==jj) TextOut(hdc,vr.left+8+L*6+1,vr.top+1,str,L1);
            L+=L1;
        }
        if (idx>0) {
            if (OpenClipboard(hWnd)) {
                EmptyClipboard();
                hData=GlobalAlloc(GMEM_MOVEABLE|GMEM_DDESHARE,16);
                lpData=(char *)GlobalLock(hData);
                sprintf(lpData,"%d",idx+1);//将当前行行号放入剪贴板,方便外部程序定位光标到当前行。
                GlobalUnlock(hData);
                SetClipboardData(CF_TEXT,hData);
                CloseClipboard();
            }
        }
        SetTextColor(hdc,oc);
        SelectObject(hdc,ohfont);
        DeleteObject(hfont);

//      SelectObject(hdc,ob);
        DeleteObject(hbrush);

        EndPaint(hWnd, &ps);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
    MSG msg             = {0};
    WNDCLASS wc         = {0};
    HBRUSH hbrh;

    if ('/'==lpCmdLine[0] && '?'==lpCmdLine[1]) {
        MessageBox(NULL,
            "·可大于32767行,最多7列\n"
            "·鼠标左键点击折线图时在底部提示行显示对应第几行和对应数值并将当前行行号放入剪贴板\n"
            "·鼠标左键点击底部提示行轮换在最上面显示某列折线并以粗体字显示其对应数值\n"
            "·可在命令行参数中用1~6另外指定第一列数据使用的颜色,默认蓝色\n"
            "·按Esc或Alt+F4键退出\n"
            "设计者:赵中 zhao4zhong1@163.com 2014-10-30",
            "全屏分行显示c:\\data.txt文件中的数据折线图",
            MB_OK
        );
        return 7;
    }
    cb=atoi(lpCmdLine);if (cb<0||6<cb) cb=0;//命令行指定第一种颜色
    f=fopen("c:\\data.txt","r");
    if (NULL==f) return 3;
    if (NULL==fgets(str,1024,f)) {fclose(f);return 5;}
    cc=0;
    p=str;
    while (1) {
        r=sscanf(p,"%lf%n",&mind[0],&n);
        if (1==r) {
            cc++;
            p+=n;
        } else if (0==r) {
            p++;
        } else break;//
    }
    cc2=0;
    if (NULL!=fgets(str,1024,f)) {
        p=str;
        while (1) {
            r=sscanf(p,"%lf%n",&mind[0],&n);
            if (1==r) {
                cc2++;
                p+=n;
            } else if (0==r) {
                p++;
            } else break;//
        }
    }
    if (0==cc && 0==cc2) {fclose(f);return 6;}//第1行有cc列数据,第2行有cc2列数据
    cc=__max(cc,cc2);
    if (cc>7) cc=7;//忽略大于7列的数据
    rewind(f);
    nn=0;
    while (1) {
        if (NULL==fgets(str,1024,f)) break;//
        nn++;
    }
    for (j=0;j<cc;j++) {
        d[j]=(double *)malloc(nn*sizeof(double));
        if (NULL==d[j]) {fclose(f);return 4;}
    }
    rewind(f);
    for (i=0;i<nn;i++) {
        fgets(str,1024,f);
        j=0;
        p=str;
        while (1) {
            r=sscanf(p,"%lf%n",&d[j][i],&n);
            if (1==r) {
                if (0==i) {
                    mind[j]=d[j][0];
                    maxd[j]=d[j][0];
                } else {
                    if (d[j][i]<mind[j]) mind[j]=d[j][i];
                    if (d[j][i]>maxd[j]) maxd[j]=d[j][i];
                }
                j++;
                if (j>=cc) break;// //忽略大于cc列的数据
                p+=n;
            } else if (0==r) {
                p++;
            } else break;//
        }
        for (;j<cc;j++) d[j][i]=d[0][0]; //本行数据若少于cc列,将其余列填写为本文件第1个数据
    }
    fclose(f);
    hbrh=CreateSolidBrush(0x00999999);
    wc.lpfnWndProc      = WndProc;
    wc.hInstance        = hInstance;
    wc.hbrBackground    = hbrh;
    wc.lpszClassName    = "zzChart2";
    wc.hCursor          = LoadCursor(NULL,IDC_CROSS);
    if( FAILED(RegisterClass(&wc)) ) return 1;
    if(FAILED(CreateWindow(wc.lpszClassName,
                        "zzChart2",
                        WS_POPUP|WS_VISIBLE,
                        0,
                        0,
                        GetSystemMetrics(SM_CXSCREEN),
                        GetSystemMetrics(SM_CYSCREEN),
                        0,
                        0,
                        hInstance,
                        NULL)))
        return 2;

    while( GetMessage( &msg, NULL, 0, 0 ) > 0 ) {
        DispatchMessage( &msg );
    }
    DeleteObject(hbrh);
    for (j=0;j<cc;j++) free(d[j]);
    return 0;
}
TyiTguoQ 2018-01-09
  • 打赏
  • 举报
回复
柱状图,不可能每个像素宽就一个柱子吧?你完全可以量化的时候就设定好几个柱子嘛,数据就可以存下了,哪怕是一百个柱子,每个柱子的最值可以存下,以后重绘就按照这个数据绘制就好了啊,柱子数目干嘛要动态的。。。
倚栏|听风 2018-01-09
  • 打赏
  • 举报
回复
引用 5 楼 zhao4zhong1 的回复:
仅供参考: 显示大于32767行数据对应的折线图VC源代码 http://download.csdn.net/download/zhao4zhong1/7610833
赵老师,我穷的连5个积分都没有啊..不如你直接给个思路,我捉摸琢磨

64,282

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧