使用CSplitterWnd类静态分割的窗口的隐藏[转]

2023-05-16

 

标题略长……之前百度了很多,也看过了很多程序,那个时候稍微有点小青涩,所以那些东西根本是看不懂什么意思…现在回过头来看,其实还是很容易就实现的…当然,话题很初级,不是面向中高级群体的,凑合写这凑合看,也是为了像当初我这么羞射的人看的……

首先说一下,使用CSplitterWnd类分割窗口。用这个可以动态分割,也可以静态分割。具体怎么动态分割我忘了,静态分割的方法大概就是在MainFrame类中重载某个函数…在里面添加分割代码,首先CreateStatic,然后再为每一个分隔出来的窗口添加View类。当初因为什么原因一定要用这种方式我想不起来了。只是认为还有更好的方式实现多窗口啊,多视图什么的。比如使用VS的那种风格,叫什么dockable之类的,如果仅仅是想添加一个可以拖动的对话框工具栏,那么直接使用CDialogBar会更简单啊。使用静态分割窗口是我那个时候的噩梦。根本搞不清楚如何隐藏。废话少说,如果要隐藏静态分隔出来的窗口,有个问题必须要先了解,那就是这些分个窗口的资源ID。嗯。这些资源的ID是有限制的,固定在AFX_IDW_PANE_FIRST和AFX_IDW_PANE_LAST之间。并且大小为16*16.也就是16行16列的意思。好了,言归正传,以下内容我只是复制的自己论文的一部分,当然是为了凑字数,实在不知道写点啥…

1. 获取要隐藏窗口的指针,调用ShowWindow(SW_HIDE)隐藏窗口;

2. 为该窗口指定一个新的ID资源,这个资源不会与现存的资源冲突;

3. 如果该窗口的后面还有其他窗口资源,那么需要将后面的窗口ID全部重新向前移动一位;

4. 将CSplitterWnd类中的保护成员变量m_nCols(如果是行则为m_nRows)减一,调用RecalcLayout。

代码才是事实,所以下面是具体事例:


 1 void CMySplitterWnd::HideLeftCol() //用于隐藏左侧工具栏窗口
 2 {
 3     CWnd* pPaneHide = GetPane(0, 0);
 4     pPaneHide->ShowWindow(SW_HIDE);
 5 //将隐藏窗口资源ID分配到当前行的最大列之外
 6     pPaneHide->SetDlgCtrlID(AFX_IDW_PANE_FIRST + m_nCols); 
 7     CWnd* pPane = GetPane(0, 1);
 8     pPane->SetDlgCtrlID(IdFromRowCol(0, 0)); //将下一列的资源提前
 9     m_nCols--;
10     RecalcLayout();
11 }  

这当然不是什么通用的代码,所以别想什么复制粘贴的事情了。这段代码具体来说,看类的名字也许就知道,我是自定义了一个叫做CMySplitterWnd类,这样,我自己分割窗口当然用CMySplitterWnd类啦。

下面讲解一下代码,因为针对性特别强嘛,所以我说明一下,我用CMySplitterWNd类分割成了左右两部分,我想隐藏的是左侧窗口,所以第3行,pPaneHide就是我想要隐藏的窗口的指针,通过GetPane(0,0)获取。第4行没啥好说的,第6行,这里我也是有疑问的,为什么要这么做?我知道第六行代码的含义是将隐藏窗口的资源ID重新分配,只是我不知道是否可以分配到一个更广阔的地方呢?我自己也确实懒得实验…总之这里就是把要隐藏的窗口的ID分配到了当前行的最大列之外一个。这里需要强调一下,这个程序很单一,因为我知道自己将窗口分割成了1行2列,所以才用这么偷懒的方式书写。按照道理应该是如下书写:


pPaneHide->SetDlgCtrlID(AFX_IDW_PANE_FIRST +current_row*16+ m_nCols);  

 

一定要记得是当前行啊!由于当前行是0,所以我忽略掉了……接下来的事情就简单了,诚如所见,就是将剩下的还在的窗口的ID重新分配一下,该提前的提前。第8行代码的作用不就是如此么。注意第九行啊,一定要写上。不写有什么影响我不清楚,但是我认为后果一定很严重…这是CSplitterWnd类的内部保护成员,代表分个窗口的列数(看名字就知道。。。我还这么罗嗦。。。)

如果要把隐藏的窗口再显示回来,自然就是上面步骤逆转一下就好了,


void CMySplitterWnd::ShowLeftCol()
{
    m_nCols++;
//根据ID将隐藏的窗口找出来
    CWnd* pPanShow = GetDlgItem(AFX_IDW_PANE_FIRST + m_nCols);
    pPanShow->ShowWindow(SW_SHOWNA);
    CWnd* pPane = GetPane(0, 0);
    pPane->SetDlgCtrlID(IdFromRowCol(0, 1));
    pPanShow->SetDlgCtrlID(IdFromRowCol(0, 0));
    RecalcLayout();
}  

 

我想到了这里,应该都能懂了,所以就写到这里吧!如果我有空并且还没忘记这个地方的话,到时候会补上一个示例程序。

以上。

转载于:https://www.cnblogs.com/Dennis-mi/articles/3418252.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用CSplitterWnd类静态分割的窗口的隐藏[转] 的相关文章

  • Android reckon 控制项目打包版本

    reckon 用法 github地址 xff1a https github com ajoberstar reckon 根项目 gradle配置 buildscript apply from 39 versions gradle 39 re
  • ArrayList源码解析

    构造函数 Constructs an empty list with an initial capacity of ten 使用10个初始容量构造一个空的集合 public ArrayList super 用一个空的数组进行初始化 this
  • 2023年有效的rtsp,rtmp,hls流媒体测试地址整理汇总

    rtsp rtsp wowzaec2demo streamlock net vod mp4 BigBuckBunny 115k mov 已停用 rtsp wowzaec2demo streamlock net vod mp4 BigBuck
  • http请求

    HTTP请求报文 一个HTTP请求报文由请求行 xff08 request line xff09 请求头部 xff08 header xff09 空行和请求数据4个部分组成 1 请求行 请求行分为三个部分 xff1a 请求方法 请求地址和协
  • http响应报文

    HTTP响应报文主要由状态行 响应头部 空行以及响应数据组成 1 状态行 由3部分组成 xff0c 分别为 xff1a 协议版本 xff0c 状态码 xff0c 状态码描述 其中协议版本与请求报文一致 xff0c 状态码描述是对状态码的简单
  • centos7+jdk8+安装Elasticsearch6.0

    一 xff1a 为Elasticsearch准备用户 1 添加用户 Elasticsearch6 0需要使用非root用户启动 root 64 66 adduser ela root 64 66 passwd ela 2 授权用户 查看文件
  • Retrofit2 源码解析

    0 基本使用 1 Retrofit 将我们的 HTTP API 转换成一个 接口形式 所以我们第一步定义一个 interface public interface GitHubService 64 GET 34 user user repo
  • Android Studio插件的源文件位置——mac端

    有些时候安装插件后 xff0c 整个android studio都卡住了 xff0c 无法通过Android Studio gt preferences gt plugins来卸载 xff0c 这时候就需要找到安装位置 xff0c 进行删除
  • H.264编码基础知识详解

    一 编码基础概念 1 为什么要进行视频编码 xff1f 视频是由一帧帧图像组成 xff0c 就如常见的gif图片 xff0c 如果打开一张gif图片 xff0c 可以发现里面是由很多张图片组成 一般视频为了不让观众感觉到卡顿 xff0c 一
  • Android事件分发

    基本知识 什么是触摸事件 触摸事件 xff0c 是Android用来描述你的手对屏幕做的事情的最小单元 关键词有两个 xff1a 手势 xff08 你的手对屏幕做的事情 xff09 最小单元 所谓手势 xff0c 就是比如按下 移动 抬起
  • HashMap这一篇就够了

    介绍下 HashMap 的底层数据结构 现在用的都是 JDK 1 8 xff0c 底层是由 数组 43 链表 43 红黑树 组成 xff0c 如下图 xff0c 而在 JDK 1 8 之前是由 数组 43 链表 组成 为什么要改成 数组 4
  • Activity的结构分析

    1 结构介绍 大伙儿应该都知道 xff0c Activity的结构分为三层 xff0c 分别是 xff1a Activity Window和View xff0c 不同层承担着不同的责任 上面的图简单的描述了Activity整个结构的构建流程
  • LinkedBlockingQueue

    一 类签名 从类名可知 xff0c LinkedBlockingQueue是基于链表实现的阻塞队列 public class LinkedBlockingQueue lt E gt extends AbstractQueue lt E gt
  • UDP Socket

    UDP的Java支持 UDP协议提供的服务不同于TCP协议的端到端服务 xff0c 它是面向非连接的 xff0c 属不可靠协议 xff0c UDP套接字在使用前不需要进行连接 实际上 xff0c UDP协议只实现了两个功能 xff1a 1
  • volatile

    把代码块声明为 synchronized xff0c 有两个重要后果 xff0c 通常是指该代码具有 原子性 xff08 atomicity xff09 和 可见性 xff08 visibility xff09 原子性意味着个时刻 xff0
  • Android 相机预览方向和拍照方向

    我们知道手机 Camera 的图像数据都是来自于摄像头硬件的图像传感器 xff08 Image Sensor xff09 xff0c 这个 Sensor 被固定到手机之后是有一个默认的取景方向的 xff0c 这个方向如下图所示 xff0c
  • Python无参装饰器

    一 什么是装饰器 定义一个函数 xff0c 该函数可为其他函数添加额外的功能 二 何时用装饰器 需要在不修改被装饰对象源代码及其调用方式时 xff0c 为被装饰对象添加额外的功能 三 如何写一个装饰器 现在我们有如下一个函数help xff
  • typedef的用法

    typedef中声明的类型在变量名的位置出现 什么意思呢 xff0c 我们回头来看 我们是怎么声明int类型变量的 xff1f int Typename 像上面这样 xff0c 对不对 xff1f 那么用typedef之后呢 xff1f 把
  • Activity启动流程(一)

    Launcher进程请求AMSAMS发送创建应用进程请求Zygote进程接受请求并孵化应用进程应用进程启动ActivityThread 一 Launcher进程请求AMS 上面我们提到根Activity的启动流程其实就是桌面上点击一个应用图
  • Activity启动流程(二)

    应用进程绑定到AMSAMS发送启动Activity的请求ActivityThread的Handler处理启动Activity的请求 一 应用进程绑定到AMS 1 时序图 2 详细过程 在前面一篇我们知道当Zygote进程孵化出应用进程后会执

随机推荐

  • AudioRecord

    数字音频 数字音频通常分为三步 xff1a 采样 量化 编码 采样 xff1a 就是将获取的信号给数字化 xff0c 其中有个概念就是采样频率 xff0c 而人耳能听到的频率范围只有20Hz 20kHz xff0c 所以一般设置的都是44
  • GCC编译C/C++程序(一步完成)

    使用 GCC 编译器编译 C 或者 C 43 43 程序 xff0c 也必须要经历这 4 个过程 但考虑在实际使用中 xff0c 用户可能并不关心程序的执行结果 xff0c 只想快速得到最终的可执行程序 xff0c 因此 gcc 和 g 4
  • GCC -E选项:对源程序做预处理操作

    存储在 demo c 文件中 include lt stdio h gt int main puts 34 hello world 34 return 0 通过为 gcc 指令添加 E 选项 xff0c 即可控制 GCC 编译器仅对源代码做
  • GCC -S选项:编译非汇编文件

    root 64 bogon demo cat demo c include lt stdio h gt int main puts 34 Hello World 34 return 0 root 64 bogon demo gcc E de
  • GCC -c选项:生成目标文件

    root 64 bogon demo ls demo c root 64 bogon demo cat demo c include lt stdio h gt int main puts 34 Hello World 34 return
  • GCC -l选项:手动添加链接库

    标准库的大部分函数通常放在文件 libc a 中 xff08 文件名后缀 a代表 achieve xff0c 译为 获取 xff09 xff0c 或者放在用于共享的动态链接文件 libc so 中 xff08 文件名后缀 so代表 shar
  • GCC 编译使用动态链接库和静态链接库

    1 库的分类 根据链接时期的不同 xff0c 库又有静态库和动态库之分 静态库是在链接阶段被链接的 xff08 好像是废话 xff0c 但事实就是这样 xff09 xff0c 所以生成的可执行文件就不受库的影响了 xff0c 即使库被删除了
  • python爬虫——爬取数据导入excel表

    1 导入第三方库 requests库 re html xlwt span class token keyword from span bs4 span class token keyword import span BeautifulSou
  • Makefile call函数

    引用变量的格式为 变量名 xff0c 函数调用的格式如下 xff1a lt function gt lt arguments gt 或者是 lt function gt lt arguments gt 其中 xff0c function 是
  • Glide生命周期绑定

    Glide class和RequestManagerRetriever class xff0c 主要用来获得RequestManager with返回一个RequestManager public static RequestManager
  • Glide缓存机制

    Glide中采用计数的方式统计资源的引用 xff0c 在每个EngineResource内部都设置一个引用计数acquired xff0c 在加载资源时引用 43 43 xff0c 释放资源时引用 xff1a class EngineRes
  • UML类图

    类图 xff08 Class Diagrams xff09 xff1a 用户根据用例图抽象成类 xff0c 描述类的内部结构和类与类之间的关系 xff0c 是一种静态结构图 在UML类图中 xff0c 常见的有以下几种关系 泛化 xff08
  • android源码github

    https github com aosp mirror platform frameworks base
  • jar 包转 java

    jd gui 内 File gt Save All Sources 直接保存到本地
  • DataBinding源码解析

    DataBinding是Google发布的支持库 xff0c 它可以实现UI组件及数据源的双向绑定 使用DataBinding可以轻松实现MVVM模式 xff0c 当数据发生变化时会体现在View界面上 xff0c 反过来界面内容变化也会同
  • LiveData源码分析

    首先还是以一个示例开始 xff1a MutableLiveData lt String gt liveString 61 new MutableLiveData lt gt liveString observe mOwner new Obs
  • ViewModel源码分析

    首先 xff0c 还是先看一个例子 xff1a public class MyViewModel extends ViewModel private MutableLiveData lt List lt User gt gt users p
  • RxJava2源码分析——Map操作符

    本文章用的RxJava和RxAndroid版本如下 xff1a implementation 39 io reactivex rxjava2 rxjava 2 2 6 39 implementation 39 io reactivex rx
  • 交叉编译pytorch的aarch64版本

    提示 xff1a 文章写完后 xff0c 目录可以自动生成 xff0c 如何生成可参考右边的帮助文档 文章目录 前言一 基础环境二 编译流程1 下载源码并配置TOOLCHAIN FILE内容2 预编译出protoc库和sleef库3 ana
  • 使用CSplitterWnd类静态分割的窗口的隐藏[转]

    标题略长 之前百度了很多 xff0c 也看过了很多程序 xff0c 那个时候稍微有点小青涩 xff0c 所以那些东西根本是看不懂什么意思 现在回过头来看 xff0c 其实还是很容易就实现的 当然 xff0c 话题很初级 xff0c 不是面向