鱼C论坛

 找回密码
 立即注册
查看: 2384|回复: 4

[已解决]Winsock 在visual studio2010中运用GDI画图

[复制链接]
发表于 2018-7-13 08:40:15 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
程序怎么改,求问
  1. #include <winsock2.h>
  2. #include <windows.h>//引入wingdi.h
  3. #include <stdio.h>
  4. #include <math.h>
  5. #include <time.h>
  6. #include <conio.h>
  7. #pragma  comment(lib,"ws2_32.lib")
  8. #define PI 3.1416

  9. #define ORIGINX 0        //曲线起点X坐标
  10. #define ORIGINY 200        //曲线起点Y坐标
  11. #define LENGTHX 800        //X坐标轴长度
  12. #define LENGTHY 300        //Y坐标轴长度
  13. #define XDATALEN 100//X坐标数据量

  14. HDC hdc = 0;//控制台绘图设备描述句柄 HDC
  15. HPEN hPen, hPen2;//画笔变量
  16. HPEN hPenOld;
  17. TCHAR title[256];//控制台程序标题
  18. int times = 0;//绘制次数变量
  19. double datay[XDATALEN];//曲线纵坐标数组

  20. //毫秒延时函数
  21. void delay_ms(INT64 Ms)
  22. {
  23.         LARGE_INTEGER CurrTicks, TicksCount;

  24.         QueryPerformanceFrequency(&TicksCount);
  25.         QueryPerformanceCounter(&CurrTicks);

  26.         TicksCount.QuadPart = TicksCount.QuadPart * Ms / (INT64)1000;
  27.         TicksCount.QuadPart += CurrTicks.QuadPart;

  28.         while (CurrTicks.QuadPart<TicksCount.QuadPart)
  29.                 QueryPerformanceCounter(&CurrTicks);
  30. }

  31. //绘制清屏矩形
  32. void ClearWind(HDC hdc)
  33. {
  34.         HPEN hPen;
  35.         HBRUSH hBrush;
  36.         hBrush = CreateSolidBrush(RGB(0, 0, 0));
  37.         hPen = CreatePen(PS_SOLID, 0, RGB(0, 0, 0));
  38.         SelectObject(hdc, hBrush);
  39.         SelectObject(hdc, hPen);
  40.         //绘制黑色矩形,范围可根据需要自行更改
  41.         Rectangle(hdc, ORIGINX, 0, ORIGINX + LENGTHX + 1, ORIGINY + LENGTHY + 1);
  42. }

  43. int main(int argc, char* argv[])
  44. {
  45.         //获取控制台标题
  46.         GetConsoleTitle(title, 256);
  47.         //先通过FindWindow函数借助标题获取窗口句柄HWND,之后再利用GetDC函数借助HWND获取HDC
  48.         hdc = GetDC(FindWindow(0, title));
  49.         hPen = CreatePen(PS_SOLID, 3, RGB(255, 0, 0));//设置曲线画笔,红色
  50.         hPen2 = CreatePen(PS_SOLID, 3, RGB(0, 0, 255));//设置X轴画笔,蓝色
  51.         hPenOld = (HPEN)SelectObject(hdc, hPen);

  52.         char sendDataGain[15] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x01 ,0x10, 0x00, 0x38, 0x00, 0x01, 0x02, 0x00, 0x00 };//1倍增益
  53.     char sendDataAD[12] = { 0x00,0x00,0x00,0x00,0x00,0x06,0x01,0x03,0x01,0x00,0x00,0x01 };//AD1查询命令
  54.     char sendDataRange[15] = { 0x00,0x00,0x00,0x00,0x00,0x09,0x01,0x10,0x00,0x0a,0x00,0x01,0x02,0x00,0x01 };//-5~+5V和跳线对应
  55.     char recData[255];//TCP接收缓冲区
  56.     UINT8 VH = 0, VL = 0;//16位二进制电压采集数据原码高8位、低8位
  57.     float V = 0.0;//转化后电压值
  58.     int ret;//接收数据长度
  59.     WORD sockVersion = MAKEWORD(2, 2);
  60.     WSADATA data;

  61.         if (WSAStartup(sockVersion, &data) != 0)//启动并检查可用Winsock API实现库
  62.         {
  63.                 printf("无可用Winsock API实现库");
  64.                 return 0;
  65.         }

  66.         SOCKET sclient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建socket套接字
  67.         if (sclient == INVALID_SOCKET)
  68.         {
  69.                 printf("socket无效!");
  70.                 return 0;
  71.         }

  72.         sockaddr_in serAddr;
  73.         serAddr.sin_family = AF_INET;
  74.         serAddr.sin_port = htons(8000);//设置通讯端口号
  75.         serAddr.sin_addr.S_un.S_addr = inet_addr("192.168.1.126");//设置目标IP地址

  76.         if (connect(sclient, (sockaddr *)&serAddr, sizeof(serAddr)) == SOCKET_ERROR)//建立TCP连接
  77.         {
  78.                 printf("连接错误!");
  79.                 closesocket(sclient);
  80.                 return 0;
  81.         }
  82.         else
  83.         {
  84.                 printf("连接成功!\n");
  85.         }

  86.         //设置AD增益1倍
  87.         send(sclient, sendDataGain, 15, 0);
  88.         if (recv(sclient, recData, 255, 0) != 0)
  89.         {
  90.                 printf("设置AD增益1倍\n");
  91.         }

  92.         //设置模拟量采集范围-5~+5V
  93.         send(sclient, sendDataRange, 15, 0);
  94.         if (recv(sclient, recData, 255, 0) != 0)
  95.         {
  96.                 printf("设置模拟量采集范围-5~5V\n");
  97.         }

  98.         while (1)
  99.         {
  100.                 //发送AD1读取命令
  101.                 send(sclient, sendDataAD, 12, 0);
  102.                 //接收下位机应答数据
  103.                 ret = recv(sclient, recData, 255, 0);
  104.                 if(ret>0)
  105.                 {
  106.                         for (int i= 0;i<2000;i++)
  107.                         {
  108.                         VH = (UINT8)recData[9];//读取16位AD数据原码高8位
  109.                         VL = (UINT8)recData[10];//读取16位AD数据原码低8位
  110.                         V = 5.0*(float)(VH << 8 | VL) / 32767.0 - 5.0;//将AD数据原码转化为工程单位
  111.                   
  112.                                 if (i<=99)
  113.                                  datay[i]=V;
  114.                                 else
  115.                                         for(int K=0 ;K<99;K++)
  116.                                         datay[K]=datay[K+1];
  117.                                     datay[99]=V;
  118.                         }
  119.                 }
  120.                 ClearWind(hdc);//清屏
  121.                 hPenOld = (HPEN)SelectObject(hdc, hPen);//选择画笔
  122.                 MoveToEx(hdc, ORIGINX, ORIGINY, NULL);//移动到起点


  123.                 for (int m = 0; m < XDATALEN; m++)
  124.                 {
  125.                         //绘制线段,连接前一个点与下一个点,第二个参数为目标点x坐标,第三个参数为y坐标
  126.                         LineTo(hdc, LENGTHX * m / XDATALEN + ORIGINX,datay[m] + ORIGINY);
  127.                 }
  128.                 //创建绘制x轴的pen并将其选入设备上下文
  129.                 hPenOld = (HPEN)SelectObject(hdc, hPen2);//选择画笔
  130.                 MoveToEx(hdc, ORIGINX, ORIGINY, NULL);//移动到起点
  131.                 LineTo(hdc, ORIGINX + LENGTHX, ORIGINY);//绘制X轴直线
  132.                 times++;
  133.                 delay_ms(100);//延时100ms

  134.                 if (kbhit())//检查是否有按键按下
  135.                 {
  136.                         if (_getch() == 0x1b)//若按下ESC键跳出循环
  137.                         {
  138.                                 break;
  139.                         }
  140.                 }
  141.         }

  142.         DeleteObject(hPen);//删除画笔
  143.         DeleteObject(hPen2);//删除画笔
  144.         return 0;
  145. }
复制代码
最佳答案
2018-7-13 09:26:34
老大,怎么也得把报错信息发一下吧。。。还有现象什么的。。。都没服务端程序也跑不起来,肉眼也没发现啥毛病。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-7-13 08:40:52 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-7-13 08:42:57 | 显示全部楼层
第128--134可能有问题,求大佬改一下
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-7-13 09:26:34 | 显示全部楼层    本楼为最佳答案   
老大,怎么也得把报错信息发一下吧。。。还有现象什么的。。。都没服务端程序也跑不起来,肉眼也没发现啥毛病。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-6-5 20:33:15 | 显示全部楼层
这什么鬼,我当时竟然学了这么难的东西了吗,大学教授太残忍了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-26 02:54

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表