如何在Windows下愉快的完成控件开发
在Win32环境下,怎么来创建常用的那些基本控件呢?通过MSDN可以知道,不管是创建窗口还是控件,都是通过CreateWindow或者CreateWindowEx这个函数来完成的,这两个函数除了多一个扩展风格之外,其他完全一样,下面以CreateWindow为例说明,该函数原型如下:
HWND CreateWindow(LPCTSTR lpClassName,
LPCTSTR lpWindowName,
DWORD dwStyle,
int x, int y, int nWidth, int nHeight,
HWND hWndParent,
HMENU hMenu,
HANDLE hInstance,
PVOID lpParam );
参数如下:
lpClassName:窗口或控件的类名
lpWindowName:窗口或控件的名字或者文本
dwStyle:窗口或控件风格
x,y,nWidth,nHeight:窗口或控件的坐标和宽高
hWndParent:窗口或控件的父窗口
hMenu:窗口菜单或者控件的ID
hInstance:窗口实例,控件一般为空
lpParam:窗口或控件参数,会被传递到创建消息中去
那么具体怎么实现各个基本的控件呢?下面我们来一一创建。
-
创建标签/静态文本:
CreateWindow(\”STATIC\”, TEXT(\”Test Text\”), WS_CHILD|WS_VISIBLE|SS_LEFT, 10, 10, 250, 30, hwnd, (HMENU)IDC_STATIC1, NULL, NULL);
通过该调用,就创建了一个静态文本。
-
创建button:
CreateWindow(\”BUTTON\”, TEXT(\”Open(&O)\”), WS_CHILD|WS_VISIBLE, 170, 110, 90, 30,
hwnd, (HMENU)IDC_BUTTON1, NULL, NULL);
-
创建编辑框:
CreateWindow( \”Edit\”, NULL, WS_CHILD|WS_VISIBLE|WS_BORDER, 10, 50, 250, 30,
hwnd, (HMENU)IDC_EDIT1, NULL, NULL);
-
创建控件容器Frame
CreateWindow(\”BUTTON\”, TEXT(\”颜色\”), WS_CHILD|WS_VISIBLE|BS_GROUPBOX, 360, 90, 130, 140, hwnd, (HMENU)IDC_FRAME, NULL, NULL);
-
创建列表框:
CreateWindow(\”LISTBOX\”, NULL, WS_CHILD|WS_VISIBLE|LBS_STANDARD,
170, 150, 180, 100, hwnd, (HMENU)IDC_LISTBOX, NULL, NULL);
-
创建组合框:
CreateWindow(\”COMBOBOX\”, NULL, WS_CHILD|WS_VISIBLE|WS_VSCROLL|CBS_SIMPLE,
500, 10, 190, 150, hwnd, (HMENU)IDL_ComboBoxSpl, NULL, NULL);
这些控件创建出来的效果如下:
这些控件可是不用MFC中的方式创建,纯手工打造,怎么样?是不是很简单,赶快去试试吧。
事实上,windows的所有控件都是用这个函数创建的,只是不同的控件的类不一样,更多的控件可以查MSDN。
大家如果对编程感兴趣,想了解更多的编程知识,解决编程问题,高手帮忙解决入门疑惑,我们这里有java高手,C++/C高手,windows/Linux高手,android/ios高手,请大家关注我的微信公众号:程序员互动联盟(coder_online)
你想要的WinForm界面开发教程在这里 – 如何使用自定义用户控件
DevExpress Winforms Controls 内置140多个UI控件和库,完美构建流畅、美观且易于使用的应用程序。
点击“了解更多”获取DevExpress WinForm v20.1完整版下载
在很多时候,我们做一些非常规化的界面的时候,往往需要创建一些用户控件,在其中绘制好一些基础的界面块,作为后续重复使用的一个单元,用户控件同时也可以封装处理一些简单的逻辑。在开发Winform各种类型项目,我都时不时需要定制一些特殊的用户控件,以方便在界面模块中反复使用。我们一般是在自定义的用户控件里面,添加各种各样的界面控件元素,或者封装一些特殊的函数处理共外部调用等。本篇随笔主要介绍基于DevExpress的Winform开发经验,介绍一个类似看板信息的用户控件,并在TabelLayout和StackLayout布局控件中进行展示。
一、用户控件界面的处理
在偶尔的一个场合下,看到一个牙医管家的软件界面做的非常不错,其中有一个预约列表的界面感觉非常好,如下界面所示。
其中它的每个用户信息列表里面,都是一个综合信息的展示,非常直观,估计应该是用户自定义控件做的。
在其中里面,有不同的字体,各式图标,以及内容的信息展示, 这个我在DevExpress的列表控件里面,没有看到可以如此定义列表内容的,在DevExpress的GridView里面有一个看板模板的定义有点接近,但是试了一下,可调性不好,于是放弃寻求其他接近方案,玩遍DevExpress的控件后,发现最好的方式应该是自定义用户控件的方式来解决这个界面问题。
花了一点时间,制作了一个用户控件,在其中添加一个LayoutControl方便控制布局,添加一些标签以及设置了一些图标,得到下图所示。
左侧的颜色条由于使用Group控件,因此宽度暂时无法调整,如果介意大小,我们可以在其中在创建一个LayoutControl,然后在其中方式内容即可。
我们改变布局,然后添加一个颜色块,得到类似界面如下所示。
我们来定义一下用户控件的源码部分,修改其中源码,增加对应的属性,方便动态设置用户控件的相关属性,如颜色块,项目背景色,以及绑定的对象信息等内容。
然后在界面加载完毕后,设置对应的信息和颜色信息,如下代码所示。
但我们鼠标浮动在项目上或者离开的时候,或者单击某项的时候,我们变换下颜色,方便区分显示。
完成这些后,我们需要在窗体上对内容进行初始化。
最后我们看看界面的效果如下所示
或者下面这样的界面布局。
如果嫌弃边框红色不好看,我们 可以修改边框为灰色调一点的,这样总体看起来效果如下所示。
得到和我们最终需要的界面很接近了。
一般除了悬浮鼠标颜色变化外,控件单击后,我们会设置不同的背景色,以示区分。
一般列表界面中,我们除了支持鼠标移动、单击变色的效果外,我们还希望支持通过键盘箭头上下键进行上下浏览项目。我们如果需要使用键盘的按键,需要设置窗体的KeyPreview属性为True,
然后跟踪按键的事件即可,如下所示。
按键事件捕捉处理如下所示,主要就是判断选中的用户控件,并对面板的子控件的选中效果进行处理。
界面中用户控件的切换选中效果,需要先清空之前所有的选择,然后在设置新的选中控件,所以还需要对控件触发单击事件进行处理,如下所示。
如下效果所示。
二、TabelLayout和StackLayout布局控件的介绍和使用
我们在做Winform开发的时候,一般知道,微软传统Winform的布局提供两个控件,FlowLayoutPanel和TableLayoutPanel,一个是流式布局,一个是表格布局,各有各的用处。流式布局主要就是按照顺序挨个放置控件,表格布局主要按照表格的定义的行列单元格,严格放置控件,表格单元格控制强度更大,而且控件具有拉伸效果。
对于DevExpress,我们一般还是倾向于采用它提供给的控件来做界面,可以很好融合它的皮肤效果,相对于Winform传统两个布局控件,DevExpress提供了两个封装效果相当的控件布局StackPanel和 TablePanel,他们的效果实现大同效果,不过调用的接口不同。
对于两个控件,我们希望里面的内容自动出现滚动条,那么设置属性AutoScroll 为True即可,如下代码所示。
而StackPanel另外需要LayoutDirection,也就是控件顺序展现的方式,如下代码所示。
使用StackPanel面板来测试展示用户控件列表的界面代码如下所示。
对于表格布局TablePanel控件来说,使用初始化控件的方式也差不多,不过有个别地方注意即可。
添加控件的时候,需要注意下面的代码,才能正常展示控件信息,否则无法看到用户控件。
最后对比下效果,左边是TablePanel,右边是StackPanel展现出来的效果。
以上就是界面如何在DevExpress开发中使用各种用户控件进行用户控件的创建、以及实现鼠标进入、移出、单击的不同效果,以及实现键盘上下箭头按键的事件选中效果,并介绍DevExpress中两个布局控件TabelPanel和StackPanel的正常使用,达到展示控件信息的作用。
本文转载自-伍华聪
WinCC中的.Net控件开发技巧
WinCC不但支持ActiveX控件,也支持.Net控件。借助于.Net Framework的博大精深,我们完全可以开发一些高级控件以拓展WinCC功能。
因为WinCC平台的特殊性,为WinCC或者其它组态软件开发.Net控件有一些地方需要特别注意。如果我们不能对平台特性有所了解,在控件开发过程中难免会走弯路。我们团队长期致力于WinCC平台上的.Net控件开发,在多年的控件开发过程中,碰到了不少问题。今天和大家分享一个比较典型的问题。
我们的.Net控件在加载时有时需要根据属性值进行初始化,比如控件的背景色,多语言或者其它一些功能等。如果这些属性在WinCC中是通过静态值传递那么没有任何问题。如果是通过WinCC的变量动态传递那么就会发现控件无法进行初始化。因为控件在加载时获取不到变量值而导致的初始化失败。这是为何呢?
图1 控件属性传递静态或者动态值
因为在.Net中,我们的控件属性一般采用简化的书写方式。
上面的代码中,初始化代码放在了控件的Load事件中。这种写法对于静态值传递是没有问题的。但是如果传递的是动态值那么就会初始化失败。这是因为在.Net控件加载时,变量的当前值还没有被刷新。可能当控件的Load事件执行完成后变量值才更新。所以导致控件的初始化失败。对于这种问题,我们需要采用完整的自定义属性语法。
在上面的代码中,当属性值更新时调用单独的方法进行初始化,这样就可以避免.Net控件在WinCC画面中的初始化失败问题了。
本文作者及来源:Renderbus瑞云渲染农场https://www.renderbus.com
文章为作者独立观点不代本网立场,未经允许不得转载。