![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
VC++(基础篇)
通过简单明朗的知识介绍,让读者能够快速学习VC++,掌握VC++基础知识,体会学习的乐趣。
老狼主
工作中展现自我,学习中完善自我,生活中乐活自我!
展开
-
VC++ 在MSVC的基础上做自己的编译器(续)
打开环境变量,编辑环境变量(这里以我本机VS2017为例)1、设定path路径,解决找不到cl.exe的问题。2、设定include路径,解决找不到头文件的问题。3、设定lib路径,解决找不到lib库文件的问题。原创 2023-04-03 12:25:22 · 247 阅读 · 0 评论 -
VC++ 在MSVC的基础上做自己的编译器
编译器指令程序cl.exe。只要搞定了cl的用法,实现编译器就不是难事。原创 2023-03-22 13:22:44 · 321 阅读 · 0 评论 -
CTreeCtrl 递归遍历节点
根据节点关联数据值,采用递归算法查找指定节点。原创 2022-12-11 14:54:18 · 334 阅读 · 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 评论 -
WTL 界面设计篇(CSkinDialog)
头文件声明(CSkinDialog.h):#pragma once#include <gdiplus.h>#include "SkinManager.h"class CSkinDialog : public CWindowImpl<CSkinDialog, CWindow>{public: CSkinDialog(void); ~CSkinDialog(void); BEGIN_MSG_MAP_EX(CSkinDialog) MSG_WM_CREATE原创 2020-09-18 12:13:42 · 1143 阅读 · 0 评论 -
WTL 界面设计篇(CSkinButton)
头文件声明(CSkinButton.h):#pragma once#include "SkinManager.h"enum SKIN_BUTTON_TYPE{ SKIN_PUSH_BUTTON, SKIN_CHECKBOX, SKIN_RADIO_BUTTON, SKIN_GROUPBOX, SKIN_ICON_BUTTON, SKIN_MENU_BUTTON};class CSkinButton : public CWindowImpl<CSkinButton, C原创 2020-09-18 12:10:52 · 1288 阅读 · 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 评论 -
C++ 线程池(二)
头文件声明(CThreadPool.h):#pragma once#include <vector>class CThreadPoolTask{public: CThreadPoolTask(); virtual ~CThreadPoolTask();public: virtual BOOL IsRunning(); virtual void SetRunning(BOOL bRunning); virtual int Run(); virtual int St原创 2020-08-19 23:24:56 · 244 阅读 · 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 评论 -
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 评论 -
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 评论 -
MFC窗口程序#32770修改方法
MFC对话框默认类名是#32770,是有基类属性ClassName来决定的,ClassName默认是只读属性,是无法修改的。1、切换到资源视图页面,选择rc文件,右键查看属性,将MfcMode改为False。2、紧接着就可以修改对话框的ClassName属性了。例如:MyClassName。不要以为到此工作就算完成了,这个时候运行程序,肯定会异常报错,因为新修改的对话框类名还未系统注册。3、在对话框的构造函数里面,添加如下代码:WNDCLASSwndClass;::GetClass..原创 2020-05-09 10:14:20 · 2753 阅读 · 2 评论 -
VC++ ComboBox右侧下拉列表三角形绘制
CRect rcClient; GetClientRect(&rcClient); CDC* pDC = GetDC(); CRect rcButton = rcClient; rcButton.left = rcButton.right - 16; if (rcButton.left < rcClient.left) rcButto...原创 2020-01-16 16:14:30 · 509 阅读 · 0 评论 -
VC++ 数组模板类
头文件声明(CSWArray.h)#ifndef ARRAY_HEAD_FILE#define ARRAY_HEAD_FILE#pragma once//数组模板类template <class TYPE, class ARG_TYPE=const TYPE &> class CSWArray{ //变量定义protected: TYPE * ...原创 2020-01-13 17:23:54 · 511 阅读 · 0 评论 -
VC++ CTreeCtrl自绘
头文件声明(CSWTreeCtrl.h):#pragma once#define _OWNER_DRAWN_TREE // 自绘CTreeCtrl,可支持背景图片显示功能class CSWTreeCtrl : public CTreeCtrl{ friend class CSWListTreeCtrl; DECLARE_DYNAMIC(CSWTreeCtrl) // 成...原创 2020-01-13 17:13:10 · 1096 阅读 · 7 评论 -
VC++ 多列表项树控件
代码是基于网络上CColumnTreeCtrl基础上整理和功能扩展,效果图如下:头文件定义(CSWListTreeCtrl.h):#pragma once#include "CSWTreeCtrl.h"class CSWListTreeCtrl : public CWnd{ typedef struct _CTVHITTESTINFO { POINT pt; UI...原创 2020-01-13 17:11:30 · 881 阅读 · 9 评论 -
VC++ CComboBox自绘(选择下拉列表框)
效果图:头文件定义(CSWCheckComboBox.h):#pragma onceclass CSWCheckComboBox : public CComboBox{ DECLARE_DYNAMIC(CSWCheckComboBox) // 成员私有结构定义 // 构造/析构函数public: CSWCheckComboBox(); virtual ~CSWCh...原创 2020-01-12 12:36:36 · 1761 阅读 · 1 评论 -
C++类结构规范定义
后期私有类肯定还会有很多,为了自己和读者方便阅读,在后面的设计中将严格按照制定格式来定义类的变量和函数:#pragma onceclass CClassxxx: public CClassBase{ DECLARE_DYNAMIC(CClassxxx) // 成员私有结构定义 // 构造/析构函数public: CClassxx...原创 2020-01-12 09:31:28 · 709 阅读 · 0 评论 -
VC++ CComboBox自绘(改进版)
今天测试发现CSWComboBox虽然下拉列表里面可以显示图标了,但是处于非下拉状态下,却只能显示文字,感觉有点点遗憾,于是改进了一下。现在非下拉状态下也可以显示图标了,效果图如下:具体实现思路就是把子窗体CEdit设置一个偏移,左边空出来的部分用于显示图标,修改核心代码如下:// 获取子控件CEditCEdit* CSWComboBox::FindChildEdit(){ :...原创 2020-01-11 22:11:56 · 1290 阅读 · 0 评论 -
VC++ CComboBox自绘(颜色下拉列表框)
使用前,请将控件的Style属性设置为DropdownList(下拉列表),OwnerDraw设置为Fixed,HasStrings设置为TRUE,效果图如下:头文件声明(CSWColorComboBox.h):#pragma once#include "afxwin.h"#include <afxcmn.h>class CSWColorComboBox : ...原创 2020-01-11 20:42:48 · 3166 阅读 · 0 评论 -
VC++ CDialog自绘(改进版)
考虑到设置最小化、最大化/恢复、关闭按钮比较麻烦,所以新增加自绘最小化、最大化/关闭、关闭按钮。核心代码如下:void CSWDialog::DrawSysMenu(Gdiplus::Graphics& g){ CRect rcClient; GetClientRect(rcClient); g.SetSmoothingMode(Gdiplus::/*SmoothingMode...原创 2020-01-11 00:08:45 · 547 阅读 · 0 评论 -
VC++ CButton自绘(改进版2)
给之前的CSWButton添加一个背景色(支持半透明),效果图如下:头文件声明(CSWButton.h):#pragma once#include "afxwin.h"#include <afxcmn.h>class CSWButton : public CButton{ DECLARE_DYNAMIC(CSWButton)public: enum B...原创 2020-01-11 00:05:26 · 645 阅读 · 2 评论 -
VC++ CImageFactory类加载ICON资源文件失败
今天设计CSWComboBox控件发现CImageFactory类接口加载系统ICON资源文件失败,几经周折找到了几种解决方案,其一可以将资源文件类型ICON,改为非系统默认类型(比如MICON,ICON1等等);或者修改代码如下:Bitmap* CImageFactory::GetSkinItemImage(UINT uiResID, LPCTSTR lpszResType){ Img...原创 2020-01-09 23:46:37 · 422 阅读 · 0 评论 -
VC++ CComboBox自绘阶段性总结
在绘制列表框左侧的时候,本来说是采用的CImageList接口进行绘制,结果发现绘制后的图标不干净,有锯齿或者黑色背景存在,于是采用了GDI+来实现左侧图标的绘制。代码如下:GDI是完全可以通过图像处理彻底解决图标不干净问题的(之前文章有介绍过解决方法),但是这里偷个懒,鉴于复杂性改为GDI+比较方便。...原创 2020-01-09 23:40:19 · 384 阅读 · 0 评论 -
VC++ CComboBox自绘
头文件定义(CSWComboBox.h):#pragma onceclass AFX_CLASS_EXPORT CSWComboBox : public CComboBox{ DECLARE_DYNAMIC(CSWComboBox)public: CSWComboBox(); ~CSWComboBox();private: // 初始化 void CommonCo...原创 2020-01-09 23:29:50 · 1182 阅读 · 0 评论 -
VC++ FindResource加载资源失败
接口原型:HRSRC FindResourceA( _In_opt_ HMODULE hModule, _In_ LPCSTR lpName, _In_ LPCSTR lpType );hModule资源模块句柄,获取方式有:HINSTANCE hModule= AfxGetResourceHandle();HINSTANCE h...原创 2020-01-09 17:38:17 · 1639 阅读 · 0 评论 -
VC++ CImageList添加图标(HBITMAP、HICON)
方式1:int AddImageList(HBITMAP hBitmap){ if (hBitmap == NULL) return -1; BITMAP bmpObj; ::GetObject(hBitmap, sizeof(BITMAP), (LPVOID)&bmpObj); UINT nFlags = ILC_MASK; switch (bmpObj.bmBi...原创 2020-01-09 16:55:09 · 837 阅读 · 0 评论 -
VC++ 关于窗口刷新的几个函数InvalidateRect、UpdateWindow、RedrawWindow
在前面写了那么多自绘控件,有必要对这几个接口做下声明解释:这几个接口都是对执行窗体重绘的消息,那么什么时候才会发生重绘窗口的消息?答案是:当窗体需要更新内容或是重绘外观背景的时候,应用程序通常会发送一条WM_PAINT消息,通知窗体进行重新绘制。InvalidateRect(m_hWnd, lpRect, bErase):强制系统进行重绘,但是不一定马上会进行重绘,仅仅是通过Pos...原创 2020-01-09 09:01:52 · 2010 阅读 · 0 评论 -
VC++ WaitForMultipleObjects注意事项
通常我们用WaitForMultipleObjects来等待多个事件的消息触发响应,如果有多个事件同时到达,那么返回是最小序号事件的句柄,问题是如果最小序号事件频繁触发,那么怎么样才能等到其它序号事件的触发消息呢?这个时候,我们需要继续调用WaitForMultipleObjects来等待事件的触发,不过这次我们要从上次触发事件序号+1开始等待,这样本地调用就不会再触发最小序号事件的内核对象了。...原创 2020-01-08 23:23:13 · 371 阅读 · 0 评论 -
VC++ CComboBox自绘前序
有关CComboBox,计划编写3个类:其1:实现在每一行Item右侧添加自定义图标HICON(一般多为删除图标,用于删除某一项)CSWComboBox其2:实现下拉列表显示树形结构CSWCheckComboBox其3:实现颜色选择下拉列表框CSWColorComboBoxCComboBox常识:1、设置下拉列表框Item高度SetItemHeight(nItem,...原创 2020-01-08 23:09:05 · 279 阅读 · 0 评论 -
VC++ CEdit自绘增强版(带文件/夹浏览功能)
本文代码借鉴CMFCEditBrowseCtrl代码,综合CSWEdit代码整理成稿。头文件定义(CSWBrowseEdit.h):#pragma once// CSWBrowseEditclass CSWBrowseEdit : public CSWEdit{ DECLARE_DYNAMIC(CSWBrowseEdit)public: CSWBrowseEdit()...原创 2020-01-08 15:19:27 · 563 阅读 · 0 评论 -
VC++ CEdit自绘阶段性总结
在设计CSWEdit过程中,字体的设置写在了HBRUSH CSWEdit::CtlColor(CDC* pDC, UINT nCtlColor)里面,比如pDC->SelectObject(&m_font);后来经过测试发现,如果文本内容输入内容非常长,光标的末尾位置不在最右边,而是逐渐往前移动了。后来经过代码排查,发现问题出在CtlColor里面,于是乎将字体的设置放到...原创 2020-01-08 14:47:38 · 415 阅读 · 0 评论 -
VC++ CEdit自绘篇
头文件定义(CSWEdit.h):#pragma once// CSWEditclass CSWEdit : public CEdit{ DECLARE_DYNAMIC(CSWEdit)public: CSWEdit(); virtual ~CSWEdit(); void SetToolTipText(LPCSTR lpszToolTipText, BOOL bAc...原创 2020-01-08 12:49:17 · 1459 阅读 · 5 评论 -
VC++ CImage抠图
void SetBackgroundMaskImage(LPCTSTR lpszImageName){ COLORREF crAlpha = RGB(255, 0, 0); CImage img; img.Load(lpszImageName); if (img.IsNull()) return; struct PixelData { BYTE B; BYTE G;...原创 2020-01-06 22:33:04 · 752 阅读 · 0 评论