MFC进阶
文章平均质量分 86
XiaoTobey
这个作者很懒,什么都没留下…
展开
-
程序的来龙去脉
来龙去脉总整理前面各节的目的就是如何将表面上看来不知所以然的MFC 程序对映到我们在SDK 程序设计中学习到的消息流动观念,从而清楚地掌握MFC 程序的诞生与死亡。让我对MFC程序的来龙去脉再做一次总整理。程序的诞生:■ Application object 产生,内存于是获得配置,初值亦设立了。■ Afx WinMain 执行AfxWinInit,后者又调用AfxInit转载 2013-04-10 10:20:10 · 585 阅读 · 0 评论 -
MFC自动生成代码详解(一)
首先声明这篇博客是给MFC刚刚上路的coder准备的,老鸟们就自觉无视我吧!大家有没有感觉,创建MFC工程时他总会生成一大堆文件一大堆代码。虽然给我们带来了便利,但是调试的时候碰到这些代码总是畏首畏脚的,从来不敢动他们。这篇博客就来帮大家解决这个问题。让你在熟悉他们的作用同时,真正的不怕他们!现在我见了一个工程名字为Example他会生成以上几个文件我们就从从Examp原创 2013-04-12 20:57:51 · 3548 阅读 · 1 评论 -
InterlockedIncrement函数详解
InterLockedIncrement and InterLockedDecrement实现数的原子性加减。什么是原子性的加减呢?举个例子:如果一个变量 Long value =0;首先说一下正常情况下的加减操作:value+=1;1:系统从Value的空间取出值,并动态生成一个空间来存储取出来的值;2:将取出来的值和1作加法,并且将和放回Value的空间转载 2013-04-28 10:12:00 · 901 阅读 · 0 评论 -
CMap类的用法
定义: CMap myMap(16); 赋值: for (int i=0;i myMap.SetAt( i, CPoint(i, i) ); 赋完值后就变成如下这样: 索引 值 0 -> (0,0) 1 -> (1,1) 2 -> (2,2) 3 -> (3,3) 4 -> (4,4) 5 -> (5,5) 6 -> (6,6) 7转载 2013-05-02 12:59:09 · 1393 阅读 · 0 评论 -
CMap的成员函数SetAt和Lookup用法实例
遇到好多次这玩意了,老也理解不了,今天忽然觉得有点明白了,选写下一点,等以后再深刻理解了再补充吧。觉得这个例子不错,简单也容易理解一些。#include #include void main() { AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0);转载 2013-05-14 14:59:24 · 5736 阅读 · 0 评论 -
svn符号各含义
黄色感叹号(有冲突):--这是有冲突了,冲突就是说你对某个文件进行了修改,别人也对这个文件进行了修改,别人抢在你提交之前先提交了,这时你再提交就会被提示发生冲突,而不允许你提交,防止你的提交覆盖了别人的修改。要解决冲突,如果你确认你的修改是无效的,则用TSVN还原你的修改就行了;如果认为你的修改是正确的,别人的提交是无效的,那么用TSVN先标记为“解决冲突”,然后就可以提交了;如果你认为你的修转载 2013-04-01 10:12:35 · 662 阅读 · 0 评论 -
GetMessage与PeekMessage区别
它们都是到消息队列中抓消息,如果抓不到,程序的主执行线程(primary thread,是一个UI 执行线程)会被操作系统虚悬住。当操作系统再次回来照顾此一执行线程,而发现消息队列中仍然是空的,这时候两个API函数的行为就有不同了: GetMessage 会过门不入,于是操作系统再去照顾其它人。 PeekMessage 会取回控制权,使程序得以执行一段时间。于是上述消息循环转载 2013-04-11 17:08:51 · 610 阅读 · 0 评论 -
宽字节与单字节的转换 Unicode字符集下CString与char *转换
在Visual C++.NET2005中,默认的字符集形式是Unicode,但在VC6.0等工程中,默认的字符集形式是多字节字符集(MBCS:Multi-Byte Character Set),这样导致在VC6.0中非常简单实用的各类字符操作和函数在VS2005环境下运行时会报各种各样的错误,这里总结了在Visual C++.NET2005环境中Unicode字符集下CString和char *之转载 2013-04-12 10:27:27 · 744 阅读 · 0 评论 -
CallBack()回调函数详解
回调函数,就是由你自己写的。你需要调用另外一个函数,而这个函数的其中一个参数,就是你的这个回调函数名。这样,系统在必要的时候,就会调用你写的回调函数,这样你就可以在回调函数里完成你要做的事。模块A有一个函数foo,它向模块B传递foo的地址,然后在B里面发生某种事件(event)时,通过从A里面传递过来的foo的地址调用foo,通知A发生了什么事情,让A作出相应反应。 那么我们转载 2013-04-03 10:01:48 · 2295 阅读 · 0 评论 -
多线程断点续传文件下载原理
多线程传输实现实现原理:将源文件按长度为分为N块文件,然后开辟N个线程,每个线程传输一块,最后合并所有线线程文件.比如一个文件500M我们按长度可以分5个线程传输.第一线程从0-100M,第二线程从100M-200M......最后合并5个线程文件.实现流程:1.客户端向服务端请求文件信息(名称,长度)2.客户端跟据文件长度开辟N个线程连接服务端3.服务端开辟新的线转载 2013-05-06 17:11:48 · 1172 阅读 · 0 评论 -
Dll学习笔记
比较大的应用程序都由很多模块组成,这些模块分别完成相对独立的功能,它们彼此协作来完成整个软件系统的工作。可能存在一些模块的功能较为通用,在构造其它软件系统时仍会被使用。在构造软件系统时,如果将所有模块的源代码都静态编译到整个应用程序EXE文件中,会产生一些问题:一个缺点是增加了应用程序的大小,它会占用更多的磁盘空间,程序运行时也会消耗较大的内存空间,造成系统资源的浪费;另一个缺点是,在编写大的EX转载 2013-04-08 13:34:24 · 946 阅读 · 0 评论 -
很好的一篇关于介绍注册表的文章
注册表对有的人还是比较陌生的,因为现在第三方软件太多了,如优化大师、魔法兔子等等,但个人觉得改善系统的第三方软件还不够完善,如果初级用户使用不当,会出现严重的后果,所以提供这篇文章,希望大家多多学习,本人能力有限,还希望大家多提宝贵意见:一、注册表的由来PC机及其操作系统的一个特点就是允许用户按照自己的要求对计算机系统的硬件和软件进行各种各样的配置。早期的图形操作系统,如Win3.x中,对转载 2013-05-02 14:05:26 · 1105 阅读 · 0 评论 -
MFC VC++下ADO方式访问连接MySQL数据库 添加 删除 修改数据库
这都是以前为了做那个项目测试ADO连接MySQL数据功能的,这里发文分享一下。实际运行如下图所示,具有列表显示数据库内容,添加,删除,修改功能,点击列表框的任一栏就可以就行修改或者删除,功能算是有点小全面吧。我们可以从MySQL自带的MySQL workbench看看源数据库里的数据,如图所示。如果没有接触过的可以尝试一下在这里建立数据库,添加删除数据等,操作成功后我们再用VC转载 2013-04-18 09:46:09 · 1530 阅读 · 0 评论 -
WaitForSingleObject函数
一下子跳到等待函数 WaitForSingleObject, 是因为下面的 Mutex、Semaphore、Event、WaitableTimer 等同步手段都要使用这个函数; 不过等待函数可不止 WaitForSingleObject 它一个, 但它最简单.function WaitForSingleObject( hHandle: THandle; {要等待的对象句柄}转载 2013-04-01 16:00:21 · 714 阅读 · 0 评论 -
线程间的通信实例
(一)实验目的: 学习线程间的通信(二)线程间的通信: 在一个多线程的应用程序中,所有线程共享进程资源,协同工作。所以,线程之间的通信是编写多线程应用的必不可少的环节。 线程之间的通信包括互斥、同步等,它是多线程设计中最难控制的部分,也是关键部分。1、线程间的互斥 (1) 临界区 在一个多线程的应用程序中,可能存在这样的危险:一个线程以某种转载 2013-04-01 19:17:52 · 641 阅读 · 0 评论 -
Event事件对象
事件对象就像一个开关:它只有两种状态---开和关。当一个事件处于”开”状态,我们称其为”有信号”否则称为”无信号”。您可以在一个线程的执行函数中创建一个事件对象,然后观察它的状态,如果是”无信号”就让该线程睡眠,这样该线程占用的CPU时间就比较少。 产生事件对象的函数如下:CreateEvent proto lpEventAttributes:DWORD,\ bManualRese转载 2013-04-02 09:06:59 · 855 阅读 · 0 评论 -
setTimer()函数详解
转自:http://blog.csdn.net/ellor/article/details/1714741Timer事件,即定时器事件,是在游戏编程中,经常使用的一个事件。借助它可以产生定时执行动作的效果。这篇文章,就和大家一起探讨一下如何使用SetTimer()函数。 1、SetTimer定义在那里? SetTimer表示的是定义转载 2013-04-03 09:07:47 · 3757 阅读 · 0 评论 -
stdafx.h、stdafx.cpp是干什么用的?为什么我的每一个cpp文件都必须包含stdafx.h? Windows和MFC的include文件都非常大,即使有一个快速的处理程序,编
sstdafx.h、stdafx.cpp是干什么用的?为什么我的每一个cpp文件都必须包含stdafx.h? Windows和MFC的include文件都非常大,即使有一个快速的处理程序,编译程序也要花费相当长的时间来完成工作。由于每个.CPP文件都包含相同的include文件,为每个.CPP文件都重复处理这些文件就显得很傻了。 为避免这种浪费,AppWizard和Vi转载 2013-04-12 11:38:53 · 937 阅读 · 0 评论 -
一个进程的诞生与死亡
执行一个程序,必然就产生一个进程(process)。最直接的程序执行方式就是在shell (如Win95 的文件总管或Windows 3.x 的文件管理员)中以鼠标双击某一个可执行文件图标(假设其为App.exe),执行起来的App 进程其实是shell 调用CreateProcess 激活的。让我们看看整个流程:1. shell 调用CreateProcess 激活App.exe转载 2013-04-11 17:46:38 · 547 阅读 · 0 评论