自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

积累点滴,保持自我

遇见问题,解决问题

原创 再看mfc

前言 很久不用mfc,曾几何时以为以后会很少接触它了,以前总是嫌弃它,老古董,做mfc的没前途。。。最近又用它做东西时,有了不少感悟,mfc是属于界面类库,而且是属于比较成熟,有历史的库,相较于目前做界面比较华丽多彩的duilib、BCG、QT等从外观上略显逊色,但是都了解过之后会有一些想法界面类库实现原理大致类同,类似于同一锅里蒸出的馒头,大小形态不一,本质差别不大,精通于任意一种都会对此领域有较深刻的理解,所以现在我用起mfc没有以前那种偏见了,而且现在使用对它的理解也逐渐准确了许多...

2020-08-07 16:02:15 31

原创 duilib的通用窗口类WindowImplBase

前言duilib程序中,编写自己的窗口类一般的继承关系有两种,一种是继承自CWindowWnd、INotifyUI、IMessageFilterUI,而第二种方式是继承自duilib封装好的通用窗口类WindowImplBaseWindowImplBase类从源码中可以看到WindowImplBase其实是继承自一般能用到的所有基础类:class DUILIB_API WindowImplBase : public CWindowWnd , public CNotifyPump

2020-08-06 15:37:09 24

原创 duilib源码修改之WindowImplBase类OnCreate函数

问题:duilib默认新建窗体的左上角为屏幕左上角,无法自己输入参数修改,如下 代码:#include "stdafx.h"#include "MainFrame.h"int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE /*hPrevInstance*/, LPSTR /*lpCmdLine*/, int nCmdShow){ CPaintManagerUI::SetInstance(hInstance); CWndShadow:

2020-08-05 17:53:04 58

原创 duilib绝对定位与相对定位

前言duilib中窗口,布局,控件等在屏幕上的显示位置都是按照配置好的xml文件规则显示的,每个显示元素的位置大小也需要显式指定,才能呈现出更好看的界面效果,显示元素的位置有两种配置规则,即绝对位置(fuilib中float属性为true时)与相对位置(float属性为false时)。绝对位置(float=true)首先看一张惨不忍睹的自绘图:图中简单描述的是一个屏幕,屏幕里面包含了一个窗口,窗口里面包含了一个显示控件(这个控件可以理解为duilib的各种布局与控件组合),在一般的界面系

2020-08-05 11:55:14 44

转载 duilib整体框架认识

从GoogleCode上下载的duilib工程中附带的一副总体设计图(如下所示),可以先整体了解一下,有个初步的认识,对后续进一步深入了解学习会很有帮助。通过设计图有了一个初步认识后,接下来开始进一步深入学习了解,主要从以下几个方面进行了解学习:库的组成;框架基本流程;元素创建机制;消息处理机制。1. 库的基本组成1.1 工具库由于duilib没有对外部的任何库进行依赖,所以在其内部实现了很多用于支撑项目的基础类(如下图所示)。这些类分布在Util文件夹中:UI相关:CP.

2020-08-04 14:50:28 24

原创 Duilib使用---颜色配置

前言duiilib是通过加载配置的xml文件渲染显示的界面,xml文件在duilib中扮演着类似衣服的角色,所有关于外表界面的各种属性全在xml文件配置,这篇文章介绍一下duilib的颜色配置。8位16进制值表示颜色简单示例下面是摘自一个简单示例的一段duilib的xml,表示的是一个水平布局,包含四个元素(两个label,两个button)。<HorizontalLayout height="30"> <Label name="labsoftname" text

2020-08-04 14:30:04 42

转载 WM_CLOSE、WM_DESTROY、WM_QUIT及各种消息投递函数详解

本文对WM_CLOSE、WM_DESTROY、WM_QUIT及各种消息投递函数的功能及区别做出了分析比对,有助于读者更好的对消息投递函数加以理解。详情如下:一、WM_CLOSE、WM_DESTROY、WM_QUIT区别WM_CLOSE:关闭应用程序窗口WM_DESTROY:关闭应用程序WM_QUIT:关闭消息循环只有关闭了消息循环,应用程序的进程才真正退出(在任务管理器里消失)。win32应用程序的完整退出过程:点击窗口右上角的关闭按钮,发送WM_CLOSE消息。此消息处理中调用De

2020-08-03 14:07:08 34

原创 c++ while(condition) 中condition的一些思考

前言再来看一个c++的基础性问题,while循环,一个再熟悉不过的c++语法,一直只知道使用,对于他的一些使用细节缺少认知,下面先看一下基本语法(摘自菜鸟教程)语法C++ 中while循环的语法:while(condition){ statement(s);}在这里,statement(s)可以是一个单独的语句,也可以是几个语句组成的代码块。condition可以是任意的表达式,当为任意非零值时都为真。当条件为真时执行循环。当条件为假时,程序流将继续执行紧接着循环...

2020-08-03 14:03:35 39

转载 C++线程同步的四种方式(Windows)

一、为什么要进行线程同步?在程序中使用多线程时,一般很少有多个线程能在其生命期内进行完全独立的操作。更多的情况是一些线程进行某些处理操作,而其他的线程必须对其处理结果进行了解。正常情况下对这种处理结果的了解应当在其处理任务完成后进行。如果不采取适当的措施,其他线程往往会在线程处理任务结束前就去访问处理结果,这就很有可能得到有关处理结果的错误了解。例如,多个线程同时访问同一个全局变量,如果都是读取操作,则不会出现问题。如果一个线程负责改变此变量的值,而其他线程负责同时读取变量内容,则不能保证读取到的数据是

2020-07-31 14:13:52 38

转载 VC下线程同步的四种方法详解

前言使线程同步  在程序中使用多线程时,一般很少有多个线程能在其生命期内进行完全独立的操作。更多的情况是一些线程进行某些处理操作,而其他的线程必须对其处理结果进行了解。正常情况下对这种处理结果的了解应当在其处理任务完成后进行。  如果不采取适当的措施,其他线程往往会在线程处理任务结束前就去访问处理结果,这就很有可能得到有关处理结果的错误了解。例如,多个线程同时访问同一个全局变量,如果都是读取操作,则不会出现问题。如果一个线程负责改变此变量的值,而其他线程负责同时读取变量内容,则不能保证读取到的数

2020-07-31 11:52:18 40

转载 windows编程系列知识

本文转载自:https://blog.csdn.net/MoreWindows 感谢作者的分享为了方便大家查找和学习,现将本人博客中所有博客文章列出目录。一. 白话经典算法目前有17篇,分为七大排序和经典面试题讲解两大类1. 《白话经典算法系列之一 冒泡排序的三种实现》2. 《白话经典算法系列之二 直接插入排序的三种实现》3. 《白话经典算法系列之三 希尔排序的实现》4. 《白话经典算法系列之四 直接选择排序及交换二个数据的...

2020-07-31 11:34:34 31

原创 ShellExecute打开外部程序并输入相应参数

前言ShellExecute函数常被用来打开外部程序,这是很常用的功能,但是对打开的程序附加命令这个没使用过,其实函数本身包含这个参数。函数原型:注意事项:使用该函数时,需添加该头文件:[1]#include <shellapi.h>#include<windows.h>ShellExecute函数原型及参数含义如下:ShellExecute(hWnd: HWND; {指定父窗口句柄}Operation: PChar; {指定动作, 譬如: o..

2020-07-30 19:22:38 50

转载 VC++ 窗口拆分CSplitterWnd

前言  当前许多优秀的软件都采用“多视”技术。所谓“多视”,是指在同一个框架窗口里同时显示多个视图。通过运用这种技术,可以在框架的有限控件内同时提供用户更大的信息量,并且使得用户界面更加友好,增强软件的可操作性。拆分类型MFC支持两种类型的拆分窗口:静态的和动态的。  静态拆分窗口:行列数在拆分窗口被创建时就设置好了,用户不能更改,但是用户可以缩放各行各列。一个静态拆分窗口最多可以包含16行16列。要找一个使用了静态拆分...

2020-07-30 17:58:34 20

转载 WinInet 错误代码 (12001 - 12156 )

以下是从微软查找的wininet的函数错误码简介http://support.microsoft.com/kb/193625Microsoft Win32 互联网 (WinInet) API 提供了独立的应用程序方便地访问 Gopher、 FTP 和 HTTP 等标准的互联网协议。WinInet API 将抽象为 Win32 开发人员熟悉的高级别接口协议。以下是 WinInet 函数所返回的错误代码的列表: Code Error Message and Des..

2020-07-30 09:38:37 20

原创 进程互斥(当前程序已运行!)

实现功能,当程序已经运行时,禁止另外开启一个同样的程序,这时可以使用进程互斥实现。在windows下:#include "windows.h"#include "stdio.h"int main(){ HANDLE m_hMutex = CreateMutex(NULL, TRUE, "cplusplus_me"); DWORD dwRet = GetLastError(); if (m_hMutex) { if (ERROR_ALREADY_EXISTS == dwRet)

2020-07-28 17:22:14 27

转载 红黑树c++实现

红黑树的实现文件(RBTree.h)/** * C++ 语言: 红黑树 * * @author skywang * @date 2013/11/07 */#ifndef _RED_BLACK_TREE_HPP_#define _RED_BLACK_TREE_HPP_#include <iomanip>#include <iostream>using namespace std;enum RBTColor{RED, BLACK};template

2020-07-12 21:14:57 50

转载 git使用小结

准备工作前提: 确保已经安装Git客户端git commit必备配置,会依据这个配置确定代码提交人。执行下面两条命令会在机器家目录下生成~/.gitconfig文件1)配置账号git config --global user.email 用户名@abc.com # 邮箱地址git config --global user.name 用户名使用ssh协议上传下载代码必备配置,简单来说,就是在客户端所在的机器上生成一堆公钥私钥对,并将公钥(~/.ssh/id_rsa.pub)绑定到G..

2020-07-07 20:15:19 46

转载 为什么不能cout一个string?

为什么不能cout一个string#include<iostream>int main(int, char**){ std::string str("hello"); // 正确 std::cout << str << std::endl; // 错误,没有与这些操作数(operand,std::string)相匹配的"<<"运算符 return 0;}cout竟然不能输出string类型,这太令人诧异了?...

2020-07-05 22:29:04 88

原创 二叉树的遍历方法总结与c++实现

概述:二叉树的遍历方式分为:深度遍历(前序,中序,后序)广度遍历(层次遍历)二叉树是一种非常重要的数据结构,很多其它数据结构都是基于二叉树的基础演变而来的。对于二叉树,有深度遍历和广度遍历,深度遍历有前序、中序以及后序三种遍历方法,广度遍历即我们平常所说的层次遍历。因为树的定义本身就是递归定义,因此采用递归的方法去实现树的三种遍历不仅容易理解而且代码很简洁,而对于广度遍历来说,需要其他数据结构的支撑,比如堆了。所以,对于一段代码来说,可读性有时候要比代码本身的效率要重要的多。四种主要的遍历思想为

2020-07-02 22:27:54 102

转载 C++引用(作为函数参数和返回值)

一、引用简介引用就是某一变量(目标)的一个别名,对引用的操作与对变量直接操作完全一样。引用的声明方法:类型标识符 &引用名=目标变量名;eg:int a; int &b=a; //定义引用b,它是变量a的引用,即别名说明:(1)&在此不是求地址运算,而是起标识作用。(2)类型标识符是指目标变量的类型。(3)声明引用时,必须同时对其进行初始化。(4)引用声明完毕后,相当于目标变量名有两个名称,即该目标原名称和引用名,且不能再把该引用名作为其他变量名的别名

2020-06-28 20:18:53 143

原创 基本类型,指针,双指针作为函数参数

1.指针与双指针的内存示意图函数内定义如下变量Int* a=1;Int** b=2;a[0x********] --->栈内存地址n(值为1);b[0x********] --->*b[0x********] ---->栈内存地址m(值为2);2.当基本类型,指针,双指针作为函数参数传入函数#include<iostream>using namespace std;//修改从函数外部传来的变量的数值void fun(int* vartype){

2020-06-27 22:31:56 72

原创 线程池理解

线程池理解:线程池就像是一个大饭店,饭店里有N多个服务员,每个服务员就相当于线程池中的每个线程,而这个店里面会来很多顾客吃饭,每个顾客都会从门口有序排队进入饭店就餐(每个顾客就相当于线程池中的请求队列),每一名顾客同一时间只需要一名顾客服务,一名服务员对应一名顾客,包括从门口进入饭店以及后续上菜等操作都需要一名服务员从头到尾服务(高级餐厅...)(这其实就是线程安全,顾客就是资源,同一时间只能有一个线程访问),饭店能容纳的顾客数量是有限的,座位有限,其他顾客只能在外边排队,等待里面的顾客吃完

2020-06-14 21:07:02 73

转载 Linux系统之下的基本gdb调试

一、调试的工具: gdb二、调试的对象: 可执行程序,而不是.c文件,调试的对象一定是一个进程。调试时,程序必须带有调试信息,所以在编译链接的过程中,需要加上参数“-g”。三、调试的命令:l 显示代码回车 继续执行上一操作b + 行号 加断点info + b(break) 查看断点信息r 运行程序n 下一步,单步执行p + 变量名 打印变量的值(p + &变量名 打印变量的地址)q 退出调试display + 变量名 持续打印c 继续执行delete + 断点编号 删...

2020-06-14 21:00:23 74

转载 简单web服务器的实现(C++)

本文转载自:https://blog.csdn.net/qq_36573828/article/details/82784425一、具体功能实现GET方法请求解析POST方法请求解析返回请求资源页面利用GET方法实现加减法利用POST方法实现加减法HTTP请求行具体解析400、403、404错误码返回的处理注意:!!本人也是小白一只,这是刚刚开始学习网络编程写的东西,存在很多问题。也未用到RAII等机制,纯属是披着C++皮的C语言项目,类的封装也不是太好。也未经过压力、性能等测试。

2020-05-31 23:02:27 152

转载 #ifndef HeaderName_h #define HeaderName_h #endif 使用详解

想必很多人都看到过头文件中写有:#ifndef HeaderName_h #defineHeaderName_h // 这里面通常写各种宏定义、其他头文件的包含 #endif这样做的目的:防止该头文件被重...

2020-05-31 22:43:04 55

转载 getopt()用法详解

getopt被用来解析命令行选项参数。就不用自己写东东处理argv了。#include <unistd.h> extern char *optarg; //选项的参数指针 extern int optind, //下一次调用getopt的时,从optind存储的位置处重新开始检查选项。 extern int opterr, //当opterr=0时,getopt不向stderr输出错误信息。 extern int optop

2020-05-31 22:40:50 93

转载 /usr/bin/ld: cannot find -lmysqlclient解决方法

1、使用mysql进行编译时,出现下面的错误2、使用 locate -bLi -regex -r mysqlcli命令,查看libmysqlclient的位置3、这是之前的makefile中的编译选项4、修改如下,添加-L/usr/lib64/mysql参考资料:https://forum.directadmin.com/showthread.php?t=12219原文链接:https://blog.csdn.net/libinbin_1014/artic..

2020-05-18 20:46:08 113

转载 解决MobaXterm左侧没有文件列表,没有SCP,不显示文件夹

具体原理说不太清楚,应该是什么协议的问题,直接说解决方法吧1.第一步换一个比较新的MobaXterm版本,我用的V11.0,可以通过软件界面的help,about...来查看2.第二步,说两种方法,第一个,如果是只有你的电脑是这样,别人的电脑正常,那就把你以前的MobaXterm的文件都删掉,尤其是.ini这类的配置文件,然后安装新的MobaXterm.exe,把别人的ini文件拷过来放到你新的MobaXterm.exe的所在文件夹下,记得一定要把你之前的配置和文件删干净,这样你再打开,就是别人的配

2020-05-13 21:33:58 608

转载 CentOS 7 启动与切换图形界面

目录CentOS 7 启动与切换图形界面  安装图形界面  开机启动图形化界面  DOS界面与图形化切换快捷键CentOS 7 启动与切换图形界面今天打开了新安装的centos 7虚拟机,发现刚进去是DOS界面,原来默认情况下并不会安装图形界面,需要手动安装。安装图形界面1.开机root登录2.安装X(X Window System)命令如下:yum groupinstall "X Window System"安装完成后出现complete字样。3.然后安装图..

2020-05-13 20:59:47 306

原创 CentOS 7.6 配置VNC远程访问服务器图形界面

1. 安装VNC1.1 安装图形界面yum groupinstall "development tools"yum groupinstall "gnome desktop"1.2 安装配置vncyum install tigervnc tigervnc-server -yvncserver :n#这里的n是 sessionnumber,不指定默认为1,也可以是2、3等等。第一次会提示输入密码,以后可以使用 vncpasswd 命令修改密码。具体如下:[root@orac

2020-05-13 20:55:19 224

转载 JSON.parse与eval

JSON.parse与eval和能将一个字符串解析成一个JSON对象,但还是有挺大区别。测试代码var A = "{ a: 1 , b : 'hello' }";var B = "{ 'a': 1 , 'b' : 'hello' }";var C = "{'a':1,'b':'hello'}";var D = '{"a":1,"b":"hello"}';var E = '{ ...

2020-04-25 20:32:10 62

转载 Python 字典与集合

一、Dictionary 字典  字典(dict)是在列表后我们学到的第二种可变的容器模型,可以存储任意类型的对象。字典,顾名思义就像是我们经常使用的新华字典或英语词典一样,具有极快的查找速度,可以帮助我们快速的查找到所需要的东西。在Python中,字典是以键值对(‘key’-'value')的形式表现的,每个键值对用冒号(:)分割,每个对之间用逗号(,)分割,整个字典包括在花括号({})中。...

2020-04-25 20:08:12 103

转载 python环境搭建和pycharm的安装配置

一.python环境的搭建1.下载python(这里以python3.6为例)step 1:打开下载网址:https://www.python.org/downloads/windows/step 2:我这里选着python3的版本step 3:选择python的可执行文件安装包 2...

2020-04-25 19:56:27 95

转载 epoll讲解

首先我们来定义流的概念,一个流可以是文件,socket,pipe等等可以进行I/O操作的内核对象。 不管是文件,还是套接字,还是管道,我们都可以把他们看作流。 之后我们来讨论I/O的操作,通过read,我们可以从流中读入数据;通过write,我们可以往流写入数据。现在假定一个情形,我们需要从流中读数据,但是流中还没有数据,(典型的例子为,客户端要从socket读如数...

2020-04-25 17:27:19 48

转载 epoll原理详解及epoll反应堆模型

文章目录一、epoll原理详解二、epoll的两种触发模式三、epoll反应堆模型  设想一个场景:有100万用户同时与一个进程保持着TCP连接,而每一时刻只有几十个或几百个TCP连接是活跃的(接收TCP包),也就是说在每一时刻进程只需要处理这100万连接中的一小部分连接。那么,如何才能高效的处理这种场景呢?进程是否在每次询问操作系统收集有事件发生的TCP连接时,把这100万个连接告诉操作...

2020-04-25 17:24:09 136

转载 select函数及fd_set介绍

select函数及fd_set介绍1. select函数1. 用途 在编程的过程中,经常会遇到许多阻塞的函数,好像read和网络编程时使用的recv, recvfrom函数都是阻塞的函数,当函数不能成功执行的时候,程序就会一直阻塞在这里,无法执行下面的代码。这时就需要用到非阻塞的编程方式,使用select函数就可以实现非阻塞编程。 select函数是一个轮循函...

2020-04-25 17:09:26 75

转载 C++ socket编程select模型

在做Socket编程时,当要处理一个server对应多个client,这种可以每个客户端用一个线程来处理,但是客户端太多,程序的性能会降低。Windows提供了select模型,很好的处理了一对多的模型。select的申明如下:Int WSAAPI select(_In_ int nfds, //0,无意义_Inout_opt_ fd_set FAR * readfds, //检查...

2020-04-25 17:00:46 79

转载 C++面试常见题

1.什么是虚函数?什么是纯虚函数?虚函数是允许被其子类重新定义的成员函数。虚函数的声明:virtual returntype func(parameter);引入虚函数的目的是为了动态绑定;纯虚函数声明:virtual returntype func(parameter)=0;引入纯虚函数是为了派生接口。(使派生类仅仅只是继承函数的接口)2.基类为什么需要虚析构函数?防止内存泄...

2020-04-10 17:27:01 73

转载 哈夫曼树(二)之 C++详解

本文转载自:http://www.cnblogs.com/skywang12345/更多内容:数据结构与算法系列 目录哈夫曼树的介绍Huffman Tree,中文名是哈夫曼树或霍夫曼树,它是最优二叉树。定义:给定n个权值作为n个叶子结点,构造一棵二叉树,若树的带权路径长度达到最小,则这棵树被称为哈夫曼树。 这个定义里面涉及到了几个陌生的概念,下面就是一颗哈夫曼树,我们来看图解...

2020-04-08 14:44:35 87

转载 C++解析char *p与char p[]

本文转载自:https://blog.csdn.net/c243311364/article/details/81502722首先来看一道题目:#include "stdio.h"char *get_string_1(){ char p[] = "hello world!"; return p;}char *get_string_2(){ char *p...

2020-04-08 11:34:33 148

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