控制台窗口界面的编程控制(二)

【C++】Windows控制台API基本使用(下) 文章目录前言 十四、填充指定行 一、直接输出 二、使用API 三、使用转义序列 十五、DEC线条绘制功能 十六、备用和主缓冲区 … 阅读详情

七、滚动和移动

  ScrollConsoleScreenBuffer是实现文本区滚动和移动的API函数。它可以将指定的一块文本区域移动到另一个区域,被移空的那块区域由指定字符填充。函数的原型如下:

BOOL ScrollConsoleScreenBuffer(
  HANDLE hConsoleOutput, // 句柄
  CONST SMALL_RECT* lpScrollRectangle, // 要滚动或移动的区域
  CONST SMALL_RECT* lpClipRectangle, // 裁剪区域
  COORD dwDestinationOrigin, // 新的位置
  CONST CHAR_INFO* lpFill // 填充字符
);

  利用这个API函数还可以实现删除指定行的操作。下面来举一个例子,程序如下:

#include
#include
#include
HANDLE hOut;
void DeleteLine(int row); // 删除一行
void MoveText(int x, int y, SMALL_RECT rc); // 移动文本块区域
void ClearScreen(void); // 清屏
void main()
{
 hOut = GetStdHandle(STD_OUTPUT_HANDLE); // 获取标准输出设备句柄
 WORD att = FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY |   
       BACKGROUND_BLUE ;
 // 背景是蓝色,文本颜色是黄色
 SetConsoleTextAttribute(hOut, att);
 ClearScreen();
 printf("/n/nThe soul selects her own society,/n");
 printf("Then shuts the door;/n");
 printf("On her devine majority;/n");
 printf("Obtrude no more./n/n");
 CONSOLE_SCREEN_BUFFER_INFO bInfo;
 GetConsoleScreenBufferInfo( hOut, &bInfo );
 COORD endPos = {0, bInfo.dwSize.Y - 1};
 SetConsoleCursorPosition(hOut, endPos); // 设置光标位置
 SMALL_RECT rc = {0, 2, 40, 5};
 _getch();
 MoveText(10, 5, rc);
 _getch();
 DeleteLine(5);
 CloseHandle(hOut); // 关闭标准输出设备句柄
}

void DeleteLine(int row)
{
 SMALL_RECT rcScroll, rcClip;
 COORD crDest = {0, row - 1};
 CHAR_INFO chFill;
 CONSOLE_SCREEN_BUFFER_INFO bInfo;
 GetConsoleScreenBufferInfo( hOut, &bInfo );
 rcScroll.Left = 0;
 rcScroll.Top = row;
 rcScroll.Right = bInfo.dwSize.X - 1;
 rcScroll.Bottom = bInfo.dwSize.Y - 1;
 rcClip = rcScroll;
 chFill.Attributes = bInfo.wAttributes;
 chFill.Char.AsciiChar = ' ';
 ScrollConsoleScreenBuffer(hOut, &rcScroll, &rcClip, crDest, &chFill);
}

void MoveText(int x, int y, SMALL_RECT rc)
{
 COORD crDest = {x, y};
 CHAR_INFO chFill;
 CONSOLE_SCREEN_BUFFER_INFO bInfo;
 GetConsoleScreenBufferInfo( hOut, &bInfo );
 chFill.Attributes = bInfo.wAttributes;
 chFill.Char.AsciiChar = ' ';
 ScrollConsoleScreenBuffer(hOut, &rc, NULL, crDest, &chFill);
}

void ClearScreen(void)
{
 CONSOLE_SCREEN_BUFFER_INFO bInfo;
 GetConsoleScreenBufferInfo( hOut, &bInfo );
 COORD home = {0, 0};
 WORD att = bInfo.wAttributes;
 unsigned long size = bInfo.dwSize.X * bInfo.dwSize.Y;
 FillConsoleOutputAttribute(hOut, att, size, home, NULL);
 FillConsoleOutputCharacter(hOut, ' ', size, home, NULL);
}

  程序中,实现删除行的操作DeleteLine的基本原理是:首先将裁剪区域和移动区域都设置成指定行row(包括该行)以下的控制台窗口区域,然后将移动的位置指定为(0, row-1)。这样,超出裁剪区域的内容被裁剪掉,从而达到删除行的目的。

  需要说明的是,若裁剪区域参数为NULL,则裁剪区域为整个控制台窗口。
 

八、光标操作

  控制台窗口中的光标反映了文本插入的当前位置,通过SetConsoleCursorPosition函数可以改变这个“当前”位置,这样就能控制字符(串)输出。事实上,光标本身的大小和显示或隐藏也可以通过相应的API函数进行设定。例如:

BOOL SetConsoleCursorInfo( // 设置光标信息
 HANDLE hConsoleOutput, // 句柄
 CONST CONSOLE_CURSOR_INFO *lpConsoleCursorInfo // 光标信息
);

BOOL GetConsoleCursorInfo( // 获取光标信息
 HANDLE hConsoleOutput, // 句柄
 PCONSOLE_CURSOR_INFO lpConsoleCursorInfo // 返回光标信息
);

  这两个函数都与CONSOLE_CURSOR_INFO结构体类型有关,其定义如下:

typedef struct _CONSOLE_CURSOR_INFO {
 DWORD dwSize; // 光标百分比大小
 BOOL bVisible; // 是否可见
} CONSOLE_CURSOR_INFO, *PCONSOLE_CURSOR_INFO;

  需要说明的是,dwSize值反映了光标的大小,它的值范围为1-100;当为1时,光标最小,仅是一条最靠下的水平细线,当为100,光标最大,为一个字符大小的方块。

  九、读取键盘信息

  键盘事件通常有字符事件和按键事件,这些事件所附带的信息构成了键盘信息。它是通过API函数ReadConsoleInput来获取的,其原型如下:

BOOL ReadConsoleInput(
 HANDLE hConsoleInput, // 输入设备句柄
 PINPUT_RECORD lpBuffer, // 返回数据记录
 DWORD nLength, // 要读取的记录数
 LPDWORD lpNumberOfEventsRead // 返回已读取的记录数
);

  其中,INPUT_RECORD定义如下:

typedef struct _INPUT_RECORD {
 WORD EventType; // 事件类型
 union {
  KEY_EVENT_RECORD KeyEvent;
  MOUSE_EVENT_RECORD MouseEvent;
  WINDOW_BUFFER_SIZE_RECORD WindowBufferSizeEvent;
  MENU_EVENT_RECORD MenuEvent;
  FOCUS_EVENT_RECORD FocusEvent;
 } Event;
} INPUT_RECORD;

  与键盘事件相关的记录结构KEY_EVENT_RECORD定义如下:

typedef struct _KEY_EVENT_RECORD {
 BOOL bKeyDown; // TRUE表示键按下,FALSE表示键释放
 WORD wRepeatCount; // 按键次数
 WORD wVirtualKeyCode; // 虚拟键代码
 WORD wVirtualScanCode; // 虚拟键扫描码
 union {
  WCHAR UnicodeChar; // 宽字符
  CHAR AsciiChar; // ASCII字符
 } uChar; // 字符
 DWORD dwControlKeyState; // 控制键状态
} KEY_EVENT_RECORD;

  我们知道,键盘上每一个有意义的键都对应着一个唯一的扫描码,虽然扫描码可以作为键的标识,但它依赖于具体设备的。因此,在应用程序中,使用的往往是与具体设备无关的虚拟键代码。这种虚拟键代码是与设备无关的键盘编码。在Visual C++中,最常用的虚拟键代码已被定义在Winuser.h中,例如:VK_SHIFT表示SHIFT键,VK_F1表示功能键F1等。

  上述结构定义中,dwControlKeyState用来表示控制键状态,它可以是CAPSLOCK_ON(CAPS LOCK灯亮)、ENHANCED_KEY(按下扩展键)、LEFT_ALT_PRESSED(按下左ALT键)、LEFT_CTRL_PRESSED(按下左CTRL键)、NUMLOCK_ON (NUM LOCK灯亮)、RIGHT_ALT_PRESSED(按下右ALT键)、RIGHT_CTRL_PRESSED(按下右CTRL键)、SCROLLLOCK_ON(SCROLL LOCK灯亮)和SHIFT_PRESSED(按下SHIFT键)中的一个或多个值的组合。

  下面的程序是将用户按键的字符输入到一个控制台窗口的某个区域中,并当按下NUM LOCK、CAPS LOCK和SCROLL LOCK键时,在控制台窗口的最后一行显示这些键的状态。

#include
HANDLE hOut;
HANDLE hIn;
void DrawBox(bool bSingle, SMALL_RECT rc);
void ClearScreen(void);
void CharWindow(char ch, SMALL_RECT rc); // 将ch输入到指定的窗口中
void ControlStatus(DWORD state); // 在最后一行显示控制键的状态
void DeleteTopLine(SMALL_RECT rc); // 删除指定窗口中最上面的行并滚动
void main()
{
 hOut = GetStdHandle(STD_OUTPUT_HANDLE); // 获取标准输出设备句柄
 hIn = GetStdHandle(STD_INPUT_HANDLE); // 获取标准输入设备句柄
 WORD att = FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY |  
       BACKGROUND_BLUE ;
 // 背景是蓝色,文本颜色是黄色
 SetConsoleTextAttribute(hOut, att);
 ClearScreen(); // 清屏
 INPUT_RECORD keyRec;
 DWORD state = 0, res;
 char ch;
 SMALL_RECT rc = {20, 2, 40, 12};
 DrawBox(true, rc);
 COORD pos = {rc.Left+1, rc.Top+1};
 SetConsoleCursorPosition(hOut, pos); // 设置光标位置
 for(;;) // 循环
 {
  ReadConsoleInput(hIn, &keyRec, 1, &res);
  if (state != keyRec.Event.KeyEvent.dwControlKeyState) {
   state = keyRec.Event.KeyEvent.dwControlKeyState;
   ControlStatus(state);
  }
  if (keyRec.EventType == KEY_EVENT){
   if (keyRec.Event.KeyEvent.wVirtualKeyCode == VK_ESCAPE) break;
   // 按ESC键退出循环
   if (keyRec.Event.KeyEvent.bKeyDown) {
    ch = keyRec.Event.KeyEvent.uChar.AsciiChar;
    CharWindow(ch, rc);
   }
  }
 }
 pos.X = 0; pos.Y = 0;
 SetConsoleCursorPosition(hOut, pos); // 设置光标位置
 CloseHandle(hOut); // 关闭标准输出设备句柄
 CloseHandle(hIn); // 关闭标准输入设备句柄
}

void CharWindow(char ch, SMALL_RECT rc) // 将ch输入到指定的窗口中
{
 static COORD chPos = {rc.Left+1, rc.Top+1};
 SetConsoleCursorPosition(hOut, chPos); // 设置光标位置
 if ((ch<0x20)||(ch>0x7e)) return;
 WriteConsoleOutputCharacter(hOut, &ch, 1, chPos, NULL);
 if (chPos.X>=(rc.Right-1))
 {
  chPos.X = rc.Left;
  chPos.Y++;
 }
 if (chPos.Y>(rc.Bottom-1))
 {
  DeleteTopLine(rc);
  chPos.Y = rc.Bottom-1;
 }
 chPos.X++;
 SetConsoleCursorPosition(hOut, chPos); // 设置光标位置
}

void ControlStatus(DWORD state) // 在最后一行显示控制键的状态
{
 CONSOLE_SCREEN_BUFFER_INFO bInfo;
 GetConsoleScreenBufferInfo( hOut, &bInfo );
 COORD home = {0, bInfo.dwSize.Y-1};
 WORD att0 = BACKGROUND_INTENSITY ;
 WORD att1 = FOREGROUND_GREEN | FOREGROUND_INTENSITY | BACKGROUND_RED;
 FillConsoleOutputAttribute(hOut, att0, bInfo.dwSize.X, home, NULL);
 FillConsoleOutputCharacter(hOut, ' ', bInfo.dwSize.X, home, NULL);
 SetConsoleTextAttribute(hOut, att1);
 COORD staPos = {bInfo.dwSize.X-16,bInfo.dwSize.Y-1};
 SetConsoleCursorPosition(hOut, staPos);
 if (state & NUMLOCK_ON)
 WriteConsole(hOut, "NUM", 3, NULL, NULL);
 staPos.X += 4;
 SetConsoleCursorPosition(hOut, staPos);
 if (state & CAPSLOCK_ON)
 WriteConsole(hOut, "CAPS", 4, NULL, NULL);
 staPos.X += 5;
 SetConsoleCursorPosition(hOut, staPos);
 if (state & SCROLLLOCK_ON)
 WriteConsole(hOut, "SCROLL", 6, NULL, NULL);
 SetConsoleTextAttribute(hOut, bInfo.wAttributes); // 恢复原来的属性
 SetConsoleCursorPosition(hOut, bInfo.dwCursorPosition); // 恢复原来的光标位置
}

void DeleteTopLine(SMALL_RECT rc)
{
 COORD crDest;
 CHAR_INFO chFill;
 SMALL_RECT rcClip = rc;
 rcClip.Left++; rcClip.Right--;
 rcClip.Top++; rcClip.Bottom--;
 crDest.X = rcClip.Left;
 crDest.Y = rcClip.Top - 1;
 CONSOLE_SCREEN_BUFFER_INFO bInfo;
 GetConsoleScreenBufferInfo( hOut, &bInfo );
 chFill.Attributes = bInfo.wAttributes;
 chFill.Char.AsciiChar = ' ';
 ScrollConsoleScreenBuffer(hOut, &rcClip, &rcClip, crDest, &chFill);
}

  程序运行结果如下图所示:
十、读取鼠标信息

  与读取键盘信息方法相似,鼠标信息也是通过ReadConsoleInput来获取的,其MOUSE_EVENT_RECORD具有下列定义:

typedef struct _MOUSE_EVENT_RECORD {
 COORD dwMousePosition; // 当前鼠标位置
 DWORD dwButtonState; // 鼠标按钮状态
 DWORD dwControlKeyState; // 键盘控制键状态
 DWORD dwEventFlags; // 事件状态
} MOUSE_EVENT_RECORD;

  其中,dwButtonState反映了用户按下鼠标按钮的情况,它可以是:FROM_LEFT_1ST_BUTTON_PRESSED(最左边按钮)、RIGHTMOST_BUTTON_PRESSED(最右边按钮)、FROM_LEFT_2ND_BUTTON_PRESSED(左起第二个按钮)、FROM_LEFT_3RD_BUTTON_PRESSED(左起第三个按钮)和FROM_LEFT_4TH_BUTTON_PRESSED (左起第四个按钮)。而dwEventFlags表示鼠标的事件,如DOUBLE_CLICK(双击)、MOUSE_MOVED(移动)和MOUSE_WHEELED(滚轮滚动,只适用于Windows 2000/XP)。dwControlKeyState的含义同前。

  下面举一个例子。这个例子能把鼠标的当前位置显示在控制台窗口的最后一行上,若单击鼠标左键,则在当前位置处写一个字符‘A’,若双击鼠标任一按钮,则程序终止。具体代码如下:

#include <WINDOWS.H>
#include <STDIO.H>
#include <STRING.H>
HANDLE hOut;
HANDLE hIn;
void ClearScreen(void);
void DispMousePos(COORD pos); // 在最后一行显示鼠标位置
void main()
{
 hOut = GetStdHandle(STD_OUTPUT_HANDLE); // 获取标准输出设备句柄
 hIn = GetStdHandle(STD_INPUT_HANDLE); // 获取标准输入设备句柄
 WORD att = FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY |  
       BACKGROUND_BLUE ;
 // 背景是蓝色,文本颜色是黄色
 SetConsoleTextAttribute(hOut, att);
 ClearScreen(); // 清屏
 INPUT_RECORD mouseRec;
 DWORD state = 0, res;
 COORD pos = {0, 0};
 for(;;) // 循环
 {
  ReadConsoleInput(hIn, &mouseRec, 1, &res);
  if (mouseRec.EventType == MOUSE_EVENT){
   if (mouseRec.Event.MouseEvent.dwEventFlags == DOUBLE_CLICK) break;
    // 双击鼠标退出循环
    pos = mouseRec.Event.MouseEvent.dwMousePosition;
    DispMousePos(pos);
    if (mouseRec.Event.MouseEvent.dwButtonState == FROM_LEFT_1ST_BUTTON_PRESSED)
          FillConsoleOutputCharacter(hOut, 'A', 1, pos, NULL);
   }
  }
  pos.X = 0; pos.Y = 0;
  SetConsoleCursorPosition(hOut, pos); // 设置光标位置
  CloseHandle(hOut); // 关闭标准输出设备句柄
  CloseHandle(hIn); // 关闭标准输入设备句柄
 }

void DispMousePos(COORD pos) // 在最后一行显示鼠标位置
{
 CONSOLE_SCREEN_BUFFER_INFO bInfo;
 GetConsoleScreenBufferInfo( hOut, &bInfo );
 COORD home = {0, bInfo.dwSize.Y-1};
 WORD att0 = BACKGROUND_INTENSITY ;
 FillConsoleOutputAttribute(hOut, att0, bInfo.dwSize.X, home, NULL);
 FillConsoleOutputCharacter(hOut, ' ', bInfo.dwSize.X, home, NULL);
 char s[20];
 sprintf(s,"X = %2lu, Y = %2lu",pos.X, pos.Y);
 SetConsoleTextAttribute(hOut, att0);
 SetConsoleCursorPosition(hOut, home);
 WriteConsole(hOut, s, strlen(s), NULL, NULL);
 SetConsoleTextAttribute(hOut, bInfo.wAttributes); // 恢复原来的属性
 SetConsoleCursorPosition(hOut, bInfo.dwCursorPosition); // 恢复原来的光标位置
}

void ClearScreen(void)
{
 CONSOLE_SCREEN_BUFFER_INFO bInfo;
 GetConsoleScreenBufferInfo( hOut, &bInfo );
 COORD home = {0, 0};
 unsigned long size = bInfo.dwSize.X * bInfo.dwSize.Y;
 FillConsoleOutputAttribute(hOut, bInfo.wAttributes, size, home, NULL);
 FillConsoleOutputCharacter(hOut, ' ', size, home, NULL);
}

  程序运行结果如下:
  

  十一、结语

  综上所述,利用控制台窗口的Widows API函数可以设计简洁美观的文本界面,使得用Visual C++ 6.0开发环境深入学习C++以及文本界面设计成为一件比较容易的事件。当然文本界面的设计还需要一定的方法和技巧,限于篇幅,这里不再阐述
文章出处:http://www.diybl.com/course/3_program/c++/cppsl/2008829/138698_2.html

C语言控制台窗口图形界面编程(二):窗口缓冲区的设置 下面介绍 阅读详情

相关推荐

C语言控制台窗口图形界面编程(一):设备句柄与窗口信息

在Windows操作系统下用C语言编写

JZQT_T的博客 1万+

.net2.0轻松判断NumLock、CapsLock、ScrollLock、Insert键的状态:)

不多说了,直接插代码:) 不用Api publicForm1(){InitializeComponent();Application.Idle+=newEventHandler(Application_Idle);}privatevoidApplication_Idle(objectsender,EventArgse){if(Control.IsKeyLocked...

weixin_30338743的博客 248

C语言控制台窗口图形界面编程(八):鼠标事件

上次讲的是键盘事件,这次我们介绍鼠标事件。

JZQT_T的博客 9320

vb.net模拟键盘输入 特殊键值

.net中 模拟键盘输入方法sendkeys.send 或则 sendkeys.sendwait  向textbox中输入,用法: textbox.selecttextbox.foucssendkeys.send("{A}") 一般情况下发送具体的键值即可,特殊键值如下:   BACKSPACE   {BACKSPACE}、{BS}   或   {BKSP}

linzai专栏 7718

海德堡CP2000操作手册

海德堡CP2000操作手册 在(印刷/印刷材料)菜单中输入纸张厚度,输纸台高度会自动设置好。   •纸张厚度少于0.1mm:每次提升0.5mm   •纸张厚度在0.1mm至0.5mm之间:每次提升5张纸的厚度   •纸张厚度超过0.5mm:每次提升2.5mm   再次更改设置:   a.按下走纸按键(图7-7/①)。(纸张行程)菜单出现在显示屏上。   b.按下输纸堆按键(图7-7/②)。显示屏上显示(输纸堆)菜单(图7-7)。   c.使用"+"和"-"按键(图7-7/③)来设置所需的提升增量(调整范围:自动确认值至2.5mm)。

移远EC800M CAT1模块HTTP POST实战:从AT指令到数据上报的完整避坑指南

本文详细介绍了移远EC800M CAT1模块通过AT指令实现HTTP POST数据上报的完整开发流程,包括模块初始化、PDP上下文配置、HTTP POST实现及优化策略。针对实际开发中的常见问题如网络异常、低功耗需求等提供了经过验证的解决方案,帮助开发者快速实现稳定可靠的物联网数据传输功能。

weixin_42556197的博客 480

Windows conio.h 的源码,实现gotoxy, textcolor,movetext等函数

经过自己的修改,成功从Dev-C++移植到VC,不用多说,直接上代码,支持Visual Studio and VC++, Windows only /* A conio implementation for Mingw/Dev-C++. * * Written by: * Hongli Lai <hongli@telekabel.nl> * tkorrovi <tko...

Tody Guo的专栏 1900

【原创工具 | OpenCV-CamCalib】一个基于 OpenCV 的自动化相机数据采集和标定程序

一个基于OpenCV的自动化相机数据采集和标定程序。系统内置相机地址默认为 0。

XavierJ的博客 2698

CMD 控制台 CLS 命令内幕

本文通过 OD 调试分析 cmd 执行过程,来看看在 cls 命令清屏时到底做了什么。

Icy_Ybk 的博客 7259

Coze智能体网页集成实战:从零搭建免登录AI助手

本文详细介绍了如何利用Coze Chat SDK从零开始为网站集成免登录AI助手。通过获取访问令牌和智能体ID,仅需几行JavaScript代码即可将功能完整的对话窗口嵌入网页,实现开箱即用的智能交互。文章重点讲解了核心部署步骤、会话隔离方案以及UI深度定制方法,帮助开发者快速打造贴合品牌、提升用户体验的网页AI助手。

gold8的专栏 558

FreeModbus V1.6主机模式实战:如何在STM32上实现Modbus RTU主从一体通信

本文详细介绍了如何在STM32平台上利用FreeModbus V1.6开源协议栈实现Modbus RTU主从一体通信。文章深入剖析了V1.6版本主机模式的架构设计,提供了从硬件配置、串口与定时器移植到FreeRTOS操作系统适配的完整实战指南,并分享了数据缓冲区管理、多线程协同及高级调试技巧,为构建稳定可靠的工业通信网关提供了系统化解决方案。

weixin_29194255的博客 374

linux控制台界面编程,控制台窗口界面的编程控制(二)

#include <WINDOWS.H>#include <STDIO.H>#include <STRING.H>HANDLE hOut;HANDLE hIn;void ClearScreen(void);void DispMousePos(COORD pos); // 在最后一行显示鼠标位置void main(){hOut = GetStdHandle(STD_OUTPUT_HANDLE); /...

weixin_39940788的博客 552

LoveSQL

LoveSQL(SQL注入详解) 1、根据题目,显然想到的是sql注入漏洞,直接尝试万能密码 2、此时url构造,查看字段数 /check.php?username=admin' order by 3%23&password=1 # 存在 /check.php?username=admin' order by 4%23&password=1 # 报错 因此,得到总共有三个字段数 注意:url中不能用#,应该用url编码%23 3、用union来查询测试注入点,查看回显点

lunan的博客 1562

控制台窗口界面的编程控制(二)

三、控制台窗口操作  用于控制台窗口操作的API函数如下:GetConsoleScreenBufferInfo 获取控制台窗口信息GetConsoleTitle 获取控制台窗口标题ScrollConsoleScreenBuffer 在缓冲区中移动数据块SetConsoleScreenBufferSize 更改指定缓冲区大小SetConsoleTitle 设置控制台窗口标题SetCo

流水一样的年华 761

YOLO系列专栏(十二):YOLO26行业落地实战(三):无人机航拍场景——户外巡检(机载边缘计算+YOLO26)

无人机航拍巡检场景,面临机载设备算力/显存有限、高空航拍目标小、户外环境复杂(风力、光线变化)、图像抖动等问题,对模型的轻量化、实时性、小目标检测能力要求极高。YOLO26相比传统模型,在该场景中具备三大核心优势:✅ 极致轻量化:INT8量化+模型剪枝后,模型体积可压缩至5MB以内,显存占用控制在512MB以内,适配Jetson Xavier NX等机载边缘计算设备;✅ 小目标检测能力强:优化检测头与锚框配置,可精准识别高空航拍中的小尺寸目标(如线路断股、绝缘子裂纹),检测准确率高;

qq_36130719的博客 259

C#项目实战——【实例】企业人事管理系统(二):4、数据库与数据表设计;5、创建项目;

(1)展开新建的db_PWMS数据库节点,选中“表”节点,单击鼠标右键,在弹出的快捷菜单中选择“新建表”命令,如下图:(2)在SQL Server 2008管理器的右边显示一个新表,这里输入要创建的表中所需要的字段,并设置主键,如下图:(3)单击“保存”按钮,弹出“选择名称”对话框,如下图,输入要新建的表名“tb_Login”,单击“确定”按钮,即可在数据库中添加一个表。

做有价值的事,积累有价值的笔记! 1621

【C语言】控制台窗口图形界面编程(二)窗口信息和填充缓冲区

00. 目录 文章目录00. 目录01. COORD结构体02. SMALL_RECT结构03. CONSOLE_SCREEN_BUFFER_INFO结构体04. GetConsoleScreenBufferInfo函数05. FillConsoleOutputCharacter 函数06. 获取窗口信息和填充程序 01. COORD结构体 定义控制台屏幕缓冲区中字符单元格的坐标。坐标系(0,0)...

C/C++软件工程师、嵌入式软件工程师、物联网研发工程师、C/C++讲师、物联网讲师、嵌入式讲师、鸿蒙讲师---欢迎大家一起交流(私信添加博主微信) 3312

初识数据之特征选择

【代码】初识数据之特征选择。

M_inherit的博客 1135

C语言控制台窗口图形界面编程(二)

下面介绍几个用于控制台窗口操作的API函数,如下: [cpp]view plaincopy //获取控制台窗口信息 GetConsoleScreenBufferInfo(); //获取控制台窗口标题 GetConsoleTitle(); //更改指定缓冲区大小 SetConsoleScreenBufferSize();...

weixin_30564785的博客 292

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

控制台刷新界面c语言程序设计教程课后答案,【C语言】控制台窗口图形界面编程(二)窗口信息和填充缓冲区...

00. 目录[TOC]01. COORD结构体定义控制台屏幕缓冲区中字符单元格的坐标。坐标系(0,0)的原点位于缓冲区的左上角。类型声明typedef struct _COORD {SHORT X;SHORT Y;} COORD, *PCOORD;说明:x: 水平坐标或列值。单位取决于函数调用。y: 垂直坐标或行值。单位取决于函数调用。02. SMALL_RECT结构定义矩形的左上角和右下角的坐标...

weixin_39665060的博客 553

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

控制台窗口界面的编程控制

文本界面的控制台应用程序开发是深入学习C++、掌握交互系统的实现方法的最简单的一种手段。然而,Visual C++的C++专用库却没有TC所支持的文本(字符)屏幕控制函数,为此本系列文章从一般控制步骤、控制台窗口操作、文本(字符)控制、滚动和移动、光标、键盘和鼠标等几个方面讨论控制台窗口界面的编程控制方法。   在众多C++开发工具中,由于Microsoft本身的独特优势,选用Visual

把握自己。 7924

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

控制台窗口界面编程控制

摘要: 文本界面的控制台应用程序开发是深入学习C++、掌握交互系统的实现方法的最简单的一种手段。然而,Visual C++的C++专用库却没有TC所支持的文本(字符)屏幕控制函数,为此本系列文章从一般控制步骤、控制台窗口操作、文本(字符)控制、滚动和移动、光标、键盘和鼠标等几个方面讨论控制台窗口界面的编程控制方法。  在众多C++开发工具中,由于Microsoft本身的独特优势,选用Visual

2503

C语言控制台窗口图形界面编程

下面介绍几个用于控制台窗口操作的API函数,如下: [cpp] view plain copy   //获取控制台窗口信息   GetConsoleScreenBufferInfo();      //获取控制台窗口标题   GetConsoleTitle();      //更改指定缓冲区大小   SetConsoleScreenBuffe

KEEP的博客 6万+
上一篇: 控制台窗口界面的编程控制(一)
下一篇: Windows文件操作的API(CreateFile系列)
yangfcf
博客等级 码龄19年 10粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值