- 博客(29)
- 收藏
- 关注
原创 Mx Component多线程使用
MX Component中的ActiveX控件运作在STA(Single Thread Apartment)模式下,这意味着它们依赖于单线程环境。在两个线程都使用CoInitializeEx(0, COINIT_MULTITHREADED);初始化com套件,成功解决问题。在编写代码的时候,发现多线程使用GetDevice会报错误,并且返回值失败。
2024-08-30 13:34:08 163
原创 Effective C++——32.确定public继承是“is-a”关系
1.is-a关系的概念,就是基类可以实现的事情,子类就一定要能实现。如果不能实现,可以修改设计,比如将基类能实现,子类却不能实现的事情派生出一个中间基类。记住一点:1.“public继承”意味着is-a,适用于基类身上的每一件事情也一定适用于派生类,因为每一个派生类对象也都是一个基类对象...
2021-07-13 11:55:09 278
原创 Effective C++——4.确定对象被使用前已经初始化
1.为防止有的情况下对象未初始化导致的混乱,最佳的处理办法就是:永远在使用对象之前先将它初始化。对于无任何成员的内置类型,必须手工完成2.内置类型以外的任何其他东西,初始化责任在构造函数中。规则很简单:确保每一个构造函数都将对象的每一个成员初始化3.C++规定,对象的成员变量的初始化动作发生在进入构造函数本体之前。在构造函数中就是给成员变量赋值,而不是初始化4.可以用成员初始化列表对成员变量进行初始化,但因为类成员变量有时候非常多,所以这只是理想情况5.初始化时是调用变量的构造函数传递值,赋
2021-07-12 16:54:00 286
原创 Effective C++——22.将成员变量声明为private
1.一致性:如果public中的每样东西都是函数,就不需要思考使用的时候要不要带小括号()。 2.使用函数可以让成员变量的处理有更精确的控制 3.封装性:有时候要根据不同情况修改set和get的实现方式,被广泛应用的class的public成员通常是不可改变的,所以要封装起来,否则每次改变对客户代码影响很大。 成员变量的封装性与“成员变量的内容改变时所破坏的代码数量”成反比。 从封装的角度,其实只有两种访问权限:priv...
2021-07-12 13:21:36 237
原创 Effective C++——7.为多态基类声明virtual析构函数
通常的心得是,只有class内至少含有一个virtual函数时,才为它声明virtual析构函数。 但是,有时候会因为大意,继承一些没有将析构函数声明为virtual的类,通常是继承一些库的类时,类似std::string等。 当不希望类实例化,希望类是一个抽象类,但是又没有纯虚函数时,就可以将析构函数声明为纯虚的。但是依旧实现该抽象类的析构函数。 记住两点: 1.如果类是带多态性(virtual函数)的基类,就像声明v...
2021-07-12 11:49:35 189
原创 C/C++——枚举enum的使用
一、枚举定义在类里面我印象中,在Java里,类中枚举的访问是要通过枚举类的名字的,但是在C++中,如果枚举定义在类中,则全部包含在类的范围下。C++11可以通过enum class声明不互通的enum,我用的是早期的C++版本,可以在每个枚举类外再单独用class或struct包裹一层,但这样就太变态了。二、枚举定义在类外面因为早期C++类里面定义枚举的很多问题,所以个人决定以后将枚举全部都放在类外面,这样每个枚举相同命名的值才不会冲突...
2021-06-03 10:26:59 522
原创 C/C++——枚举enum相关
最近发现公司原有老代码一直用int替代enum的功能,可读性太差了,读起来费时费力,所以进行enum替换int的同时梳理一下enum。enum TestEnum1{ T1, // 0,默认是从0开始 T2, // 1 T3 // 2};enum TestEnum2{ T1 = 1, // 1,从1开始 T2, // 2 T3 // 3};enum TestEnum3{ T1, // 0,默认从0
2021-05-26 17:56:59 156
原创 C/C++——字符串拼接
总结一下C++中的字符串拼接方式,有以下几种:1.sprintf()函数// 函数定义int sprintf(char *string, char *format [,argument,...]);// 用法,拼接"11"和str2char str1[10];char str2[10] = "999";sprintf(str1, "%s%s", "11", str2);2.strcat()函数// 函数定义extern char *strcat(char *dest, co
2021-05-19 09:49:07 8013
原创 MFC——OnPaint无限循环导致CPU占用高
原本一直使用mfc对应的Gdi方法绘图,所以没出现这个问题。当我开始使用Gdi+之后,发现打开程序后风扇声音变得很大,看了一下发现CPU占用非常高,经过检查发现是OnPaint函数的问题。在使用CDC重绘的时候,都会有CPaintDC dc(this)代码,这行代码构造函数会自动调用BeginPaint函数,析构函数自动调用EndPaint函数。BeginPaint函数的作用就是将窗口需要重绘的区域设置为空(也就是UpdateRegion置空)。在正常情况下,我们接收到了WM_PAINT消息后.
2021-05-17 13:11:47 1120
原创 MFC——CEdit类
常用样式组合:WS_CHILD|WS_VISIBLE|WS_BORDER所有样式如下:// 超出边界水平滚动ES_AUTOHSCROLL// 多行编辑框ES_MULTILINE// 左对齐文本ES_LEFT// 文本居中ES_CENTER// 右对齐ES_RIGHT// 允许控件水平滚动但没有滚动条ES_AUTOHSCROLL// 允许垂直滚动但没有滚动条ES_AUTOVSCROLL// 小写字母显示所有字符ES_LOWERCASE// 大写字母显示ES_UPPE
2021-05-13 16:34:51 896
原创 VS2008——调试方法大全
总结以下VS2008的调试方法,首先最常用的就是使用断点了,断点分为两种:普通断点、跟踪点普通断点就是红色圆点,跟踪点是红色菱形。可以通过右键设置断点相关内容,让断点有更多功能。条件:设置表达式,只有表达式为true或者已更改才暂停命中条件:设置命中断点时的操作,通常用于打印消息,也可以执行宏,以及设置是否暂停程序在运行到普通断点的位置后,会停止运行,然后可以通过以下窗口查看想要的信息。自动窗口:显示断点行以及运行的上一行代码所使用的变量和对应的值,可以修改值局部变量:显示断点行
2021-05-12 17:14:07 2100
原创 Gdi+绘图2——使用双缓冲解决闪烁问题
使用Gdi+绘图后,出现很明显的闪烁问题,于是使用Gdi的Bitmap来进行双缓冲解决问题。void CLedButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct){ // 获取按钮矩形区域 CRect tempRect = lpDrawItemStruct->rcItem; // 建立缓冲使用的位图 Bitmap buffer(tempRect.Width(), tempRect.Height()); // 建立Graphics对象
2021-05-12 13:52:04 1103
原创 Gdi+绘图1——导入Gdi+资源并进行初始化
在绘制按钮的时候发现mfc默认使用的gdi绘图有很多缺点,第一点就是有锯齿,第二点就是没有渐变色,因此开始了解使用Gdi+绘图。我的开发环境是win10+vs2008,以下是我使用Gdi+的方法1.首先要在工程中添加对应lib,也就是Gdiplus.lib,我这边默认路径下就有,直接添加就可以2.导入Gdi资源ULONG_PTR gdiplusToken;// Gdi+初始化GdiplusStartupInput gdiplusInput;GdiplusStartup(&
2021-05-12 13:26:50 419 1
原创 C/C++——初始化int数组
其实int数组有种很好的初始化方法是用列表初始化,但是公司要求用vs2008,C++标准还没到C++11,所以只能想其它办法初始化int数组// 方法1:memsetint test[10];memset(test, 0, sizeof(test));memset(test, -1, sizeof(test));// 方法2:使用fill_n或者fillstd::fill_n(test, 10, 999);memset是按照字节来赋值的,所以int初始化的时候只有0和-1能使用mems
2021-05-11 15:40:34 1225
原创 MFC——绘制特定样式按钮
首先,继承CButton按钮类,然后我们要重写一个函数virtual void PreSubclassWindow();这个函数可以初始化子类窗口,做一些绘制子类窗口之前要做的事情,如按钮风格的修改,按钮形状的修改,通常在重写窗口类时使用。在这个函数里我们修改按钮的风格,改为ODS_OWNERDRAW风格,即自绘风格。防止在创建控件的时候没有设定BS_OWNERDRAW,导致不调用DrawItem函数。void CLedButton::PreSubclassWindow(){.
2021-05-11 11:16:16 681
原创 MFC——画刷CBrush类
CBursh封装了三种画刷:单色、带阴影线、带图案// 创建单色画刷方式1CBrush brush(RGB(255,0,0));// 方式2CBrush brush;brush.CreateSolidBrush(RGB(255,0,0));// 创建阴影线画刷方式1,HS_DIAGCROSS是六种阴影线之一CBrush brush(HS_DIAGCROSS, RGB(255,0,0));// 方式2CBrush brush;brush.CreateHatchBrush(HS_DI
2021-05-10 16:32:08 1964
原创 C/C++——全局变量
全局变量存放在全局/静态存储区。全局变量的定义必须放在.cpp文件中,因为如果放在.h文件中,就会出现重复定义的情况,因为所有包含.h头文件的地方都会定义一次。在.cpp文件中定义之后,其它地方需要使用全局变量的话,需要使用extern声明全局变量,然后使用。...
2021-05-08 16:20:50 926
原创 C/C++语言——函数指针传递问题
写代码过程中写出了错误代码,才注意到自己使用指针存在这样的思维误区。// 错误函数void test(int *x){ x = new int(3);}int *value = NULL;test(value);这个test函数是没有任何意义的一个函数,运行结果value最终还是NULL空指针,其实函数的参数传递根本上还是值传递,指针也不过是值的一种而已。将int指针value传递进去时,test内的x最开始是null,在new int(3)后,new关键字给x分配了一个地址
2021-05-07 14:30:19 357
原创 MFC——CWnd类
整理一下自己对于CWnd类的笔记。函数virtual BOOL Create(LPCTSTR className, LPCTSTR windowName, DWORD style, Const RECT& rect, CWnd* parentWnd, UINT ID, CCreateContext* context = NULL);virtual BOOL Create(LPCTSTR className, LPCTSTR windowName, DWORD style, ..
2021-05-07 13:04:35 1223
原创 C/C++语言——函数返回临时变量、对象
函数内部的临时变量、临时对象的生命周期只在函数运行期间,函数运行结束后,就会释放对应内存空间。// 错误的函数写法int& test1(){ int x = 1; return x;}// 错误的函数写法int* test2(){ int x = 1; return &x;}// 正确常用的写法int test3(){ int x = 1; return x;}对于越简单的类型,例如int类型,运行的效果就越可能不出问题
2021-05-07 11:47:04 2209
原创 MFC——窗口、控件ID相关
在vs的拖拽界面下,所有窗口和控件的ID都是唯一的,而且mfc也建议所有控件的ID唯一。但是控件ID不是操作系统层的,只是程序级别的而已,所以实际上ID设置成相同的也是同样可以的。对于不需要进行操作的CStatic控件,完全可以全部设置为相同的ID,对于父窗口不同的控件,即使需要操作,也可以设置为相同的窗口ID。...
2021-05-07 10:34:18 627
原创 MFC——字符串CString类相关
在vs的编译环境下,字符串字面量是 const char [] 类型的值,例如"AAA",就是 const char [4] 类型的值,因为字面量的后面还有一个"\0"字符(通过编译器的报错可知)而中文的字符串,类似"博客",则是 const char [5] 类型的值,每个中文两个char存放,再加上字符结尾"\0"这一点无论vs的字符编码是Unicode字符集还是多字节字符集都是不变的,在Unicode字符集下,CString::Append() 接收的字符是 const wchar_t *
2021-04-30 08:58:39 324
原创 C/C++语言——文件处理
因为一些无奈的原因,只能用最原始的代码写功能,于是熟悉一些语音基础1.FILE结构体对文件的操作都要使用FILE对象的指针,使用方法如下 FILE *file = NULL;2.常用文件操作函数fopen()、fclose()、fread()、fwrite()、fputc()、fgetc()、fseek()、fputs()、fgets()、fprintf()、fscanf()、feof()、ferror()、rewind()、remove()、tmpfile()、tmpna.
2021-04-29 15:40:17 154
原创 MFC——批量修改窗口字体为等宽字体
mfc所有控件的字体是顶层窗体设置的字体,vs创建的窗体默认是MS Shell Dlg(9)这种字体其实就是 Microsoft Sans Serif——常规——小五windows默认的字体是微软雅黑,记事本默认是微软雅黑——常规——小四但是微软雅黑也不是等宽字体vs编辑器默认字体是新宋体,新宋体是等宽字体,换字体存在其余设备没有这种字体的风险,但是目前暂时用这种方法如果是vs界面拖拽方法字体会继承顶层窗体字体,但是动态创建不会继承字体可以Create字体,然后在initDial
2021-04-28 15:47:44 816
原创 怎样找回自己CSDN丢失博客?
写博客是件很欢快的事情,但没多久就发现自己刚写的博客丢失,这是一件更加“欢快”的事情。百度了一下关于CSDN博客丢失的现象,虽然不算很多,但还是有个别人也同样发生了这样的情况。注:本方法仅适用于刚发布的博客,如果很久之前的博客丢失,请联系管理员!提示:注意别乱点把原来缓存的页面覆盖了步骤1:先找到浏览器缓存文件地址,以谷歌为例,本人的缓存文件是在C:\Users\Administr
2016-08-14 08:42:18 1552 6
原创 Java中repaint方法清除原来图像问题
虽然Java界面编程作用不大,但在兴趣的驱使下还是了解了一下,在写小程序的时候发现了repaint方法有时候会清理原来的图像,有时候又不清理。下面贴出我通过API文档得出的结论。程序作用:每点击一次,窗口上就多出一个小圆。情形一:
2016-08-14 00:50:59 14237 2
转载 程序员需要关注的那些网站(转自知乎)
质量上乘的程序员论坛有:1、Stack Overflow:Stack Overflow2、CodeProject:<a href="//link.zhihu.com/?target=http%3A//www.codeproject.com/" class=" wrap external" target="_blank" rel="nofollow noreferrer">CodeProject
2016-07-18 20:31:27 638
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人