自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(325)
  • 资源 (38)
  • 收藏
  • 关注

原创 网站如何防御 CC 和 DDOS 攻击

此文章是个人建站两年以来的对攻防的总结点,只是个人拙见,欢迎大佬们在评论中补充站长们最头痛的事情莫过于网站(服务)又又又被攻击了,本篇文章总结常见的攻击和防御方式简单介绍这种攻击的原理本人有幸遇到过几次 CC 攻击,每次都是把服务器 CUP 消耗到 100%,造成无法正常浏览网站。其实防御 CC 攻击的方式有很多种,如果您是不差钱的主儿,可以直接上高防御 CDN ,利用 CDN 的原理将流量引入到云平台,等待数据清洗后,再将正常的流量回源到你的服务器,当然了,其实普通的 CDN 通过简单的配置也可以达到防御

2022-07-09 22:01:50 828 1

原创 Win10微信 PC 端打字卡顿解决方法

初步评估,您可以先尝试下方方法:【方法A】“干净启动”,排除第三方软体的影响:停止非核心的程序运作(包括第三方杀毒、优化软体)情况允许的话,卸载设备中的第三方杀毒、管家、优化软件同时按【Windows 徽标键+R】,输入 【msconfig】,按回车(Enter)点击 【服务】>【隐藏所有 Microsoft 服务】>【全部禁用】(若您启用了指纹识别功能,请不要关闭相关服务)启动【任务管理器】,点击 【启动】 选项卡,将所有启动项都禁用重启设备《如何

2022-05-27 22:55:31 8801 3

原创 git submodule 使用小结

Git Submodule 允许一个git仓库,作为另一个git仓库的子目录,并且保持父项目和子项目相互独立。添加子仓库$ git submodule add <仓库地址> <本地路径>新建一个父仓库main,一个子仓库sub。将父仓库克隆到本地。$ git clone ssh://[email protected]:23/dennis/main.git进入父仓库,并添加子仓库。$ git submodule add ssh://[email protected]:23/

2022-02-19 14:17:04 631

原创 iOS 集成Firebase统计(Analytics)、崩溃捕获(Crashlytics)、消息推送(Messaging) 2022版

https://firebase.google.cn/docs/ios/setup一、统计(Analytics)1、注册应用2、下载配置文件3、添加Firebase SDK\使用Cocoapods导入pod 'Firebase/Analytics'4、添加初始化代码@import Firebase;@implementation AppDelegate- (BOOL)application:(UIApplication *)application\ didFinis.

2022-02-13 17:33:54 6306

原创 Swift cocoapods No such module 解决方法

1.pod install完成后还是提示:解决Swift中出现 No such module ‘Moya’解决办法是在build phases中的link binary with libraries中先删除pods_xxx.framework,再重新添加一次就好了2.可能是报错库的版本问题,有ioser在Podfile中为报错库指定了具体版本,问题解决。3.我的情况,相对来说比较复杂。开始的时候工程运行良好,没有问题。我开始导入pod 'WCDB.swift’这个库,发现导入不成功,在使用官方pod

2022-01-19 23:53:13 2445

原创 FBRetainCycleDetector iOS15 fishhook crash replace indirect_symbol_bindings[i] 的解决方法

pod 'MLeaksFinder', :configurations => ['Debug'] post_install do |installer| ## Fix for XCode 12.5 find_and_replace("Pods/FBRetainCycleDetector/FBRetainCycleDetector/Layout/Classes/FBClassStrongLayout.mm", "layoutCache[currentClass

2021-10-13 23:25:21 966

原创 LNMP、宝塔环境无法删除网站目录提示.user.ini权限问题解决方法

LNMP、宝塔环境无法删除网站目录提示.user.ini权限问题解决方法LNMP一键包环境,1.2版本之前不需要用到”lnmp vhost del”这样的命令进行删除,同样宝塔linux面板创建的网站也无法在ssh上使用rm进行删除,执行rm命令删除提示”rm: cannot remove `www.tieww.com/.user.ini’: Operation not permitted”的错误提示。意思是说目录中有一个.user.ini没有权限删除。解决方法:1、chattr解决权限问题,对.us

2021-07-04 23:30:35 1075 1

原创 MVVP:一种基于状态的架构模式的设计与实现

1、常见架构模式MVCMVC 模式的意思是,软件可以分成三个部分。视图(View):用户界面。控制器(Controller):业务逻辑模型(Model):数据保存MVPMVP 模式将 Controller 改名为 Presenter,同时改变了通信方向。1. 各部分之间的通信,都是双向的。2. View 与 Model 不发生联系,都通过 Presenter 传递。3. View 非常薄,不部署任何业务逻辑,称为"被动视图"(Passive View),即没有任

2021-04-06 15:27:10 2206

原创 Your account does not have sufficient permissions to modify containers的解决方法

Your account does not have sufficient permissions to modify containers解决:直接把 BuildSettings – Code Signing Entitlements 中的xxxx.entitlements直接删除就可以了

2021-03-19 13:00:44 1043

原创 WordPress index.php Redirects to Base Url

ProblemRecently, I was working on a website that needed to display a temporary home page, while an installation of WordPress was being worked on. The custom home page was being displayed as index.html. WordPress uses index.php, combined with mod_rewrite,

2020-09-05 13:33:46 230

原创 Permanent link to Renaming WordPress index.php

=Now as any developer who’s dabbled with WordPress knows, it’s easy to change the root directory location of WordPress so that directory structure wise different CMS systems can play nicely alongside one another.What about, however, the situatio

2020-09-05 13:25:31 406

原创 thinkPHP 5 nginx 部署时,只跳转首页的问题解决

在使用tp5时候把它部署到服务器上发现一个奇葩的事情,就是它默认访问config配置的默认页,无论怎么跳转到其他接口都不好使,最终重写了 Nginx 的配置文件解决了这个问题server{ listen 80; server_name www.XXXX.com; index index.php index.html index.htm; root /var/www/didu;

2020-06-29 11:12:56 696

原创 wordpress 后台出现 ajax-admin.php 500 错误的解决方法

在修改新主题的时候不知道增加了什么代码,导致后台回复留言时 ajax-admin.php 文件报 500 错误,可以联想到肯定与评论函数有关,但是由于增加了不少的代码,具体哪一行真的是不好找。ajax-admin.php 500 错误出现这类报错让我很容易抓狂,因为它不直接输出 PHP 代码错误位置。Google 搜索了一圈,发现 500 报错可以从 PHP 报错日志找线索的。废话不多说,我们开始排查原因:何先生使用的是宝塔面板,首先在/www/server/php/73/etc/php-fpm

2020-06-02 00:08:22 1322

转载 Synergy 配置 SSL 失败的解决方法

在激活了 Synergy Pro 之后,会自动生成 SSL 证书并开启 SSL 加密。但是由于某个暂时还未知的 Bug,在 Mac 上第一次自动生成的证书总是不能用的,会报这样的错误:[2017-01-25T09:57:03] INFO: OpenSSL 1.0.2 22 Jan 2015[2017-01-25T09:57:18] ERROR: ssl error occu...

2019-07-21 15:08:52 8723

原创 Please install the Android Support Repository, Could not find com.android.support:appcompat-v7 解决方法

没有找到对应依赖的26.0.0,让我们下载,按照提示打开发现并没有缺少Repository,并没有什么需要下载的。旁边大佬说可能是各自的开发工具里面的SDK有差距导致的;百度了下,发现,从api 26开始,support libraries 需要从google的maven仓库下载,所以需要在project的build.gradle中allprojects 添加如下配置即可解决方法1.确实必要...

2019-06-08 15:29:08 3877

原创 升级到Mac OS Mojave 10.14 TeamViewer远程登录后无法控制 键盘鼠标无反应的的解决方法no keyboard on remote side

去系统偏好设置中,找到安全性与隐私找到辅助功能选项,把Teamviewer前面的勾勾上,就可以了。

2019-05-09 11:03:57 7811 1

原创 wordpress页面属性中没有模板选项下拉菜单

一、前言在wordpress后台新建页面的时候,页面属性中会有模版选项。但是发现,自己的wordpress新建页面中,并没有这个选项,这是为什么?二、解决办法出现以上的问题是由于php禁用了scandir函数。解决办法:1、编辑php.ini配置文件:vim /usr/local/php/etc/php.ini2、通过vim的查找,快速定位到scandir的位置,在disabl...

2019-05-07 12:01:59 1810

原创 无法建立目录wp-content/uploads/xxxx/xx。有没有上级目录的写权限的解决方法

// 设置用户和群组sudo chown -R www:www /var/www// 设置文件夹权限为755sudo find /var/www -type d -exec chmod 755 {} ;// 设置文件权限为644sudo find /var/www -type f -exec chmod 644 {} ;环境二:虚拟主机安装Wordpress首先确认wp-conten...

2019-05-04 16:23:17 8139

原创 WordPress php升级到7.2提示Warning: Use of undefined constant Y – assumed ‘Y’ 问题解决

今天将php从7.1升到了7.2,升级后浏览文章页面,文章页面底部却出现了以下提示信息:Warning: Use of undefined constant Y – assumed ‘Y’ (this will throw an Error in a future version of PHP) in wp-content/themes/bdidq/functions.php on line 4...

2019-04-27 14:41:07 25870 4

原创 苹果全面屏(iphoneXR/XS/XS Max)适配和一些常用宏定义

iPhone X375 * 812width = 1125, height = 2436iPhone XS375 * 812width = 1125, height = 2436iPhone XS Max414 * 896width = 1242, height = 2688iPhone XR414 * 896width = 828, height = 179...

2019-04-10 14:06:16 1954

转载 基于DLNA实现iOS,Android投屏:SOAP控制设备

UPdP网络中,控制点和服务之间使用简单对象访问协议(Simple Object Access Protocol,SOAP)根据基于DLNA实现iOS,Android投屏:SSDP发现设备收到设备描述文档(DDD)和服务描述文档(SDD),通过解析DDD获取 <controlURL> 控制点可以知道该设备上某个服务的控制点地址。再通过解析 DDD 中 <action> 中...

2019-04-02 17:17:09 1301 1

原创 SSL received a record that exceeded the maximum permissible length ERR_SSL_PROTOCOL_ERROR错误解决方法

修改server里面的 listen 443; 为 listen 443 default ssl; 保存,重启Nginx。完美解决!

2019-04-01 15:21:35 34171 2

原创 【iOS】Software caused connection abort Code 53 [BoringSSL] nw_protocol_boringssl_error 的解决方法

现象系统版本:iOS12build configuration: Release场景: 后台收到Push进入前台,触发网络请求。Xcode 输出:nw_socket_handle_socket_event [C58:1] Socket SO_ERROR [9: Bad file descriptor]nw_socket_get_input_frames [C58:1] recvmsg(...

2019-03-27 16:08:00 4717

原创 iOS圆角和阴影并存的两种实现方法

圆角和阴影无法共存的原因就是因为这句代码。Because shadow is an effect done outside the View, and that masksToBounds set to YES will tell the UIView not to draw everything that is outside itself.这句话的意思就是,圆角都是我给你割出来的,圆角外面的...

2019-01-26 15:00:18 6776 2

原创 IOS 自定义UITabBar、UITabBarController的高度(2019版)

IOS 自定义UITabBar、UITabBarController的高度,支持iPhone X以上 所有设备 static let height: CGFloat = 49.0 override open func sizeThatFits(_ size: CGSize) -&gt; CGSize { guard let window = UIApplicati...

2019-01-22 17:37:46 1168

原创 XCode 10中修改cocoapods中的源码编译不生效的解决方法

经过确认,这是xcode 10的一个bug,目前苹果没有提供解决方案,只有以下3种替代解决方案修改为 legacy build system ,菜单File -&gt; Project/Workspace SettingsProduct -&gt; Clean 清除项目缓存,重新编译用回xcode 9参考链接:https://github.com/CocoaPods/CocoaPods...

2018-12-19 15:03:55 3131

原创 36位UUID压缩为22位字符串base64编解码函数(Swift)

通用唯一标识符(UUID,也称为Windows上的GUID)是识别人群中唯一事物的有用标准。为了确保每个UUID的所有意图和用途都是唯一的,它必须是36个字符长。当在大规模网络上传输时,这些冗长的标识符会消耗带宽。有什么好的方法进行压缩?Jeff Atwood在这个题目上有一篇有益的文章。扰流板警报:他的结论是ASCII85编码可以用来压缩UUID到20个字符。我用一个Base64作为一个解决...

2018-11-06 16:02:11 3187

原创 RxSwift中的 Disposed by bag的含义

Dispose bags 类似于RX中的ARC的行为。当DisposeBag被释放时,它将在每个添加的一次性用品上调用dispose并释放内存。它用于处理在闭包中传递的旧引用和不再需要的资源(显然不使用它们):例如,一个HTTP连接,数据库连接或缓存。Dispose bags are used to return ARC like behavior to RX. When a DisposeB...

2018-10-29 19:07:44 2076

原创 iOS项目如何忽略UserInterfaceState.xcuserstate文件以及添加gitignore文件模板

在项目中有一些文件需要忽略不需要跟踪提交到远端服务器,我们做如下设置。cd worksapce 到工程根目录下touch .gitignore 创建忽略文件vim .gitignore vim编辑文件去GitHub搜索gitignore 找到对应语言的内容打开复制到vim编辑git esc 退出shift + :输入 wq!保存并退出然后找到忽略文件退回工作...

2018-10-11 14:39:54 1182

原创 Swift 5.0 计划年底发布:主打 ABI 稳定性,不向前兼容

在上周发布 4.2 正式版本后,Swift 开发团队本周在官网更新了 “Swift 5.0 Release Process” ,主要介绍 Swift 5.0 的开发目标、发布流程和预估时间表。和我们之前报道的一样,Swift 5.0 的主要目标是使语言实现 ABI 稳定性。同时,模块稳定性也是重点工作,根据开发进度在 Swift 5.0 或在之后的 5.x 版本中实现。不幸的是,Swift 5...

2018-09-28 14:23:33 1575

原创 Compile error: Header 'ChattoAdditions-Swift.h' not found解决方法

Increase the version of Swift for the libraries: Chatto and ChattoAdditions.The main project has swift 3.3 version. But I can use libraries with swift 4.Steps to fix problem:Choose Pods in Project ...

2018-09-21 15:01:46 2104

原创 Pod error 'shared' is unavailable. use viewcontroller based solutions解决方法

解决方法:在项目设置里面把 require only app-extension-safe api 设置为NO,重新编译就可以了。

2018-09-21 14:43:17 643

转载 浅析 iOS 开发页面之间数据传递的方式

iOS 开发中 VC 之间数据的传递和交换可以有很多种方法,下面介绍常见的几种方式,并且从设计和架构的层次上分析一下不同方法的优缺点和适用场景。内容主要来自于笔者自己在开发中的实践和思考,如果有错误或者遗漏,欢迎联系指正。为了方便描述,我们举一个实际的用例。假设我们有一个设置界面 SettingViewController,其中有一项是语言设置,显示当前选择的语言。点进去之后进入到具体的语言...

2018-09-19 18:43:23 1467

原创 Xcode 10 兼容遇到的坑和解决方法

$(TeamIdentifierPrefix)Xcode 10 已知 Bug,无法自动替换。Workaround可以手动将 entitlements 文件的 Pass Type ID 值设置为 mobileversion 文件中com.apple.developer.pass-type-identifiers 对应值。libstdc++Xcode 10 取消了内置支持的 lib...

2018-09-19 15:00:43 3610

转载 Swift 值类型,引用类型,深拷贝,浅拷贝,Copy,MutableCopy

前言:Swift相对应Objective C来说,它不再需要绝大部分对象继承自NSObject,所以Swift的类型和Objective C的变量类型也不一致。Value Type/Reference Type什么是值类型,引用类型?二者最主要的差别在于当copy发生的时候,注意,当在Swift中使用赋值符号的时候发生的都是copy,这个在最后我会解释为什么。Struct是值类型st...

2018-09-19 11:46:52 1547 2

原创 Are you trying to mount a directory onto a file or vice-versa 解决方法

运行docker命令:docker run -p 80:80 -p 8080:8080 --name nginx -v $PWD/www:/www -v $PWD/conf/nginx.conf:/etc/nginx/nginx.conf -v $PWD/logs:/wwwlogs -d nginx:latest出现错误:docker: Error response from da...

2018-09-13 19:03:37 38777 7

原创 Swift: 如何检查字符串是否包含数组中的任何单词/子字符串

您应该已经知道可以检查字符串是否包含单个单词,如下所示:let string = "The rain in Spain" let stringResult = string.contains("rain")您还应该知道可以检查字符串数组以查看特定字符串是否在那里,如下所示:let words = ["clouds", "rain", "wind"] let arrayResul...

2018-09-13 11:24:29 3742

原创 UIView常用的setNeedsDisplay和setNeedsLayout

1.UIView的setNeedsDisplay和setNeedsLayout方法\ 首先两个方法都是异步执行的。而setNeedsDisplay会调用自动调用drawRect方法,这样可以拿到 UIGraphicsGetCurrentContext,就可以画画了。而setNeedsLayout会默认调用layoutSubViews,\ 就可以 处理子视图中的一些数据。\ 综上所诉,set...

2018-09-07 14:19:35 776

原创 App Extension访问Cocoapods引入的第三方库

步骤一:  PROJECT –info –configurations,将对应的Debug和Release 设置成pods.debug和pods.release 步骤2:编译一下(本人遇到的问题是真机调试可以跑起来了,但是打包Archive给别人测试的时候出现下面的错误:在App Extension 出现 library not found for-lMasonry 错误。解决...

2018-09-07 11:16:59 749

原创 iOS10推送通知进阶(Notification Extension)

Notification ExtensioniOS10 添加了很多的Extension,与通知相关的 extension 有两个:Service Extension 和 Content Extension。 我们先来了解一下Service Extension,这个东西主要是干啥的呢? 主要是,让我们在收到远程推送的时候&amp;lt;注意哈,必须是远程推送&amp;gt;,展示之前对通知进行修改,因为我们...

2018-09-05 10:43:03 3172

NitroBake2动力学转换关键帧C4D插件V2.07版下载

NitroBake2动力学转换关键帧C4D插件V2.07版下载

2022-10-27

程序员面试宝典 PDF电子书 高清版

程序员面试宝典 PDF电子书 高清版

2012-01-31

凯立德最新2012电子眼文件(高清版) 红绿灯 测速 预警

凯立德最新2012电子眼文件(高清版) 红绿灯 测速 预警

2012-01-28

极速FLV合并器 亲测好用的FLV合并工具软件

极速FLV 合并器 亲测好用 FLV合并工具 软件

2012-01-03

300多条MTK工作笔记为你的工作节省一半时间.pdf

300多条MTK工作笔记为你的工作节省一半时间.pdf

2011-11-29

RAMDISK 4G, 详细教程版。不会的请来看

RAMDISK 4G 内存 详细教程版 RAMDISK 4G 内存 详细教程版

2011-11-28

最好的自动整理内存的小软件 很实用

最好的自动整理内存的小软件 很实用最好的自动整理内存的小软件 很实用

2011-08-11

MTK_MMI函数手册

MTK_MMI函数手册 MTK MMI 函数 宝典 说明书 API

2010-06-03

QQ号码分析工具2.1.1 整理qq号的工具

QQ号码分析工具2.1.1 整理qq号的工具

2009-05-30

深入BREW开发.rar 深入BREW开发.doc 深入BREW开发.pdf

深入BREW开发.rar 深入BREW开发.doc 深入BREW开发.pdf

2009-05-16

硬盘数据恢复教程 数据恢复手册 50页

硬盘数据恢复教程 数据恢复手册 50页 硬盘数据恢复教程 数据恢复手册 50页

2009-04-10

VMware-workstation-6.5汉化补丁VMware6.5汉化补丁 VMware6.5中文 VMware6.5简体中文

VMware-workstation-6.5汉化补丁VMware6.5汉化补丁 VMware6.5中文 VMware6.5简体中文

2009-04-04

金山词霸2009牛津版激活程序(支持sp2更新-内附属使用说明)

金山词霸2009牛津版激活程序(支持sp2更新-内附属使用说明)

2009-04-03

百度笔试题 百度 笔试题

百度笔试题 百度 笔试题 百度 笔试题

2008-10-27

计算机网络(第4版)中文版PDF完美版part1(All 4 Parts)

清华大学出版社 / 2004-8-1 / (美)特南鲍姆(Tanenbaum,A.S.)著,潘爱民 译 / 60 元 ISBN:7302089773

2008-09-13

计算机网络(第4版)中文版PDF完美版part2(All 4 Parts)

清华大学出版社 / 2004-8-1 / (美)特南鲍姆(Tanenbaum,A.S.)著,潘爱民 译 / 60 元 ISBN:7302089773

2008-09-13

计算机网络(第4版)中文版PDF完美版part3(All 4 Parts)

清华大学出版社 / 2004-8-1 / (美)特南鲍姆(Tanenbaum,A.S.)著,潘爱民 译 / 60 元 ISBN:7302089773

2008-09-13

计算机网络(第4版)中文版PDF完美版part4(All 4 Parts)

清华大学出版社 / 2004-8-1 / (美)特南鲍姆(Tanenbaum,A.S.)著,潘爱民 译 / 60 元 ISBN:7302089773

2008-09-13

PDG转PDF万能工具

PDG转PDF万能工具 PDG转PDF万能工具 PDG转PDF万能工具

2008-09-13

C++之父Bjarne Stroustrup 的C++ Style and Technique FAQ

C++之父Bjarne Stroustrup 的C++ Style and Technique FAQ

2008-07-06

西北工业大学C++全套课件

西北工业大学 C++ 全套课件西北工业大学c++全套课件,绝对好的课件

2008-04-21

BCGControlBar.专业版.v9.4.Full.Source 完整版Part1

BCGControlBar.专业版.v9.4.Full.Source 完整版Part1

2008-03-29

BCGControlBar.专业版.v9.4.Full.Source 完整版Part2

BCGControlBar.专业版.v9.4.Full.Source 完整版Part2

2008-03-29

Mycolor 我的取色器2007 很强大的取色软件

Mycolor 我的取色器2007 很强大的取色软件

2008-03-29

200个XP系统图标 很好很强大

200个XP系统图标 很好很强大

2008-03-29

很好的FileDialog控件 类似IE的选项对话框以及超链接类源码

很好的FileDialog控件 类似IE的选项对话框以及超链接类源码

2008-03-29

VC6.0透明背景的对话框示例代码

VC6.0 透明背景 对话框 示例代码

2008-03-29

last_order fantastic_dream Slicer系列精美图标下载

last_order fantastic_dream Slicer 系列 精美图标

2008-03-29

Adobe奥多比注册机全集 35合1 史上最强大

Adobe 奥多比 注册机全集 35合1 史上最强大

2008-03-14

北京大学信息学院数理逻辑经典教程

北京大学信息学院数理逻辑经典教程 共333页教程 计算机逻辑的经典教材

2008-01-02

利用多线程在程序繁忙时显示进度条源代码

利用多线程在程序繁忙时显示进度条源代码 很好的了解学习多线程的源代码

2008-01-01

MFC多线程编程源代码和说明文档(二)

MFC多线程编程源代码和说明文档(二)

2008-01-01

MFC多线程编程源代码和说明文档

MFC多线程编程源代码和说明文档

2008-01-01

ubuntu实用教程

ubuntu实用教程<br>

2007-12-30

在单文档程序中动态切换多个窗体的源码程序

摘要:本文通过一个程序实例描述了在VC++6.0下如何在单文档程序中通过菜单动态控制多 个窗体的切换。    一、 引言    我们在编制程序中根据需求的不同会在程序风格上选择多文档、单文档或是对话框模式 ,对于单文档模式可能是我们使用比较多的,但有时我们想采用单文档的形式显示多个不同 的窗体,如作为数据库前台应用程序就会遇到此类问题,数据库由大量的表单组成,而同常 一个窗体内只用来显示一个表单,所以要显示其他的表单时就要用到切换窗体的技术了,下 面就通过一个程序说明该技术的实现方法。    二、 实现技术    新建一个基于CFormView的单文档应用程序,再添加一个窗体和与之对应的基于 CFormView的新视类,然后通过在主框架类里添加控制代码和菜单控制实现这两个窗体的动态 切换,下面就是具体的实现过程:    (一) 用"MFC AppWizard(exe)"建立一个新项目"SwitchForm",并在第二步的创建类型上选 择为"Single documnet"单文档模式,第三、四、五、六步均取确省状态,最后一步选择 "CFormView"作为视类的基类。点按"完成"按钮,生成了初始工程"SwitchForm"。    (二) 点选菜单"Insert"、"Resource…",在弹出的"Insert Resource"对话框中"Dialog"树 里的"IDD_FORMVIEW",点击"New"按钮,生成了一个新的窗体,将其ID号改为"IDD_NEXTFORM"。 在原有的窗体上加一个静态框"这是第一个窗体";在新建的窗体上也添加一个静态框"这是第二 个窗体"。    (三) 在菜单资源的"IDR_MAINFRAME"上添加一级菜单"窗体切换",及其二级菜单"第一个窗 体"、"第二个窗体",其标识号分别为"ID_FIRSTFORM"和"ID_SECONDFORM"。修该"第一个窗体" 的属性为"Checked",表明程序初始时显示的是第一个窗体。    (四) 在"ClassView"属性页里的"SwitchForm classes"上右键,在弹出菜单上选择 "New Class…",弹出"New Class"对话框,选择"Dialog ID:"为我们刚添加的新窗体 "IDD_NEXTFORM",选择"Base class:"为"CFormView",类名取为"CNextFormView",这样就把第 二个窗体对应的视图类添加到了工程。 (五) 在框架类里添加函数SwitchToForm(): void CMainFrame::SwitchToForm(int nForm) { file://获取原来的活动窗体的视图句柄 CView* pOldActiveView = GetActiveView(); file://获取由"nForm"标识的窗体所对应的视图句柄 CView* pNewActiveView = (CView*) GetDlgItem(nForm); file://若视图句柄为空,则创建一新的。 if (pNewActiveView == NULL) { if (nForm == IDD_SW99vCHFORM_FORM) pNewActiveView = (CView*)new CSwitchFormView; if (nForm == IDD_NEXTFORM) pNewActiveView = (CView*)new CNextFormView; CCreateContext context; context.m_pCurrentDoc = pOldActiveView->GetDocument(); pNewActiveView->Create(NULL,NULL,0L, CFrameWnd::rectDefault, this,nForm,&context); pNewActiveView->OnInitialUpdate(); } file://选择pNewActiveView为活动窗体 SetActiveView(pNewActiveView); file://显示活动窗体,隐藏非活动窗体 pNewActiveView->ShowWindow(SW_SHOW); pOldActiveView->ShowWindow(SW_HIDE); int ID; if(pOldActiveView->GetRuntimeClass() == RUNTIME_CLASS(CSwitchFormView)) ID=IDD_SW99vCHFORM_FORM; if(pOldActiveView->GetRuntimeClass() == RUNTIME_CLASS(CNextFormView)) ID=IDD_NEXTFORM; file://设置窗体的ID号 pOldActiveView->SetDlgCtrlID(ID); pNewActiveView->SetDlgCtrlID(AFX_IDW_PANE_FIRST); RecalcLayout(); }    (六)添加两个菜单相对应的命令响应函数和更新函数如下: void CMainFrame::OnFirstform() { file://通过IsKindOf函数确定当前活动窗口是否是第一个窗口,如是,则无须切换, file://否则将通过SwitchToForm函数将当前活动窗口切换到"IDD_SW99vCHFORM_FORM" file://标识的第二个窗体。 if (GetActiveView()->IsKindOf(RUNTIME_CLASS(CSwitchFormView))) return; SwitchToForm(IDD_SW99vCHFORM_FORM); } void CMainFrame::OnUpdateFirstform(CCmdUI* pCmdUI) { file://通过IsKindOf函数判断当前活动窗口是否是第一个窗体,如是则将其选中。 pCmdUI->SetCheck(GetActiveView()->IsKindOf(RUNTIME_CLASS(CSwitchFormView))); } void CMainFrame::OnSecondform() { if (GetActiveView()->IsKindOf(RUNTIME_CLASS(CNextFormView))) return; SwitchToForm(IDD_NEXTFORM); } void CMainFrame::OnUpdateSecondform(CCmdUI* pCmdUI) { pCmdUI->SetCheck(GetActiveView()->IsKindOf(RUNTIME_CLASS(CNextFormView))); }    然后再在该文件开始处添加对两个视图类的引用: #include "SwitchFormDoc.h" #include "SwitchFormView.h" #include "NextFormView.h"    在此须注意:应在两个视类的引用之前添加对文档类的引用,否则会引起编译错误。另外,由于视 类的构造函数在声明时都确省的声明为保护型的,在框架类中无法引用,所以还要将两个视类的类 声明改动如下: class CNextFormView : public CFormView { public: file://将protected 改为public. CNextFormView(); …… }; class CSwitchFormView : public CFormView { public: file://将protected 改为public. CSwitchFormView(); …… };    三、 编译运行    编译运行程序,开始时的窗体上有"这是第一个窗体的字样",菜单也只有"第一个窗体"是被选中的, 当前的活动窗体是第一个窗体;点击菜单"第二个窗体",视图中的窗体上的字样变成了"这是第二 个 窗体",同时选中的菜单也由"第一个窗体"变成了"第二个窗体",实现了通过菜单将窗体进行动态切换。    总结:此程序中关键的是SwitchToView函数,在此函数中,程序搜索所有当前文档的显示窗口来查找与CruntimeClass变量匹配的视图类。如果找到,该窗口被激活。通过与之类似的方法,还可以实现在多文档模式下的单档(文档)多视(视图),通过不同的视图以不同的方式显示来自同一份文档的数据,以更好的满足程序的需要。

2007-12-16

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除