由于现在在windows下用c语言写一些算法,c语言并没有自己的图形界面库,所以在调试的时候很不方便。相信很多使用c语言开发的朋友都会为此而苦恼。所以最近我基于easyX写了一个实时绘制数据的程序,希望可以给大家一些帮助。

easyX是一个c++的图形库,只能在windows上使用,而且一般只能在vs或者vc上面使用(我用的vs),限制条件比较多,如果大家想用,还是老老实实安装软件吧,先装vs,然后安装easyX。easyX安装起来很简单。

先给大家看一下效果:

静态显示(不带网格):

静态显示(带网格,这里网格线将刻度值的负号遮盖了,理解万岁):

动态绘制(无网格):

动态绘制(有网格):

动态绘制时,使用了一个循环队列,然后每一次重新绘制队列中的所有元素

接下来是代码:

先是循环队列的代码:

queue.h

#ifndef _QUEUE_H
#define _QUEUE_H//循环队列的大小
#define MAXSIZE  1000  typedef struct queueint {int data[MAXSIZE];int front, rear;
}QueueInt;typedef struct queueintfloat {float data[MAXSIZE];int front, rear;
}QueueFloat;void queueInitFloat(QueueFloat* queue);int insertFloat(QueueFloat* queue,float a);int deleteFloat(QueueFloat* queue);int getSizeFloat(QueueFloat* queue);void queueInitInt(QueueInt* queue);int insertInt(QueueInt* queue, int a);int deleteInt(QueueInt* queue);int getSizeInt(QueueInt* queue);#endif

queue.cpp

#include "queue.h"void queueInitFloat(QueueFloat* queue) {queue->front = 0;queue->rear = 0;for (int i = 0; i < MAXSIZE; i++)queue->data[i] = 0;
}int insertFloat(QueueFloat* queue, float a) {if ((queue->rear + 1)%MAXSIZE==queue->front) {return 1;}queue->data[queue->rear++] = a;return 0;
}int deleteFloat(QueueFloat* queue) {if (queue->front == queue->rear) {return 1;}queue->front++;return 0;
}int getSizeFloat(QueueFloat* queue) {int res = queue->rear - queue->front;if (res < 0) {res += MAXSIZE;}return res;
}void queueInitInt(QueueInt* queue) {queue->front = 0;queue->rear = 0;for (int i = 0; i < MAXSIZE; i++)queue->data[i] = 0;
}int insertInt(QueueInt* queue, int a) {if ((queue->rear + 1) % MAXSIZE == queue->front) {return 1;}queue->data[queue->rear++] = a;queue->rear %= MAXSIZE;return 0;
}int deleteInt(QueueInt* queue) {if (queue->front == queue->rear) {return 1;}queue->front++;queue->front %= MAXSIZE;return 0;
}int getSizeInt(QueueInt* queue) {int res = queue->rear - queue->front;if (res < 0) {res += MAXSIZE;}return res;
}

然后是坐标系的绘制,以及绘图代码

drawCoordinateSystem.h

#pragma once
#ifndef DrawCoordinateSystem
#define DrawCoordinateSystem
#include "queue.h"
/*
这是绘制坐标系的函数
1、轴
2、刻度
3、原点
4、网格
5、图幅
6、箭头
*///轴结构体
struct Axis {int xlow, xhigh;int ylow, yhigh;int centerx,centery;float ax, ay;   //压缩int color;
};//刻度结构体
struct Scale {int openflag;  //是否开启int scalex;     //刻度大小int scaley;int color;
};
struct Grid{int openflag;int color;
};typedef struct coordinatesystem {struct Axis axis;struct Scale scale;int zerox, zeroy;  //坐标系原点struct Grid grid;int length, width;  //图幅长宽int color;     //背景颜色int borderx, brodery; //边界空出的范围
}CoordinateSystem;void coordinateSystemInit(CoordinateSystem* cs);void createCS(CoordinateSystem* cs);void plotInt(CoordinateSystem* cs, int* data, int len, int color);void plotFloat(CoordinateSystem* cs, float* data, int len, int color);void dynamicPlotInt(CoordinateSystem* cs,QueueInt* queue,int color);void addInt(QueueInt* queue,int a);#endif // !DrawCoordinateSystem 

drawCoordinateSystem.cpp

#include "drawCoordinateSystem.h"
#include <easyx.h>            // 引用图形库头文件
#include <Windows.h>
#include <math.h>
#include <stdio.h>
#include "queue.h"void coordinateSystemInit(CoordinateSystem* cs) {//图幅初始化cs->length = 1280;cs->width = 780;//坐标轴初始化cs->axis.xhigh = 100;cs->axis.xlow = -100;cs->axis.yhigh = 100;cs->axis.ylow = 0;cs->axis.centerx = (cs->axis.xhigh + cs->axis.xlow) / 2;cs->axis.centery = (cs->axis.yhigh + cs->axis.ylow) / 2;int len1 = cs->axis.xhigh - cs->axis.xlow;int len2 = cs->axis.yhigh - cs->axis.ylow;cs->axis.ax = cs->length*1.0 / len1;cs->axis.ay = cs->width*1.0 / len2;cs->axis.color = BLACK;//坐标原点初始化cs->zerox = 0;cs->zeroy = 50;//刻度初始化cs->scale.openflag = 1;cs->scale.scalex = 10;cs->scale.scaley = 10;cs->scale.color = BLACK;//网格初始化cs->grid.openflag = 1;cs->grid.color = BLACK;//边界空出范围cs->borderx = 10;cs->brodery = 10;cs->color = WHITE;//创建窗口HWND hwnd = initgraph(cs->length + cs->borderx, cs->width + cs->brodery, EW_SHOWCONSOLE);setrop2(R2_MASKPEN); //加一个光栅更好看
}int transX(CoordinateSystem* cs, float x) {x -= cs->axis.centerx;x *= cs->axis.ax;int k = x;if (x - k > 0.5)k++;return k;
}
int transY(CoordinateSystem* cs, float y) {y -= cs->axis.centery;y *= cs->axis.ay;int k = y;if (y - k > 0.5)k++;return k;
}void createCS(CoordinateSystem* cs) {//设置原点int avex = (cs->length + cs->borderx) / 2;int avey = (cs->width + cs->brodery) / 2;setorigin(avex, avey);//设置缩放与坐标轴方向setaspectratio(1,-1); //将y轴翻转为 向上为正//设置背景色setbkcolor(cs->color);cleardevice();//绘制坐标轴setlinecolor(cs->axis.color); //设置颜色setlinestyle(PS_SOLID,3);     //线的样式:实线,宽度line(-cs->length/2,0,cs->length/2,0);line(transX(cs,cs->zerox),cs->width/2, transX(cs, cs->zerox),-cs->width/2);//绘制箭头float angle = 15/180.0*3.14159; //箭头角度float len3 =20;float x11 = cs->zerox*1.0;float x12 = cs->zerox*1.0 + len3 * tan(angle)/cs->axis.ax;float x13 = cs->zerox*1.0 - len3 * tan(angle) / cs->axis.ax;float y11 = cs->axis.yhigh*1.0;float y12 = cs->axis.yhigh*1.0 - len3 / cs->axis.ay;float y13 = cs->axis.yhigh*1.0 - len3/cs->axis.ay;line(transX(cs,x11),cs->width/2,transX(cs, x12 ),cs->width/2-len3);line(transX(cs, x11), cs->width / 2, transX(cs, x13), cs->width / 2 - len3);float x21 = cs->axis.xhigh;float x22 = cs->axis.xhigh - len3 / cs->axis.ax;float x23 = cs->axis.xhigh - len3 / cs->axis.ax;float y21 = cs->zeroy;float y22 = cs->zeroy+len3* tan(angle) / cs->axis.ay;float y23 = cs->zeroy - len3 * tan(angle) / cs->axis.ay;line(transX(cs, x21), transY(cs, y21), transX(cs, x22), transY(cs, y22));line(transX(cs, x21), transY(cs, y21), transX(cs, x23), transY(cs, y23));// 绘制刻度if (cs->scale.openflag) {int len4 = 5;  //刻度的高度float rlen = 50 / cs->axis.ax, rwid = 30 / cs->axis.ay; //刻度值长宽int bias = 2; //刻度值离坐标轴的距离char s[10];int i = 0;setaspectratio(1, 1); //将y轴翻转为 向上为负settextcolor(cs->scale.color); //设置文字颜色setbkmode(TRANSPARENT); //背景透明while (cs->zerox - i * cs->scale.scalex > cs->axis.xlow) {setlinecolor(cs->axis.color); //设置刻度颜色setlinestyle(PS_SOLID, 3);     //线的样式:实线,宽度line(transX(cs, cs->zerox - i * cs->scale.scalex), transY(cs, cs->zeroy), transX(cs, cs->zerox - i * cs->scale.scalex), transY(cs, cs->zeroy) - len4);RECT r = { transX(cs, cs->zerox - i * cs->scale.scalex - rlen / 2), transY(cs, cs->zeroy) + bias,transX(cs, cs->zerox - i * cs->scale.scalex + rlen / 2),transY(cs, cs->zeroy + rwid) + bias };sprintf(s, "%d", cs->zerox - i * cs->scale.scalex);//       printf("%s\n", s);drawtext(s, &r, DT_CENTER | DT_TOP | DT_SINGLELINE);//绘制网格if (cs->grid.openflag&&i!=0) {setlinecolor(cs->grid.color); //设置网格颜色setlinestyle(PS_DASH, 1);     //线的样式:虚线,宽度line(transX(cs, cs->zerox - i * cs->scale.scalex), transY(cs, cs->axis.ylow), transX(cs, cs->zerox - i * cs->scale.scalex), transY(cs, cs->axis.yhigh));}i++;}i = 1;while (cs->zerox + i * cs->scale.scalex < cs->axis.xhigh) {setlinecolor(cs->axis.color); //设置刻度颜色setlinestyle(PS_SOLID, 3);     //线的样式:实线,宽度line(transX(cs, cs->zerox + i * cs->scale.scalex), transY(cs, cs->zeroy), transX(cs, cs->zerox + i * cs->scale.scalex), transY(cs, cs->zeroy) - len4);RECT r = { transX(cs, cs->zerox + i * cs->scale.scalex - rlen / 2), transY(cs, cs->zeroy) + bias,transX(cs, cs->zerox + i * cs->scale.scalex + rlen / 2),transY(cs, cs->zeroy + rwid) + bias };sprintf(s, "%d", cs->zerox + i * cs->scale.scalex);
//          printf("%s\n", s);drawtext(s, &r, DT_CENTER | DT_TOP | DT_SINGLELINE);//绘制网格if (cs->grid.openflag&&i != 0) {setlinecolor(cs->grid.color); //设置网格颜色setlinestyle(PS_DASH, 1);     //线的样式:虚线,宽度line(transX(cs, cs->zerox + i * cs->scale.scalex), transY(cs, cs->axis.ylow), transX(cs, cs->zerox + i * cs->scale.scalex), transY(cs, cs->axis.yhigh));}i++;}i = 0;while (cs->zeroy - i * cs->scale.scaley > cs->axis.ylow) {setlinecolor(cs->axis.color); //设置刻度颜色setlinestyle(PS_SOLID, 3);     //线的样式:实线,宽度line(transX(cs, cs->zerox), transY(cs, cs->zeroy + i * cs->scale.scaley), transX(cs, cs->zerox) + len4, transY(cs, cs->zeroy + i * cs->scale.scaley));RECT r = { transX(cs, cs->zerox - rlen) - bias, transY(cs,cs->zeroy + i * cs->scale.scaley - rwid / 2),transX(cs, cs->zerox) - bias, transY(cs,cs->zeroy + i * cs->scale.scaley + rwid / 2) };sprintf(s, "%d", cs->zeroy - i * cs->scale.scaley);
//          printf("%s\n", s);drawtext(s, &r, DT_RIGHT | DT_VCENTER | DT_SINGLELINE);//绘制网格if (cs->grid.openflag&&i != 0) {setlinecolor(cs->grid.color); //设置网格颜色setlinestyle(PS_DASH, 1);     //线的样式:虚线,宽度line(transX(cs, cs->axis.xlow), transY(cs, cs->zeroy + i * cs->scale.scaley), transX(cs, cs->axis.xhigh), transY(cs, cs->zeroy + i * cs->scale.scaley));}i++;}i = 1;while (cs->zeroy + i * cs->scale.scaley < cs->axis.yhigh) {setlinecolor(cs->axis.color); //设置刻度颜色setlinestyle(PS_SOLID, 3);     //线的样式:实线,宽度line(transX(cs, cs->zerox), transY(cs, cs->zeroy - i * cs->scale.scaley), transX(cs, cs->zerox) + len4, transY(cs, cs->zeroy - i * cs->scale.scaley));RECT r = { transX(cs, cs->zerox - rlen) - bias, transY(cs,cs->zeroy - i * cs->scale.scaley - rwid / 2),transX(cs, cs->zerox) - bias, transY(cs,cs->zeroy - i * cs->scale.scaley + rwid / 2) };sprintf(s, "%d", cs->zeroy + i * cs->scale.scaley);
//          printf("%s\n", s);drawtext(s, &r, DT_RIGHT | DT_VCENTER | DT_SINGLELINE);//绘制网格if (cs->grid.openflag&&i != 0) {setlinecolor(cs->grid.color); //设置网格颜色setlinestyle(PS_DASH, 1);     //线的样式:虚线,宽度line(transX(cs, cs->axis.xlow), transY(cs, cs->zeroy - i * cs->scale.scaley), transX(cs, cs->axis.xhigh), transY(cs, cs->zeroy - i * cs->scale.scaley));}i++;}}
}void setRange(CoordinateSystem*cs, int xlow, int xhigh, int ylow, int yhigh) {cs->axis.ylow = ylow;cs->axis.yhigh = yhigh;cs->axis.xlow = xlow;cs->axis.xhigh = xhigh;cs->axis.centerx = (cs->axis.xlow + cs->axis.xhigh) / 2;cs->axis.centery = (cs->axis.ylow + cs->axis.yhigh) / 2;int len1 = cs->axis.xhigh - cs->axis.xlow;int len2 = cs->axis.yhigh - cs->axis.ylow;cs->axis.ax = cs->length*1.0 / len1;cs->axis.ay = cs->width*1.0 / len2;cs->scale.scalex =(int) (100 / cs->axis.ax)/10*10;cs->scale.scaley = (int)(100 / cs->axis.ay) / 10*10;if (cs->scale.scalex <= 0)cs->scale.scalex=(int)(100 / cs->axis.ax);if (cs->scale.scaley <= 0)cs->scale.scaley=(int)(100 / cs->axis.ay);if (cs->scale.scalex <= 0)cs->scale.scalex = 1;if (cs->scale.scaley <= 0)cs->scale.scaley = 1;cs->zerox = 0;cs->zeroy = cs->axis.centery;
}//直接给一组数据,将数据绘制出来
void plotInt(CoordinateSystem* cs, int* data, int len, int color) {//找出最大最小值int min = data[0];int max = data[0];for (int i = 1; i < len; i++) {if (data[i] > max) {max = data[i];}if (data[i] < min) {min = data[i];}}int range = max - min;coordinateSystemInit(cs);setRange(cs, 0-len*0.1, len*1.1, min-range*0.1, max+range*0.1);createCS(cs);setlinecolor(color);setaspectratio(1, -1);setlinestyle(PS_SOLID, 2);for (int i = 0; i < len - 1; i++) {line(transX(cs,i + 1),transY(cs, data[i]),transX(cs, i + 2),transY(cs, data[i + 1]));}for (int i = 0; i < len; i++) {putpixel(transX(cs,i + 1),transY(cs, data[i]),color);}
}//直接给一组数据,将数据绘制出来
void plotFloat(CoordinateSystem* cs, float* data, int len, int color) {//找出最大最小值float min = data[0];float max = data[0];for (int i = 1; i < len; i++) {if (data[i] > max) {max = data[i];}if (data[i] < min) {min = data[i];}}float range = max - min;coordinateSystemInit(cs);setRange(cs, 0 - len * 0.1, len*1.1, min - range * 0.1, max + range * 0.1);createCS(cs);setlinecolor(color);setaspectratio(1, -1);setlinestyle(PS_SOLID, 2);for (int i = 0; i < len - 1; i++) {line(transX(cs, i + 1), transY(cs, data[i]), transX(cs, i + 2), transY(cs, data[i + 1]));}for (int i = 0; i < len; i++) {putpixel(transX(cs, i + 1), transY(cs, data[i]), color);}//
}void dynamicPlotInt(CoordinateSystem* cs, QueueInt* queue, int color) {int len = getSizeInt(queue);int min, max;if (len == 0) {min = 0;max = 100;}else if (len==1) {min = queue->data[queue->front] - 10;max = queue->data[queue->front] + 10;}else {int p = (queue->front+1)%MAXSIZE;min = queue->data[queue->front];max = queue->data[queue->front];while (p% MAXSIZE != queue->rear) {if (queue->data[p ]>max) {max = queue->data[p ];}if (queue->data[p ] < min) {min = queue->data[p ];}p++;p %= MAXSIZE;}}if (min == max) {min = min - 10;max = max + 10;}float range = max - min;//   coordinateSystemInit(cs);if (len <= 10) {setRange(cs, -10, 10, min - range * 0.1, max + range * 0.1);}else {setRange(cs, 0 - len * 0.1, len*1.1, min - range * 0.1, max + range * 0.1);}BeginBatchDraw();//开始批量画图createCS(cs);if (len == 0) {EndBatchDraw();return;}setlinecolor(color);setaspectratio(1, -1);setlinestyle(PS_SOLID, 2);int i = 0;int k = 0;for (int p = queue->front; (p+1)%MAXSIZE != queue->rear;p++,p%=MAXSIZE,i++) {line(transX(cs, i + 1), transY(cs,queue->data[p]), transX(cs, i + 2), transY(cs, queue->data[(p+1)%MAXSIZE]));k++;if (k == 10) {
//          FlushBatchDraw();k = 0;}}EndBatchDraw();
//  i = 0;
//  for (int p = queue->front; p%MAXSIZE != queue->rear; p++, p %= MAXSIZE, i++) {
//      putpixel(transX(cs, i + 1), transY(cs, queue->data[p]), color);
//  }
//  for (int i = 0; i < len; i++) {
//      putpixel(transX(cs, i + 1), transY(cs, data[i]), color);
//  }
}void addInt(QueueInt* queue, int a) {if (insertInt(queue, a)) {deleteInt(queue);insertInt(queue, a);}
}

最后是绘制代码

绘制静态数据代码:

#include <math.h>
#include <windows.h>
#include <stdio.h>
#include <easyx.h>            // 引用图形库头文件
#include <conio.h>
#include "drawCoordinateSystem.h"
#include "queue.h"int main() {CoordinateSystem cs;coordinateSystemInit(&cs);float a[1001];int j = 0;for (float i = 0; i < 2 * 3.14; i += 3.14 / 500) {a[j++] = 10 * sin(i);}plotFloat(&cs, a, 1000, RED);getchar();return 0;
}

绘制动态数据代码:

#include <math.h>
#include <windows.h>
#include <process.h>
#include <stdio.h>
#include <easyx.h>            // 引用图形库头文件
#include <conio.h>
#include "drawCoordinateSystem.h"
#include "queue.h"void fun(void* p) {CoordinateSystem cs;coordinateSystemInit(&cs);while (1) {dynamicPlotInt(&cs,&queue,RED);Sleep(20);}_endthread();
}int main(){queueInitInt(&queue);_beginthread(fun, 0, NULL);float t = 0;getchar();while (1) {if (int(t+1) % 500 == 0) {addInt(&queue, 100 * sin(t / 100));}elseaddInt(&queue,100*sin(t/100));Sleep(10);t++;printf("%d\n",getSizeInt(&queue));}return 0;
}

这里动态绘制只写了绘制int类型的代码,float类型的其实也基本一样,复制一下就好,如果各位有需求,可以自己动手或评论或者私信,我来加上。

基于easyX和vs使用c++绘制坐标系以及实时显示相关推荐

  1. 基于STM32的脉搏心率检测仪(OLED可以实时显示脉冲波形)

    -设计完整,功能可全部实现,有完整报告文档说明.程序以及pcb文件- 可作为:课程设计,STM32实践学习,电子制作等 **禁止转载,以及用于其他商业用途.*** B站对应讲解心率传感器项目链接 设计 ...

  2. 基于EasyX的五子棋游戏

    基于EasyX的五子棋游戏 一.预备知识 二.游戏逻辑 1.五子棋元素 2.五子棋规则 三.游戏设计 1.地图设计 2.点击设计 3.结束设计 4.整体设计 一.预备知识 1.使用EasyX必须要知道 ...

  3. 用easyx画电子钟_基于EasyX图形库的多线程绘图应用

    本文<基于EasyX图形库的多线程绘图应用>由手机部落整理,仅供参考.如果觉得很不错,欢迎点评和分享-感谢你的阅读与支持! 张煜昕 摘要:EasyX 是C++语言进行图形化编程和游戏编程的 ...

  4. 基于EasyX的贪吃蛇游戏

    基于EasyX的贪吃蛇游戏 一.预备知识 二.游戏逻辑 1.贪吃蛇元素 2.贪吃蛇规则 三.游戏设计 1.地图设计 2.移动设计 3.速度设计 4.整体设计 一.预备知识 1.使用EasyX必须要知道 ...

  5. 基于easyx库的GUI扫雷项目

    基于easyx库的GUI扫雷项目 文章目录 基于easyx库的GUI扫雷项目 0.观前提醒 1.扫雷游戏项目效果展示 2.扫雷游戏项目基本信息 3.扫雷游戏项目设计思路 4.扫雷游戏实现原理 4.1 ...

  6. 基于EasyX的扫雷游戏

    基于EasyX的扫雷游戏 一.预备知识 二.游戏逻辑 1.扫雷元素 2.扫雷规则 三.游戏设计 1.地图设计 2.点击设计 3.结束设计 4.整体设计 一.预备知识 1.使用EasyX必须要知道的一些 ...

  7. C/C++基于easyX库实现三星环绕小项目(C/C++)

    1,项目描述 功能1:使用图形化的方式描述地球围绕着太阳转动,月球围绕着地球转动 功能2:在转动的过程中当用户按下1,2,3,4,5,6,7时它可以变换出7种不同的颜色,当用户按下8时它可以变换从1- ...

  8. 使用VC++绘制坐标系

    首先打开VC++,新建一个单文档应用程序: 按下图,为View类添加消息处理函数,变更单文档窗体背景色为黑色: 在菜单中添加如下菜单: 为菜单添加消息处理函数:添加在View类中: 在View类头文件 ...

  9. 【精选】基于EasyX的贪吃蛇小游戏

    文章目录 前言 一.项目环境 1.Visual Studio 2019 2.EasyX 20200902 二.运行效果展示 0.加载游戏 1.主菜单 2.游戏设置 3.游戏说明 4.生存模式 5.无尽 ...

最新文章

  1. cordova环境部署
  2. mybatisplus 结果_springboot整合mybatisPlus 乐观锁的实现
  3. js中加入php读取文件名,js获取文件里面的所有文件名(实例)
  4. BAPI FOR MD61,MD62,MD63
  5. BZOJ 2754 [SCOI2012]喵星球上的点名 (AC自动机、树状数组)
  6. 中查询一个文件夹下文件数量_如何在 Bash 中使用循环 | Linux 中国
  7. MySQL数据库之互联网常用架构方案(全)
  8. Eclipse开发工具组合键介绍
  9. 鼠标悬停在图片上出现蒙层的方法
  10. 几大经典算法c语言cnds,浮点数据有损压缩算法 附完整C代码
  11. [ArcPy百科]第一节:何为arcpy
  12. 微软在上海有哪些办公地点?上下班来回三小时?不止闵大荒!
  13. 阻焊机器人系统_可处理最大PCB面板干膜和阻焊激光直接成像的X3000(LDI)系统
  14. 广义相对论-学习记录1-第一章-历史回顾
  15. android 平板z97,高清配置 翰智Z97-W通话版平板评测
  16. 计算机的操作系统的功能有哪些,操作系统的主要功能是主要有哪些类型
  17. java怎么把数据传入数组_怎么把数据放入数组中
  18. 全球人造丝卫生棉条行业调研及趋势分析报告
  19. 【Python-数据结构】——线性结构
  20. Freemarker静态页面使用方法详解+指令

热门文章

  1. 合同诈骗与普通诈骗有什么区别
  2. 海思3518EV300 liteos sdk编译
  3. Linux 驱动USB键盘驱动入门demo
  4. 利用aircrack-ng破解WIFI密码
  5. 5.4节呈献:HP-Socket v5.3.1 发布 — 支持 Android NDK
  6. 云计算如何智慧升级我们的生活?
  7. 计算机窗口移动不了怎么办,电脑鼠标拖不动文件怎么办 电脑鼠标拖动不灵敏如何解决...
  8. 职场PPT达人装酷的13条秘诀
  9. VIRTUALBOX 虚拟机安装 OS X 10.9 MAVERICKS
  10. WIN7+MySQL+ActivePerl+bugzilla+Apache安装配置