有关MFC界面与控制台交互

开心的卡夫卡 2009-12-28 10:03:00

WCHAR ch[20] = {0};
DWORD dCnt = 0;
HANDLE hConsole = GetStdHandle(STD_INPUT_HANDLE);
ReadConsoleW(hConsole, ch, 20, &dCnt, 0);

上面是读取控制台的代码
但是我每次执行这段读取代码时候应用程序都会卡住!
求教这是为什么
或者ReadConsole使用时候该注意哪些问题,请教经验!
谢谢!
...全文
153 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
开心的卡夫卡 2009-12-29
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 jingzhongrong 的回复:]
WriteConsole在输入缓冲区中写入了东西,ReadConsole一读就读到了,自然不会阻塞
[/Quote]
这是怎么个过程呢,大致是怎样的,道理好像不是很清晰!例如ReadConsole是从控制台读取东西是怎么读取的是读取缓冲,还是。。。
jingzhongrong 2009-12-29
  • 打赏
  • 举报
回复
WriteConsole在输入缓冲区中写入了东西,ReadConsole一读就读到了,自然不会阻塞
开心的卡夫卡 2009-12-29
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 jingzhongrong 的回复:]
这表明该函数是阻塞的,可以创建一个线程调用ReadConsole
[/Quote]
的确是阻塞的,这个东西似乎与操作有关,当我用WriteConsole后创建一个窗口,然后想这个窗口输入东西,虽然输入不进去,但是之后调用ReadConsole就会相应而且不会阻塞,此后再向窗口输入既可以但是这时候就出现了阻塞~晕死!但问能否详细解释下其中道理~小弟感激不尽
jingzhongrong 2009-12-29
  • 打赏
  • 举报
回复
这表明该函数是阻塞的,可以创建一个线程调用ReadConsole
目录 第1章 面向对象编程 1.1 面向对象的基本概念 1.1.1 类和对象 1.1.2 封装、多态和继承 1.1.3 消息 1.2 面向对象的建模技术UML 1.2.1 类图 1.2.2 交互图 1.2.3 用例图 1.3 面向对象的C++语言 1.3.1 C++对象的内存布局 1.3.2 C++编程技术要点 1.4 小结 第2章 窗口 2.1 窗口结构 2.2 窗口类型 2.3 窗口关系 2.4 消息和消息处理 2.4.1 系统定义的消息 2.4.2 应用程序定义的消息 2.4.3 消息参数 2.4.4 消息队列 2.4.5 消息循列 2.4.6 窗口过程 2.5 窗口应用框架 2.6 小结 第3章 MFC简介 3.1 MFC的优势 3.2 MFC中的类 3.3 用MFC开发应用的基本方法 3.4 MFC中的窗口管理 3.4.1 C++窗口对象和Windows窗体之间的关系 3.4.2 创建窗口 3.4.3 销毁窗体 3.4.4 定位窗体 3.4.5 绘图 3.4.6 消息处理 3.5 小结 第4章 CObject类 4.1 概述 4.2 创建对象 4.2.1 直接构造 4.2.2 使用new操作符 4.3 诊断功能 4.3.1 Dump成员 4.3.2 AssertValid 4.4 运行时类信息 4.4.1 CRuntimeClass结构 4.4.2 添加运行时类信息 4.4.3 IsKindOf 4.5 动态创建 4.6 序列化 4.6.1 添加序列化支持 4.6.2 CArchive类 4.6.3 对象序列化实例 4.7 小结 第5章 MFC应用框架 5.1 应用程序对象和MFC类库的交互 5.2 应用程序的初始化 5.3 消息循环 5.4 空闲处理 5.5 应用程序的退出 5.6 CWinApp提供的其他服务 5.6.1 外壳程序注册 5.6.2 文件管理器拖放 5.6.3 跟踪最近使用的文档 5.7 小结 第6章 消息映射 6.1 基本概念 6.2 消息映射表 6.3 一般窗口消息的处理成员的定位 6.4 命令处理成员的定位 6.5 消息映射宏 6.5.1 窗口映射宏 6.5.2 命令映射宏 6.5.3 控制通知消息映射宏 6.5.4 通知消息映射宏 6.5.5 反射消息映射宏 6.6 小结 第7章 消息处理 7.1 处理标准窗口消息 7.1.1 处理WM_CREATE消息 7.1.2 处理WM_DESTROY消息 7.1.3 处理WM_NCDESTORY消息 7.1.4 处理WM_CLOSE消息 7.2 处理命令消息 7.3 处理反射消息 7.4 投递和发送消息 7.4.1 投递和发送消息的概念 7.4.2 postMessage函数 7.4.3 SendMessage函数 7.4.4 SendMessage 7.5 SendNotifymessage和SendMessageCallback 7.6 使用自定义命令 7.7 使用自定义窗口消息 7.8 使用登记消息 7.9 处理线程消息 7.10 跨进程处理消息 7.11 消息钩子 7.11.1 钩子和过滤器 7.11.2 钩子的类型和范围 7.11.3 安装和解除消息钩子 7.11.4 使用线程范围和钩子实例 7.11.5 使用全局钩子实例 7.12 小结 第8章 对话框 8.1 对话框的生存期 8.1.1 对话框的创建 8.1.2 对话框的初始化 8.1.3 对话框的消息处理 8.1.4 对话框的结束 8.2 数据交换和数据验证 8.3 使用通用对话框 8.3.1 基本用法 8.3.2 定制通用对话框 8.4 运行时修改对话框 8.5 作为子窗口的对话框 8.6 HTML对话框 8.6.1 HTML资源 8.6.2 让HTML全部可见 8.6.3 混合HTML元素和窗口控件设计对话框 8.6.4 HTML消息处理 8.6.5 HTML元素和对话框成员间的数据交换 8.6.6 导航 8.6.7 基于HTML对话框的实用实例 8.7 使用属性表 8.8 使用对话栏 8.8.1 创建 8.8.2 销毁 8.8.3 处理控件消息 8.8.4 访问对话栏成员 8.8.5 实例 8.9 小结 第9章 文档和视图 9.1 文档/视图结构 9.1.1 原理 9.1.2 为什么使用文档/视图结构 9.1.3 基于文档/视图结构的应用 9.2 文档/视图结构的创建 9.2.1 文档模板的创建 9.2.2 文档的创建 9.2.3 框架的创建 9.2.4 视图的创建 9.2.5 文档/视图的初始化 9.3 深入文档模板 9.3.1 文档模板管理器 9.3.2 文档模板的创建 9.3.3 管理文档 9.3.4 其他 9.4 文档对象 9.4.1 文档的初始化 9.4.2 保存文档 9.4.3 设置修改标志和保存修改 9.4.4 关闭文档 9.4.5 管理视图 9.4.6 文档的销毁 9.4.7 命令处理 9.4.8 文档的序列化 9.4.9 设计文档的成员 9.5 视图对象 9.5.1 视图的初始化 9.5.2 视图和文档间的数据交换 9.5.3 视图的绘制 9.5.4 视图的销毁 9.6 框架窗口 9.6.1 初始化 9.6.2 和文档的交互 9.6.3 和视图的交换 9.6.4 命令处理 9.6.5 确定视图大小 9.6.6 为框架添加其他子控件 9.7 打印 9.7.1 文档/视图框架中的打印流程 9.7.2 自定义打印 9.7.3 打印预览 9.8 小结 第10章 深入视图 10.1 拆分 10.1.1 视图的创建 10.1.2 拆分窗口的命令处理 10.1.3 对拆分子窗口的管理 10.1.4 绘制 10.2 流动和缩放 10.2.1 滚动 10.2.2 缩放视图 10.3 控件视图 10.4 窗体视图 10.5 基于HTML的视图——CDHtmlView 10.5.1 加载HTML 10.5.2 事件处理 10.5.3 在新的文档中打开HTML 10.6 小结 第11章 GDI绘图 11.1 GDI绘图的编程模型 11.1.1 逻辑空间和设备空间 11.1.2 设备上下文 11.1.3 GDI对象 11.1.4 坐标变量和坐标映射 11.2 绘制图形 11.2.1 画线 11.2.2 绘制矩形 11.2.3 绘制椭圆 11.2.4 绘制弧线 11.2.5 绘制多边形 11.2.6 绘制贝济埃样条 11.2.7 使用路径 11.2.8 填充 11.2.9 区域 11.3 使用图像 11.3.1 位图的结构 11.3.2 位图类型 11.3.3 图像初始化和销毁 11.3.4 从文件加载图像文件 11.3.5 将图像保存为文件 11.3.6 图像的显示、裁剪和缩放 11.3.7 图像处理 11.4 小结 第12章 GDI+绘图 12.1 GDI+编程模型 12.1.1 GDI+的组成 12.1.2 GDI+的功能 12.1.3 GDI+编程步骤 12.1.4 新增功能 12.2 绘制基数样条曲线 12.3 独立的路径对象 12.4 Alpha混合 12.4.1 在钢笔中应用Alpha混合 12.4.2 在画刷中应用Alpha混合 12.4.3 对图像应用Alpha混合 12.5 渐变 12.5.1 线性渐变 12.5.2 轨迹渐变 12.6 变换和矩形对象 12.7 使用图像 12.8 小结 第13章 进程和线程 13.1 基本理论 13.1.1 什么是进程 13.1.2 什么是线程 13.1.3 进程地址空间 13.1.4 线程的生命周期 13.2 创建子进程 13.3 虚拟内存管理 13.4 进程间内存共享 13.5 用户界面线程 13.5.1 创建 13.5.2 退出 13.5.3 线程间通信 13.6 辅助线程 13.6.1 创建 13.6.2 退出 13.6.3 线程间通信 13.7 线程安全措施 13.7.1 需要采取线程安全措施的对象 13.7.2 线程安全的实现 13.8 小结 第14章 动态链接库 14.1 简介 14.1.1 DLL的构成 14.1.2 到DLL的链接 14.1.3 DLL映射到进程空间 14.1.4 使用动态链接的好处 14.2 规则DLL创建及其使用 14.2.1 创建规则DLL 14.2.2 规则DLL的使用 14.2.3 输出全局变量 14.2.4 输出类 14.2.5 输出进程间共享的数据 14.3 进程状态、模块状态和线程状态 14.3.1 线程局部存储 14.3.2 模块状态 14.4 创建和使用扩展DLL 14.4.1 创建 14.4.2 使用 14.5 DLL中的资源 14.5.1 资源的名字和类型 14.5.2 确定定义资源的模块 14.5.3 在模块中查找、加载资源 14.5.4 枚举资源 14.5.5 修改可执行文件的资源 14.5.6 纯资源DLL 14.5.7 附属DLL 14.6 小结 第15章 COM组件编程 15.1 COM基础知识 15.1.1 COM中的接口 15.1.2 COM对象的线程模型 15.1.3 进程内组件和进程间组件 15.1.4 COM库 15.1.5 COMK 的功能复用 15.2 IUnknown接口在MFC中的实现 15.2.1 内部类 15.2.2 接口映射类 15.2.3 聚合的实现 15.3 类厂及其MFC实现 15.3.1 ColeObjectFactory类 15.3.2 全局类厂链 15.3.3 类厂的注册/反注册 15.3.4 类厂对象的创建 15.3.5 类厂对象创建COM对象 15.3.6 为CCmdTarget添加类厂支持 15.4 用MFC实现简单的COM组件 15.4.1 创建支持自动化的规则DLL 15.4.2 定义接口文件 15.4.3 实现被聚合的COM组件 15.4.4 实现包容组件 15.4.5 编译、注册COM组件 15.4.6 创建一个对话框应用 15.5 双重接口 15.5.1 调度表 15.5.2 COleDispatchImpl 15.5.3 m_xDispatch成员 15.5.4 输出IDispatch接口 15.5.5 双重接口的客户端 15.5.6 范例 15.6 可连接对象及其MFC实现 15.6.1 用CCmdTarget实现可连接对象 15.6.2 可连接对象的客户端 15.7 封送的应用:在线程间传递接口指针 15.8 小结 第16章 .NET应用开发 16.1 C++托管扩展简介 16.1.1 什么是.NET平台 16.1.2 托管C++中的类型 16.1.3 托管C++的用途 16.1.4 为什么MFC应用添加托管支持 16.1.5 使用.NET类型 16.1.6 实例:创建手管类型 16.1.7 装箱:值类型到引用类型的转化 16.1.8 托管类型和非托管类型的混用 16.1.9 固定指针 16.2 常用的托管C++编程技能 16.2.1 声明托管类 16.2.2 声明值类型的托管类型 16.2.3 添加属性 16.2.4 定义及实现接口 16.2.5 托管数组 16.2.6 处理异常 16.2.7 定义和使用委托 16.2.8 创建对象 16.2.9 对象的序列化和反序列化 16.2.10 用ADO.NET访问数据库 16.2.11 断方和条件编译 16.3 具有双重接口功能的规则DLL 16.4 典型托管应用开发 16.4.1 控制台应用 16.4.2 类库应用 16.4.3 窗体应用 16.5 小结
多 文 档 命 令 行 一、概括: 作者长期从事 CAD 软件的使用、对比、二次开发技术的研究工作,特别对于欧特克(Autodesk)软件公司的旗舰产品 AutoCAD 以及其二次开发平台 ObjectARX for AutoCAD ,它公布许多的应用程序 AutoCAD 本身的组件、或者组件的开发接口。经作者的多年分析,可以对它进行如下描述:其核心二次开发技术 ObjectARX 定义一个分层式软件开发模型,其存在三大技术:图形文件的读写及内存管理、实体的屏幕显示、人机交互。 二、软件工程的由来: 使用 AutoCAD 的技术人员都知道,从 AutoCAD 2000 以后的各个版本, AutoCAD 中的命令的执行具有以下的特性,在一个命令执行没有完成之前就可以切换到另一个图形窗口执行别的命令,就像切换到别的应用程序。 从代码编制的角度讲,就是在一个程序的代码执行序列中的两个独立过程中的代码相互切换,从知道 AutoCAD 绘图的这个功能现象后,作者就对其很感兴趣,一直至今。 AutoCAD 二次开发的好处在于免费提供了基于 Visual C++ 集成开发环境的所必需的头文件、输入库、动态链接库。通过研读头文件,仔细阅读帮助文档,终于明白这个技术可以称为人机交互技术的组成部分,也是 ObjectARX for AutoCAD 隐藏的技术之一,这些技术就隐藏在 ObjectARX 应用程序同 AutoCAD 作用并进行用户输入的许多个全局函数中,其函数名称具有如下命名规则, acedGetXXX 。 由于这些函数同以往的控制台应用程序中调用的 C 语言库中的控制台输入输出函数具有初级的类似,于是作者确定自己的研究方向就是将这些用户输入函数的实现技术搞清楚,同时最好编制出原型程序,于是在 Microsoft Windows 2000 上安装 AutoCAD 2000 、ObjectARX for AutoCAD 2000 以及符合 ObjectARX 开发条件的 Visual C++ 6.0 ,开始的研究之路。 软件工程名称就定义为多文档命令行。 三、成功的结果: 近十年来的研究,经过各种各样技术路线的努力,终于得到了回报,做出了自己的原型程序,原型程序的目标是模拟 AutoCAD 使用者可以看到的下列组成部分:多文档同时编辑、命令行窗口、主窗口菜单、字符屏幕窗口、多文档命令,原型程序也同时实现了初级的全局用户输入函数、利用 MFC 序列化技术实现命令扩展、利用 MFC 扩展技术实现多文档框架下“文档-视图框架”的扩展、以及使用全局用户输入函数调用多文档命令等。 四、成功后的思考: 当自己的努力走到这一步之后,就明白以下一些问题:为什么 AutoCAD R14 不是多文档界面?这些全局用户输入函数是如何协调用户的输入以及操作系统的输入?全局用户输入函数是否同菜单宏相联系?怎样联系? 更推而广之,如果上升到人机交互技术组成的话,那么不光是 CAD 图形界面的软件提供二次开发技术需要它?其他软件也一样。 作者在按照 ObjectARX 提供头文件的技术线索,继续完善运行时刻扩展必备的 C++ 类库管理。 五、原型程序代码使用: 本电子邮件的附件为笔者努力的部分代码,主要是通过 MFC 扩展动态链接库编制多文档命令,实现开发用户自己登记、实现多文档命令,让开发用户查看“文档-视图框架”扩展部分详细代码。 使用环境: Visual C++ 6.0 ,请不要安装各种各样的 Service Pack,展开目录 MRXEXT 中,就相当于我们设计的 ObjectARX 代码,使用命令 Appload 调入这个 MFC 扩展动态连接库(MRXEXTD.MRX),可以使用的命令有:appload、test、call、doccreate、docClose 等。 使用过 Visual C++ 6.0 的开发者,可以明白原型程序的程序执行模块 multitopd.exe 和动态链接库执行模块 mrxextd.mrx 共享使用 MFC 动态链接库的调试版本。命令类是 MFC 扩展可序列化类,相关技术的应用不想多讲。 命令 test 是一个简单的多文档命令,在多文档界面下,如何测试多文档命令由研摩者自己思考。作者认为这也是理解 ObjectARX 应用开发的一个技术技巧。对应成员函数 MdMvEdCommandTest:: On_mdmvEdCommand() 命令 call ,对应成员函数 MdMvEdCommandCall :: On_mdmvEdCommand (),函数定义代码存在两段代码,研摩者可以编译、链接任一段代码或两段代码,同 ObjectARX 中 acedCmd 全局函数类似。 命令 doccreate ,对应成员函数 MdMvEdCommandDocCreate :: On_mdmvEdCommand (),这个命令可以将研发者“文档-视图”框架加入到 MDI 文档主框架中,值得注意的是新加入研发者文档没有文档执行上下文,所以不能够在它的视图窗口活动时敲入任何命令以执行,需要切换 multitopd.exe 应用程序提供的文档对应视图才能敲入命令。 命令 docclose ,对应成员函数 MdMvEdCommandDocClose :: On_mdmvEdCommand () ,这个用来关闭 mrxextd.mrx 研发者动态链接库执行模块中提供的“文档-视图”框架。 命令 appload ,由作者实现,完成扩展应用程序管理,现在不存在卸载命令,请原谅。 所有命令的敲入都不具备可见性,因为原型程序没有做命令行显示,请原谅。 六、作者联系: 如果想将自己的软件向使用者提供二次开发技术,欢迎来信联系。将附件改为 mrxext.exe ,再使用 WinRAR 或自解压。 电子邮箱:guzhenghong@sina.com ; 无兴趣者,勿恼。

16,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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