在Visual C++ 2015 中使用Tab Control控件

系统环境:Windows 7
软件环境:Visual Studio 2015 Udpate 2
本次目的:在模态或非模态对话框中使用Tab Control控件,及引申在单/多文档中使用

查阅MSDN文档,对于创建Tab Control控件,MSDN上说明如下:

To use CTabCtrl directly in a dialog box
1. In the dialog editor, add a Tab Control to your dialog template resource. Specify its control ID.
2. Use the Add Member Variable Wizard to add a member variable of type CTabCtrl with the Control property. You can use this member to call CTabCtrl member functions.
3. Map handler functions in the dialog class for any tab control notification messages you need to handle. For more information, see Mapping Messages to Functions.
4. In OnInitDialog, set the styles for the CTabCtrl .
To use CTabCtrl in a nondialog window
1. Define the control in the view or window class.
2. Call the control's Create member function, possibly in OnInitialUpdate, possibly as early as the parent window's OnCreate handler function (if you're subclassing the control). Set the styles for the control.

 

对话框内使用CTabCtrl


1. 在对话框编辑区内,添加一个Tab Control控件到资源模板里面,设置它的控制ID
2. 使用添加成员变量向导,为控件添加一个CTabCtrl类型的成员变量,你可以使用这个变量调用CTabCtrl的成员函数
3. 对话框类的映射处理功能可以处理任何你需要处理的标签控件消息。有关更多信息,请参阅消息映射函数。
4. 在OnInitDialog()函数里面,设置CTabCtrl的风格。

非对话框窗口使用CTabCtrl


1. 定义在视图或窗口类的控件。
2. 调用控件的创建成员函数,可能在OnInitialUpdate中,可能在父窗口的OnCreate处理函数早期(如果你是子类的控件)。设置控件的风格。
下面介绍在对话框中添加Tab Control控件,工程不一定是要MFC基于对话框形式,单文档视图类派生自 CFormView的工程也行,或是任何工程弹出的对话框 ( 如登录界面等等 ) 都行 ( 个人没有都去实验,但理论上应该可以,看了下面就知道。 )
1. 首先在对话框资源上添加一个Tab Control控件IDIDC_LOGIN_TAB,根据需要修改其属性,然后为其添加成员变量m_tab,类型为CTabCtrl
2. 需要几个选项卡,则在对话框资源添加几个对话框,在这里我添加两个选项卡,则要添加两个对话框,其ID分别为 IDD_TAB1_DIALOGIDD_TAB2_DIALOG它们的属性styleChild,BorderNone,其他的再根据自己调整。然后分别为其添加对应的基于CDialogCLoginTab1CLoginTab2
3. 在主对话框添加子对话框头文件,然后再添加三个成员变量,为子对话框添加实例。在OnInitDialog()函数初始化Tab Control控件显示,若对话框没有OnInitDialog()函数,则重载这个函数,具体如下:
//主对话框头文件

//主对话框实现文件

4. 响应选项卡切换事件消息,右键Tab Control控件,添加事件处理程序,选择TCN_SELCHANGE事件,在弹出的编辑区域,填入以下代码:

5. 编译运行。

22

接下来,来看看非模态对话框的实现,因为Tab Control控件要在对话框的OnInitDialog()函数初始化,而MSDN上说:

After the dialog box and all of its controls are created but just before the dialog box (of either type) appears on the screen, the dialog object's OnInitDialog member function is called. For a modal dialog box, this occurs during the DoModal call. For a modeless dialog box, OnInitDialog is called when Create is called. You typically override OnInitDialog to initialize the dialog box's controls, such as setting the initial text of an edit box. You must call the OnInitDialog member function of the base class, CDialog , from your OnInitDialog override.

非模态对话框是在Create的时候一起调用初始化函数的,OnInitDialog()我们仍可以重载这个函数,来实现以上功能。对于单文档/多文档可以看前面的MSDN说明,这里不再详细写。本文若有错误,请指出。

参考链接


在VC++中使用Tab Control控件

Windows 7 命令行调用Android截图命令screencap

目前测试,在Windows 7命令行调用Android截图命令screencap的时候,只能是如此操作才可以

参考链接


Android截图命令screencap

Android Studio 2.1.2 在引用AAR的时候排除armeabi-v7a目录下的.so文件

Android Studio 2.1.2在引用AAR的时候,如果AAR中包含armeabi-v7a版本的.so文件,而我们自带的.so又仅仅包含armeabi版本的,会导致我们的APK在运行的时候崩溃,报告找不到.so文件,另外就是会增大我们最后的APK的大小,因此我们需要排除armeabi-v7a目录下的.so文件.
操作方法如下:

这个方法的本质是通过强制指定abi的方式来要求Android Studio排除其他系统版本的.so文件。

同样道理,可以用来在32位的APK中排除64位的.so文件,减少APK大小。

参考链接


How to use 32-bit native libaries on 64-bit Android device

迅雷BT任务提示“任务出错”,鼠标放到“任务出错”标签上,提示“任务信息请求失败”

迅雷BT任务提示"任务出错",鼠标放到"任务出错"标签上,提示"任务信息请求失败"。如下图所示:

20160626222938

点击任务向右的箭头之后,点击"连接情况"标签,可以看到如下的内容,尤其是红色的"查询BT资源信息失败(文件编号:1)",如下图:

20160626223215

这个信息说明,在BT文件中的第2个文件信息无法正常查询到,文件的编号是从0开始的。

此时,我们点击"文件列表"标签,去查看一下第2个文件,可以看到,仅仅是个没有太大意义的"RARGB.com.txt",如下图:

20160626223816

此时,我们去掉对于"RARGB.com.txt"的下载即可解决问题,如下图:

20160626224453

然后再次重新开始任务,会发现,任务已经可以正常开始了。

20160626224713

20160626224843

Android Studio 2.1.2版本计算代码覆盖率

Android Studio 2.1.2版本已经集成了JaCoCo用来进行代码覆盖的计算,严格上来说,这个功能并不是Android Studio实现的,而是IntelliJ IDEA早就实现的功能。

全部需要做的仅仅是在build.gradle中增加testCoverageEnabled = true即可,如下图:

testCoverageEnabled

然后,在命令行中执行

即可在每个子项目的build\reports\coverage\debug\下面会生成代码覆盖率的统计文件。点击index.html即可查看代码覆盖情况,目前看到的情况是,貌似只能统计到test目录下覆盖到的代码,而无法统计androidTest目录下的测试代码的覆盖情况。

参考链接


Dell Wireless 1397 WLAN Mini-Card在Window 10下无法启用蓝牙的解决方法

从目前的测试来看只能通过R159805这个应用来开启蓝牙,但是最新的Windows 10,系统版本 1511,OS版本10586.420的系统上面,只能开启蓝牙,安装的驱动属于Windows通用驱动,因此尽管可以看到蓝牙,却不能正常使用,比如罗技M336鼠标,是无法正常使用的。

参考链接


Thunderbird 45.1.1 提示“文件夹 收件箱 已满,无法保存更多消息。请删除旧邮件、不需要的邮件或者压缩文件夹来保存其他消息。”

Thunderbird使用时间长了之后,我是差不多两年多点了,打开提示“文件夹 收件箱 已满,无法保存更多消息。请删除旧邮件、不需要的邮件或者压缩文件夹来保存其他消息。”,如下图:

Thunderbird-4gb-mbox-limit

根据Thunderbird的中文帮助文档,可以看到如下内容:

如果数据文件夹大于 4 GB,您将会收到一个警告“文件夹已满,无法再容纳电子邮件”。在这种情况下,您必须删除某些电子邮件或移动它们至其他文件夹以减小文件夹大小。(目标文件夹大小在 1-3 GB 比较合适,具体大小取决于您的计算机的性能)

这个实际上是属于Thunderbird文件存储系统的策略问题,尽管文件系统可以处理超过4GB的文件。但是为了兼容一些古老的系统,导致即使是到了目前的版本,依旧无法处理超过4GB的文件。

目前Thunderbird一直是32位的应用,没有出64位的版本,尽管可以使用64位的API访问文件系统,但是还是默认保留了4GB的限制。

网上的删除全部的.msf的方法,只是能解决邮件发生过删除,而实际占有的空间没有释放,因而可以通过重建索引文件的方式,来缓解问题,但是如果从来没有删除过邮件,邮件实际占有的空间已经真实超过4GB的情况下,那么这些方法实际上是无效的。

正确的做法是Ctrl+A选中全部的邮件,然后右击,出现的菜单中选择"归档",即可。这样操作的实质,其实是使用子文件夹的方式突破单个文件夹4GB的限制。

Archives-Menu

归档完成后,Thunderbird会提示是否压缩收件箱来节省空间,此时,一定要允许,否则收件箱的大小不会发生变化,如果此时没有点击许可,也可以手工在收件箱上面右击,弹出的菜单中选择压缩

参考链接


Ubuntu 16.04上使用crosstool-ng建立树莓派2B的编译环境

环境准备


编译crosstool-ng


然后加环境变量 export PATH=$PATH:/opt/crosstool-ng/bin

配置编译选项


如果想自己配置调整某些参数,则执行

最后执行

默认情况下,生成的编译工具在当前用户目录下的x-tools目录下,如果需要调整这个目录,可以参考
Mac OSX下执行crosstool-ng提示“Your file system ‘xxxx’ is *not* case-sensitive!”

编译树莓派源代码


Ubuntu 16.04 (x64)树莓派B+(Raspberry Pi  B+)源代码编译

参考链接


自己编译给树莓派的交叉编译工具