随笔分类 -  C++ MFC

MFC
MFC窗口子类化
摘要:所谓子类化,也就是因为某种需求,对一个windows窗口(当然这里的窗口可以是控件、Dialog等)用自己的窗口函数,代替原有的窗口函数)再看看别人的解释:所谓窗口子类化,实际上就是改变窗口内存块中的有关参数。由于这种修改只涉及到一个窗口的内存块,因此它不会影响到属于同一窗口类的其它窗口的功能和表现(IDàHWNDàCWnd)。窗口子类化中最常见的是修改窗口内存块中的窗口函数地址(lpfnWndProc),使其指向一个新的窗口函数,从而改变原窗口函数的处理方法,做出特定功能适应。在实际开发中,有些情况标准控件的标准过程是无能为力的。比如:在我们的应用中要求一个EDIT控件接收老师对学生的评价, 阅读全文

posted @ 2011-01-22 15:52 pjh123 阅读(737) 评论(0) 推荐(1)

MFC消息机制 3 (对1、2的合并)
摘要:1消息的分类1.1队列消息、非队列消息l队列消息:windows为每个应用程序都建立一个消息队列,那么通过消息队列,进行传送的消息都属于队列消息;一般来说,由鼠标、键盘产生的消息都属于队列消息。(为什么呢?想想,鼠标、键盘事件都是由系统捕获的,系统捕获后要传递给应用程序,就一定的通过消息队列);l非队列消息:除了队列消息,剩下的自然而然就是非队列消息了;u队列消息是通过PostMessage()的方式投递消息的,这样的消息发送也叫“寄送”,该函数寄送消息即可返回,不需要等待程序处理结果;u非队列消息是通过SendMessage()的方式进行的,这样的消息发送叫“发送”;消息不需要进入窗口的消息 阅读全文

posted @ 2011-01-19 16:15 pjh123 阅读(635) 评论(0) 推荐(0)

MFC消息机制 2
摘要:接上篇1、 消息的处理流程好了,有了前面1、2小节的基础,我们接下来来看消息的处理流程:以下描述消息从AfxWndProc起点开始的处理流程:1) AfxWndProc(HWND hWnd,Unit nMsg,….)说明,这里的hWnd指定了到底从哪个窗口开始接收并处理消息;在AfxWndProc中,调用了AfxCallWndProc函数,pWnd已经不是句柄了,而是由句柄得到的一个具体的CWnd指针指向的窗口类CWnd* pWnd=CWnd::FormatHandlePermant(hWnd)2) AfxCallWndProc(CWnd *pWnd,Unit nMsg,…..)说明:,在Af 阅读全文

posted @ 2011-01-12 23:50 pjh123 阅读(597) 评论(0) 推荐(0)

MFC消息机制
摘要:一、消息的分类1、 队列消息、非队列消息l 队列消息:windows为每个应用程序都建立一个消息队列,那么通过消息队列,进行传送的消息都属于队列消息;一般来说,由鼠标、键盘产生的消息都属于队列消息。(为什么呢?想想,鼠标、键盘事件都是由系统捕获的,系统捕获后要传递给应用程序,就一定的通过消息队列);l 非队列消息:除了队列消息,剩下的自然而然就是非队列消息了;u 队列消息是通过PostMessage()的方式投递消息的,这样的消息发送也叫“寄送”,该函数寄送消息即可返回,不需要等待程序处理结果;u 非队列消息是通过SendMessage()的方式进行的,这样的消息发送叫“发送”;消息不需要进入 阅读全文

posted @ 2011-01-11 23:14 pjh123 阅读(563) 评论(0) 推荐(0)

2010.12.8 预编译头文件
摘要:所谓的预编译头就是把一个工程中的那一部分代码,预先编译好放在一个文件里(通常是以.pch为扩展名的),这个文件就称为预编译头文件这些预先编译好的代码可以是任何的C/C++代码--------甚至是inline的函数,但是必须是稳定的,在工程开发的过程中不会被经常改变。如果这些代码被修改,则需要重新编译生成预编译头文件。注意生成预编译头文件是很耗时间的。同时你得注意预编译头文件通常很大,通常有6-7M大。注意及时清理那些没有用的预编译头文件。也许你会问:现在的编译器都有Time stamp的功能,编译器在编译整个工程的时候,它只会编译那些经过修改的文件,而不会去编译那些从上次编译过,到现在没有被 阅读全文

posted @ 2010-12-08 17:19 pjh123 阅读(172) 评论(0) 推荐(0)

2010.11.25 绘制实时曲线的源码CurveCtrl.cpp
摘要:http://www.codeproject.com/KB/miscctrl/curvectrl.aspx 阅读全文

posted @ 2010-11-25 14:39 pjh123 阅读(496) 评论(0) 推荐(0)

2010.11.18 关于向窗口发送消息
摘要:请区别PostMessage和SendMessage,与::PostMessage、::SendMessage的区别1、在VC中“::”是C++里的,是“域操作符”。比如声明了一个类A,类A里声明了一个成员函数void f(),但没有在类的声明里给出f的定义,那么在类外定义f时,就要写成void A::f(),表示这个f()函数是类A的成员函数。::一般还有一种用法,就是直接用在全局函数前,表示是全局函数。比如在VC里,你可以在调用API函数里,在API函数名前加:: 全局调用,调用windows api的SendMessage,而不是成员函数CWnd::SendMessage2、WM_COM 阅读全文

posted @ 2010-11-18 22:04 pjh123 阅读(343) 评论(0) 推荐(0)

2010.11.17 在CMainFrame创建多View
摘要:在CMainFrame创建多View 阅读全文

posted @ 2010-11-17 15:36 pjh123 阅读(228) 评论(0) 推荐(0)

2010.11.16 DYNAMIC_DOWNCAST用法
摘要:以下这段儿代码CPnrListCtrl& listCtrl=((CPnrListView*)GetActiveView())->GetListCtrl();有可能会有问题。就是当GetActiveView()返回的不是CPnrListView的时候,得到的listCtrl是错误的指针(也可能指向未知位置)如下可以解决CPnrListView *pListView=DYNAMIC_DO... 阅读全文

posted @ 2010-11-17 09:37 pjh123 阅读(1039) 评论(0) 推荐(0)

2010.11.12 CTreeCtrl的操作
摘要:当需要对某个节点之下的所有节点重新进行调整时,需要找到指定层次节点,然后删除之下所有节点,重新加载数据。关键是如何能够记录操作前的状态,并恢复到之前的状态.能否做个统一包装类,用于操作CTreeCtrl。考虑Gun Array新增或删除节点,造成统一编号遇到的麻烦 阅读全文

posted @ 2010-11-12 17:59 pjh123 阅读(212) 评论(0) 推荐(0)

2010.11.11 STL::Map
摘要:STL的某些容器,比如Map是自动排序的,顺序读取得到的结果和插入的顺序是不一致的。但某些情况下,需要禁止Map的排序,如何做呢? 阅读全文

posted @ 2010-11-11 18:15 pjh123 阅读(174) 评论(0) 推荐(0)

2010.11.10
摘要:子控件的重绘内存dc。在OnPaint中,直接用dc画 可能会导致闪烁,如下可解决:防闪烁内存dcCPaintDC dc(this); if (m_pMemDc->GetSafeHdc() == NULL){m_pMemDc->CreateCompatibleDC(&dc);HANDLE h=m_pBitmap->GetSafeHandle();m_pBitmap->... 阅读全文

posted @ 2010-11-10 18:03 pjh123 阅读(156) 评论(0) 推荐(0)

2010.11.4
摘要:1、关于宏定义 1、如果是用宏定义,避免是用简单字符,比如#define Enable 1 很多函数名称也许就是Enable,编译就会出错,而且不易发现错误; 2、Effective C++ 第2条,尽量是用const、enum、inline替换#define 阅读全文

posted @ 2010-11-04 18:00 pjh123 阅读(116) 评论(0) 推荐(0)

2010.11.1 windows下dll的生成、使用、调试
摘要:引用:http://www.vsdk.net/vsdk/C/vsdk141643.shtml  说来真是惭愧,做了这么久的程序,还没有花费三个小时来攻克某一个技术点。而VC却让我如此尴尬了一回。经过三小时的研究,终于解决了VC中调用Dll以及Dll的调试问题。  的确,网上相关资料有很多,但照着说明做后,没有一个能够成功运行的,不过对我的帮助还是非常大。  首先让我们来看看,在VC中如何调用Dll... 阅读全文

posted @ 2010-11-01 17:49 pjh123 阅读(257) 评论(0) 推荐(0)

2010.10.29 windows网络程序_socket
摘要:1、多线程程序设计;2、select 模型3、多线程同步临界区(关键代码段CRITICAL_SECTION),是很常用的一种多线程同步的方法。 对于CRITICAL_SECTION的基本操作,如void EnterCriticalSection(LPCRITICAL_SECTION lpCriticalSection);void LeaveCriticalSection(LPCRITICAL_S... 阅读全文

posted @ 2010-10-29 17:39 pjh123 阅读(141) 评论(0) 推荐(0)

2010.10.27 C++ 类基础知识
摘要:class A{A();~A();public: virtual void Func();}A::Func(){ CreateThread(NULL, 0, ThreadProc, this, 0, &m_dwThread));}class B:public A{B();~B();public: virtual void Func();}B::Func(){ ...; A::Func();... 阅读全文

posted @ 2010-10-27 17:50 pjh123 阅读(163) 评论(0) 推荐(0)

2010.10.26 设置滚动条和固定窗口大小
摘要:如何设置view有滚动条:BOOL CMyFormView::PreCreateWindow(CREATESTRUCT& cs) { // TODO: Modify the Window class or styles here by modifying // the CREATESTRUCT cs // cs.style &=WS_EX_RIGHTSCROLLBAR |~WS_T... 阅读全文

posted @ 2010-10-27 09:07 pjh123 阅读(371) 评论(0) 推荐(0)

2010.10.26 设置程序标题
摘要:1.取消MDI主框架窗口中显示的活动文档标题 缺省条件下,创建的主框架窗口和MDI子窗口通常具有FWS_ADDTOTITLE风格,所以如果要禁止, 必须取消该风格: BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) { if( !CMDIFrameWnd::PreCreateWindow(cs) ) return FALSE; cs.st... 阅读全文

posted @ 2010-10-26 12:47 pjh123 阅读(199) 评论(0) 推荐(0)

2010.10.21 设置对话框背景色
摘要:引用:一个基于对话框的MFC AppWizard应用程序中,如何改变对话框的背景颜色呢?对于这个问题,其实可以 由几种不同的方法来实现,具体如下(粗斜体代码为增添的):---- 方法一:调用CWinApp类的成员函数SetDialogBkColor来实现。---- 其中函数的第一个参数指定了背景颜色,第二个参数指定了文本颜色。下面的例子是将应用程序对话 框设置为蓝色背景和红色文本,步骤如下:---... 阅读全文

posted @ 2010-10-21 17:47 pjh123 阅读(219) 评论(0) 推荐(0)

2010.10.20 2
摘要:解决了如下问题:1、在view中拖动图形时,有痕迹的问题。 在view中选中一个图形,然后鼠标拖动,发现图像下端的箭头有痕迹。后来发现,是选中图形是,其实得到了一个CRect的无效区域,这个无效区域没有包含箭头,从而导致箭头部分绘图不及时。调整CRect,使之包含所有区域即可;2、View闪烁解决画面点击闪烁问题CView::Update{ Invalidate(True),重绘了背景导致}注意,... 阅读全文

posted @ 2010-10-20 18:07 pjh123 阅读(146) 评论(0) 推荐(0)