一、
概述
在
Windows Form
应用中,
Windows
界面系统通过消息与应用程序进行交互,每个窗口都有相应的消息处理器,处理各自的用户输入及界面重绘等逻辑。窗口都有自己的类名,需要先把该类名及它对应的消息处理器注册到
Windows
界面系统中,再根据该类名来创建自己的窗口。
Windows
也为我们准备了文本输入框,对于简单的文本输入,这个功能已经很完美了,不过如果我们要做一个功能强大的文本编辑器,就像开发环境的
IDE
那样,那么从头来写它会更好,可以实现我们想要的任何逻辑。
文本框是这样一个窗口,它响应键盘消息,并实时重绘窗口中的文本,还要响应鼠标消息来移动光标位置。
我尝试着用
Windows API
来实现了一个简单的单行文本框,它仅有以下几个功能:
1、
响应用户的普通字符输入
2、
可以用光标键及
HOME
、
END
键来移动光标
3、
可以用鼠标键来移动光标
4、
可以用
BACKSPACE
及
DELETE
键来删除输入的内容
另外,它不具有选择文本的功能及剪切、复制、粘贴等功能,这个文本框是用纯
C
来写的,不具有对象化的特征,也就是说,没有将代码封装成类,不能在界面上放置两个文本框,这是为了简化代码,只说明它的原理,如果要封装成类,可以采用
MFC
等类库来编写这个文本框。
在本文的最后,附带了本程序的全部代码,为了书写方便,把所有的代码都放在了一个代码文件中了。
本文本框运行界面如下:
二、
技术要点
1、
注册文本框类并创建文本框窗口
可以使用
API
函数
RegisterClassEx
来注册文本框类,如下:
WNDCLASSEX
wc
;
::
ZeroMemory
(&
wc
,
sizeof
(
wc
));
wc
.
cbSize
=
sizeof
(
wc
);
wc
.
style
=
CS_VREDRAW
|
CS_HREDRAW
|
CS_DBLCLKS
;
//
指定当窗口尺寸发生变化时重绘窗口,并且响应鼠标双击事件
wc
.
hInstance
=
_HInstance
;
wc
.
hbrBackground
= (
HBRUSH
)(
COLOR_WINDOW
+ 1);
//
指定窗口背景颜色为系统颜色“窗口背景”
wc
.
lpszClassName
=
_T
(
"MySimpleTextBox"
);
示例描述:本章介绍常用Win32控件的使用方法。
01_EditDemo 演示静态
文本
、
文本
框、按钮控件的使用方法
02_CheckBoxDemo 演示复选框和单选按钮控件的使用方法。
03_ComboBoxDemo 演示组合框和列表框控件的使用方法。
04_ScrollBarDemo 演示滚动条控件的使用方法。
05_SpinDemo 演示数值调节按钮的使用方法。
06_ProgressDemo 演示进度条控件的使用方法。
07_SliderDemo 演示滑块控件的使用方法。
08_HotkeyDemo 演示热键控件的使用方法。
09_ListCtrlDemo 演示列表控件的使用方法。
10_TreeCtrlDemo 演示树形控件的使用方法。
11_RichEditDemo 演示格式
文本
框的使用方法。
12_TabCtrlDemo 演示属性页的使用方法。
13_AnimateDemo 演示动画控件的使用方法。
14_DateTimeDemo 演示日期时间选择控件的使用方法。
15_CalendarDemo 演示日历控件的使用方法。
16_IPCtrlDemo 演示IP
输入
框的使用方法。
第3章(\Chapter03)
示例描述:本章介绍高级Win32控件的使用方法。
01_MenuDemo 演示窗体菜单的使用方法。
02_PopMenuDemo 演示弹出式菜单的使用方法。
03_ToolbarDemo 给窗体添加标准工具栏。
04_Toolbar256 使工具栏支持256色位图。
05_StatusBarDemo 在窗体的状态栏区域输出信息。
06_ColorStatusBar 在状态栏添加彩色渐变进度条。
07_ToolTipDemo 使用ToolTip显示即时提示。
第4章(\ Chapter04)
示例描述:本章介绍窗体的使用方法和使用技巧。
01_WindowDemo 演示创建和显示窗体的方法。
02_TopMostWnd 让窗体保持在桌面最顶层。
03_TransparentWindow 创建半透明窗体。
04_EllipticalWindow 创建椭圆窗体。
05_TextPathWnd 创建文字异形窗体。
06_ImagePathWnd 根据图片创建异形窗体。
07_AnimatedWnd 以动画方式显示和隐藏窗体。
08_AutoSize 让窗体上的控件自动适应窗体大小。
09_AutoSizeEx 多个控件改变大小时防止闪烁。
10_LimitSize 限制窗体的最大和最小尺寸。
11_AutoPos 让窗体具有停靠效果。
12_EnumWnd 枚举系统中的窗口。
第5章(\ Chapter05)
示例描述:本章介绍创建对话框以及通用对话框的使用技巧。
01_ModalDlg 显示模式对话框。
02_ModallessDlg 显示非模式对话框。
03_OpenFileDemo 使用打开文件对话框。
04_SaveFileDemo 使用保存文件对话框。
05_FontDlgDemo 使用字体选择对话框。
06_FontDlgDemo_Color 使用字体选择对话框。
07_PreviewFileDlg_Demo 为打开文件对话框增加预览功能。
08_InputDlg_Demo 从内存创建对话框。
第6章(\ Chapter06)
示例描述:本章介绍
Windows
应用程序消息循环的原理和消息处理技巧。
01_PeekMsgDemo 传递并响应
Windows
消息。
02_SendMsg 发送
Windows
消息。
03_MsgInMfc 了解MFC的映射消息机制。
04_UserMsg 使用自定义消息。
05_DoubleEdit_Demo 拦截并处理Win32控件的消息。
第7章(\ Chapter07)
示例描述:本章介绍
Windows
系统和外壳编程的技巧。
01_TimerDemo 使用计时器。
02_RegDemo 访问系统注册表。
03_SuperPwd 用随机数生成强力密码。
04_ShellOpen 打开一个和程序相关联的文档。
05_ClipboardDemo 访问
Windows
剪切板。
06_ClipboardMonitor 监视剪切板内容变化。
07_TrayIconDemo 使用系统托盘图标。
第8章(\ Chapter08)
示例描述:本章介绍在应用程序中使用
Windows
基本设备的方法和技巧。
01_MouseSample 处理鼠标消息。
02_KeyTest 处理键盘消息。
03_MouseMoving 利用客户区鼠标消息拖动无边框窗体。
04_NCMsg 利用非客户区鼠标消息控制无边框窗体。
05_LockMouse 限制鼠标移动区域。
06_MyEvent 模拟键盘鼠标消息。
07_ClipboardHelper 使用系统热键消息使后台程序得到通知。
第9章(\ Chapter09)
示例描述:本章学习
Windows
进程的创建和管理方法。
01_StartProcess 创建和结束进程。
02_RedirectStdio 用匿名管道获取控制台程序的输出。
03_CatchError 拦截并处理外部进程的错误。
04_SingleInstance 防止应用程序运行多个实例。
05_ProcessMsg 用消息在进程间通讯。
06_MappingFile 用内存映射文件在进程间通讯。
07_ProcessList 枚举并得到系统中所有进程信息。
第10章(\ Chapter10)
示例描述:本章学习
Windows
线程的创建和管理方法。
01_PrimeNumberFinder 主线程和用户界面。
02_PrimeNumberFinderEx 创建和结束线程。
03_PrimeNumberFinal 用临界区对象同步线程。
04_BigPrimeNumber 用事件对象同步线程。
05_SemaphoreDemo 用信号量对象同步线程。
06_ThreadPriority 调整线程优先级。
第11章(\ Chapter11)
示例描述:本章学习使用VC6进行图形图像开发的技巧。
01_ZoomBitmap 用DC对象缩放位图。
02_DrawLine 用画笔对象画线。
03_BrushDemo 用画刷对象填充区域。
04_RollText 在屏幕上输出
文本
。
05_PicShow 使用GDI+读取不同格式的图片。
06_PicShowEx 使用GDI+保存不同格式的图片。
07_Snap 制作屏幕截图程序。
08_Watermark 给图片增加版权信息。
第12章(\ Chapter12)
示例描述:本章学习使用VC6进行文件IO开发的技巧。
01_BinaryView 用基本
API
编写二进制编辑器。
02_MyCompressor 用MFC类编写文件压缩软件。
03_DirMonitor 监控硬盘上文件的变化。
04_HddSpace 获取本机所有磁盘及其空间使用情况。
05_WideText
文本
保存及编码方式。
06_XmlReader 读写XML文件。
07_SerialPort 读写串口数据。
第13章(\ Chapter13)
示例描述:本章学习使用VC6进行数据库开发的方法和技巧。
01_ODBC_Source 创建ODBC数据源。
02_ODBC_Demo 通过ODBC访问Access数据库。
03_ADO_Demo 通过ADO访问据库。
04_ExecProc 调用SQL Server的存储过程。
05_TransExec 事务处理SQL Server命令。
06_BinData 存取数据库中的图片。
07_CreateMdb 在程序中动态生成Access数据库。
第14章(\ Chapter14)
示例描述:本章学习使用VC6进行网络开发的方法和技巧。
01_UdpClient 建立UDP连接客户端。
02_UdpServer 建立UDP连接服务器端。
03_TcpClient 建立TCP连接客户端。
04_TcpServer 建立TCP连接服务器端。
05_MfcSock 使用MFC的SOCKET类。
06_MyWebProtocol 注册自己的浏览器地址栏协议。
07_GetHttpStr 抓取网页内容。
08_VisualPing 基于ICMP编写网络速度监控程序。
第15章(\ Chapter15)
示例描述:本章介绍一些
Windows
高级编程技术。
01_AppSnap 制作鼠标HOOK。
02_PasswordShow 用鼠标HOOK读取密码框中的内容。
03_KeyVoice 制作键盘HOOK。
04_SysKey 用键盘HOOK屏蔽系统按键。
05_DlgSkinDemo 用HOOK技术给对话框换肤。
06_PeExport 分析DLL文件获取其导出函数列表。
第16章(\ Chapter16)
示例描述:本章介绍VC6在多媒体开发方面的应用技术。
01_BgMusic 用基本
API
播放声音。
02_MP3Player 用MCI播放音频。
03_MyReal 调用RealPlayer播放音频文件。
04_Recorder 制作录音机程序。
05_GifCtrl 在VC中显示动态的GIF动画。
06_FlashWnd 在VC中播放Flash动画。
07_MediaPlayer 在VC中播放视频。
08_CaptureVideo 在VC中
实现
视频采集及截图功能。
第17章(\ Chapter17)
示例描述:本章介绍VC6在ActiveX方面的应用技术。
01_MyActiveX 创建ActiveX控件。
02_MyActiveX2 为ActiveX控件增加属性和方法。
03_ActiveXInDlg 在应用程序中使用ActiveX控件。
04_ActiveXInWeb 在浏览器中使用ActiveX控件。
05_MyActiveX3 在VC中显示动态的GIF动画。
06_RegOCX 在程序中注册和注销ActiveX控件。
第18章(\ Chapter18)
示例描述:本章介绍如何将应用程序制作成完整的应用软件的技术。
01_MyHelp 制作帮助文件。
02_Setup 制作安装程序。
03_MultiLanguage 让应用程序界面支持多语言。
04_MultiLanguageEx 多语言的字符串常量。
05_SetupEx 制作多语言的安装程序。
在WinForm程序中,
实现
TextBox
文本
输入
框占位符的方式也很多,最常用的是方式基于
Windows
Api
SendMessage函数发送EM_SETCUEBANNER消息,或者通过TextBox自带的焦点事件处理。
SendMessage函数
实现
创建一个继承TextBox的ZhmTextBox
输入
框控件,新增Placeholder属性,在Placeholder的set方法中发送EM_SETCUEBANNER消息
public class ZhmTextBox: TextBox
private const int EM_SETCUEBANNER = 0x1501;
设置打印颜色COORD 类型结构体延时 Sleep设置控制台光标位置 SetConsoleCursorPosition获取/设置控制台模式 GetConsoleMode / SetConsoleMode获取鼠标在控制台的位置system 函数设置控制台标题 SetConsoleTitle检测按键状态 GetKeyState / GetAsyncKeyState 检查控制台是否有键盘
输入
_kbhit读取键盘
输入
_getch设置控制台字体大小蜂鸣 Beep检索指定的系统指标或系统配置设置 GetSy
目录前言一、控制台缓冲区大小一、获取缓冲区大小二、设置缓冲区大小三、更详细的结构体二、窗口大小一、获取窗口大小二、设置窗口大小三、光标位置一、获取光标位置二、设置光标位置四、设置光标是否显示一、旧版
API
二、新版控制台的 ANSI 转义序列三、新版控制台特性五、通过代码打开 ANSI 转义序列六、控制台编码一、设置输出编码二、设置
输入
编码七、修改控制台
文本
样式一、使用
API
二、使用ANSI转义序列八、控制台窗口标题一、获取控制台窗口标题二、设置窗口标题一、使用旧版
API
二、使用转义序列三、获取控制台原始标题