VC实现串口通信例程 作者:阮帮秋

VC++ 专栏收录该内容
43 篇文章 0 订阅
VC实现串口通信例程 作者:阮帮秋 发布时间:2001/04/19
 
文章摘要:
  WIN95界面下的VC++串口通讯程序在WIN32下是不建议对端口进行操作的,在WIN32中所有的设备都被看成是文件,串行口也不例外也是作为文件来进行处理的。
  关键词
 串行口,DWORD,缓冲区
       

正文: 


VC实现串口通信例程 


  WIN95界面下的VC++串口通讯程序在WIN32下是不建议对端口进行操作的,在WIN32中所有的设备都被看成是文件,串行口也不例外也是作为文件来进行处理的。这是我的一份关于串口编程的读书笔记,对于使 用VC进行编程的同行应该有一定的帮助。

1.打开串口:

  在Window 95下串行口作为文件处理,使用文件操作对串行口进行处理。使用CreateFile()打开串口,CreateFile()将返回串口的句柄。
  HANDLE CreateFile(
  LPCTSTR lpFileName, // pointer to name of the file
  DWORD dwDesiredAccess, // access (read-write) mode
  DWORD dwShareMode, // share mode
  LPSECURITY_ATTRIBUTES lpSecurityAttributes, // pointer to security attributes
  DWORD dwCreationDistribution, // how to create
  DWORD dwFlagsAndAttributes, // file attributes
  HANDLE hTemplateFile // handle to file with attributes to copy
  );
  lpFileName: 指明串口制备,例:COM1,COM2
  dwDesiredAccess: 指明串口存取方式,例:GENERIC_READ|GENERIC_WRITE
  dwShareMode: 指明串口共享方式
  lpSecurityAttributes: 指明串口的安全属性结构,NULL为缺省安全属性
  dwCreateionDistribution: 必须为OPEN_EXISTIN
  dwFlagAndAttributes: 对串口唯一有意义的是FILE_FLAG_OVERLAPPED
  hTemplateFile: 必须为NULL

2.关闭串口:

  CloseHandle(hCommDev);

3.设置缓冲区长度:

  BOOL SetupComm(
  HANDLE hFile, // handle of communications device
  DWORD dwInQueue, // size of input buffer
  DWORD dwOutQueue // size of output buffer
  );

4.COMMPROP结构:

  可使用GetCommProperties()取得COMMPROP结构,COMMPROP结构中记载了系统支持的各项设置。
  typedef struct _COMMPROP { // cmmp
  WORD wPacketLength; // packet size, in bytes
  WORD wPacketVersion; // packet version
  DWORD dwServiceMask; // services implemented
  DWORD dwReserved1; // reserved
  DWORD dwMaxTxQueue; // max Tx bufsize, in bytes
  DWORD dwMaxRxQueue; // max Rx bufsize, in bytes
  DWORD dwMaxBaud; // max baud rate, in bps
  DWORD dwProvSubType; // specific provider type
  DWORD dwProvCapabilities; // capabilities supported
  DWORD dwSettableParams; // changeable parameters
  DWORD dwSettableBaud; // allowable baud rates
  WORD wSettableData; // allowable byte sizes
  WORD wSettableStopParity; // stop bits/parity allowed
  DWORD dwCurrentTxQueue; // Tx buffer size, in bytes
  DWORD dwCurrentRxQueue; // Rx buffer size, in bytes
  DWORD dwProvSpec1; // provider-specific data
  DWORD dwProvSpec2; // provider-specific data
  WCHAR wcProvChar[1]; // provider-specific data
  } COMMPROP;
  dwMaxBaud:
  BAUD_075 75 bps
  BAUD_110 110 bps
  BAUD_134_5 134.5 bps
  BAUD_150 150 bps
  BAUD_300 300 bps
  BAUD_600 600 bps
  BAUD_1200 1200 bps
  BAUD_1800 1800 bps
  BAUD_2400 2400 bps
  BAUD_4800 4800 bps
  BAUD_7200 7200 bps
  BAUD_9600 9600 bps
  BAUD_14400 14400 bps
  BAUD_19200 19200 bps
  BAUD_38400 38400 bps
  BAUD_56K 56K bps
  BAUD_57600 57600 bps
  BAUD_115200 115200 bps
  BAUD_128K 128K bps
  BAUD_USER Programmable baud rates available
  dwProvSubType:
  PST_FAX 传真设备
  PST_LAT LAT协议
  PST_MODEM 调制解调器设备
  PST_NETWORK_BRIDGE 未指定的网桥
  PST_PARALLELPORT 并口
  PST_RS232 RS-232口
  PST_RS422 RS-422口
  PST_RS423 RS-432口
  PST_RS449 RS-449口
  PST_SCANNER 扫描仪设备
  PST_TCPIP_TELNET TCP/IP Telnet协议
  PST_UNSPECIFIED 未指定
  PST_X25 X.25标准
  dwProvCapabilities
  PCF_16BITMODE 支持特殊的16位模式
  PCF_DTRDSR 支持DTR(数据终端就绪)/DSR(数据设备就绪)
  PCF_INTTIMEOUTS 支持区间超时
  PCF_PARITY_CHECK 支持奇偶校验
  PCF_RLSD 支持RLSD(接收线信号检测)
  PCF_RTSCTS 支持RTS(请求发送)/CTS(清除发送)
  PCF_SETXCHAR 支持可设置的XON/XOFF
  PCF_SPECIALCHARS 支持特殊字符
  PCF_TOTALTIMEOUTS 支持总(占用时间)超时
  PCF_XONXOFF 支持XON/XOFF流控制
  标准RS-232和WINDOW支持除PCF_16BITMODE和PCF_SPECIALCHAR外的所有功能
  dwSettableParams
  SP_BAUD 可配置波特率
  SP_DATABITS 可配置数据位个数
  SP_HANDSHAKING 可配置握手(流控制)
  SP_PARITY 可配置奇偶校验模式
  SP_PARITY_CHECK 可配置奇偶校验允许/禁止
  SP_RLSD 可配置RLSD(接收信号检测)
  SP_STOPBITS 可配置停止位个数
  标准RS-232和WINDOW支持以上所有功能
  wSettableData
  DATABITS_5 5个数据位
  DATABITS_6 6个数据位
  DATABITS_7 7个数据位
  DATABITS_8 8个数据位
  DATABITS_16 16个数据位
  DATABITS_16X 通过串行硬件线路的特殊宽度路径
  WINDOWS 95支持16的所有设置

5.DCB结构:

  typedef struct _DCB {// dcb
  DWORD DCBlength; // sizeof(DCB)
  DWORD BaudRate; // current baud rate
  指定当前的波特率
  DWORD fBinary: 1; // binary mode, no EOF check
  指定是否允许二进制模式,
  WINDOWS 95中必须为TRUE
  DWORD fParity: 1; // enable parity checking
  指定奇偶校验是否允许
  DWORD fOutxCtsFlow:1; // CTS output flow control
  指定CTS是否用于检测发送控制。
  当为TRUE是CTS为OFF,发送将被挂起。
  DWORD fOutxDsrFlow:1; // DSR output flow control
  指定CTS是否用于检测发送控制。
  当为TRUE是CTS为OFF,发送将被挂起。
  DWORD fDtrControl:2; // DTR flow control type
  DTR_CONTROL_DISABLE值将DTR置为OFF, DTR_CONTROL_ENABLE值将DTR置为ON, DTR_CONTROL_HANDSHAKE允许DTR"握手",DWORD fDsrSensitivity:1; // DSR sensitivity 当该值为TRUE时DSR为OFF时接收的字节被忽略
  DWORD fTXContinueOnXoff:1; // XOFF continues Tx
  指定当接收缓冲区已满,并且驱动程序已经发
  送出XoffChar字符时发送是否停止。
  TRUE时,在接收缓冲区接收到缓冲区已满的字节XoffLim且驱动程序已经发送出XoffChar字符中止接收字节之后,发送继续进行。
  FALSE时,在接收缓冲区接收到代表缓冲区已空的字节XonChar且驱动程序已经发送出恢复发送的XonChar之后,发送继续进行。
  DWORD fOutX: 1; // XON/XOFF out flow control
  TRUE时,接收到XoffChar之后便停止发送
  接收到XonChar之后将重新开始
  DWORD fInX: 1; // XON/XOFF in flow control
  TRUE时,接收缓冲区接收到代表缓冲区满的XoffLim之后,XoffChar发送出去
  接收缓冲区接收到代表缓冲区空的XonLim之后,XonChar发送出去
  DWORD fErrorChar: 1; // enable error replacement
  该值为TRUE且fParity为TRUE时,用ErrorChar 成员指定的字符代替奇偶校验错误的接收字符
  DWORD fNull: 1; // enable null stripping
  TRUE时,接收时去掉空(0值)字节
  DWORD fRtsControl:2; // RTS flow control
  RTS_CONTROL_DISABLE时,RTS置为OFF
  RTS_CONTROL_ENABLE时, RTS置为ON
  RTS_CONTROL_HANDSHAKE时,
  当接收缓冲区小于半满时RTS为ON
  当接收缓冲区超过四分之三满时RTS为OFF
  RTS_CONTROL_TOGGLE时,
  当接收缓冲区仍有剩余字节时RTS为ON ,否则缺省为OFF
  DWORD fAbortOnError:1; // abort reads/writes on error
  TRUE时,有错误发生时中止读和写操作
  DWORD fDummy2:17; // reserved
  未使用
  WORD wReserved; // not currently used
  未使用,必须为0
  WORD XonLim; // transmit XON threshold
  指定在XON字符发送这前接收缓冲区中可允许的最小字节数
  WORD XoffLim; // transmit XOFF threshold
  指定在XOFF字符发送这前接收缓冲区中可允许的最小字节数
  BYTE ByteSize; // number of bits/byte, 4-8
  指定端口当前使用的数据位
  BYTE Parity; // 0-4=no,odd,even,mark,space
  指定端口当前使用的奇偶校验方法,可能为:
  EVENPARITY,MARKPARITY,NOPARITY,ODDPARITY
  BYTE StopBits; // 0,1,2 = 1, 1.5, 2
  指定端口当前使用的停止位数,可能为:
  ONESTOPBIT,ONE5STOPBITS,TWOSTOPBITS
  char XonChar; // Tx and Rx XON character
  指定用于发送和接收字符XON的值
  char XoffChar; // Tx and Rx XOFF character
  指定用于发送和接收字符XOFF值
  char ErrorChar; // error replacement character
  本字符用来代替接收到的奇偶校验发生错误时的值
  char EofChar; // end of input character
  当没有使用二进制模式时,本字符可用来指示数据的结束
  char EvtChar; // received event character
  当接收到此字符时,会产生一个事件
  WORD wReserved1; // reserved; do not use 未使用
  } DCB;

6.改变端口设置

  使用如下的两个方法
  BOOL GetCommState(hComm,&dcb);
  BOOL SetCommState(hComm,&dcb);

7.改变普通设置

  BuildCommDCB(szSettings,&DCB);
  szSettings的格式:baud parity data stop
  例: "baud=96 parity=n data=8 stop=1"
  简写:"96,N,8,1"
  szSettings 的有效值
  baud:
  11 or 110 = 110 bps
  15 or 150 = 150 bps
  30 or 300 = 300 bps
  60 or 600 = 600 bps
  12 or 1200 = 1200 bps
  24 or 2400 = 2400 bps
  48 or 4800 = 4800 bps
  96 or 9600 = 9600 bps
  19 or 19200= 19200bps
  parity:
  n=none
  e=even
  o=odd
  m=mark
  s=space
  data:
  5,6,7,8
  StopBit
  1,1.5,2

8.COMMCONFIG结构:

  typedef struct _COMM_CONFIG {
  DWORD dwSize;
  WORD wVersion;
  WORD wReserved;
  DCB dcb;
  DWORD dwProviderSubType;
  DWORD dwProviderOffset;
  DWORD dwProviderSize;
  WCHAR wcProviderData[1];
  } COMMCONFIG, *LPCOMMCONFIG;
  可方便的使用BOOL CommConfigDialog(
  LPTSTR lpszName,
  HWND hWnd,
  LPCOMMCONFIG lpCC);
  来设置串行口。

9.超时设置:

  可通过COMMTIMEOUTS结构设置超时,
  typedef struct _COMMTIMEOUTS {
  DWORD ReadIntervalTimeout;
  DWORD ReadTotalTimeoutMultiplier;
  DWORD ReadTotalTimeoutConstant;
  DWORD WriteTotalTimeoutMultiplier;
  DWORD WriteTotalTimeoutConstant;
  } COMMTIMEOUTS,*LPCOMMTIMEOUTS;
  区间超时:(仅对从端口中读取数据有用)它指定在读取两个字符之间要经历的时间
  总超时: 当读或写特定的字节数需要的总时间超过某一阈值时,超时触发.
  超时公式:
  ReadTotalTimeout = (ReadTotalTimeoutMultiplier * bytes_to_read)
  + ReadToTaltimeoutConstant
  WriteTotalTimeout = (WriteTotalTimeoutMuliplier * bytes_to_write)
  + WritetoTotalTimeoutConstant
  NOTE:在设置超时时参数0为无限等待,既无超时
  参数MAXDWORD为立即返回
  超时设置:
  GetCommTimeouts(hComm,&timeouts);
  SetCommTimeouts(hComm,&timeouts);

10.查询方式读写数据

  例程:
  COMMTIMEOUTS to;
  DWORD ReadThread(LPDWORD lpdwParam)
  {
  BYTE inbuff[100];
  DWORD nBytesRead;
  if(!(cp.dwProvCapabilities&PCF_INTTIMEOUTS))
  return 1L;
  memset(&to,0,sizeof(to));
  to.ReadIntervalTimeout = MAXDWORD;
  SetCommTimeouts(hComm,&to);
  while(bReading)
  {
  if(!ReadFile(hComm,inbuff,100,&nBytesRead,NULL))
  locProcessCommError(GetLastError());
  else
  if(nBytesRead)
  locProcessBytes(inbuff,nBytesRead);
  }
  PurgeComm(hComm,PURGE_RXCLEAR);
  return 0L;
  }
  NOTE:
  PurgeComm()是一个清除函数,它可以中止任何未决的后台读或写,并且可以冲掉I/O缓冲区.
  BOOL PurgeComm(HANDLE hFile,DWORD dwFlags);
  dwFlages的有效值:
  PURGE_TXABORT: 中止后台写操作
  PRUGE_RXABORT: 中止后台读操作
  PRUGE_TXCLEAR: 清除发送缓冲区
  PRUGE_RXCLEAR: 清除接收缓冲区
  技巧:
  可通过ClearCommError()来确定接收缓区中处于等待的字节数。
  BOOL ClearCommError(
  HANDLE hFile, // handle to communications device
  LPDWORD lpErrors, // pointer to variable to receive error codes
  LPCOMSTAT lpStat // pointer to buffer for communications status
  );
  ClearCommError()将返回一个COMSTAT结构:
  typedef struct _COMSTAT { // cst
  DWORD fCtsHold : 1; // Tx waiting for CTS signal
  DWORD fDsrHold : 1; // Tx waiting for DSR signal
  DWORD fRlsdHold : 1; // Tx waiting for RLSD signal
  DWORD fXoffHold : 1; // Tx waiting, XOFF char rec`d
  DWORD fXoffSent : 1; // Tx waiting, XOFF char sent
  DWORD fEof : 1; // EOF character sent
  DWORD fTxim : 1; // character waiting for Tx
  DWORD fReserved : 25; // reserved
  DWORD cbInQue; // bytes in input buffer
  DWORD cbOutQue; // bytes in output buffer
  } COMSTAT, *LPCOMSTAT;
  其中的cbInQue和cbOutQue中即为缓冲区字节。

11.同步I/O读写数据

  COMMTIOMOUTS to;
  DWORD ReadThread(LPDWORD lpdwParam)
  {
  BYTE inbuff[100];
  DWORD nByteRead,dwErrorMask,nToRead;
  COMSTAT comstat;
  if(!cp.dwProvCapabilities&PCF_TOTALTIMEOUTS)
  return 1L;
  memset(&to,0,sizeof(to));
  to.ReadTotalTimeoutMultiplier = 5;
  to.ReadTotalTimeoutConstant = 50;
  SetCommTimeouts(hComm,&to);
  while(bReading)
  {
  ClearCommError(hComm,&dwErrorMask,&comstat);
  if(dwErrorMask)
  locProcessCommError(dwErrorMask);
  if(comstat.cbInQue >100)
  nToRead = 100;
  else
  nToRead = comstat.cbInQue;
  if(nToRead == 0)
  continue;
  if(!ReadFile(hComm,inbuff,nToRead,&nBytesRead,NULL))
  locProcessCommError(GetLastError());
  else
  if(nBytesRead)
  locProcessBytes(inbuff,nBytesRead);
  }
  return 0L;
  }

12.异步I/O读写数据

  当CreateFile()中的fdwAttrsAndFlags参数为FILE_FLAG_OVERLAPPEN时, 端口是为异步I/O打开的,此时可以在ReadFile的最后一个参数中指定一个OVERLAPPED结构,使数据的读操作在后台进行。WINDOWS 95包括了异步I/O的许多变种。
  typedef struct _OVERLAPPED {
  DWORD Internal;
  DWORD InternalHigh;
  DWORD Offset;
  DWORD OffsetHigh;
  HANDLE hEvent;
  } OVERLAPPED;
  对于串行口仅hEvent成员有效,其于成员必须为0。
  例程:
  COMMTIMEOUTS to;
  ...
  DWORD ReadThread((LPDWORD lpdwParam)
  {
  BYTE inbuff[100];
  DWORD nRytesRead,endtime,lrc;
  static OVERLAPPED o;
  if(!cp.dwProvCapabilities & PCF_TOTALTIMEOUTS)
  return 1L;
  memset(&to,0,sizeof(to));
  to.ReadTotalTimeoutMultiplier = 5;
  to.ReadTotalTimeoutConstant = 1000;
  SetCommTimeouts(hComm,&to);
  o.hEvent = CreateEvent(NULL,TRUE,FALSE,NULL);
  while(bReading)
  {
  if(!ReadFile(hComm,inbuff,10,&nBytesRead,&o))
  {
  nBytesRead = 0;
  if(lrc=GetLastError() == ERROR_IO_PENDING)
  {
  endtime = GetTickCount() + 1000;
  while(!GetOverlappedResult(hComm,&o,&nBytesRead,FALSE))
  if(GetTickCount() > endtime) break;
  }
  if(nBytesRead) locProcessBytes(inbuff,nBytesRead);
  }
  else
  {
  if(nBytesRead) locProcessBytes(inbuff,nBytesRead);
  ResetEvent(o.hEvent);
  }
  }
  PurgeComm(hComm,PURGE_RXCLEAR);
  return 0L;
  }
  这一例程是对一开始读缓冲区就读到所需的字节时的处理:
  while(bReading)
  {
  if(!ReadFile(hComm,inbuff,10,&nBytesRead,&o))
  {
  if((lrc=GetLastError()) ==ERROR_IO_PENDING)
  {
  if(GetOverlappedResult(hComm,&o,&nBytesRead,TRUE))
  {
  if(nBytesRead)
  locProcessBytesa(inbuff,nBytesRead);
  }
  else
  locProcessCommError(GetLastError());
  }
  else
  locProcessCommError(GetLastError));
  }
  else
  if(nBytesRead) locProcessBytes(inbuff,nBytesRead);
  ResetEvent(o.hEvent);
  }

13.事件驱I/O读写:

  GetCommMask(hComm,&dwMask)
  Windows 95报告给应用程序的事件由此方法返回。
  SetCommMasl(hComm,&dwMask)
  添加或修改Windows 95所报告的事件列表。
  事件掩码如下:
  EV_BREAK 检测到输入为止
  EV_CTS CTS(清除发送)信号改变状态
  EV_DSR DSR(数据设置就绪)信号改变状态
  EV_ERR 发生了线路状态错误.
  线路状态错误为:
  CE_FRAME(帧错误)
  CE_OVERRUN(接收缓冲区超限)
  CE_RXPARITY(奇偶校验错误)
  EV_RING 检测到振铃
  EV_RLSD RLSD(接收线路信号检测)信号改变状态
  EV_EXCHAR 接收到一个字符,并放入输入缓冲区
  EV_RXFLAG 接收到事件字符(DCB成员的EvtChar成员),度放入输入缓冲区
  EV_TXEMPTY 输出缓冲区中最后一个字符发送出去
  在用SetCommMask指定了有用的事件后,应用程序可调用WaitCommEvent()来等待事件发生.
  BOOL WaitCommEvent(
  HANDLE hFile, // handle of communications device
  LPDWORD lpEvtMask, // address of variable for event that occurred
  LPOVERLAPPED lpOverlapped, // address of overlapped structure
  );
  此方法可以以同步或异步方式操作
  例程:
  COMMTIMEOUTS to;
  ...
  DWORD ReadTherad(LPDWORD lpdwParam)
  {
  BYTE binbuff[100];
  DWORD nBytesRead,dwEvent,dwError;
  COMSTAT cs;
  SetCommMask(hComm,EV_RXHAR);
  while(bReading)
  {
  if(WaitCommEvent(hComm,&dwEvent,NULL))
  {
  ClearCommError(hComm,&dwError,&cs);
  if((dwEvent&EV_RXCHAR)&&cs.cbInQue)
  {
  if(!ReadFile(hComm,inbuff,cs.cbInQue,&nBytesRead,NULL)
  locProcessCommError(GetLastError());
  }
  else
  {
  if(nByteRead)
  locProcessBytes(inbuff,nBytesRead);
  }
  else
  locProcessCommError(GetLastError());
  }
  PurgeComm(hComm,PURGE_RXCLEAR);
  return 0L;
  }
  NOTE: SetCommMask(hComm,0)可使WaitCommEvent()中止.
  可使用GetCommmodemStatus()方法,例程:
  if(cp.dwProvCapabilities&PCF_RTSCTS)
  {
  SetCommMask(hComm,EV_CTS);
  WaitCommEvent(hComm,&dwMask,NULL);
  if(dwMask&EV_CTS)
  {
  GetCommModemStatus(hComm,&dwStatus)
  if(dwStatus&MS_CTS_ON) /* CTS stransition OFF-ON */
  else /* CTS stransition ON-OFF */
  }
  }
  MS_CTS_ON CTS为ON
  MS_DSR_ON DSR为ON
  MS_RING_ON RING为ON
  MS_ELSD_ON RLSD为ON

14.错误

  当发生错误时应用方法ClearCommError(hComm,&dwErrorMask,&constat)得到错误掩码。
  CE_BREAK 中止条件
  CE_FRAME 帧错误
  CW_IOE 一般I/O错误,常伴有更为详细的错误标志
  CE_MODE 不支持请求的模式
  CE_OVERRUN 缓冲区超限下一个字符将丢失
  CE_RXOVER 接收缓冲区超限
  CE_RXPARITY 奇偶校验错误
  CE_TXFULL 发送缓冲区满
  CE_DNS 没有选择并行设备
  CE_PTO 并行设备发生超时
  CE_OOP 并行设备缺纸

15.控制命令

  EscapeCommFunction()可将硬件信号置ON或OFF,模拟XON或XOFF

  BOOL EscapeCommFunction(
  HANDLE hFile, // handle to communications device
  DWORD dwFunc // extended function to perform
  );
  dwFunc的有效值(可用'|'同时使用多个值)
  CLRDTR DTR置OFF
  CLRRTS RTS置OFF
  SETDTR STR置ON
  SETRTS TRS置ON
  SETXOFF 模拟XOFF字符的接收
  SETXON 模拟XON字符的接收
  SETBREAK 在发送中产生一个中止
  CLRBREAK 在发送中清除中止

作者会员名:ruan_bangqiu

 
  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

相关推荐
第1章 实例001——实现C++类的多重继承 实例002——使用虚函数实现运行时多态 实例003——操作符重载实现编译多态(复数的加法运算) 实例004——使用函数模板实现不同数据类型的极值函数 实例005——使用C++实现格式化数据的IO 实例006——实现数字金额的中文大写转换 实例007——将十进制数转换为二进制输出 实例008——产生随机数 实例009——实现排序操作 实例010——使用Windows API创建程序窗口 实例011——使用AppWizard创建基于文档视图结构MFC应用程序框架 实例012——使用AppWizard建立对话框应用程序框架 实例013——实现查找、替换字符串 实例014——根据指定字符分割字符串 实例015——格式化字符串 实例016——CString字符串的类型转换 实例017——获取当前的日期、时间并格式化输出 实例018——计算某日为星期几 实例019——计算两个时间点的时间间隔 实例020——使用CStringArray类创建和使用字符串数组 实例021——使用CPtrList类创建和使用链表 第2章 实例022——基本键盘操作——判断按键消息 实例023——在普通视图窗口中实现键盘字符的输入 实例024——创建和使用键盘插入符 实例025——使用程序模拟键盘输入 实例026——在对话框中实现键盘消息响应 实例027——向其他应用程序(记事本)中发送键盘消息 实例028——基本鼠标操作——判断鼠标消息 实例029——创建并设置鼠标光标 实例030——在对话框中定义光标的热区 实例031——创建和使用鼠标提示框 实例032——在视图窗口实现捕捉鼠标 实例033——限制鼠标的作用区域在客户窗口 实例034——使用程序模拟鼠标动作 实例035——创建和使用自定义消息 实例036——使用命令范围消息处理函数 实例037——使用定时器实时显示当前时间 实例038——使用定时器显示毫秒级的时间 第3章 实例039——创建和使用下压按钮、单选框和复选框 实例040——实现位图按钮,设定控件文本的字体 实例041——实现超链接风格的按钮 实例042——实现动画按钮 实例043——使用单行、多行编辑框输入显示文本 实例044——只允许输入字母,并转换为大写的编辑框 实例045——单行编辑控件输入回车后,不响应默认控件处理消息 实例046——设置编辑框控件的背景、文本颜色 实例047——创建完全只读(没有输入焦点,不能选择)的编辑框 实例048——实现只能输入小数的编辑框控件 实例049——使用Rich Edit编辑框格式化显示文本 实例050——设定静态文本框的背景色和文本颜色 实例051——使用Picture控件实现分隔线 实例052——使用静态文本控件显示图标和位图 实例053——在静态文本控件上进行绘图 实例054——创建显示数字钟的静态文本框 实例055——创建超链接风格的静态控件 实例056——添加删除列表框的数据 实例057——创建带有复选框的列表框和可拖放列表项的列表框 实例058——实现选中项缩进的列表框 实例059——创建带有智能水平滚动条的列表框 实例060——添加和获取组合框的列表项 实例061——使用扩展组合框使组合框的选项带有图标 实例062——在组合框的下拉列表框中实现自动选择 实例063——创建颜色选择下拉组合框 实例064——使用滑块控件和调节钮控件设置选择范围 实例065——使用滚动条和进度条进行范围设置 实例066——创建带有文本指示的自定义进度条 实例067——动态创建和删除编辑控件 实例068——在视图中创建和使用控件 第4章 实例069——使用列表控件添加和选择数据项 实例070——动态设置列表控件的不同显示方式 实例071——实现列表控件的扩展风格(拖放、整栏选择和显示网格) 实例072——使用树形控件显示数据 实例073——动态添加、删除树形控件的节点,获取树形控件的选中项 实例074——在树形控件中使用背景位图 实例075——创建可编辑节点的树形控件 实例076——使用树形控件和列表控件显示系统的资源列表 实例077——在程序中使用月历控件 实例078——使用日期控件设置、获取日期时间信息 实例079——使用动画控件播放简单动画 实例080——使用IP地址控件显示和设置IP地址 实例081——使用标签控件创建标签页 实例082——使用热键控件为程序设置热键 实例083——在对话框窗口中使用Microsoft ActiveX控件FlexGrid 实例084——在视图窗口中动态创建ActiveX控件FlexGrid 实例085——使用MFC开发ActiveX控件OleEdit 实例086——通过例程测试使用开发的ActiveX控件OleEdit 实例088——编程实现ActiveX控件的注册 实例089——使用ATL开发ActiveX控件MagicBox 实例090——通过例程测试使用开发的ActiveX控件MagicBox 第5章 实例091——基本下拉菜单的创建与消息响应 实例092——启用、禁用菜单项 实例093——实现单选标记菜单 实例094——动态添加、删除菜单项 实例095——创建带有图标的菜单 实例096——创建弹出式菜单 实例097——实现中英文双语菜单 实例098——为系统菜单添加菜单项 实例099——在对话框中添加菜单 实例100——使用快捷键和发送消息触发菜单命令 实例101——基本工具栏按钮的创建与使用 实例102——保持工具栏按钮组中只有一个按钮被按下 实例103——在工具栏上同时显示位图和文本标签 实例104——为工具栏添加下拉按钮 实例105——在工具栏添加非按钮控件 实例106——实现在同一行上,停靠两个工具栏 实例107——在对话框中添加工具栏 实例108——在状态栏上实时显示当前时间 实例109——在状态栏上显示BMP位图 实例110——在状态栏上添加组合框控件 实例111——在状态栏上显示进度条 实例112——为对话框窗口创建状态栏 实例113——在单文档程序中创建对话条 实例114——实现对话条与窗口消息的信息交互 实例115——创建和使用伸缩条 第6章 实例116——创建模态对话框 实例117——创建非模态对话框 实例118——模态对话框与应用程序之间的数据交换 实例119——非模态对话框与应用程序之间的数据交换 实例120——使用MessageBox消息对话框 实例121——使用AfxMessageBox消息对话框 实例122——使用字体对话框更改文本的字体 实例123——使用颜色对话框选择颜色 实例124——使用文件对话框获取文件路径 实例125——使用多选文件对话框 实例126——重载打开文件对话框,添加删除按钮 实例127——使用查找替换对话框实现查找替换功能 实例128——在程序中使用属性表对话框 实例129——激活使用属性表对话框中的“应用”按钮 实例130——去除属性表对话框中的“应用”按钮 实例131——在对话框中使用属性表 实例132——创建向导对话框 实例133——设置对话框的背景颜色 实例134——使用位图作为对话框背景 实例135——创建半透明对话框窗口 实例136——创建圆形对话框窗口 实例137——全屏幕显示对话框窗口 实例138——动态改变对话框窗口大小 实例139——按下Esc键,对话框不关闭 实例140——禁用对话框右上角的关闭按钮 实例141——可在对话框的任意位置拖动对话框 实例142——为对话框程序制作启动画面 实例143——动态弹出、关闭对话框 实例144——在对话框上动态创建视图 第7章 实例145——在视图中使用CDC进行绘图操作 实例146——在视图中使用CPaintDC进行进行窗口重绘操作 实例147——在视图中使用CWindowDC在整个窗口进行绘图 实例148——在对话框窗口中进行绘图操作 实例149——创建字体进行文本输出 实例150——制作简单的立体字 实例151——制作空心立体字 实例152——显示倾斜的文字 实例153——制作滚动的字幕 实例154——获取系统中已安装的所有字体 实例155——使用不同的画笔绘制图形 实例156——使用不同类型的画刷填充矩形 实例157——使用CRgn对象得到某一特定区域 实例158——提取并显示鼠标所在图像点的颜色 实例159——绘制坐标刻度和自定义线条 实例160——绘制带有箭头的线条 实例161——在视图窗口中显示DDB位图 实例162——实现位图的各种缩放处理 实例163——实现局部放大位图 实例164——实现位图的镜像显示 实例165——通过区域剪裁实现显示椭圆位图 实例166——显示透明位图 实例167——复制位图到剪切板 实例168——抓取屏幕图像并在视图窗口中显示 实例169——创建和使用调色板 实例170——使用不同的映射方式进行绘图 实例171——创建自定义坐标系进行绘图 实例172——制作绚丽的圆环 第8章 实例173——在视图中使用鼠标进行绘图操作(涂鸦) 实例174——在文档中记录绘图数据,并实现窗口重绘 实例175——通过序列化保存文档 实例176——当文档被修改时在标题上给出提醒 实例177——使用对话框与文档视图进行数据交换 实例178——多文档程序实现为新建的文档设置显示字体 实例179——在滚动窗口中实现绘图 实例180——实现动态滚动窗口 实例181——在窗体视图(CFormView)中使用控件 实例182——在列表视图(CListView)中使用列表控件 实例183——改变视图窗口的背景色 实例184——改变MDI框架窗口背景色 实例185——动态设置主框架窗口的图标 实例186——动态设置子框架窗口的图标 实例187——使窗口总在最前显示 实例188——MDI启动时不创建新文档,且限定框架窗口的大小和位置 实例189——限定框架窗口的大小和位置 实例190——限定MDI子框架窗口的最大、最小尺寸 实例191——实现客户窗口的全屏显示 实例192——为程序制作启动界面 实例193——动画启动、关闭窗口并添加位图背景 实例194——改变主窗口上的标题 实例195——为程序创建系统托盘图标 实例196——为程序创建类似迅雷的辅助隐藏窗口 实例197——动态分割窗口,不同窗口对应同一视图 实例198——静态分割窗口,实现窗口的任意切分 实例199——固定分割窗口的分隔线 实例200——动态改变分割窗口的大小 实例201——定制分隔条的外观特性 实例202——分割窗口形成的多视图实现与文档的交互 第9章 实例203——实现“所见即所得”的打印 实例204——设置打印图形的位置 实例205——定制打印固定大小的单页文档 实例206——实现定制打印多页文档 实例207——实现定制打印页的页眉和页脚 实例208——为对话框控件添加ToolTip提示框 实例209——使用AppWizard自动创建WinHelp帮助 实例210——制作WinHelp帮助文件 实例211——向程序中手工添加WinHelp帮助文件 实例212——调试环境配置(Debug模式和Release模式) 实例213——设置位置断点跟踪程序 实例214——设置数据断点跟踪程序 实例215——使用断言宏检测程序的运行状态 实例216——使用跟踪宏在程序运行过程中输出调试信息 实例217——使用TRY-THROW-CATCH结构捕获处理异常 实例218——使用CFileException类捕获文件异常 实例219——为应用程序创建快捷方式 实例220——删除快捷方式 实例221——实现对软件的简单加密 实例222——开发简单的注册机 第10章 实例223——创建文本文件并进行读写数据操作 实例224——在文件的指定位置存放和读取数据 实例225——复制、删除、移动文件 实例226——实现遍历目录下的每个文件 实例227——获取文件的属性 实例228——获取指定文件的图标 实例229——获取系统所有的驱动器以及每个驱动器的序列号 实例230——获取驱动器的文件系统类型 实例231——获取磁盘的空间信息 实例232——判别磁盘驱动器的类型 实例233——获取当前目录、系统目录和Windows目录 实例234——创建和删除目录 实例235——实现删除非空目录 实例236——实现目录的复制操作 实例237——删除指定目录下某种类型的文件 实例238——获取目录的创建时间 实例239——获取应用程序的完整路径 实例240——使用CStdioFile实现在txt文件中逐行读写数据 实例241——使用内存映射文件来共享数据 实例242——创建临时文件 实例243——使用INI文件保存程序的信息 实例244——使用剪贴板实现数据的复制和粘贴 实例245——实现拖放文件到视图窗口 实例246——实现拖放文件到对话框中的编辑控件 实例247——分割大文件到定长小文件 实例248——合并分割的小文件 实例249——使程序开机自动运行 实例250——使用默认浏览器打开某个网页 实例251——枚举注册表的键值名 实例252——设置和修改IE默认主页 实例253——设置软件的使用时限 实例254——限制软件的使用次数 实例255——使窗口开启时保持上次关闭时的大小 实例256——使用注册表模拟软件加密 第11章 实例257——使用Win32 API创建、销毁线程(控制进度条) 实例258——创建MFC用户界面线程 实例259——创建MFC工作者线程,进行耗时计算 实例260——设置线程的优先级 实例261——使用全局结构进行线程间的通信 实例262——使用自定义消息进行线程间的通信 实例263——使用事件对象进行线程间的通信 实例264——使用CEvent对象实现线程同步 实例265——使用临界区对象(CriticalSeciton)实现线程同步 实例266——使用互斥对象(Mutex)实现线程同步 实例267——使用互斥对象(Mutex)实现不同进程间线程同步 实例268——使用信号量(Semaphore)实现线程的同步 实例269——使用多线程进行文件搜索 实例270——获取当前系统的所有进程 实例271——实现应用程序在系统中只能运行一个实例 实例272——获取所有打开窗口程序的句柄、类名及标题 实例273——创建和终止进程 实例274——三种方法实现启动其他的应用程序 实例275——使用剪贴板实现程序间的数据交换 实例276——通过内存映射实现进程间的数据交换 实例277——通过消息机制实现进程间的通信 第12章 实例278——创建导出浮点数四则运算函数的Win32 DLL 实例279——使用显式方式调用DLL实现浮点数的四则运算 实例280——使用隐式方式调用DLL实现浮点数的四则运算 实例281——创建Win32 DLL导出一个全局变量 实例282——调用DLL,获取其导出的全局变量值 实例283——创建Win32 DLL导出一个计算长方体表面积和体积的类 实例284——调用DLL,使用其导出类计算长方体的表面积和体积 实例286——创建MFC常规DLL,通过导出函数显示颜色信息对话框 实例287——调用MFC常规DLL,显示颜色信息对话框 实例288——创建MFC扩展DLL,实现圆形按钮类 实例289——调用MFC扩展DLL,创建圆形按钮 实例290——创建记录键盘动作的全局钩子DLL 实例291——调用键盘钩子DLL,实现监视系统的键盘操作 实例292——创建记录当前鼠标所在窗口标题信息的鼠标钩子DLL 实例293——调用鼠标钩子DLL,显示鼠标所在窗口的标题 实例294——获取当前操作系统的版本信息 实例295——获取系统CPU信息 实例296——获取系统内存的相关信息 实例297——获取当前系统所有安装的硬件设备 实例298——调用系统关机对话框 实例299——编码实现关闭和重启计算机 实例300——实现休眠计算机,并创建快捷键 实例301——显示并设置系统的显示属性 实例302——隐藏显示系统的任务条 实例303——改变系统的桌面壁纸 第13章 实例304——使用CAsyncSocket进行无连接(UDP)通信 实例305——使用CSocket进行有连接(TCP)通信 实例306——CS结构信息转发器的实现(服务器) 实例307——CS结构信息转发器的实现(客户端) 实例308——多人在线的网络聊天室(服务器) 实例309——多人在线的网络聊天室(客户端) 实例310——CS结构点对点信息交互系统(服务器) 实例311——CS结构点对点信息交互系统(客户端) 实例312——使用WinInet通过HTTP协议读取网上文件 实例313——在对话框中,使用WebBrowser控件实现Web浏览器 实例314——使用CHtmlView类,实现类似IE的网页浏览器 实例315——在对话框中显示HTML网页 实例316——获取IE运行实例的标题,并修改其标题 实例317——向IE的工具条上添加自定义的按钮图标 实例318——获取主机名和IP地址 实例319——扫描获取计算机端口的状态 实例320——编程实现收发电子邮件 实例321——利用MSComm控件进行串口通信 第14章 实例322——使用MFC ODBC连接数据源 实例323——使用MFC ODBC查看、编辑数据源中表的数据 实例324——使用MFC ODBC向数据库表中添加、删除记录 实例325——使用Visual C++程序自动设置ODBC数据源 实例326——使用ODBC直接读写Excel文件数据 实例327——使用ADO接口连接数据库 实例328——使用ADO在数据库中创建表,并添加记录 实例329——使用ADO在数据库中遍历、修改和删除记录 实例330——使用ADO Data和DataGrid控件实现遍历、修改、删除、添加记录 实例331——使用ADO直接操作Access数据库 实例332——使用ADO向数据库添加BLOB数据(图像) 实例333——使用ADO从数据库中读出BLOB数据(图像) 实例334——使用SQL语句进行基本的条件查询 实例335——使用SQL语句进行时间条件检索 实例336——使用SQL语句对数据库进行通用操作,使用DataGrid控件显示结果集 实例337——使用Word实现生成、打印数据库报表数据 实例338——使用Excel实现生成、打印数据库报表数据 实例339~342——药品库存管理系统 第15章 实例377——在ADO中调用、执行SQL Server中的存储过程 实例379——在ADO中使用事务处理 第16章 实例380——创建DIB操作的类(CDib) 实例381——使用CDib类实现显示与保存BMP文件 实例382——使用IPicture显示多种格式的图像 实例383~388——使用DIB实现图像的特效显示 综合实例——雷达工程数据的可视化与处理 第17章 实例390——实现“静态”的位图动画 实例391——实现“动态”的位图动画 实例392——使用OpenGL实现绘制三维图形 实例393——使用OpenGL通过动态调整观察点位置实现三维动画 实例394——在OpenGL中,使用纹理显示图形 实例395——用MessageBeep播放WAV文件 实例396——使用PlaySound播放WAV文件 实例397——使用低级波形音频函数播放WAV文件 实例398——创建基于MCI的WAV音频处理类(CMyMCIWave) 实例399——使用CMyMCIWave类创建波形文件播放器 实例400——创建基于MCI的CD音频处理类(CMyMCICD) 实例401——使用CMyMCICD类创建CD播放器 实例402——获取和设置系统音量 实例403——创建基于MCI的数字视频处理类(CMyMCIVideo) 实例404——使用CMyMCIVideo类创建数字视频播放器 实例405——使用MediePlay AcriveX控件创建媒体播放器 实例406——使用VFW实现视频捕捉与保存 综合实例——基于音、视频传输的远程诊断系统
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值