整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

Qt编写地图综合应用24-miniblink内核

Qt编写地图综合应用24-miniblink内核

# 一、前言

用Qt做项目过程中,遇到需要用到浏览器控件的项目,可能都会绕不开一个问题,那就是从Qt5.6版本开始mingw编译器的Qt构建套件,不再提供浏览器控件了,之前还可以用webkit控件,这下很多项目要么选择5.6以下版本,要么选择msvc的构建套件,而且大部分的msvc构建套件还不自带浏览器控件,也需要自己编译,只有原配的构建套件比如Qt5.9+VS2015、Qt5.12+VS2017这种搭配才可能有浏览器控件,不然就算你勾选了浏览器控件也不会安装,这样就使得很多依赖浏览器控件的项目比较被动,于是必须寻找一个轻量级的浏览器控件来替代,比如cef、miniblink,个人更倾向于miniblink,用法极其简单,依赖极其精简就一个dll,在linux和mac系统上本来qt就一直会有浏览器控件,所以也就不涉及到跨平台的问题,所以miniblink暂支持windows的缺点也就不算缺点了。

miniblink是一个追求极致小巧的浏览器内核项目,全世界第三大流行的浏览器内核控件。其基于chromium最新版内核,去除了chromium所有多余的部件,只保留最基本的排版引擎blink。miniblink保持了10M左右的极简大小,是所有同类产品最小的体积,同时支持windows xp、npapi。miniblink的作者非常牛逼,QQ昵称叫扫地僧,犹如天龙八部中的扫地僧一般,极其隐秘又武功极高,精通各种绝技,确实相当的屌。

qt+miniblink用法步骤:

- 第一步:调用wkeSetWkeDllPath函数加载dll文件路径,一个项目只需要执行一次。

- 第二步:调用wkeInitialize初始化动态库,一个项目只需要执行一次。

- 第三步:调用wkeCreateWebWindow创建一个浏览器控件,传入句柄。

- 第四步:调用wkeOnLoadingFinish注册回调加载完成信号,有需要才注册。

- 第五步:调用wkeJsBindFunction注册回调接收数据的方法,一定要放在这里在网页加载前执行。

- 第六步:调用wkeLoadURL加载网址、wkeLoadFile加载网页文件、wkeLoadHtmlWithBaseUrl加载网页内容。

- 第七步:调用wkeRunJS执行js函数,超级简单。

- 第八步:调用wkeFinalize释放资源,只要执行一次,在整个项目结束的时候。

qt+miniblink完整demo开源地址:

[https://gitee.com/feiyangqingyun/QWidgetDemo/tree/master/miniblink](https://gitee.com/feiyangqingyun/QWidgetDemo/tree/master/miniblink)

[https://github.com/feiyangqingyun/QWidgetDemo/tree/master/miniblink](https://github.com/feiyangqingyun/QWidgetDemo/tree/master/miniblink)

## 二、功能特点

1. 同时支持在线地图和离线地图两种模式。

2. 同时支持webkit内核、webengine内核、miniblink内核、IE内核。

3. 支持设置多个标注点,信息包括名称、地址、经纬度。

4. 可设置地图是否可单击、拖动、鼠标滚轮缩放。

5. 可设置协议版本、秘钥、主题样式、中心坐标、中心城市、地理编码位置等。

6. 可设置地图缩放比例和级别,缩略图、比例尺、路况信息等控件的可见。

7. 支持地图交互,比如鼠标按下获取对应位置的经纬度。

8. 支持查询路线,可设置起点位置、终点位置、路线模式、路线方式、路线方案(最少时间、最少换乘、最少步行、不乘地铁、最短距离、避开高速)。

9. 可显示点线面工具,可直接在地图上划线、点、矩形、圆形等。

10. 可设置行政区划,指定某个城市区域绘制图层,在线地图自动输出行政区划边界点集合到js文件给离线地图使用。

11. 可静态或者动态添加多个覆盖物。支持点、折线、多边形、矩形、圆形、弧线、点聚合等。

12. 提供函数接口处理经纬度解析成地址和地址解析成经纬度坐标。

13. 提供的demo直接可以单独选点执行对应的处理比如路线查询。

14. 可以拿到路线查询到的点坐标信息集合,比如用于机器人坐标导航等。

15. 封装了丰富的函数比如删除指定点和所有点,删除指定覆盖物和所有覆盖物等。

16. 标注点弹框信息可以自定义内容,标准html格式。

17. 标注点单击事件可选 0-不处理 1-自己弹框 2-发送信号。

18. 标注点可设置动画效果 0-不处理 1-跳动 2-坠落

19. 标注点可设置本地图片文件等。

20. 函数接口友好和统一,使用简单方便,就一个类。

21. 支持js动态交互添加点、删除点、清空点、重置点,不需要刷新页面。

22. 支持任意Qt版本、任意系统、任意编译器。

## 三、体验地址

1. 体验地址:[https://pan.baidu.com/s/1ZxG-oyUKe286LPMPxOrO2A](https://pan.baidu.com/s/1ZxG-oyUKe286LPMPxOrO2A) 提取码:o05q 文件名:bin_map.zip

2. 国内站点:[https://gitee.com/feiyangqingyun](https://gitee.com/feiyangqingyun)

3. 国际站点:[https://github.com/feiyangqingyun](https://github.com/feiyangqingyun)

4. 个人主页:[https://blog.csdn.net/feiyangqingyun](https://blog.csdn.net/feiyangqingyun)

5. 知乎主页:[https://www.zhihu.com/people/feiyangqingyun/](https://www.zhihu.com/people/feiyangqingyun/)

## 四、效果图

## 五、相关代码

载说明:原创不易,未经授权,谢绝任何形式的转载

本文章系《Unleashing the Power of CSS》(释放CSS的力量,暂且这么翻译吧)一书的学习笔记,希望通本书的学习,系统的梳理下CSS相关的高级新特性。本篇文章是其第一部分,由于全书英文版,理解和阅读会有偏差,欢迎各位大佬们指正,我们一起共同提高。

开篇

在过去的几年里,CSS引入了许多新的改进功能,并且跨浏览器的努力提高了兼容性,使这门语言比以往任何时候都更加稳定!让我们回顾一下布局、响应式设计、元素样式、属性和选择器方面的这些增强功能,并且也来看一看即将推出的新功能。

现在,浏览器之间新功能的协调实施意味着我们几乎可以在它们出现的同时开始使用这些功能,这对于保持我们的样式表尽可能简单非常有帮助。现在,只需几个单行属性就可以替代多行的hacky解决方案。在某些情况下,新提供的功能甚至可能意味着我们可以删除以前需要的JavaScript解决方案,以解决旧限制!

新的和增强的属性

Custom Properties(自定义属性或变量)

随着Internet Explorer 11的生命周期进入尾声,现在是时候开始使用自定义属性了!自定义属性,也被称为“CSS变量”,允许我们定义可在样式表中重复使用的值。自定义属性可以作为属性的整个值或部分值使用,我们还可以在JavaScript中修改自定义属性。

aspect-ratio

一种新的属性可以消除“填充hack”,它是 aspect-ratio 。它按照其名称的意思,允许我们为元素定义一个纵横比。我所提到的 hack 通常用于保持视频嵌入的16:9比例。现在,通过这个属性和声明 aspect-ratio: 16/9 ,可以实现这个比例。它还是实现完美正方形的快速方法,使用 aspect-ratio: 1 即可。

这是一个代码演示,展示了如何使用 aspect-ratio 与旧属性 object-fit 结合使用,以保持一致的头像大小,无论原始图像的比例如何,而且不会扭曲图像。

Html部分

<ul class="avatar-list">
  <li>
    <figure>
      <img src='https://images.unsplash.com/photo-1640952131659-49a06dd90ad2?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwzMjM4NDZ8MHwxfHJhbmRvbXx8fHx8fHx8fDE2NjkwNTE0MTQ&ixlib=rb-4.0.3&q=80&w=400' alt=''>
      <figcaption>Aaron Fizzle</figcaption>
    </figure>
  </li>
  <li>
    <figure>
      <img src='https://images.unsplash.com/photo-1544725176-7c40e5a71c5e?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwzMjM4NDZ8MHwxfHJhbmRvbXx8fHx8fHx8fDE2NjkwNTE0MTQ&ixlib=rb-4.0.3&q=80&w=400' alt=''>
      <figcaption>Lily Sebastian</figcaption>
    </figure>
  </li>
  <li>
    <figure>
      <img src='https://images.unsplash.com/photo-1628157588553-5eeea00af15c?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwzMjM4NDZ8MHwxfHJhbmRvbXx8fHx8fHx8fDE2NjkwNTE1MTU&ixlib=rb-4.0.3&q=80&w=400' alt=''>
      <figcaption>Devon Albian</figcaption>
    </figure>
  </li>
</ul>

Css部分

.avatar-list img {
  /* Make it a square */
  aspect-ratio: 1;
  /* Fit the image to it's container without distortion */
  object-fit: cover;
  /* Make the square round */
  border-radius: 50%;
  width: 100%; /* Make sure the image fills the container */
  height: 100%; /* Make sure the image fills the container */
}

* {
  box-sizing: border-box;
  margin: 0;
}

html {
  height: 100%;
}

body {
  min-height: 100%;
  font-family: system-ui, sans-serif;
  display: grid;
  place-content: center;
  background-color: mediumvioletred;
  padding-inline: 1rem;
}

/* Standard responsive image fix */
img {
  max-width: 100%;
}

.avatar-list {
  list-style: none;
  padding: 0;
  background: #fff;
  border-radius: 0.5rem;
  box-shadow: 0.25rem 0.25rem 0.5rem -0.15rem hsl(0 0% 0% / 30%);
  border: 1px solid hsl(0 0% 0% / 10%);
}

.avatar-list li {
  position: relative;
  padding: 3%;
  font-size: 1.35rem;
  font-size: clamp(0.8rem, 0.8rem + 2cqi, 1.5rem);
  color: hsl(0 0% 45%);
  letter-spacing: 0.03em;
}

.avatar-list li + li::before {
  content: "";
  position: absolute;
  top: 0;
  left: calc(15% + 1rem);
  right: 3%;
  border-top: 1px solid hsl(0 0% 0% / 15%);
}

.avatar-list figure {
  display: grid;
  grid-template-columns: 15% 1fr;
  align-items: center;
  gap: 1rem;
}

https://codepen.io/SitePoint/pen/oNaNaao

Individual Transform Properties(个体变换属性)

浏览器中还新增了各自的变换属性。Chrome 104进行的CSS变换具有独立的属性。这些属性是 scale , rotate 和 translate ,您可以使用它们来单独定义变换的各个部分。

并非所有的转换函数都有相应的个体属性,例如 skewX() 和 matrix() 。

.target {
  translate: 50% 0;
  rotate: 30deg;
  scale: 1.2;
}

Logical Properties(逻辑属性)

CSS的Logical Properties(逻辑属性)是一种用于处理文本和布局的属性,它们考虑了文本流的逻辑方向而不是物理方向。在CSS中,文档可以采用不同的书写模式,例如从左到右(LTR)的水平书写模式和从右到左(RTL)的水平书写模式,以及垂直书写模式。Logical Properties的目标是使样式更加灵活,适应不同的书写模式,而不需要为每种书写模式都编写不同的样式。

如果我们要为国际受众管理内容,则可以考虑使用逻辑属性。适用于大多数 CSS 2.1 属性,逻辑变体考虑了文本的编写模式和流。对于标准的英文文本,我们将“左/右”换成“内联”,用“top/bottom”换成“block”:

.element {
  margin-block: 2rem;
}

如上例所示,逻辑属性还提供了一次设置两边的简写,其中 margin-block 水平写入模式等效于 set margin-top 和 margin-bottom 。

新的选择器

近期对CSS最有影响力的三个变化是:is、:where和:has伪类选择器。以下是它们的概述:

:is() ,它用于选择满足括号内任何选择器的元素。这个伪类可以帮助你编写更简洁和可维护的 CSS 代码,尤其是当你需要同时匹配多个选择器时。例如, :is(#id, a, .class) 将具有一个 id 的特异性。

:where 是一个 CSS 伪类选择器,它与 :is 伪类选择器类似,可以用于选择满足括号内任何选择器的元素。它的语法也与 :is 相似,但有一个重要的区别::where 不会影响优先级。

与 :is 不同,:where 不会增加或改变样式规则的优先级。这意味着,无论你在样式表中的什么位置使用 :where,它都不会改变选择器的权重,不会增加特异性(specificity),也不会影响其他样式规则的优先级。

这使得 :where 在一些情况下非常有用,特别是当你需要选择一组元素,但不希望影响其他选择器的优先级时。例如,假设你有一个已经存在的 CSS 样式表,其中包含了一些具有不同权重和特异性的样式规则,但你希望添加一个新的规则,同时不改变其他规则的优先级,你可以使用 :where 来实现这一点。

/* 不使用 :where */
.btn {
  background-color: #3498db;
}

/* 使用 :where,不影响其他规则的优先级 */
:where(.btn-primary, .btn-secondary, .btn-danger) {
  background-color: #3498db;
  color: white;
}

:has() 是期待已久的“父选择器”,它允许检查父元素是否包含特定的子元素,并对父元素进行样式设置,或者扩展为复合选择器以对子元素进行样式设置。(本系列教程中有关于 :has() 的完整教程。)

这个演示利用 :where() 、 :is() 和 :has() 来创建一个作者简介组件,根据是否有头像来改变网格显示属性。

<aside class="bio">
  <img class="avatar" src='https://images.unsplash.com/photo-1554727242-741c14fa561c?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwzMjM4NDZ8MHwxfHJhbmRvbXx8fHx8fHx8fDE2NzExNDcxMjM&ixlib=rb-4.0.3&q=80&w=400' alt=''>
  <h2>Jane Stylesheet</h2>
  <p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Ipsa quam aspernatur, nobis ex rem iure!</p>
</aside>

<aside class="bio">
  <h2>Bob Markup</h2>
  <p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Aliquam neque a blanditiis praesentium impedit.</p>
</aside>
* {
  box-sizing: border-box;
  margin: 0;
}

body {
  font-family: system-ui;
  padding: 3vw;
  background-color: mediumvioletred;
}

img {
  display: block;
  max-width: 100%;
}

:where(* + *) {
  margin-block-start: 1rem;
}

.bio :is(h2, p) {
  margin-block-start: 0;
}

.bio {
  background-color: white;
  display: grid;
  gap: 1rem;
  border-radius: 0.5rem;
  padding: 5%;
  box-shadow: 0 0 10px -2px hsl(0 0% 0% / 85%);
}

.bio:has(.avatar) {
  grid-template-areas: "avatar name" "avatar bio";
  grid-template-columns: min(25vw, 80px) 1fr;
}

.bio:has(.avatar) :not(.avatar) {
  grid-column: bio;
}

.bio .avatar {
  grid-area: avatar;
}

.avatar {
  aspect-ratio: 1;
  object-fit: cover;
  border-radius: 50%;
}

https://codepen.io/SitePoint/pen/WNaeJOy

:has() 在撰写本文时仅部分浏览器支持,因此上述演示目前仅适用于Safari 15.4+和Chrome/Edge 105+,以及启用 layout.css.has-selector.enabled 标志的Firefox 103。

增强的 :not()

最近,:not() 选择器已经增强,可以接受一个选择器列表,这使得 :not(nav a, footer a) 成为有效的语法。然而,与 :is() 和 :where() 不同,这个更新并没有使 :not() 对于无效的选择器更加宽容,因为需要保持向后兼容性支持。

焦点选择器

下面的两个新伪类都会影响焦点行为。当子元素处于焦点状态时,可以使用 :focus-within 选择器来为父元素设置样式,比如表单字段周围的容器。对于元素焦点样式,我们现在可以使用 :focus-visible ,它最近取代了 :focus 成为跨浏览器默认的元素焦点样式。

下面是 :focus-within 的一些关键点和与 :focus 的区别:

:focus-within 选择器:

  • 选择包含有焦点元素的祖先元素。
  • 当用户在页面上的某个元素上聚焦(例如,输入框或按钮),并且该元素是其祖先元素(例如,一个表单或一个包含该输入框的 div)内的子元素时,祖先元素将匹配 :focus-within。
  • 通常用于创建包含输入框的表单的外观,以在用户输入时改变整个表单的样式或行为。

:focus 选择器:

  • 选择当前具有焦点的元素。
  • 通常用于样式化或增强当前拥有焦点的元素,例如,更改输入框的边框颜色或文本区域的背景颜色。
  • 不会选择包含有焦点元素的父元素。

假设有以下 HTML 结构:

<div class="container">
  <input type="text" id="username" />
  <input type="password" id="password" />
</div>

现在,我们可以使用 :focus 和 :focus-within 来添加一些样式:

/* 当输入框具有焦点时,样式化输入框本身 */
input:focus {
  border: 2px solid blue;
}

/* 当包含有焦点输入框的容器具有焦点时,样式化整个容器 */
.container:focus-within {
  background-color: lightgray;
}

在上面的示例中,当用户点击输入框时,输入框自身会具有蓝色边框(使用 :focus 选择器),同时包含有焦点输入框的容器 .container 也会变为灰色背景(使用 :focus-within 选择器)。这使得用户在与表单交互时,不仅输入框本身被强调,整个表单容器也能够获得焦点的可视反馈。

总之,:focus-within 选择器用于选择包含有焦点元素的祖先元素,而 :focus 选择器用于样式化具有焦点的元素本身。这两个选择器可以一起使用,以创建更丰富的交互体验。

::marker

最后但并非最不重要的是,伪元素 ::marker 允许我们直接选择和样式化 <ul> 和 <ol> 元素上的列表项符号和编号,以及 <summary> 元素的“插入符号”。这意味着我们可以使用 ::marker 来仅改变列表的符号颜色!

元素样式的改进

accent-color

框架和设计系统最常见的改变之一是本地表单字段样式。在 accent-color 属性出现之前,甚至改变表单元素的颜色都是不可能的。现在,我们可以通过 accent-color 影响单选按钮和复选框的选中外观,以及范围输入和进度元素的填充状态。

下面是一个示例,演示了如何使用 accent-color 属性:

a {
  accent-color: blue;
}

在这个示例中,accent-color 属性应用于所有链接元素 (<a>),并将链接的强调颜色设置为蓝色。

color-scheme

如果我们想要根据用户的浅色或深色模式偏好来调整我们的界面,可以使用自定义切换和/或 prefers-color-scheme 查询,我们还应该添加color-scheme属性。这提供了一种选择,可以适应浏览器的UI元素,如滚动条、表单控件和CSS系统颜色。而 accent-color 让我们可以为一些元素选择自定义颜色, color-scheme 则要求浏览器进行更多的适应,例如要求文本输入和文本区域以浅色或深色主题显示。

建议将此应用于 :root 元素,并按照网站默认值的顺序列出这些值。换句话说,如果我们默认为浅色但支持深色,则列出 light dark 。如果我们默认为深色但支持浅色,则列出 dark light 。如果我们只支持 light 或 dark ,只需列出单个值即可:

:root {
  color-scheme: light dark;
}

例如,你可以这样定义一个明亮模式和一个暗模式的颜色方案:

/* 明亮模式 */
@media (prefers-color-scheme: light) {
  body {
    background-color: white;
    color: black;
  }
}

/* 暗模式 */
@media (prefers-color-scheme: dark) {
  body {
    background-color: black;
    color: white;
  }
}

Forced-color Modes (强制色彩模式)

为了完善关于颜色的主题,还有一个偏好查询和属性对需要讨论。在Windows上,一些用户需要“高对比度”主题,其中操作系统强制使用减少的调色板来代替我们定义的颜色。调色板填充系统颜色的值,替换背景、文本、按钮和链接颜色等内容,而像盒子阴影这样的样式则被删除。

如果我们有使用颜色的关键样式,比如产品颜色样本,我们可能需要在 forced-colors 属性旁边使用 force-color-adjust 查询。根据以下配对,我们原始的 .swatch 颜色将被保留:

@media (forced-colors: active) {
  .swatch {
    forced-color-adjust: none;
  }
}

强制使用颜色应该谨慎使用,只有在用户体验受到高对比度主题颜色交换的负面影响时才使用。如果您对高对比度主题不熟悉,请了解如何使用强制颜色进行样式设置。

Text Decoration

在文本装饰方面,我们现在有可用的 text-underline-offset 属性,它允许我们调整定义的 text-decoration 的位置,使其偏离原始位置。 text-decoration-thickness 伴随属性允许我们控制 text-decoration 的描边粗细。结合使用这些属性,可以消除使用边框甚至伪元素来样式化链接下划线的hack。

以下样式规则将文本下划线向下偏移 2 像素:

a {
  text-decoration: underline;
  text-underline-offset: 2px;
}

结束

由于文章内容篇幅有限,今天的内容就分享到这里,文章结尾,我想提醒您,文章的创作不易,如果您喜欢我的分享,请别忘了点赞和转发,让更多有需要的人看到。同时,如果您想获取更多前端技术的知识,欢迎关注我,您的支持将是我分享最大的动力。我会持续输出更多内容,敬请期待。

FC控件:

Windows标准控件:

windows标准控件由Windows 操作系统提供,在Windows 95中还提供了一些新增的控件。所有这些控件对象都是可编程的,我们可以使用Visual C++提供的对话框编辑器把它们添加到对话框中。Microsoft基础类库(MFC)提供了封装这些控件的类,它们列于表6.1。

在MFC 中,类CWnd是所有窗口类的基类,很自然的,它也是所控件类的基类。

Windows标准控件在以下环境下提供:

windows 95

Windows NT 3.51及以后版本

win32s 1.3

注意:visual C++4.2及以后版本不再支持Win32s.

MFC基本常用控件基本用法

VC++控件工具箱:

按钮(Button)

用来接收用户的命令,应用程序在接收到用户命令后,通常需要进行一些后台工作。按钮可以响应单击或双击动作,在按钮接收到鼠标动作后,向其父窗口发送相应的控件通知,用户可以对这些控件通知进行消息映射,从而进行相应的处理。

在一个对话框中,可以定义一个默认按钮,这只要选中按钮属性中的“Default”选项。如果在对话框活动的时候按下了Enter键,则等同于单击了默认按钮。MFC提供了CButton类支持按钮控件。

复选框(Check Box)

用来显示某种可能的选择,该项选择是独立的,用户可以选中或取消该选项。在选项被选中的时候核选标记出现,选项被取消时核选标记消失。MFC中由CButton类对核选框进行支持,用户可以通过SetCheck()函数和GetCheck()函数设置或获取核选框当前的状态

BST_UNCHECKED==((CButton*)GetDlgItem(IDC_CHECK_RES1))->GetCheck()
((CButton*)GetDlgItem(IDC_CHECK_RES1))->SetCheck(true);		

编辑框(Edit Control)

用来接收用户输入的字符串通过选择编辑框的选项,编辑框可以接收字符串、数字、密码等;编辑框还可以设置成接收多行字符串的模式;可以自动进行大小写转换。编辑框可能向父窗口发送多种控件通知,如果用户需要,可以对这些控件通知进行处理。MFC提供了CEdit类支持编辑框控件

GetDlgItem(IDC_***)->SetWindowText(Cstring);
 
GetDlgItem(IDC_***)->GetWindowText(Cstring);

组合框(Combo Box)

列表框和编辑框的组合,用户除了可以在列表中对已经存在的选项进行选择外,还可以输入新的选择。MFC提供了CComboBox类对组合框控件进行支持。

CComboBox * AAA=(CComboBox*)(GetDlgItem(IDC_***));
 
AAA->AddString(_T("***"));
 
AAA->SelectString(0, _T("***"));
 
AAA->SetCurSel(0);
 
 
int nSel=AAA->GetCurSel();
 
AAA->GetLBText(nSel, Cstring);
 
if(strType.Trim()==_T("***"))

列表框(List Box)

用来选择一系列的可能选择,用户通过滚动条可以在这些选择中浏览。在列表框中,可以进行单项选择,也可以进行多项选择,这取决于用户在控件属性对话框中的设置。MFC提供了CListBox类对列表框控件进行支持。

组成框(Group Box)

用来包围具有逻辑关系的一组控件,在这些控件的周围加上边界和标题。需注意的是,组成框仅仅是在视觉效果上对控件进行“成组”,真正的“成组”工作还需要另外一些工作。仅仅在视觉上展现出一组的逻辑关系,并不添加任何代码

单选按钮(Radio Button)

用来选择某种可能的选择,与 (Check Box)复选框不同,该选项不是独立的

一般是几个单选按钮组成一组同组中的单选按钮仅有一个按钮被选中

MFC同样使用CButton类对单选按钮控件进行支持

SetCheck()函数和GetCheck()函数对单选按钮也是适用的。

静态文本(Static Text)

用来在指定的位置显示特定的字符串一般用来标识附近另一个控件的内容。显示在静态文本控件中的字符串一般不再改变,但是在需要的时候,必须为其指定一个不同食物ID号,通过调用相应的函数来进行设置。MFC提供了CStatic类支持静态控件

图形控件(Picture Control)

显示位图(Bitmap)和图标(Icon),图形绘制与显示,主要是其方形的区域适合显示,同样方形区域也可利用(Static Text)静态文本框。

滚动条(Scroll Bar)

这包括水平滚动条和垂直滚动条,除了在视觉效果上的方向不同外,水平滚动条在被滚动时发生WM_HSCROLL消息,而垂直滚动条在被滚动时发送WM_VSCROLL消息MFC提供了CScrollBar进行支持

滑块控件(Slider Control)

通常用来在程序中接受一系列离散的数值

用户可以设置滑块控件的取值范围,并可以为控件加上刻度标记以显示特定位置的含义。

MFC提供了CSliderCtrl类进行支持

微调按钮(Spin Button)

包括一对紧靠在一起的上下箭头,使用微调按钮可以增大或者缩小某个特定的数值。

微调按钮往往都需要一个“伙伴”控件,这通常都是一个编辑框

当微调按钮的向上箭头被单击时,编辑框中的数字就增大;反之则减小MFC提供了CPinButtonCtrl类进行支持

进度条(Progress Control)

进行一项需要较长时间的操作时来反应当前的进度

当操作的进度不断前进时,进度条就用特色颜色填充进度条框。用户可以设定进度条的范围和当前位置。

MFC提供了CProgressCtrl类进行支持

CProgressCtrl* progressbar=(CProgressCtrl*)GetDlgItem(IDC_PROGRESS_1);
 
progressbar->SetRange(0, 4);
 
progressbar->SetPos(0);

热键控制(Hot Key)

热键控件看起来就像一个编辑框,但是在热键控件中能够立刻反应用户刚刚按下的键组合,这在设置程序的热键时特别有用。

热键控件只是在“视觉”上显示了按键组合,设置热键的工作还需要用户添加代码完成。

MFC提供了CHotKey类进行支持

列表控制(List Control)

按一定的排列顺序显示一系列带图标的字符串。

列表控件提供了四种显示模式:大图标(Icon)、小图标(Small Icon)、列表(List)和报表(Report)

用户可以向列表控件中添加新的项,也可以控制列表控件的显示模式。

MFC提供了CListCtrl类进行支持

初始化:

 struct INFO { int id; CString time; CString type; }info; CString id; int nRow=0; id.Format(_T("%d"), info.id); m_ListCtrl.InsertItem(nRow,id); m_ListCtrl.SetItemText(nRow, 1, info.time); m_ListCtrl.SetItemText(nRow, 2, info.type); nRow ++;


添加记录:

 
struct INFO
 
{
 
int id;
 
CString time;
 
CString type;
 
}info;
 
CString id;
 
int nRow=0;
 
id.Format(_T("%d"), info.id);
 
m_ListCtrl.InsertItem(nRow,id);
 
m_ListCtrl.SetItemText(nRow, 1, info.time);
 
m_ListCtrl.SetItemText(nRow, 2, info.type);
 
nRow ++;

树形控件(Tree Control)

显示一系列项目的层次关系最典型的例子是显示磁盘上的文件与文件夹

如果有子项目的话,单击树形控件中的项目可以展开或者收缩其子项目

MFC提供了CTreeCtrl类进行支持

初始化

   void CConfigDlg::OnSize(UINT nType, int cx, int cy) { CDialog::OnSize(nType, cx, cy); // TODO: 在此处添加消息处理程序代码  CRect rcWnd; GetClientRect(&rcWnd);  CRect rcChild=rcWnd; rcChild.top=rcWnd.top+10; rcChild.bottom -=10; rcChild.left +=160; rcChild.right -=10; CRect laneRect=rcChild;  if(::IsWindow(m_1Dlg)) m_1Dlg.MoveWindow(rcChild);  if(::IsWindow(m_2Dlg)) m_2Dlg.MoveWindow(rcChild);   if ( ::IsWindow( pTree.GetSafeHwnd() ) ) { pTree.MoveWindow(rcWnd.left+10,rcWnd.top+30,130,350,1); } }

树节点切换

   void CConfigDlg::OnTvnSelchangedTree(NMHDR *pNMHDR, LRESULT *pResult) { LPNMTREEVIEW pNMTreeView=reinterpret_cast<LPNMTREEVIEW>(pNMHDR); // TODO: 在此添加控件通知处理程序代码 HTREEITEM hSelected=pNMTreeView->itemNew.hItem; if(hSelected!=NULL) { pTree.SelectItem(hSelected); int nDat=pTree.GetItemData(hSelected);  switch(nDat) { case 1: /*MessageBox(_T("YNAME"));*/ if(m_pPreWnd) m_pPreWnd->ShowWindow(SW_HIDE);  m_1Dlg.ShowWindow(SW_SHOW); m_pPreWnd=&m_1Dlg; break; case 3: /*MessageBox(_T("XNAME"));*/ if(m_pPreWnd) m_pPreWnd->ShowWindow(SW_HIDE);  m_2Dlg.ShowWindow(SW_SHOW); m_pPreWnd=&m_2Dlg; break;  default: break; } } *pResult=0; }

改变位置

   void CConfigDlg::OnSize(UINT nType, int cx, int cy) { CDialog::OnSize(nType, cx, cy); // TODO: 在此处添加消息处理程序代码  CRect rcWnd; GetClientRect(&rcWnd);  CRect rcChild=rcWnd; rcChild.top=rcWnd.top+10; rcChild.bottom -=10; rcChild.left +=160; rcChild.right -=10; CRect laneRect=rcChild;  if(::IsWindow(m_1Dlg)) m_1Dlg.MoveWindow(rcChild);  if(::IsWindow(m_2Dlg)) m_2Dlg.MoveWindow(rcChild);   if ( ::IsWindow( pTree.GetSafeHwnd() ) ) { pTree.MoveWindow(rcWnd.left+10,rcWnd.top+30,130,350,1); } }

属性表控件(Tab Control)

包含大量的控件,可以满足用户显示或者获取大量数据分类显示的要求,典型例子是Windows任务栏每个程序标签。

每个属性表又分为好几个属性页,这些属性页由各自的标签进行区分,这些属性页中都可以包容其他控件

在显示属性表的时候,一次只能够显示一个属性页的全部内容,同时显示其他属性页的标签,用户通过单击标签打开相应的属性页。

MFC提供了CTabCtrl类进行支持

初始化绑定变量

m_tab_Light.DeleteAllItems();
 
m_LightParkingDlg.DestroyWindow();
 
m_LightStatusDlg.DestroyWindow();
 
m_tab_Light.InsertItem(0, _T("0001")); // 插入第一个标签
 
m_tab_Light.InsertItem(1, _T("0002")); // 插入第二个标签
 
 
CRect tabRect; // 标签控件客户区的位置和大小
 
m_tab_Light.GetClientRect(&tabRect); // 获取标签控件客户区Rect
 
// 调整tabRect,使其覆盖范围适合放置标签页
 
tabRect.left +=2;
 
tabRect.right -=1;
 
tabRect.top +=21;
 
tabRect.bottom -=2;
 
m_LightParkingDlg.Create(IDD_DIALOG_LIGHT_PARKING, &m_tab_Light); // 创建第一个标签页
 
m_LightStatusDlg.Create(IDD_DIALOG_LIGHT_STATUS, &m_tab_Light); // 创建第二个标签页
 
//m_LightParkingDlg.InitData();
 
m_LightParkingDlg.SetWindowPos(NULL, tabRect.left, tabRect.top, tabRect.Width(), tabRect.Height(),SWP_SHOWWINDOW);

控件页面切换

 CRect tabRect; // 标签控件客户区的位置和大小
 
m_tab_Light.GetClientRect(&tabRect); // 获取标签控件客户区Rect
 
// 调整tabRect,使其覆盖范围适合放置标签页
 
tabRect.left +=2;
 
tabRect.right -=1;
 
tabRect.top +=21;
 
tabRect.bottom -=2;
 
switch (m_tab_Light.GetCurSel())
 
{
 
 
case 0:
 
m_LightStatusDlg.SetWindowPos(NULL, tabRect.left, tabRect.top, tabRect.Width(), tabRect.Height(), SWP_HIDEWINDOW);
 
m_LightParkingDlg.SetWindowPos(NULL, tabRect.left, tabRect.top, tabRect.Width(), tabRect.Height(), SWP_SHOWWINDOW);
 
break;
 
case 1:
 
m_LightParkingDlg.SetWindowPos(NULL, tabRect.left, tabRect.top, tabRect.Width(), tabRect.Height(), SWP_HIDEWINDOW);
 
m_LightStatusDlg.SetWindowPos(NULL, tabRect.left, tabRect.top, tabRect.Width(), tabRect.Height(), SWP_SHOWWINDOW);
 
break;
 
 
}

动画控件(Animation):

用来播放一段AVI格式的视频剪辑。用户可以控制视频剪辑的播放、停止和定位,但也仅限于这些功能。动画控件设置不能播放音频剪辑,如果用户需要更高层次的视频或者音频的支持,请选用MCIWnd控件

MFC提供了CAnimateCtrl类对动画控件进行支持

高级编辑框(Rich Edit)

编辑控件(Edit Control)功能的扩展。在高级编辑框中,除了简单的输入和编辑字符串外,用户还可以为字符或段落指定特定的格式,用户甚至还可以向高级编辑框中插入OLE项

高级编辑框基本上实现了一个带格式的文本编辑器功能,而只需要用户添加少量的接口。

MFC提供了CRichEditCtrl类进行支持

日期/时间选择器(Date Time Picker)

向用户提供了一种直观的选择日期和时间的方法、日期/时间选择器在外观上类似于一个组合框,但是当用户单击下拉箭头时就会展开一个日历控件供用户选择,而一旦用户做出了选择,日期/时间选择器会自动显示新的日期/时间。MFC提供了CDateTimeCtrl类进行支持。

SYSTEMTIME times_1; //开始时间日期
 
SYSTEMTIME timee_1; //结束时间日期
 
 
CDateTimeCtrl* dtPickctrs_1=(CDateTimeCtrl*)GetDlgItem(IDC_DATETIMEPICKER_START1); //获取时间控件句柄
 
CDateTimeCtrl* dtPickctre_1=(CDateTimeCtrl*)GetDlgItem(IDC_DATETIMEPICKER_END1);
 
 
memset(×_1,0,sizeof(times_1)); //时钟初始化
 
memset(&timee_1,0,sizeof(timee_1));
 
 
dtPickctrs_1->GetTime(×_1); //获取控件所选时间,保存至变量
 
dtPickctre_1->GetTime(&timee_1);
 
 
 
CString strTimeStart; //将时间转换为字符串
 
strTimeStart.Format(_T("%04d-%02d-%02d %02d:%02d:%02d"), times_1.wYear,times_1.wMonth,times_1.wDay,times_2.wHour,times_2.wMinute,times_2.wSecond);
 
CString strTimeEnd;
 
strTimeEnd.Format(_T("%04d-%02d-%02d %02d:%02d:%02d"), timee_1.wYear,timee_1.wMonth,timee_1.wDay,timee_2.wHour,timee_2.wMinute,timee_2.wSecond);
 


获取系统时间

SYSTEMTIME time;
 
::GetLocalTime(&time);

日历控件(Month Calender)

如下图,看似与真正的日历类似,操作也类似,直观的为用户提供了观察和显示当前日期的途径。MFC提供了CMonthCalCtrl类进行支持

IP地址控件(IP Adress)

IP地址控件用来输入和编辑IP地址MFC提供了CIPAddressCtrl类进行支持

该控件外观类似于一个编辑框,但是可以自动对输入的字符按3个一组进行区分和加间隔圆点。IP地址控件为开发支持Internet技术的程序提供了方便。

扩展组合框(Extended Combo Box)

在普通组合框(Combo Box)的基础上还支持图像列表

可以在组合框中显示特定的图标表示相应的选择,而不仅仅是显示文本。

MFC提供了CComboBoxEx类进行支持

用户自定义控件(Custom Control)

控件使用的时候,它的Class必须有一个类的支持这个窗口类可以VC的类,例如:Button、Edit.在头文件增加一个CEdit类的成员变量:CEdit m_Text(即点击右键添加变量),然后按照Edit控件使用即可。


超链接控件(SysLink Control ):

1.用于在 MFC 应用程序上添加超链接,就像html中的超链接一样。你点下可以链接到一个网页上去。拖控件到页面上,并绑定一个变量(m_linkCtrl),里面的内容全部是按照标准的html中href的用法写的。写错了自然链接不了的。

可以去瞧下html里面的href属性是怎/么设置的.另外要注意的是字符串中双引号的处理(记得加个转义符\),添加单击响应消息

m_linkCtrl.SetWindowTextW(_T("<a href=\"http://blog.csdn.net/miko_xiaoming\">Miko's Note</a>"));
 
PNMLINK pNMLink=(PNMLINK) pNMHDR;
 
ShellExecuteW(NULL, L"open", pNMLink->item.szUrl, NULL, NULL, SW_SHOWNORMAL); //在浏览器中打开

2.同按钮(Button)控件一样,响应相应的消息


多按钮组合控件(Split Button Control )

如下图,实现多选按钮选择功能,使用时添加相应菜单


网络IP地址输入输出控件(Network Address Control):

可以直接作为inet_addr(ip)的输入,分隔符为逗号(,)

指令按钮控件(command button control)

不仅可以为按钮添加相应命令还可以对命令做出注解

所有控件的公共属性:

ID:控件的资源标识。

Visiable:控件是否可见。

Disabled:控件是否被禁止、被禁止的控件无法接受键盘和鼠标输入。

Group:是否从这个空间开始一个新组。

Tab stop:在程序中是否可以用【Tab】键切换到这个控件。

Help ID:是否给控件分配一个帮助标识,帮助标识基于控件本身的资源标识。

Client edge:给控件增加一个凹陷的边界,使整个控件看起来像是凹下去的一样。

Static edge:给控件增加一个边界。

Modal frame:给控件增加一个3维的框架,与Client edge相反,它是凸出来的。

Transparent:拥有此属性的窗口是透明的,它下面的窗口不会被它遮掩住。

Accept files:拥有此属性的窗口可以接收拖放文件,如果一个文件被拖动到这个控件上面,控件会收到WM_DROPFILES消息。

No parent notify:表示控件不向其父窗口发送WM_PARENTNOTIFY消息。

Right aligned text:表示文本右对齐。

以上属性可通过控件的属性对话框进行设置,在属性对话框中按【F1】键可以查看属性的帮助信息。

每一种控件都由一个MFC控件类来管理,当通过资源编辑器在对话框上添加一个控件时,visualC++会自动为控件类生成一个实例,即对象,并调用构造函数,当对话框关闭时,其各个子控件对象被自动销毁。

也可以不使用资源编辑器,自己在程序中写代码创建、显示控件并设置控件的属性。

所有的控件类都来自CWnd,控件的某些操作和属性设置需要用到CWnd本身的成员函数,CWnd某些函数经常用来操纵控件和设置控件属性。

SetWindowText:设置控件上要显示的标题文本,即用来设置控件的caption属性

GetWindowText:得到控件的标题文本

EnableWindow:设置控件的Disabled属性,即社会自控件是否可以接收键盘和鼠标的输入

SetWindowPos:改变窗口的大小、位置和Z轴次序。

MoveWindow:改变窗口的大小和位置

GetWindowRec:得到窗口的大小、位置(信息存放在一个矩形结构中)。

GetClientRect:得到窗口客户区的大小(信息存放在一个矩形结构中 )

ShowWindow:设置窗口的可见性(即窗口是否可见)

SetWindowText/GetWindowText还可以用来设置/得到对话框的标题文本。

福利来啦~

学习从来不是一个人的事情,要有个相互监督的伙伴,对于C/C++感兴趣可以关注小编在后台私信我:【编程交流】一起来学习哦!可以领取一些C/C++的项目学习视频资料哦!