![](https://img-blog.csdnimg.cn/20200306170038798.jpg?x-oss-process=image/resize,m_fixed,h_224,w_224)
VC++(日积月累篇)
记录日常工作和学习过程中,编写或阅读好的代码段,方便自己,也方便大家!
老狼主
工作中展现自我,学习中完善自我,生活中乐活自我!
展开
-
CTreeCtrl 递归遍历节点
根据节点关联数据值,采用递归算法查找指定节点。原创 2022-12-11 14:54:18 · 334 阅读 · 0 评论 -
C++ 结束进程
有时候进程未正常退出,导致进程列表遗留僵尸进程,程序启动需要杀死这种僵尸进程。#include "TLHELP32.H"void TerminateSelfApplication(){ TCHAR szFileName[MAX_PATH] = { 0 }; TCHAR* szAppName = NULL; if (::GetModuleFileName(NULL, szFileName, MAX_PATH)) { szAppName = _tcsrchr(szFileName, '\.原创 2021-10-29 20:53:23 · 1801 阅读 · 0 评论 -
VC++ FTP文件下传(断点续传)
#include <WinInet.h>#pragma comment(lib, "WinInet.lib")HINTERNET hInternet, hConnect = NULL;// 建立会话hInternet = InternetOpen(_T("WinInet Ftp"), INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0/*INTERNET_FLAG_ASYNC*/);if (hInternet == nullptr) ret.原创 2021-06-29 14:55:06 · 313 阅读 · 0 评论 -
OpenSSL RSA加密和解密
rsa加密的密钥格式常见的有两种:一种是PKCS#1,密钥头为-----BEGIN RSA PUBLIC KEY-----一种是PKCS#8,密钥头为-----BEGIN PUBLIC KEY-----以字符串公钥为例,对PKCS#1格式的密钥加载使用的函数是PEM_read_bio_RSAPublicKey(),而对PKCS#8格式公钥的加载使用的是函数PEM_read_bio_RSA_PUBKEY()。1、生成密钥对#include <openssl/pem.原创 2021-06-28 10:29:38 · 2850 阅读 · 0 评论 -
VC++ HBITMAP保存文件
请先看下面这段代码:BOOL SaveBmp(HBITMAP bmp, string path){ FILE* f = fopen(path.c_str(), "wb"); if (!f) return 0; BITMAP bmpinfo; GetObject(bmp, sizeof(BITMAP), &bmpinfo); DWORD dwBmBitsSize = ((bmpinfo.bmWidth * 32 + 31) / 32) * 3 * bmpinfo.bmHeigh原创 2021-06-02 17:02:41 · 572 阅读 · 0 评论 -
VC++组播/多播功能的实现
1、端口定义/*组播套接字*/SOCKET server;2、创建组播组BOOL CChatDlg::StartMulticastService(){ WSAData wsaData; ::WSAStartup(MAKEWORD(2, 2), &wsaData); /*建立套接字*/ server = socket(AF_INET, SOCK_DGRAM, 0); /*允许端口可重复绑定*/ const int on = 1; int ret = setsock原创 2021-04-30 23:58:08 · 632 阅读 · 1 评论 -
C++ 可扩展的内存缓冲区
类声明(CMemBuffer.h):#pragma onceclass CMemBuffer{public: CMemBuffer(DWORD dwSize = 0); ~CMemBuffer(void); /*申请内存*/ BOOL Realloc(DWORD dwSize, BOOL bSetLength = FALSE); /*写入数据*/ BOOL Append(LPCVOID pBuffer, DWORD dwSize, DWORD dwPos = 0); /*原创 2021-04-30 23:41:08 · 509 阅读 · 1 评论 -
C++ 创建快捷方式
#include <shlobj.h>/*函数功能:对指定文件在指定的目录下创建其快捷方式lpszFileName 目标文件或目录,为NULL表示当前进程的EXE文件。lpszLnkFileDir 快捷方式存在目录,不能为NULL。lpszLnkFileName 快捷方式名称,为NULL表示EXE文件名。lpszWorkDir 起始位置wHotkey 快捷键,为0表示不设置快捷键iShowCmd 运行方式,默认为常规窗口pszD.原创 2021-04-30 23:10:03 · 1240 阅读 · 3 评论 -
64位系统下关闭/启用重定向
/* bWow64FsEnableRedirection: TRUE-启用 FALSE-关闭*/BOOL EnableWow64FsRedirection(BOOLEAN bWow64FsEnableRedirection){ BOOL bRes = FALSE; HMODULE hKernel32dll = ::LoadLibraryA("Kernel32.dll"); if ( NULL == hKernel32dll ) break; typedef BOOLEAN(WINA.原创 2021-04-15 17:06:45 · 1461 阅读 · 1 评论 -
VC++ 源码实现通达信公式管理器2
前面我们介绍了如何加载显示公式列表,本篇章介绍如何格式化显示公式内容:常用的CEdit或CRichEdit是不支持这种格式显示的。这里需要借助第三方控件SciLexer(没错!Notepad++就是使用的这个控件),它支持不同的文本内容支持不同的颜色,以及文本内容提示和预输入功能,非常强大,如何事情这个控件,前面有单独的篇章介绍,这里就不再赘述了。控件基本属性设置: std::unique_ptr<CScintillaCtrl> m_pEdit; m_pEdit原创 2021-02-28 17:53:06 · 731 阅读 · 0 评论 -
VC++ 源码实现通达信公式管理器
效果图前段时间,因业务需要,写了这样一个软件,同样的页面已经是第2次写了,第1次大约5年前的事情了,因为代码遗失,于是重新写。页面看似复杂,实现起来非常简单,大约耗时5天。第一步:参照通达信的公式管理器核心文件TCalc.dll,导出资源文件(TCalc.rc),这样界面基本上显现出来了,接下来就是把这些页面进行整合(页面调用)。第二步:提取公式列表信息enum formula_type : unsigned char { ftFrom, ftTechnical_Indica原创 2021-02-28 17:34:47 · 2146 阅读 · 3 评论 -
VC++ VS下编译GLFW
下载地址https://www.glfw.org/download.html解决方案用CMake-GUI生成解决方案文件编译如果生成解决方案的时候,选择的是X64位,那么编译glfw.sln,选择Win32位的时候就会提示LNK1112 模块计算机类型“X86”与目标计算机类型"X64"冲突相反,如果生成解决方案的时候,选择的是Win32位,那么编译glfw.sln,选择X64位的时候就会提示LNK1112 模块计算机类型“X64”与目标计算机类型"X86"冲突.原创 2021-02-27 21:05:56 · 458 阅读 · 0 评论 -
MetaEditor 编译原理之MQ4文件语法解析
语法解析,顾名思义就是将一个文件或者一段代码,按照语法结构拆分为一个一个的单词,比如:extern int TakeProfit = 50;int start(){ int i = 0; while ( i < TakeProfit) { i++; } return(i);}正确的解析后的结果为:代码为:typedef struct stToken{ int nType; ...原创 2021-02-27 13:39:15 · 1532 阅读 · 0 评论 -
C++ StrCmpLogicalW文件名排序
打开资源管理器,文件列表如下:搜索文件列表:#include<iostream>#include <windows.h>#include<io.h>#include <string>#include <vector>#include <algorithm>#include <iostream>#include <fstream>using namespace std;BOOL s原创 2021-02-24 11:53:14 · 1098 阅读 · 0 评论 -
C++ 隐藏控制台输出窗口
控制台输出窗口是方便调试查看用的,但是有时候我们发布程序,不希望窗口显示出来,可以在程序中加入下面一行代码#pragma comment( linker, "/subsystem:windows /entry:mainCRTStartup" )如此这般,输出窗口既不会显示出来,也不会出现一闪而过的现象。...原创 2021-02-24 11:20:52 · 1552 阅读 · 0 评论 -
VC++ 图标集显示控件
1、效果图:2、素材准备:3、头文件声明:#pragma once#include <afxwin.h>class TIconCtrl : public CWnd{public: CSize m_szIcon; // 图标大小 int m_nMargin; // 图标在显示框中内测边距 int m_nColumn; // 每列显示图标个数 int m_nSelIndex; // 所选择的图标序号private: CToolTipCtrl m_原创 2021-01-07 13:26:03 · 774 阅读 · 1 评论 -
QT 中文版信息提示框
引言:在QT设计UI程序过程中,整套系统都是中文版本,然而信息提示默认只有中文,难免有点小纠结,这里针对QMessageBox稍微做了一点点改进,使其支持完美的中文提示框。调用方式非常简单,只需要将QMessageBox调用地方,改为QShowMessage即可(头文件引用不可缺少)。头文件声明:#ifndef QSHOWMESSAGE_H#define QSHOWMESSAGE_H#include <QMessageBox>#include <QString>原创 2021-01-05 09:42:27 · 600 阅读 · 0 评论 -
高精度时间差值
引用:解决GetTickCount的时间精度不够的问题1、类声明:#pragma once#define WIN32_LEAN_AND_MEAN#include <windows.h>#include <mmsystem.h>class CHighPrecisionTimer{public: CHighPrecisionTimer(); ~CHighPrecisionTimer(); void ResetTimer(); // 重设计时器,原创 2020-12-30 23:15:43 · 238 阅读 · 0 评论 -
VC++ 调用私有字体文件
引言:有时候UI设计的时候,界面显示要求显示特殊字体,而这种字体在字体库中又并没有安装,那么在程序中该如何调用该字体文件呢?下面将给你讲解实现思路:方法一、从资源文件中加载字体资源文件方法二、从本地硬盘加载字体文件为此,我们将所需功能封装成类库文件,方便直接调用:类头文件定义:#pragma once#include <GdiPlus.h>using namespace Gdiplus;class CFontHelper : public Singleton<原创 2020-12-30 23:07:35 · 1002 阅读 · 3 评论 -
Scintilla 开源库使用-如何设置页边背景色和前景色
Scintilla是一个免费的、跨平台、支持语法高亮的编辑控件。它完整支持源代码的编辑和调试,包括语法高亮、错误指示、代码自动完成 (code completion)和调用提示(call tips)。它包含页边(margin)和标记(marker)功能,可用于显示行号、标记断点、折叠和高亮当前行。 VC++中快速开发,可下载CScintillaCtrl控件(下载地址:http://www.naughter.com/download/scintillawrappers.zip)。CScint...原创 2020-12-25 16:26:23 · 1519 阅读 · 0 评论 -
QT 界面设计篇(水波纹进度条QProgressBarWater)
效果图:头文件声明(QProgressBarWater.h):#ifndef QPROGRESSBARWATER_H#define QPROGRESSBARWATER_H#include <QWidget>#include <QPainter>#include <QPaintEvent>class QProgressBarWater : public QWidget{ Q_OBJECTpublic: explic.原创 2020-11-30 19:23:48 · 1680 阅读 · 0 评论 -
VC++ OpenCV+ZBar二维码识别
利用OpenCV处理图像的优势,结合ZBar提高二维码识别结果。接口定义:#include <vector>#include <algorithm>#include <string>#include <math.h>#include <iostream>#include<map>#include <cv.h>#include <highgui.h>#include <opencv原创 2020-09-19 17:03:08 · 798 阅读 · 0 评论 -
CStdioFile扩展(支持Ansi、Unicode、Utf-8等文本格式)
头文件声明(CStdioFileEx.h):// StdioFileEx.h: interface for the CStdioFileEx class.//// Version 1.1 23 August 2003. Incorporated fixes from Dennis Jeryd.// Version 1.3 19 February 2005. Incorporated fixes from Howard J Oh and some of my own.// Version 1.4原创 2020-09-16 10:34:11 · 1040 阅读 · 0 评论 -
msxml2类封装
头文件声明(XmlDocument.h):#pragma once#import "msxml3.dll"#include <msxml2.h>#include <string>#if defined(UNICODE) || defined(_UNICODE) typedef std::wstring tstring;#else typedef std::string tstring;#endifclass CXmlNodeList;class CX原创 2020-08-25 19:20:29 · 469 阅读 · 0 评论 -
VC++ 文件操作封装类
头文件声明(SysUtils.h):#pragma once#include <string>#if defined(UNICODE) || defined(_UNICODE) typedef std::wstring tstring;#else typedef std::string tstring;#endifnamespace SysUtils{ class CPath { public: CPath(void); ~CPath(void);原创 2020-08-25 19:12:08 · 468 阅读 · 0 评论 -
CDC 复制/克隆
初衷:复杂的图像绘制过程中,为了提高效率,有时候需要将不同的图像分别绘制到不同的图层中(类似于PS图层),最后进行拼接。在修改图像之前,有时候我们需要将图层进行备份。CDC Clone(CDC& dcSrc){ CDC dcResult;//复制后的数据 BITMAP BMP; CBitmap bmp; unsigned short width;//位图宽 unsigned short height;//位图高 dcSrc.GetBit...原创 2020-08-19 13:53:53 · 670 阅读 · 0 评论 -
libzdb(v3.2.2) 数据库连接池(C/C++)
官网地址:http://www.tildeslash.com/libzdb/#api。以下信息根据官网英文原版翻译libzdb是一个小型、易于使用的开源数据库连接池库,具有以下功能:线程安全数据库连接池 连接到多个数据库系统 零运行时配置,使用URL方案连接 支持MySQL、PostgreSQL、SQLite、Oracle、SqlServer连接URL:在创建时提供给连接池的URL以标准URL格式指定数据库连接。连接URL的格式定义为:database://[user:pas原创 2020-08-18 23:24:51 · 2157 阅读 · 0 评论 -
DWM API应用之缩略图
DwmRegisterThumbnail function在目标窗口和源窗口之间创建桌面窗口管理器(DWM)缩略图关系。DWMAPI DwmRegisterThumbnail( HWND hwndDestination, HWND hwndSource, PHTHUMBNAIL phThumbnailId);参数hwndDestination将使用DWM缩略图的窗口的句柄。目标窗口句柄为非顶级窗口类型,将导致返回值E_INVALIDARG。原创 2020-08-03 11:00:01 · 3419 阅读 · 6 评论 -
EasyPR编译指南
1、下载源码https://github.com/liuruoze/EasyPRDownloadZIP或者git(https://github.com/liuruoze/EasyPR.git)将代码解压到硬盘目录下。例如F:\车牌识别\EasyPR(车牌识别)\EasyPR2、双击解决方案文件EasyPR.sln,用VSIDE(这里使用VS2019)打开,提示点击确定。3、选择libeasypr项目,编译出现如下错误这是因为没有配置OpenCV环境所致。4、...原创 2020-08-02 18:09:09 · 3225 阅读 · 6 评论 -
C++类上使用属性(__declspec property)
原始代码如下:class : A{private: int m_nIndex;public: int getIndex() { return m_nIndex; } void setIndex(int value) { m_nIndex = value; }}如果采用属性方式实现,则可以修改代码如下:class : A{public: __declspec(pro.原创 2020-07-31 23:10:41 · 540 阅读 · 0 评论 -
GDI+ 显示GIF图像
头文件定义:#pragma once#include <gdiplus.h>#pragma comment(lib, "gdiplus.lib")class CGifImage{public: CGifImage(void); ~CGifImage(void);public: BOOL LoadFromFile(LPCTSTR pszFileName); BOOL LoadFromIStream(IStream* pStream); BOOL LoadFromB原创 2020-07-30 21:39:51 · 841 阅读 · 0 评论 -
sapi 实现语音朗读
头文件定义:#pragma once#include "sphelper.h"class CSpeechSpeekImpl{public: CSpeechSpeekImpl(void); ~CSpeechSpeekImpl(void); HRESULT SpeechVoice(LPCSTR lpszVoiceText, UINT bSyn=TRUE); HRESULT SetVolume(USHORT usVolume); HRESULT MakeW原创 2020-07-30 17:30:56 · 672 阅读 · 0 评论 -
多语言版本 UI资源切换
1、如果窗体资源和源码里面所使用的字符串资源,都已经存在于资源视图里面,则通过下面方式来实现:LANGID lid = GetSystemDefaultLangID();if (0x0809 == lid){ //英语 0x0809 SetThreadUILanguage(MAKELCID(MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), SORT_DEFAULT));}else{ //中文 0x0804 SetThreadUILanguag原创 2020-06-30 23:12:06 · 661 阅读 · 0 评论 -
多语言版本 OPENFILENAME过滤器设置问题
正常的时候,打开并选择一个文件这样写代码:char szFileName[MAX_PATH] = { 0 };OPENFILENAME ofn;memset(szFileName, 0, MAX_PATH);memset(&ofn, 0, sizeof(ofn));ofn.lStructSize = sizeof(ofn);ofn.hwndOwner = NULL;ofn.hInstance = GetModuleHandle(NULL);ofn.nMaxFile = MAX_P原创 2020-07-01 11:44:35 · 369 阅读 · 0 评论 -
VC++ CListTree遍历所有节点
1、释放节点及所有子节点数据(T表示节点存储的数据类型)template<typename T>void FreeAllItemsData(_In_ HTREEITEM hItem){ if (hItem == NULL) return; T* pData = (T*)m_Tree.GetItemData(hItem); if (pData) { delete pData; pData = NULL; } HTREEITEM hChild = m_Tree.原创 2020-06-30 23:38:57 · 559 阅读 · 0 评论 -
C++模板(template)使用注意事项(error LNK2019: 无法解析的外部符号)
通常写模板类都是在类定义里面来实现,一个头文件(.h)包含所有定义和声明代码。今天调试程序中无意识的发现程序有内存泄漏,原来是CListCtrl在使用过程中,节点关联了数据指针,以前都是在控件窗体销毁事件里面进行数据释放处理,但是发现每次释放都得在销毁事件里面进行处理非常麻烦,有没有简单点的处理方式呢?我就想窗体销毁的时候,控件也会要销毁的,于是想在控件销毁里面顺带吧节点数据也给销毁,这样是不是就省事很多呢?这样做确实省事方便了很多。由于我不想关心节点所关联的数据类型,于是获取节点数据,返回值类型统一采用L原创 2020-06-29 15:35:35 · 855 阅读 · 0 评论 -
VC++ CSWDirectoryListCtrl问题集锦
总体来说,这个控件难度值并不大,但是却卡了我1天时间,用于解决控件列表内容刷新导致主窗体闪烁问题。究其原因:最初我并不是从CListCtrl继承下来的,而是继承自己成熟的控件CSWListCtrl。CSWListCtrl控件自绘,我采用的是重载virtual void DrawItem(LPDRAWITEMSTRUCT /*lpDrawItemStruct*/);来实现的,目的是实现一个强大的CListCtrl控件,其接口功能有:1、自定义背景色或图片2、自定义单元格颜色和字体3、...原创 2020-06-29 13:09:39 · 178 阅读 · 0 评论 -
VC++ CSWDirectoryListCtrl磁盘文件列表
效果图:头文件定义(CSWDirectoryListCtrl.h):#pragma once#include "afxwin.h"#include <afxcmn.h>#include <string>namespace sw { class CSWDirectoryListCtrl: public CListCtrl { public: CSWDirectoryListCtrl(); virtual ~CSWDirectoryListCtrl(原创 2020-06-29 12:34:18 · 387 阅读 · 0 评论 -
CImageList 透明贴图解决方案
CImageList贴图其实是支持透明层,要不然也不会弄出个ILC_COLOR32出来,但是我们绘图的时候却发现,透明边缘化效果非常差,透明色变成了白色毛边的底图,难道是加载的图标文件自身出了问题吗?有不少网友说要设置透明色,又或者先将图标绘制到一个支持透明层的DC上去,再次进行贴图,如果不闲麻烦,各位可以自己试着操作一遍,复杂度就不说了,有没有效果最重要,第一种方式我尝试过肯定不行,至于第二种,鉴于复杂度我懒得折腾了。MSDN:https://docs.microsoft.com/zh-cn/window原创 2020-06-28 10:28:08 · 438 阅读 · 0 评论 -
主线程消息处理
写程序过程中,往往会遇到在按钮时间中执行一个循环事件(for/while)耗费比较长的时候,这个时候会造成界面的假死想象,对于经常写程序的人来说,解决起来相对比较容易,创建一个子线程,然后把事件放到子线程执行;但是对于初学者而言,创建子线程有时候又觉得麻烦,要解决这种问题其实不难,最容易想到的当然是sleep函数,但是测试效果并不理想,这里我介绍另外一种思路,在循环中调用如下函数即可,功能是获取消息并把消息给传递出去就可以了。代码实现如下:void DoLoopEvents(DWORD dwTime原创 2020-05-27 22:00:05 · 232 阅读 · 0 评论