- 博客(25)
- 收藏
- 关注
原创 MFC中添加热键
热键分为局部和全局对于局部热键我们可以再PreTranslateMessage中进行捕获对于全局热键的步骤是这样第一:先注册 RegisterHotKey(GetSafeHwnd(),1001,NULL,VK_F2);//F2为热键 第二:添加消息响应头文件:afx_msg LRESULT OnHotKey(WPARAM wParam,LPARAM lParam);
2010-05-26 15:46:00 928
原创 MFC 修改窗口类名
单文档:BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs){ if( !CFrameWnd::PreCreateWindow(cs) ) return FALSE; // TODO: Modify the Window class or styles here by modifying // the CREATESTRUCT cs WNDC
2010-05-24 14:13:00 1296
原创 STL的迭代器
vector是原生指针list是InputIteratordeque是random access iterator 迭代器一般分为五种:Input Iterator、Output Iterator、Forward Iterator、Bidirections Iterator和Random Access Iterator。Input Iterator就象只从输入区间中读取数据一样,具
2010-05-22 19:35:00 710
原创 Copy和插入迭代器使用心得
Copy内部实际上是赋值,并不会给容器申请内存空间,如copy(v1.begin(), v1.end(), v2.begin());如果这个时候v2的内存占用量比v1中的元素少的话就会出现断言 插入迭代器是以赋值形式提供的但其内部调用的是push_front、push_back之类的函数来调用我们看看三种迭代器的源码 所以我们可以利用copy
2010-05-22 17:33:00 940
原创 Static控件的消息
如果Static控件设置了Notify消息的话,点击Static控件或者在Static控件上移动的话,消息就是Static控件自己发送的,这时候也存在消息的反射。如果Static控件没有设置了Notify消息的话,点击Static控件或者在Static控件上移动的话,消息就是对话框发送的,这个时候对话框接管了Static控件的所有消息。
2010-05-19 21:07:00 932
转载 recvfrom以及recv
recvfrom比recv多两个参数的原因 recv是TCP的APIrecvfrom是UDP的API多余的两个参数可以用来接收对端的地址信息,这个对于udp这种无连接的,可以很方便地进行回复。而换过来如果你在udp当中也使用recv,那么就不知道该回复给谁了,如果你不需要回复的话,也是可以使用的。另外就是对于tcp是已经知道对端的,就没必要每次接收还多收一个地址,没有意义,要取地
2010-05-19 18:46:00 799
原创 MFC使用滚动条
先在对话框的OnInitDialog中设置滚动条的范围 CScrollBar *pScrollBar = (CScrollBar*)GetDlgItem(IDC_SCROLLBAR1); pScrollBar->SetScrollRange(0, 100); 接下来响应对话框的WM_VSCROLL和WM_HSCROLL消息void CXXXDlg::OnVScroll(UINT n
2010-05-17 14:53:00 1213
原创 MFC消息完成消息反射
BOOL CWnd::OnCommand(WPARAM wParam, LPARAM lParam) // return TRUE if command invocation was attempted{ UINT nID = LOWORD(wParam); HWND hWndCtrl = (HWND)lParam; int nCode = HIWORD(wParam);
2010-05-16 21:37:00 869
原创 WM_DRAWITEM消息处理流程
WM_DRAWITEM是一般的消息,如果一个按钮设置了自绘,那么他会给父窗口发送WM_DRAWITEM,父窗口找到消息处理函数看源码: void CWnd::OnDrawItem(int /*nIDCtl*/, LPDRAWITEMSTRUCT lpDrawItemStruct){ if (lpDrawItemStruct->CtlType == ODT_MENU) { CMenu*
2010-05-16 11:20:00 1171
原创 控件子类化的两种方式
1. 给控件关联变量,修改类名2. 定义一个成员变量,如CPassButton btn; 然后btn.SubclassDlgItem(IDC_BUTTON2, this); IDC_BUTTON2是窗口的ID,第二个参数是窗口的父窗口的句柄
2010-05-15 11:13:00 786
转载 CRectTracker(橡皮筋)类的使用
CRectTracker(俗称“橡皮筋”类)是一个非常有意思的类。你在Windows中,在桌面上用鼠标拖拽,便可以看到一个虚线的矩形框,它便是橡皮筋.它可以用做显示边界,你也可以扽它的八个角用来放大缩小,做框选使用。如何通过编程来实现这种功能呢?这就是CRectTracker类的作用;介绍橡皮筋类前,先介绍其他两个类:(1) Cpoint 类或Point类,cpoint.x cpoint.y,
2010-05-13 20:48:00 2146 1
原创 Static成员变量的使用
#include using namespace std;class enemytarget{public: enemytarget() { ++numtargets; } enemytarget(const enemytarget&) { ++numtargets; } ~enemytarget() { --
2010-05-13 18:42:00 769
转载 MFC 程序逆向
上篇啰里啰嗦地说了一大堆,其实所说的消息都是PostMessage方式的。MFC中还有另外一种很常见的消息发送方式,就是SendMessage函 数。这个消息起始路径和上篇所讲的完全不一样。这种方式下,前面的7个站点均不执行,而是直接进入第8站点:User32内核,从第8站点出来后,这两种 消息方式走上了同一条道路,进入第9个站点或第10个站点了,真是殊道同归。对于MFC窗口程序,所有窗口都使用同
2010-05-12 16:55:00 1584
转载 命令传递(源自深入浅出MFC)
如果是一般的windows消息,则一定是由派生类流向基类,没有旁流的可能。 如果是命令消息wm_command,那就有奇特的路线了。 afxwndproc->afxcallwndproc->CWnd::WindowProc->oncommand->OnCmdMsg 我们看看CFrameWnd的源码 这样就完成了消息的横流
2010-05-11 12:11:00 761
转载 MFC多线程程序设计(源自深入浅出MFC)
一个进程的PDB通过一个"MODREF链表"连接到其所使用的所有模块一个线程的TDB里面都放置了消息队列只有UI线程的优先级会改变,Worker线程的优先级不会改变线程上下文 当线程暂停的时候要求把CPU拥有权让出来,以备将暂停之前一刻的状态统统记录下来。AfxBeginThread和CreateThread函数创建线程的时候,内部调用::CreateThread或_beginthr
2010-05-10 21:04:00 672
转载 template的编译和链接(源自深入浅出MFC)
编译器遇到一个template时,不能够立即为它产生机器代码,它必须等待,直到template的完整定义将出现在template被使用的每一个角落。 Borland的Smart技术: 链接器会把赘余的template代码剔除,
2010-05-10 14:47:00 730
原创 CWnd::Create(EX)、CWnd::OnCreate和CreateWindow(EX)
Create(EX)是CWnd的成员函数,CWnd::OnCreate是wm_create的消息响应函数,CreateWindow(EX)是API,他们三者的调用关系是CWnd::Create(EX)调用CreateWindow(EX)来完成窗口的创建,CreateWindow(EX)会发送wm_create消息,注意发送之前窗口已经创建好了但是没有显示出来,所以三者的关系是CWnd::C
2010-05-09 19:22:00 2468
转载 MFC窗口销毁过程
假设自己通过new创建了一个窗口对象pWnd,然后pWnd->Create。则销毁窗口的调用次序: 1. 手工调用pWnd->DestroyWindow(); 2. DestroyWindow会发送WM_DESTROY; 3. WM_DESTROY对应的消息处理函数是OnDestroy(); 4. DestroyWindow会发送WM_NCDESTROY; 5. WM_NCDE
2010-05-08 16:09:00 841
转载 对话框及其子控件的内部创建过程之详细分析
创建非模态对话框时,首先程序最先开始调用CreateDialogIndirectParam函数来创建对话框 , 在CreateDialogIndirectParam中调用CreateWindowEx函数创建对话框主框架, 这时 CreateWindowEx函数发出WM_CREATEX消息,开始调用OnCreate函数。 注意这时所有对话框的子控件都还没创建 ,所以在OnCreate函数中对子控
2010-05-08 14:22:00 5015 1
原创 VS2008控制台工程检测内存泄露
#include using namespace std;#ifdef _DEBUG#define DEBUG_CLIENTBLOCK new( _CLIENT_BLOCK, __FILE__, __LINE__)#else#define DEBUG_CLIENTBLOCK#endif#define _CRTDBG_MAP_ALLOC#ifdef _DEB
2010-05-08 13:18:00 1177
转载 typename和typedef关键字
typename指示一个类型名,而非定义一个类型,以下声明了一个Seq::iterator类型的变量itr,其中Seq是一个模板实例化时才知道的类: typename Seq::iterator itr;如果没有typename指示,Seq::iterator会被认为是Seq的静态变量,而不是类型名。typename关键字不会定义一个类型,如果你想定义一个新类型的话,你必须这样:
2010-05-07 15:54:00 712
原创 操作符重载
操作符重载重载&&、||或逗号以及取地址操作符不是一种好的做法定义了+操作符,也应该定义+=和=操作符一般将算术和关系操作符定义为非成员函数而将赋值操作符定义为成员= [] ()和->等操作符必须定义为成员将这些如果定义为非成员函数将在编译时标记为错误+=通常应定义为类的成员。但是不一定非得这么做,如果定义非成员复合赋值操作符不会出现编译错误自增、自减和&操作符通常定义为类成员算术
2010-05-06 20:42:00 455
转载 placement new的用法
placement new的作用就是:创建对象(调用该类的构造函数)但是不分配内存,而是在已有的内存块上面创建对象。用于需要反复创建并删除的对象上,可以降低分配释放内存的性能消耗。placement new 是重载operator new 的一个标准、全局的版本,它不能够被自定义的版本代替(不像普通版本的operator new 和 operator delete能够被替换)。void
2010-05-06 20:35:00 1118 1
原创 Dijkstra求最短路径
先看介绍<a id="url_1" onclick="function onclick(){return checkUrl(this)}" href="http://www.cnblogs.com/gzydn/archive/2009/07/09/1520019.html" target="_blank">http://www.cnblogs.com/gzydn/archive/200
2010-05-05 20:06:00 553
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人