zoukankan      html  css  js  c++  java
  • Win32窗体控件方法与消息

    在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)))
    

    可以看到定义的方式都为以“控件_方法名”的方式来命名的,这样的方式就容易理解了.虽然本质是发送消息,但我们还是喜欢易记的方法

    .

  • 相关阅读:
    MySQL约束条件
    MySQL基本数据类型
    MySQL基本sql语句,存储引擎,创建表的语法,严格模式
    MySQL环境变量配置及系统服务制作,设置及修改密码,跳过授权表并重置密码,统一编码
    数据库及SQL语句由来,重要概念介绍,MySQL安装,启动服务端及连接,初识SQL语句
    图书管理系统前端页面搭建
    Bootstrap组件2
    c#版工作流之流程发起(3)
    C#版工作流运行机制(1)
    c#版本工作流引擎状态机(2)
  • 原文地址:https://www.cnblogs.com/Clingingboy/p/2018285.html
Copyright © 2011-2022 走看看