win32 控件的创建和消息响应

1. 控件的创建

控件的创建和窗口创建是一样的,例如:

//-------- 创建窗口或控件  ----hwnd = CreateWindow("button","myButton01", WS_VISIBLE|WS_CHILD, 80,60,35,25, hWnd,(HMENU)IDB_BUTTON01,hInst,NULL);

是一个按钮的创建,其中hWnd是窗口句柄,hInst是应用程序句柄。

其他控件类似的可以把第一个参数"button"改为"edit","listbox","static","combobox"等等;

如果要创建的控件有很多,可以用一个循环和宏组合代替:

#define CreateCtrl(s) s.hCtrl=CreateWindow(s.sClass,s.sCaption,s.wStyle, s.x,s.y,s.w,s.h, hWnd,s.id,hInst,NULL)#define ctrlNum 2// 上面的 hInst 应该设为全局变量,在窗口创建时初始化struct CtrlParam{  HWND hCtrl;  char sClass[8];  char sCaption[16];  DWORD dwStyle;  int x;  int y;  int w;  int h;  int id;};
CtrlParam ctrlParams[ctrlNum] =
{
  {"button","myButton02", WS_VISIBLE|WS_CHILD, 120,60,35,25,(HMENU)IDB_BUTTON02},// {...},
  {"edit","myEdit01", WS_VISIBLE|WS_CHILD      |ES_WANTRETURN|ES_AUTOVSCROLL|ES_MULTILINE, 80,110,100,80,(HMENU)IDE_EDIT01}
};

//--- WM_CREATE :for(int i = 0; i < ctrlNum; i++){  CreateCtrl(ctrlParams[i]);}

2. 关于dwStyle参数

控件的dwStyle参数有两层,WS_ 开头的表示窗口类型,其它的BS_, ES_,LBS_ 等等表示控件特有的类型。

WS_VISIBLE 表示可见,如果没有,则控件是隐藏的。可以在程序中动态改变:

//------ 设窗口或控件可见 ----
ShowWindow(ctrlParams[0].hCtrl, SW_SHOWNOMAL);

WS_CHILD 用于控件的创建,与hWnd配合,确定它的父窗口,位置参数x, y, width, height 都是相对于父窗口的;

WS_DISABLED 创建的窗口或控件不可用,也可以动态改变:

//----- 这里不能用 SendMessage(.., WM_ENABLE, ..); -------//----- 后果是控件灰色去掉,但控件仍然不可用  -----------EnableWindow(ctrlparams[0].hCtl, TRUE);

WS_GROUP 主要用于edit的tab键功能。作用域:一个WS_GROUP到下一个WS_GROUP之前,中间不能再有。

WS_BORDER 加边框。如果需要其它边框可以用CreateWindowEx, 多了一个参数即第一个参数, 以WS_EX_ 开头的 EDGE 结尾的 WS_EX_CLIENTEDGE 等等。

其它的查MSDN,不再赘述。

(1). edit控件:

ES_AUTOHSCROLL 和 ES_AUTOVSCROLL 当横向和纵向输入超过宽或高,则自动出现滑动条;可以不用WS_VSCORLL 和 WS_HSCORLL;

ES_MULTILINE 可支持多行;

ES_WANTRETURN 键入回车或程序输出 ‘\n‘ 时换行,必须与 ES_MULTILINE 组合;不选则不接受换行,直到行尾;

ES_READONLY 有些可视化编辑器也称 Lock,选择后不可键盘输入,但可以用 WM_SETTEXT 程序输出;

//------ TRUE 表示 LOCK    ---------//-------FALSE 表示 UNLOCK   ----------SendMessage(ctrlParams[1].hCtrl, EM_SETREADONLY, TRUE, 0);

//-------- 获取 edit 的内容 ----------------SendMessage(hCtrl, WM_GETTEXT, (WPARAM)lenth, (LPARAM)buf);

//------- 设置 edit 的内容,有字符长度限制,一般为 1kB ------------------SendMessage(hCtrl, WM_SETTEXT, 0, (LPARAM)buf);

//------ 选中字符 nStart 和 nEnd 可以相等 --------SendMessage(hCtrl, EM_GETSEL, (WPARAM)nStart, (LPARAM)nEnd);//------  nStart = -1 选中末尾 在末尾添加字符  ----------SendMessage(hCtrl, EM_REPLACESEL, 0, buf);

(2). listbox 控件:

LBS_NOTIFY 可以在主窗口接收到鼠标单击和双击 一个 list item 的消息;

LBS_MULTIPLESEL 可多选;

case WM_COOMAND:  switch(HIWORD(wParam))  {
        case LBN_DBLCLK:
       break;
        case LBN_SELCHANGE:
       break;
        default: break;
    }

//----- 添加一个 item --------index = SendMessage(hCtrl, LB_ADDSTRING, 0, lpName);//----- 删除一个 item --------SendMessage(hCtrl, LB_DELETESTRING, selIndex, 0);

//----- 选中一个 item --------SendMessage(hCtrl, LB_SETCURSEL, index, 0);//----- 获取选中的 item index --------index = SendMessage(hCtrl, LB_GETCURSEL, 0, 0);//--- 注意: 在 LBS_MULTIPLESEL 下使用 LB_SETSEL 和 LB_GETSEL

3.  窗口位置

//----- 获取窗口或控件的位置和大小 ----GetWindowRect(hwnd, &rect);//---- 设置 .... ---SetWindowPos(hwnd, HAND_TOPMOST, x, y, w, h, SWP_NOZORDER);
时间: 2024-12-11 19:36:32

win32 控件的创建和消息响应的相关文章

MFC动态创建控件(按钮)及添加消息响应

动态控件是指在需要时由Create()创建的控件,这与预先在对话框中放置的控件是不同的. 一.创建动态控件: 为了对照,我们先来看一下静态控件的创建. 放置静态控件时必须先建立一个容器,一般是对话框,这时我们在对话框编辑窗口中,从工具窗口中拖出所需控件放在对话框中即可,再适当修改控件ID,设置控件属性,一个静态控件就创建好了,当对话框被显示时,其上的控件也会显示. 静态控件不需要调用Create()函数来创建. 而创建动态控件有很大不同,以下以按钮为例,看一下动态控件的创建过程: 1.建立控件I

树控件CTreeCtrl 创建与双击响应

函数功能:创建一个树控件,并实现双击节点响应事件. 响应方法:在树控件上增加双击响应事件. 代码: 1.在OnInitDialog中:   CTreeCtrl *ctreectrl = (CTreeCtrl *)GetDlgItem(IDC_TREE1);  //调用ModifyStyle方法修改数控件Sytle  ctreectrl->ModifyStyle(0,TVS_HASLINES | TVS_LINESATROOT | TVS_HASBUTTONS);  //设置树控件字体颜色  ct

1.Win32控件-ToolTip的使用

最近在MFC中使用ToolTip时有诸多疑惑,查阅了不少资料,仔细研究了MSDN文档,在此记录使用方法和注意事项,与大家共勉. 1.理论 首先,思考一下,如果是我们自己来实现ToolTip(工具提示)的功能,要如何做呢?最自然的想法是:当我们把鼠标移动到希望提示的窗口时弹出一个提示窗口,我们把鼠标移出希望提示的窗口时关闭提示窗口.OK,微软也不会比我们聪明多少,它的实现基本思想就是这样的. 需要注意的是微软为了保证使用的方便,使用了设计模式中的观察者模式,这样使用方便,但是却造成了理解上的不易.

第三章 按钮控件的创建

一.前言 不知不觉一晃两个月过去,说来惭愧,在此期间alterto一直没有再研究DuiEngine.主要是因为DuiEngine的作者现在构建一个新的界面库soui,而笔者也一直处于观望状态,因为DuiEngine的作者说了以后可能就不维护DuiEngine了,要把主要的经历放在SOUI上.alterto顿时犹豫了,既然这样我还为DuiEngine做什么教程啊.于是这两个月的时间里一直都很犹豫,也没有再出DuiEngine相关的教程.现在看来这种焦躁对于一个优秀的程序猿来说着实不应该,这也正暴露

MFC控件编程之鼠标消息

MFC控件编程之鼠标消息 在MFC中鼠标消息.键盘消息我们很常用.所以说一下. 鼠标消息分为客户区消息.跟非客户区消息. 一丶客户区消息 我们可以处理消息.来进行我们相应的函数即可. MFC添加消息的话.可以自己在消息映射表中添加 .可以自己使用工具直接添加. 消息映射表添加 学习过MFC原理的应该知道.这里可以添加消息. 自己可以手动添加.我们也可以使用向导来添加. void CCDCDlg::OnLButtonDown(UINT nFlags, CPoint point) { // TODO

Swift学习之函数和简单地控件的创建

 今天还是重复昨天做的事情--敲代码,但唯一的不同就是所学的知识不同了,我们又进一步往深得层次学习了,感觉越来越有意思了,虽然临近结束了看着大家积极性越来越低了,但是我知道我不能这样,我要比别人付出的更多,更加的踏实才行,因为我知道我的基础不如别人,目标和动力也和他们不同,看着大家有的说是只要找到工作就好,还有的说只要每个月够花就好,担着真的是大家来这里学习的最终目的吗,如果是这样,真的还不如随便找个工作将就一下,也比这个整天做到这好多了,还交了那么贵得费用,所以何必呢,既然选择了这条路,既然当

MFC动态按钮的创建及其消息响应(自定义消息)

动态按钮(多个)的创建: 1.在类中声明并定义按钮控件的ID #define IDC_D_BTN 10000 2.在类的OnInitDialog()函数中动态创建按钮(建立按钮对象时最好建立对象的指针) 3.手动释放对象指针 下面是动态生成多个按钮的例子: CButton* btn = new CButton[5]; DWORD dwStyle = WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON; for(int i = 0; i < 5; i++) { btn[i]

MFC动态按钮的创建及其消息响应 和 自定义消息

原文链接: http://www.cnblogs.com/gaohongchen01/p/4046525.html 动态按钮(多个)的创建: 1.在类中声明并定义按钮控件的ID #define IDC_D_BTN 10000 2.在类的OnInitDialog()函数中动态创建按钮(建立按钮对象时最好建立对象的指针) 3.手动释放对象指针 下面是动态生成多个按钮的例子: CButton* btn = new CButton[5]; DWORD dwStyle = WS_CHILD | WS_VI

事件委托应用:在父控件中创建子控件,并接收值

传值过程使用委托方法 定义一个打开按扭,一个文本框 1 /// <summary> 2 /// 增加父控件 3 /// </summary> 4 public void AddParent(BaseControl ctl) 5 { 6 foreach (Control ct2 in this.Parent.Controls) 7 { 8 if (ct2.Name == ctl.Name) { 9 ct2.Focus(); 10 return; 11 } 12 } 13 ctl.Wi