MFC
_acme_
这个作者很懒,什么都没留下…
展开
-
MFC如何画饼图详解
有个画扇形的API,但是现在先不解释,因为不懂画饼图的原理,你也不懂怎么用。接下来就一步步带大家去计算饼图的扇形两点坐标。直接看下图,文字解释总是太抽象。 接下来就是用Pie这个函数来画出扇形了。 其原型如下:BOOL Pie( LPCRECT lpRect, POINT ptStart, POINT ptEnd );lpRect: 这个就是上图中的外接矩形 ptSta原创 2017-06-20 21:03:53 · 10556 阅读 · 1 评论 -
如何在ListCtrl中显示不同的图片
使用范围: 1.如果你想list的不同item前面都是不一样的图片,可以用这个方法(这个方法是Icon模式,其它模式需要自己稍微修改一下就行,类似的) 2.用list来显示图片(这个只支持Icon模式)效果如图: 其中图片下面的数字就是每个item的text,可以不要也可以要.步骤如下: 1.添加资源(我添加的是位图资源) 这一步骤前面有文章已经说过,这里不再详细说了.2.右键单击list原创 2016-05-24 11:56:21 · 4212 阅读 · 2 评论 -
怎样发布程序
发布程序的方法很多.如果你只想直接在别人电脑上运行,就不用下载发布程序的软件了.如果想打包软件,并且可以在别的电脑上安装使用,则需要下载第三方发布软件.有一个免费的发布软件叫做Inno Setup. 附上百度云链接链接:http://pan.baidu.com/s/1hr47FyW 密码:a62p注意:我们一般在Debug模式下写程序调试程序,一旦完成想发布的时候一般都是发布Release版本,所原创 2016-04-11 21:11:23 · 5890 阅读 · 2 评论 -
MFC-PlaySound
PlaySound函数是用来播放wav格式的音频文件的.它包含在mmsystem.h头文件中,还需要导入winmm.lib.其原型如下:BOOL WINAPI PlaySound( LPCSTR pszSound, HMODULE hmod, DWORD fdwSound //标记);pszSound:指定了要播放声音的字符串,该参数可以是WAVE文件的名字,或是WAV资源的名原创 2016-04-10 21:23:09 · 4124 阅读 · 0 评论 -
MFC-更换窗口过程
更换窗口过程就是拦截消息,专业术语叫做窗口”子类化”技术.下面用编辑框做例子.如图: 1.添加一个C++类 右键单击项目->添加->C++类,如图所示: 2.在新建类的头文件中添加相关变量和函数protected: //新的窗口过程,格式一定得这样写. static LRESULT APIENTRY NewEditProc(HWND hwnd, UINT message原创 2016-03-28 20:29:28 · 2342 阅读 · 0 评论 -
MFC-抓取网页源码
利用CInternetSession中的成员函数OpenURL来打开网页 再CHttpFile来获取网页的源码,CInternetSession类在afxinet.h头文件中CStdioFile* OpenURL(LPCTSTR pstrURL, //URL地址,或者本地文件的地址也可以 DWORD_PTR dwContext = 1, //上下文ID DWORD dwFlags = I原创 2016-04-09 21:22:05 · 3062 阅读 · 0 评论 -
MFC-自定义消息
微软定义的消息都是小于WM_USER的,所以我们想要自定义消息这个ID就要大于WM_USER,也就是16进制大于WM_USER对应的16进制.自定义消息有两种方法一:直接定义消息 1.//只要大于WM_USER就行#define WM_MY_MESSAGE (WM_USER+0x10)2.写消息处理函数的声明//这是规定的写法,写错了就映射不了了afx_msg LRESULT OnMyMess原创 2016-03-27 21:49:35 · 762 阅读 · 0 评论 -
MFC-登录框
有些软件需要登录才能进入到主页面,所以就需要个登录框.登录框需要解决两个难点.第一,对话框窗口需要接受回车消息.第二,当登录成功后弹出主窗口.1.添加资源–>对话框2.给登录框添加类 3.在头文件中添加成员变量//在构造函数初始化为FALSEBOOL m_bLogIn;4.在主对话框初始化对话框中打开登录框 //判断是否登录成功 CLogInDlg dlg; if (dlg原创 2016-04-08 21:33:46 · 1750 阅读 · 0 评论 -
MFC-CtabCtrl(属性页控件)
属性页->选项卡->对话框就是属性页包含多个选项卡,每个选项卡对应一个对话框,如图所示: 1.添加对话框,这里先插入两个对话框,如图所示: 2.把两个对话框的属性修改一下,Style属性设置为Child,Border属性设置为None.然后向对话框添加几个控件作为演示.如图: 3.分别给两个对话框添加类,如图所示: 4.在主对话框头文件里给两个对话框定义变量 CPage1D原创 2016-03-27 13:47:03 · 2710 阅读 · 2 评论 -
MFC-字体和颜色对话框
用富文本框来做例子:要使用富文本框就要初始化富文本框. 在InitInstance()函数中写如下代码 //初始化富文本框 AfxInitRichEdit2();然后添加两个菜单,在两个菜单中添加事件处理程序,如图所示: 接下来就是写对应的消息处理了.字体菜单事件处理函数. 代码如下: //文字格式结构 CHARFORMAT cf = { 0 }; cf.原创 2016-03-27 12:58:27 · 4482 阅读 · 0 评论 -
MFC-文件对话框
打开文件对话框: //创建文件对话框,TRUE表示打开文件对话框,FALSE表示保存文件对话框,文件名和路径必须存在 CFileDialog dlg(TRUE, nullptr, nullptr, OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST , _T("文本文件(*.txt)|*.txt|所有文件(*.*)|*.*||"), this);原创 2016-03-26 16:39:44 · 924 阅读 · 0 评论 -
MFC-模态对话框和非模态对话框
创建模态对话框:打开资源视图->插入对话框,如图所示: 然后右键属性添加类,如图所示: 然后在主对话框cpp文件中包含它的头文件,如图所示 然后在打开模块对话框按钮中写代码 //创建模态对话框 CModal d;//这个就是新创建的对话框类 d.DoModal();效果如图: 然后用同样的方法(从步骤1开始)创建非模态对话框实现代码: //一定得用指针原创 2016-03-26 16:19:23 · 1110 阅读 · 0 评论 -
MFC-CStatusBar(状态栏)
效果如图: 首先在头文件中定义一个CStatusBar变量CStatusBar m_statusbar;然后在初始化对话框中创建状态栏并且设置面板信息 //创建状态栏 m_statusbar.Create(this); //创建两个面板//第一个面板是1,第二个面板是2 UINT nID[] = { 1,2 }; m_statusbar.SetIndicato原创 2016-03-26 15:48:58 · 5295 阅读 · 0 评论 -
MFC-Toolbar(24位真彩色)
先准备一个24位的真彩色工具栏BMP图片 如图所示: 然后添加到资源里接着上一篇16位工具栏的代码,进行稍微修改即可 //创建Toolbar m_toolbar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP); //加载Toolbar //16位的工具栏按钮个数决定24位的工具栏按钮个数原创 2016-03-26 15:15:44 · 4556 阅读 · 0 评论 -
MFC对话框如何运行后隐藏起来
一般初学者会简单的认为在初始化对话框中ShowWindow(SW_HIDE);不就可以了吗?但其实那样是不行的,因为MFC中对话框的初始化显示其实很复杂,并不像SDK中的ShowWindow那么简单。下面介绍几种方法来达到运行后立刻隐藏。1.使用MoveWindow //在初始化对话框中使用 MoveWindow(0, 0, 0, 0);注意:这个把对话框变没了,所以你点击任务栏程序图原创 2016-05-14 22:20:03 · 2034 阅读 · 0 评论 -
如何打开磁盘目录对话框(BrowseForFolder)
打开文件对话框相信很多人都已经懂了,那么如何通过打开对话框选择路径呢?这里就要介绍几个函数和结构体.//文件夹信息结构typedef struct _browseinfo { HWND hwndOwner; //弹出目录对话框的父窗口 LPCITEMIDLIST pidlRoot;//ITEMIDLIST结构的地址,包含浏览时的初始根目录 //如果设为NULL则桌面目原创 2016-05-04 10:52:05 · 4571 阅读 · 0 评论 -
MFC串口通信实例
参考MSComm控件的用法和函数说明。里面讲得也算详细了。所以这里直接献上源码示例。github下载地址 CSDN下载地址效果如图: 需要注意的是:1.如果想同时recv/send,则必须加个线程。2.奇偶校验中,参数设置为,无(n),偶校验(o),寄校验(e),标记(m),空格(s)。3.数据位一般填写5~84.停止位一般填1、1.5、25.还有换行符的问题,一定要发送换行符,否则命令可能不能原创 2017-03-13 15:53:02 · 10585 阅读 · 1 评论 -
MFC如何让背景图随窗口大小改变
刚开始做的时候,我理所当然的想,直接在OnPaint函数中改变图片的大小,但是发现,这样会导致图片出现如下现象: 这是因为多次重复地更新同一区域,导致图片看起来重叠了,也可以这样理解,因为没有使客户区无效,所以OnPaint再重绘的时候不会先把原来的背景擦出,从而覆盖上去,出现重叠。所以由此可以想到解决办法,那就是在别的函数中使用Invalidate()函数使客户区矩形区域无效,然后通知重绘,这时原创 2017-03-01 19:11:28 · 8382 阅读 · 4 评论 -
MFC如何设置背景图片
方法有很多种,有难有易。接下来从简单到难来讲解,并举例。一、利用WM_CTLCOLOR消息将图片绘制上去步骤如下: 1.为对话框添加WM_CTLCOLOR消息 2.添加两个成员变量 CBitmap m_bmp; //位图 CBrush m_brush; //画刷3.加载位图,并且在WM_CTLCOLOR函数中绘制背景m_bmp.LoadBitmap(MAKEINTRESOUR原创 2017-02-28 21:14:55 · 21650 阅读 · 6 评论 -
MFC操作EXCEL例子
因为其中原理我也不是很懂,所以目前只能按着基本步骤来,感兴趣的可以去看ATL/COM编程。点击下载完整代码效果如图: 步骤如下: 1.新建一个MFC工程(对话框)新建过程中,记得要选择自动化。如图: 之后会自动添加如下头文件#include <afxdisp.h> // MFC 自动化类2.用类向导添加EXCEL接口 如图: 1. 2. 3.找到EXCEL.EXE所在的路原创 2016-12-25 19:02:20 · 2983 阅读 · 0 评论 -
MFC连接MySQL数据库实例
关于项目配置请参考这篇文章 http://blog.csdn.net/qq_18297675/article/details/52239881关于乱码问题请参考这篇文章 http://blog.csdn.net/qq_18297675/article/details/52240029需要注意的是,在MFC中有些函数的参数类型是LPCTSTR的,这样就算数据库返回的数据不乱码,你把它强制转换后还是原创 2016-08-18 13:38:41 · 13737 阅读 · 22 评论 -
MFC如何获取控件的坐标
思路是先获取到控件相对于屏幕左上角的坐标然后转换成相对于客户区的坐标. 代码如下:GetDlgItem(IDC_BUTTON)->GetWindowRect(&rectCtr); //获取被选中的控件大小ScreenToClient(&rectCtr); //转化为客户区坐标原创 2016-08-04 01:29:43 · 3591 阅读 · 0 评论 -
MFC动态创建线程
这里需要一个知识点,就是多个线程可以共用一个线程函数,所以我们就不需要去烦恼怎么动态创建不同的线程函数。只需要考虑同一个线程函数什么时候该做哪一个线程的事就行。所以变化的就是穿进线程函数的参数了,然后由这个值来确定是哪个线程.例子如下: 效果如图: 代码如图:1.开始按钮 UpdateData(TRUE); for (int i =0;i<m_countThread;i++)原创 2016-07-26 19:30:44 · 3217 阅读 · 0 评论 -
怎样给Tab Control控件加上背景颜色或图片
如果不懂Tab控件添加选项卡(属性页)的请看这篇文章:http://blog.csdn.net/qq_18297675/article/details/50991413这里我就直接在添加好选项卡的基础上 加上背景颜色和图片. 这里要用到WM_CTLCOLOR消息,如果不懂怎么用请看这篇文章:http://blog.csdn.net/qq_18297675/article/details/51049原创 2016-04-24 13:33:24 · 9474 阅读 · 2 评论 -
怎样使用CPropertyPage类和CPropertySheet类创建属性表
CPropertyPage类是属性页类,相当于每一个类就是一个对话框.它继承自CDialog类.CPropertySheet类是属性表类,它有多个属性页.它继承自CWnd类创建属性表步骤如下: 这里简单的以只有两个属性页的属性表为例子.1.创建一个主对话框. 如图: 2.在资源中创建一个菜单 如图: 3.给菜单添加事件处理程序 如图: 4.在主对话框属性中添加菜单 如图: 5.添加原创 2016-04-23 23:15:21 · 4836 阅读 · 3 评论 -
对其它程序的编辑框进行操作
首先大家很容易的想到用FindWindow函数来进行查找其句柄.就拿记事本来说.如果你用FindWindow获取其句柄是获取不到编辑框的句柄的,只能获取它父窗口的句柄.所以我们可以调整一下思路.先获取它父窗口的句柄,然后通过它找到子窗口句柄.效果如图: 1.发送内容给其它程序的编辑框 //获取父窗口句柄 HWND hFindParent = ::FindWindow(nullptr,原创 2016-04-21 21:59:15 · 1121 阅读 · 0 评论 -
如何动态显示图片
有两种办法,第一种就是用PicTure控件。这种办法的优点是简单,缺点是当图片大小不一致的时候,图片显示会一大一小很难看。 第二种办法就是直接把位图图片画上去。优点是可以任意伸缩以后画上去,这样可以保证大小一致。很明显的缺点就是代码比较难,稍微不留意就会内存泄漏,程序崩溃。第二个缺点是分辨率会明显降低.要注意的是,最好用工作线程来处理显示图片,否则主线程会堵塞,程序会崩溃.一.用Picture控件原创 2016-05-16 21:18:14 · 2966 阅读 · 0 评论 -
如何动态的显示程序运行的时间
假设你在做一个小软件,需要动态显示某个软件功能运行所花费的时间.就像杀毒那样,上面会有运行时间。动态显示很简单,首先想到的就是设置一个定时器,每隔一秒获取当前系统的时间,然后和程序刚运行的时间相减就能得出运行时间了。但是这样就有一个问题,假如中途你这个程序想要暂停一会,然后继续,你会发现,显示的时间突然跳变了,因为在你暂停的那一会,系统的时间是在流逝的,并不会暂停,只是你暂停显示了而已。而我想要的效原创 2016-05-04 11:21:54 · 2662 阅读 · 0 评论 -
如何在list控件中响应右键弹出菜单中的菜单事件
当你在list控件中右键单击的时候可以正常弹出菜单,但是当你选择菜单的功能的时候却没有反应,这是为什么呢?原因很简单,菜单事件处理消息是主窗口处理的,而你是在子窗口(list)中选择的,传入的窗口指针是子窗口的,处理消息的自然也是子窗口的,但是子窗口并没有处理相应消息的事件处理程序,所以才会有在list控件中右键菜单中的事件并没有响应。解决的办法可以说也是很简单的,就是把消息传给父窗口处理.代码如下原创 2016-05-04 11:03:31 · 1706 阅读 · 0 评论 -
MFC-Toolbar(16位)
创建Toolbar:打开资源视图->右键添加资源->Toolbar->新建 如图: 然后可用利用VS上的画图工具设计Toolbar图标,如图: 接着去头文件中定义一个CToolbar变量CToolBar m_toolbar;然后去初始化对话框中创建加载调整Toolbar //创建Toolbar m_toolbar.CreateEx(this, TBSTYLE_FLAT, WS_C原创 2016-03-26 14:45:07 · 1037 阅读 · 0 评论 -
MFC-CMenu(菜单)
创建窗口菜单:添加资源->菜单资源,如图所示: 现在创建了两个子菜单(文件和编辑菜单)然后点击主窗口右键单击属性,如图所示: 然后右键单击新建->添加事件处理程序,如图所示:写测试代码:void CMFCTESTDlg::OnNew(){ // TODO: 在此添加命令处理程序代码 AfxMessageBox(_T("文件->NEW"));}如图所示:创建快捷菜单:原创 2016-03-26 14:12:51 · 1144 阅读 · 0 评论 -
MFC-创建,挂起,恢复线程
线程分为界面线程和工作线程界面线程: 学过windows程序设计的都知道每一个窗口都有一个消息循环来处理各种消息.所以界面线程的机制和窗口过程差不多,是比较复杂的. 工作线程: 很简单的一种线程,只能用来打印输出循环等.不能进行消息处理.所以功能不是很强大,贵在简单.创建工作线程的函数:CWinThread* AfxBeginThread( AFX_THREADPROC pfnThre原创 2016-04-02 15:34:14 · 3048 阅读 · 0 评论 -
MFC-通过WtsApi32.dll中的函数枚举进程
WtsApi32是终端服务API,这种方法获取进程信息很快很简洁.效果如图: 1.包含头文件WtsApi32.h,导入库WstApi32.lib2.代码如下://终端服务的名字,就是计算机的名字 TCHAR szComputerName[100] = TEXT("xxx"); //打开终端服务,返回一个句柄 HANDLE hSever = WTSOpenServer(szCo原创 2016-04-02 13:31:25 · 1127 阅读 · 0 评论 -
MFC-通过psapi.dll中的函数枚举进程
这次通过一个实用的小例子讲解一下psapi.dll(头文件是Psapi.h)中几个函数的用法. 效果如图: 这个例子需要用到的知识有: 静态文本http://blog.csdn.net/qq_18297675/article/details/50978562 ListControlhttp://blog.csdn.net/qq_18297675/article/details/50983原创 2016-04-01 15:49:04 · 1559 阅读 · 2 评论 -
MFC-用系统快照来枚举进程
用到的函数和结构体如下: //失败返回INVALID_HANDLE_VALUE HANDLE WINAPI CreateToolhelp32Snapshot( DWORD dwFlags, //用来指定“ 快照”中需要返回的对象,可以是TH32CS_SNAPPROCESS等 DWORD th32ProcessID//一个进程ID号,用来指定要获取哪一个进程的 快照,当获取系统进原创 2016-03-31 20:36:21 · 1453 阅读 · 0 评论 -
MFC-内存映射实现数据共享
做两个进程,一个进程把数据写到内存空间,一个进程从内存空间中读取数据.写数据的进程: 1.定义两个成员变量 HANDLE m_hMapObject;//映射对象句柄 LPTSTR m_pszMapView;//指向映射的地址空间2.在初始化对话框中获取一块内存空间以便写入//创建映射对象 m_hMapObject = CreateFileMapping( (H原创 2016-03-31 19:51:55 · 7336 阅读 · 1 评论 -
MFC-利用内存映射文件来读写文件
以下简介摘抄自搜狗百科: 文件操作是应用程序最为基本的功能之一,Win32 API和MFC均提供有支持文件处理的函数和类,常用的有Win32 API的CreateFile()、WriteFile()、ReadFile()和MFC提供的CFile类等。一般来说,以上这些函数可以满足大多数场合的要求,但是对于某些特殊应用领域所需要的动辄几十GB、几百GB、乃至几TB的海量存储,再以通常的文件处理方法进原创 2016-03-31 19:02:17 · 6722 阅读 · 5 评论 -
MFC-创建互斥对象
通过一个小例子,了解一下互斥对象的用处. 有些软件是不允许运行第二个实例的,比如360,你只要运行了他,在运行一次他就只会被调到前面不会再创建一个新的进程.1.定义一个互斥对象句柄HANDLE m_hMutex;//互斥对象句柄2.给窗口设置一个标记属性,以便等会凭着这个标记找到本实例窗口 在WM_CREATE消息函数中设置窗口标记属性int CMFCTESTDlg::OnCreate(LPCR原创 2016-03-31 14:09:11 · 1182 阅读 · 0 评论 -
MFC-双管道
双管道比但管道复杂一点,但是功能强大,能更快速的处理进程间的通信.还是以单管道的例子,稍加修改即可1.定义两个成员变量. HANDLE m_hInReadPipe;//读取输入管道的内容 HANDLE m_hOutWritePipe;//把命令输出到输出管道2.在构造函数中创建管道和进程HANDLE hInWritePipe = nullptr;//把内容写到输入管道 HAND原创 2016-03-30 21:28:11 · 2333 阅读 · 0 评论 -
MFC-单管道
单管道通信,每传输一次数据就要创建一个新的进程,速度很慢,但是简单.下面做一个读取命令行内容的例子效果如图: 全部的代码都写到执行按钮中,代码如下 HANDLE hWritePipe = nullptr;//把内容写到管道的句柄 HANDLE hReadPipe = nullptr;//从管道里读取内容的句柄 //管道的安全属性 SECURITY_ATTRIBUTE原创 2016-03-30 20:20:23 · 880 阅读 · 0 评论