MFC/C++
Fenice
狂奔的蜗牛
展开
-
gcc __builtin_expect特性
__builtin_expect 说明 - 简书转载 2022-02-21 16:12:25 · 215 阅读 · 0 评论 -
C++何时使用引用,何时使用指针?
如果你有一个变量,其目的是用来指向另一个对象,但是也有可能不指向任何对象,那么你应该使用pointer,因为你可以将pointer设为nullptr。如果这个对象必须代表一个对象,也就是说你的设计不允许这个对象为null,那么你应该使用reference....原创 2021-09-13 23:32:39 · 342 阅读 · 0 评论 -
C++ const与指针的修饰顺序
如果关键字const出现在*左边,表示被指物是常量;如果出现在*右边,表示指针本身是常量;如果出现在*两边,表示被指物和指针都是常量。char greeting[] = "Hello"char *p = greeting; // non-const pointer, non-const dataconst char* p = greeting; // non-const pointer, const datach...原创 2021-08-06 00:56:42 · 354 阅读 · 0 评论 -
由std::common_type知道的?:运算符的不为人知的规则
std::common_type的原理大概是true? A : B, 而true是个常量,为啥A : B的类型是common type呢?这里参见:https://docs.microsoft.com/en-us/previous-versions/visualstudio/visual-studio-2012/e4213hs1(v=vs.110)?redirectedfrom=MSDNRemarksThe conditional operator (? :) is a ternary oper原创 2021-07-19 17:58:50 · 361 阅读 · 1 评论 -
在对话框中 实现重绘
1) 在对话框中重载重绘OnPaint() ,其中的CpaintDC dc(this) 是有自己的坐标系统的,看网络上说可以使用MapDialogRect 去掉模板单位到Screen单位。这个是在网络上看的,之后自己使用了CpaintDC dc(this), CPaintDC dc(this); // device context for painting// TODO: 在此处添加转载 2012-11-24 19:38:38 · 983 阅读 · 0 评论 -
略谈如何在对话框创建视图类画图
在对话框上画图可以通过添加控件来进行,但这种画图有一个严重弊端就是画图范围受控件范围控制。最近做一个程序,需要一个数据报告窗口,因为输出的内容比较多,格式不一致(涉及多个表,但每个表的数据要严格对齐),所以如ListControl等控件并不适合。所以我想到在对话框上创建视图类上进行数据显示。 一是视图窗口如何动态创建。首先是视图窗口的定位。一般的动态创建窗口定位窗口的位置不太容易。转载 2012-12-07 06:00:12 · 873 阅读 · 0 评论 -
在MFC中添加用户自定义消息
首先弄清楚两点:(1)谁要发送这个消息(2)谁要接受这个消息。 用一个简单的例子来说明。对象A向B(也可以就是A到A)发送消息。 1 发送消息 首先在A的头文件中定义这个消息: #define WM_USERMESSAGE WM_USER+30 所有自定义消息都是以WM_USER消息为基础加上一个任意的自然数来表示的。A是向外发送消息原创 2012-12-06 14:12:39 · 913 阅读 · 0 评论 -
MFC如何从view类向自定义类中发送消息
1.在视图类中获取自定义类的指针(). 2.通过指针来向自定义类发送一个消息postmessage(); 3.在自定义类中的消息映射中自定义个消息来接受这一从视图类发来的消息。 4.最后写个自定义消息响应函数来处理消息(over)。原创 2012-12-05 15:47:56 · 2330 阅读 · 0 评论 -
使用临界区对象实现读,写线程同步
本例创建两个工作线程,通过使用CCriticalSection类对象,保证同一时刻只有一个线程可以访问临界区对象。开发过程:(1) .界面:(2) 在对话框类的实现文件的顶部定义全局CCriticalSection对象,全局资源和工作线程入口函数CCriticalSection g_cs; //临界区对象int g_data = 0;原创 2012-11-21 18:32:31 · 993 阅读 · 0 评论 -
MFC如何使控件大小随着对话框大小自动调整
对话框的大小变化后,假若对话框上的控件大小不变化,看起来会比较难看。下面就介绍怎么让对话框上的控件随着对话框的大小的变化自动调整。首先明确的是Windows有一个WM_SIZE消息响应函数,这个函数在对话框大小发生变化的时候调用,所以我们可以记录下原来对话框的大小,还有当前对话框的大小(这个不用自己算,系统已给出),然后根据控件做出相应比例的调整。比如原来对话框大小为a,现在为b,转载 2012-12-04 21:52:51 · 1152 阅读 · 0 评论 -
CCriticalSection类的使用
当多个线程访问一个独占性共享资源时,可以使用“临界区”对象。任一时刻只有一个线程可以拥有临界区对象,拥有临界区的线程可以访问被保护起来的资源或代码段,其他希望进入临界区的线程将被挂起等待,直到拥有临界区的线程放弃临界区时为止,这样就保证了不会在同一时刻出现多个线程访问共享资源。 CCriticalSection类的用法非常简单,步骤如下: 定义CCrit原创 2012-11-21 18:17:49 · 1651 阅读 · 0 评论 -
线程的同步处理1
线程有很多便利但也有很多需要注意的问题.如何防止两个线程在同一时间访问同一数据,使隶属于同一个进程的各线程协调一致地工作称之为线程的同步.MFC提供了多种同步对象,如CEvent,CCriticalSection,CSemaphore,CMutex.另外MFC提供了线程的辅助类CSingleLock和CMutiLock。使用CEvent 对象实现线程同步:1. 首先在主原创 2012-11-20 20:44:35 · 597 阅读 · 0 评论 -
使用互斥对象CMutex实现不同的进程间通信
使用CMutex对象可以在不同的进程的线程间实现资源的安全共享.程序实例:创建一个工作进程,使用CMutex锁定数据3秒,然后解除锁定,2秒后再次锁定并循环.开启多个进程,可以发现同时只有一个工作进程可以锁定数据////////////////////////////////////////////////////////////////////////////CMutex原创 2012-11-24 23:36:52 · 2802 阅读 · 0 评论 -
MFC让文档/视图结构程序支持滚动条
要通过滚动条显示文档,还必须知道文档滚动到了什么位置;一旦用户拖动滚动条时要告诉视图改变在文档中的位置。所有这些,由MFC的CSrollView类来完成。而程序员要做的工作是:1、从CScrollView类中派生自己的视图类,以支持滚动条2、提供文档大小,确定滚定范围和设置初始值3、协调文档位置和屏幕坐标一、有CScrollView类派生视图类使用A原创 2012-12-12 23:09:23 · 3966 阅读 · 0 评论 -
MFC给按钮添加图片
VC中对话框上编辑里,通过控件方式无法给按钮设定图片的,需写代码实现,还好代码量不大,哈哈!首先建立基于对话框的MFC应用程序工程testDlg,添加按钮,ID为IDC_BUTTON_TEST,接下来一,首先建立位图句柄[cpp] view plaincopy// 方法一:加载非资源图片 HBITMAP hBitma原创 2014-03-28 22:20:25 · 872 阅读 · 0 评论 -
利用gcc对C语言的语句内嵌表达式扩展定义lambda宏
/* * 不支持g++和clang * */#include #include #include // 定义lambda宏#define lambda(return_type, function_body)\({\ return_type $this function_body\ $this;\})#define $ lambda#原创 2015-11-30 10:18:58 · 2492 阅读 · 1 评论 -
x64cpu与IA32cpu中通用寄存器的差异
整理一下IA32处理器和x86-64处理器中通用寄存器的差异。 IA32既支持32位处理器,也向后兼容16位寄存器。IA32把16位的通用寄存器,标志寄存器和指令指针寄存器扩充为32位。段寄存器仍为16位。IA32 CPU中包含一组8个32位通用寄存器,用来存储整数数据和指针。它们的名字以%e开头,可以理解为对16位的extend。 这8个寄存器分别为eax, ebx,原创 2015-07-29 00:55:37 · 4980 阅读 · 1 评论 -
使用位运算判断两个int值是否相等
int judge(int x, int y) { return !(x ^ y);}如果x和y相等,则各位都相等,异或值为0,取反即可原创 2015-07-03 23:40:18 · 8445 阅读 · 0 评论 -
使用异或交换指针的值
#include #include void inplace_swap(int *x, int *y) { *y = *x ^ *y; *x = *x ^ *y; *y = *x ^ *y;}int main() { int x = 12; int y = 23; inplace_swap(&x, &y); printf原创 2015-07-03 00:45:31 · 1651 阅读 · 0 评论 -
Win32使用Psapi库枚举系统进程信息
一、枚举当前的所有进程(64位的程序暂时不会处理) 通过EnumProcesses得到当前所有的进程的进程ID,然后调用OpenProcess通过进程ID得到进程句柄,再调用EnumProcessModules来得到该进程的模块句柄,GetModuleBaseName通过进程模块句柄得到进程的名字,GetModuleFileNameEx通过进程模块句柄得到进程的可执行文件名。上面所有原创 2014-06-08 18:03:49 · 2916 阅读 · 0 评论 -
ReadProcessMemory使用
函数功能描述:该函数用来读取指定进程的空间的数据,此空间必须是可以访问的,否则读取操作会失败!函数原型 BOOL ReadProcessMemory( HANDLE hProcess, // 目标进程句柄 LPCVOID lpBaseAddress, // 读取数据的起始地址 LPVOID lpBuffer, // 存放数原创 2014-06-08 23:13:53 · 19838 阅读 · 0 评论 -
C++将十进制数字转化为X 进制的字符串
//判断汇文数bool isPalindromic(string num){ bool flag = true; int len = num.length(); for(int i = 0; i <= len/2; i++){ if(num[i] != num[len - i - 1]){ flag = false; } } return flag;}string原创 2014-05-11 14:05:44 · 2315 阅读 · 0 评论 -
WTL在VC各版本下的安装
WTL在VC各版本下的安装WTL各版本下载地址:http://sourceforge.net/projects/wtl/files/WTL7.1+VC6.0安装过程:运行WTL71.exe,解压运行/WTL71/AppWiz60/setup.js复制WTL71/include目录下的18个头文件到VC++6.0安装目录的 /VC98/Include下。运行VC++6原创 2014-04-05 14:47:56 · 951 阅读 · 0 评论 -
橡皮筋类(CRectTracker)
Windows自带的画图软件中可以用虚线框选择图像的某个区域,之后便可以拖动、放大、缩小该区域,这是通过橡皮筋类(CRectTracker)来实现的,它将实现用线框选中一个区域,并可以拖动、放大、缩小该区域。简介:CRectTracker类允许一个项被显示,移动,以不同的方式改变大小。虽然CRectTracker类是设计来支持用户以图形化界面与OLE项交互的,但是它的使用不仅限于支原创 2012-11-18 19:45:58 · 1159 阅读 · 0 评论 -
CList的使用
初学mfc者,往往对CList等mfc的Collect类的使用感到迷惑,在使用中经常会遇到许多问题,导致对vc中的Collect类的使用产生了惧怕。以下,就个人经历而言,告诉大家如何使用CList。CList是一个双向链表类。1、头文件名不可少Clist类定义在Afxtempl.h 头文件中,因此在使用该类时,需要加这个头文件名。2、理解CList的声明和构造方法转载 2012-10-17 21:19:38 · 3587 阅读 · 0 评论 -
关于UpdateData(TRUE)和UpdateData(False)使用
UpdateData(true); //接收用户输入时使用 用窗体上控件中的内容来更新和控件相关连的变量的值(只能更新value类型的变量) 例如:你在你的窗体中有一个Edit控件,为这个控件关联了CString类型的变量m_strName; 你在控件中添入内容之后,必须调用UpdateData(true);才能把你添入的内容传给m_strName这个原创 2012-10-16 22:56:33 · 786 阅读 · 0 评论 -
CSocket类介绍
CSocket类派生于CAsyncSocket,对于windows socket API进行了更高层次的封装.支持同步操作,可以单独使用,通常情况下与CSocketFile,CArchive类一起实现数据的发送和接受.(1)Create方法用于创建一个套接字BOOL Create(UINT nSocketPort=0,int nSocketType=SOCK_STREAM,原创 2012-10-16 12:33:49 · 1669 阅读 · 0 评论 -
获取局域网的计算机名和IP
(1)创建一个基于对话框的应用程序 (2)在对话框的oninitdialog方法中添加代码WSADATA wsd; WSAStartup(MAKEWORD(2,2),&wsd); m_grid.SetExtendedStyle(LVS_EX_FLATSB |LVS_EX_FULLROWSELECT |LVS_EX_HEADERDRAGDROP |LVS_原创 2012-10-13 22:09:32 · 1507 阅读 · 0 评论 -
MFC基本控件及使用
4.1 Button按钮窗口(控件)在MFC中使用CButton表示,CButton包含了三种样式的按钮,Push Button,Check Box,Radio Box。所以在利用CButton对象生成按钮窗口时需要指明按钮的风格。创建按钮:BOOL CButton::Create( LPCTSTR lpszCaption, DWORD dwStyle, const RECT& r转载 2012-10-13 20:44:43 · 1562 阅读 · 0 评论 -
映射网络驱动器MFC
(1)新建一个对话框应用程序,如图 (2)处理...按钮void CNetDiskDlg::OnBrown() { // TODO: Add your control notification handler code here UpdateData(TRUE); BROWSEINFO bInfo; //declar原创 2012-10-13 15:42:59 · 2697 阅读 · 0 评论 -
获取网卡MAC地址
(1)新建一个基于对话框的应用程序设计对话框如图 (2)处理GetMac按钮的单击事件,在程序中使用Netbios函数获取网卡地址typedef struct _ASTAT_ { ADAPTER_STATUS adapt; NAME_BUFFER NameBuff[30]; }ASTAT, * PASTAT;void CGetMACDlg::O原创 2012-10-11 22:19:11 · 776 阅读 · 0 评论 -
外部程序启动器MFC
主要介绍CreateProcess函数的使用(1)创建一个基于对话框的工程(2)使用classwizard打开类向导,为控件选择命令(3)处理”…”的按钮单击事件,弹出文件打开对话框,让用户选择一个可执行文件。代码如下void CSubPreocessDlg::OnChosefile(){// TODO: Add your control not原创 2012-10-10 21:40:24 · 711 阅读 · 0 评论 -
进程死锁及解决办法
一、要点提示(1) 掌握死锁的概念和产生死锁的根本原因。(2) 理解产生死锁的必要条件–以下四个条件同时具备:互斥条件、不可抢占条件、占有且申请条件、循环等待条件。(3) 记住解决死锁的一般方法,掌握死锁的预防和死锁的避免二者的基本思想。(4) 掌握死锁的预防策略中资源有序分配策略。(5) 理解进程安全序列的概念,理解死锁与安全序列的关系。(6) 了转载 2012-10-10 17:40:30 · 1199 阅读 · 0 评论 -
STL中map用法详解
Map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力,由于这个特性,它完成有可能在我们处理一对一数据的时候,在编程上提供快速通道。这里说下map内部数据的组织,map内部自建一颗红黑树(一种非严格意义上的平衡二叉树),这颗树具有对数据自动排序的功能,所以在map内部所有的数据都是有序的,后边我们会见识到有原创 2012-10-05 22:48:26 · 717 阅读 · 0 评论 -
修改MFC程序标题
MFC程序的默认的标题是“无标题-title”,其中title是应用程序的名称,我们应如何修改MFC窗口标题来符合自己的要求? MFC程序的文档类中定义了一个虚函数SetTitle,用于设置窗口标题的前半部分,如果只是要修改“无标题”部分,可以重载文档类的该函数。窗口标题的后半部分可以通过SetWindowText设置,也可以编辑字符串资源中的IDR_MAINFRAME字符串,将第一个转载 2012-10-28 16:36:02 · 912 阅读 · 0 评论 -
DECLARE_SERIAL(class_name)
DECLARE_SERIAL(class_name)参数: class_name 类的实际名字(不用引号括起来)。 说明:DECLARE_SERIAL为可以串行化的CObject的派生类生成了必要的C++代码。串行化是指将对象的内容写入文件或从文件读入对象的内容的过程。在.H模块中使用DECLARE_SERIAL宏,然后在所有需要访问这个类的对象的.CPP模块中包含这个模块原创 2012-10-25 09:57:20 · 3960 阅读 · 0 评论 -
ClxDialog类
//从此类派生出的对话框可以根据对话框大小变化自动调整控件大小//头文件///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 自动改变控件位置和大小的对话框类// 文件名:l原创 2012-12-01 13:54:49 · 1091 阅读 · 0 评论 -
控件大小随窗口变化的方法(MFC)
VC++之根据对话框大小调整控件大小1、在对话框类中加入成员变量CRect m_rect;用于保存对话框大小变化前的大小;2、在对话框的OnInitDialog()函数中获取对话框创建时的大小:GetClientRect(&m_rect);3、在WM_SIZE的响应函数OnSize()中加入以下代码:CWnd *pWnd; pWnd = GetDlgItem(IDC_LIST)原创 2012-12-01 13:52:07 · 2206 阅读 · 0 评论 -
VC 坐标体系
1.逻辑坐标 LP 逻辑坐标就为独立于设备地,它与设备点地大小无关。使用逻辑单位,就为实现写出来"所见即所得"地基础。当程序软件代码员在调用1个画线地GDI函数functionLineTo,画出25.4mm(1英寸) 长地线时,他并非要考虑输出地就为何种设备。若设备就为VGA显示器,Windows自动将其转化为96个像素点;若设备就为1个300dpi地激光打印原创 2012-12-01 16:51:26 · 766 阅读 · 0 评论 -
在对话框中使用CSrollView
BOOL CViewDlgDemoDlg::OnInitDialog(){ CDialog::OnInitDialog(); CRect rectWindow; GetWindowRect(rectWindow); CRuntimeClass *pViewClass = RUNTIME_CLASS(CMyScrollView); CCrea原创 2012-12-01 14:22:22 · 1061 阅读 · 0 评论