Win32窗体控件方法与消息
2011-04-16 15:22 Clingingboy 阅读(2665) 评论(0) 编辑 收藏 举报
在Windows中,每个窗体的子控件也称之为窗体,创建一个控件的方法是CreateWindow
控件公共方法
如GetWindowText,EnableWindow等方法,几乎每个控件都拥有这些特性,所以这些方法是公用的
控件自身特性
如CheckBox拥有GetCheck和SetCheck方法,windows为每个控件定义了不同的消息事件来进行交互,
比如你调用SetCheck方法,那么实际上就是向Windows内部发送一个BM_SETCHECK的消息,当Windows收到这个消息时就会去处理.
以此类推,其他的控件也是类似的方法.一切都是基于消息来的.如下示例
#define Button_GetCheck(hwndCtl) ((int)(DWORD)SNDMSG((hwndCtl), BM_GETCHECK, 0L, 0L))
#define Button_SetCheck(hwndCtl, check) ((void)SNDMSG((hwndCtl), BM_SETCHECK, (WPARAM)(int)(check), 0L))
Win32 控件API
在WindowsX.h头文件中定义了很多控件的宏,以方便开发者调用(因为好记的函数总是比用SendMessage方法发送消息来得方便的).好记的名字意味着容易理解如下
#define DeletePen(hpen) DeleteObject((HGDIOBJ)(HPEN)(hpen))
#define SelectPen(hdc, hpen) ((HPEN)SelectObject((hdc), (HGDIOBJ)(HPEN)(hpen)))
#define GetStockPen(i) ((HPEN)GetStockObject(i))
#define DeleteBrush(hbr) DeleteObject((HGDIOBJ)(HBRUSH)(hbr))
#define SelectBrush(hdc, hbr) ((HBRUSH)SelectObject((hdc), (HGDIOBJ)(HBRUSH)(hbr)))
#define GetStockBrush(i) ((HBRUSH)GetStockObject(i))
#define DeleteRgn(hrgn) DeleteObject((HGDIOBJ)(HRGN)(hrgn))
我一直搞不明白,为何要定义一个DeleteObject方法,Object太抽象了,而DeletePen就很清晰.再如下定义的宏
#define ListBox_Enable(hwndCtl, fEnable) EnableWindow((hwndCtl), (fEnable))
#define ListBox_GetCount(hwndCtl) ((int)(DWORD)SNDMSG((hwndCtl), LB_GETCOUNT, 0L, 0L))
#define ListBox_ResetContent(hwndCtl) ((BOOL)(DWORD)SNDMSG((hwndCtl), LB_RESETCONTENT, 0L, 0L))
#define ListBox_AddString(hwndCtl, lpsz) ((int)(DWORD)SNDMSG((hwndCtl), LB_ADDSTRING, 0L, (LPARAM)(LPCTSTR)(lpsz)))
#define ListBox_InsertString(hwndCtl, index, lpsz) ((int)(DWORD)SNDMSG((hwndCtl), LB_INSERTSTRING, (WPARAM)(int)(index), (LPARAM)(LPCTSTR)(lpsz)))
#define ListBox_AddItemData(hwndCtl, data) ((int)(DWORD)SNDMSG((hwndCtl), LB_ADDSTRING, 0L, (LPARAM)(data)))
#define ListBox_InsertItemData(hwndCtl, index, data) ((int)(DWORD)SNDMSG((hwndCtl), LB_INSERTSTRING, (WPARAM)(int)(index), (LPARAM)(data)))
可以看到定义的方式都为以“控件_方法名”的方式来命名的,这样的方式就容易理解了.虽然本质是发送消息,但我们还是喜欢易记的方法
.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
2007-04-16 数据库连接方案比拼
2006-04-16 使用XmlSchemaSet验证
2006-04-16 学习Professional ASP.NET 2.0 XML(二)
2006-04-16 学习Professional ASP.NET 2.0 XML(一)
2006-04-16 asp.net2.0快速入门教程下载