同样,对于MF℃应用程序来说,为了改变MFC AppWizard自动生成的应用程序外观和大小,我们既可以在应用程序窗口创建之前进行,也可以在该窗口创建之后进行。...在MFC程序中,如果想在窗口创建之后改变其外观,可以在框架类(CMainFrame)的OnCreate函数中添加具体的实现代码。...因为SetClassLong函数可以在窗口创建完成之后修改窗口的图标,所以我们可以在程序中每隔一定时间就调用一次这个函数,让其显示预先已准备好的一组图标中的下一幅,从而就可以实现所需的动画效果。...但是,在一个源文件中要想调用另一个源文件中定义的全局变量,必须在调用这个变量之前声明这个变量是在外部定义的,声明代码如下所示,读者可以把它放到CMainFrame类的OnCreate函数定义之前:接着,...MFC提供了一个全局函数:AfxGetApp,可以获得当前应用程序对象的指针。因为这个函数是全局函数,所以在应用程序的任意地方都可以调用它。
引出VC++6.0入门——认识MFC框架第三讲 MFC框架本章将剖析基于MFC的框架程序,探讨MFC框架程序的内部组织结构。...这个程序和我们在第1章中所创建的程序类似,但比后者多了菜单栏、工具栏以及状态栏。这一切都是通过MFC AppWizard生成的。...hInstance, // handle to application instanceLPVOID lpParam) // window-creation data{// ::表示调用的是平台全局...问题的原因有两个:一是这里定义的btn对象是个局部对象,当执行到OnCreate函数的右大括号(})时,该对象的生命周期就结束了,就会发生析构。...这就是说,当执行到例3-22所示的OnCreate函数的右大括号时,刚刚创建的btn窗口就被与之相关的C++对象销毁了。因此,不能将这个按钮对象定义为一个局部对象。
在多线程设计中,许多人为了省事,会将对话框类或其它类的指针传给工作线程,而在工作线程中调用该类的成员函数或成员变量等等。...但是在Debug版本时,在某些情况下,特别是在工作线程中调用pWnd->UpdateData(FALSE)时,会出现错误。...这个错误的原因网上有许多地方讲到了,但是,令人失望的是,讲得好的没几篇,都是非要讲什么线程模块状态什么的,让人看得云里雾里(不过,说实话,也就是从这些文章中才知道是怎么回事的)。...正因为如此,MFC只是在Debug版本中才有这个ASSERT_VALID的问题存在,在Release版本中却没有,因为它没有理由来阻止我们用。...虽然如此,但是毕竟我们的调试许多时候是要用到Debug版本的,MFC的如此做法还是给我们带来了诸多不变,幸运的是,MFC将它的真正检测线程相关MFC对象的代码做成了虚拟函数,也就是说,我们可以重载它,这样在
windows/mfc程序中使用OpenGL的多重采样功能 学过opengl基础的人都知道,打开混合功能并调用glEnable(GL_POINT_SMOOTH)/glEnable(GL_LINE_SMOOTH...但是对于实心多边形的支持却没有那么简单,单纯的调用 glEnable(GL_POLYGON_SMOOTH)发现并没有效果。...一般情况下MFC程序创建OpenGL环境 普通的Windows OpenGL程序在OnCreat()函数中完成环境初始化比较简单 int OnCreate(LPCREATESTRUCT lpCreateStruct...) { CWnd::OnCreate(lpCreateStruct); PIXELFORMATDESCRIPTOR pfd; pfd.nSize = sizeof(PIXELFORMATDESCRIPTOR...具体过程如下: int OnCreate(LPCREATESTRUCT lpCreateStruct) { CWnd::OnCreate(lpCreateStruct); CWnd
MFC中OnDraw与OnPaint的区别 : OnPaint是WM_PAINT消息的消息处理函数,在OnPaint中调用OnDraw,一般来说,用户自己的绘图代码应放在OnDraw中。 ...而OnDraw在BeginPaint与EndPaint间被调用。 1) 在mfc结构里OnPaint是CWnd的成员函数....OnDraw()和OnPaint()有什么区别呢? 首先:我们先要明确CView类派生自CWnd类。而OnPaint()是CWnd的类成员,同时负责响应WM_PAINT消息。...这就是为什么你用VC成的程序代码时,在视图类只有OnDraw没有OnPaint的原因。而在基于对话框的程序中,只有OnPaint。 其次:我们在第《每天跟我学MFC》3的开始部分已经说到了。...所以在OnDraw()里你可以区别对待打印和屏幕绘制。 其实,MFC在进行打印前后还做了很多工作,调用了很多虚函数,比如OnPreparePrint()等。
MessageBox()是Win32API函数.后者是mfc中的全局函数.在MFC中能用MessageBox()的地方都能用AfxMessageBox(). afxmessagebox很多其它的时候是用于调试...Afx开头的都是全局函数,也就是说AfxMessageBox能够用于不论什么程序;而MessageBox仅仅能用在CWnd及其派生类中。...AfxMessageBox()函数在不论什么类里边都能够使用,而MessageBox()函数仅仅能在CWnd类的继承类中使用。...在另外一种形式中, nIDPrompt为要显示的文本字符串在字符串表中的ID。函数调用时会自己主动从字符串表中加载字符串并显示在消息框中。...nType = MB_OK ); 所以说,MFC里仅仅是少了第一个參数,同一时候第三和第四都有默认值了,这就是它们的差别,其它的同样 同一时候在MFC的窗口类里要调用API的那个,在写成例如以下:
方式2: 从方式1可以看出,如果你不在被重载的OnChildNotify中对消息进行处理,函数会调用CWnd::OnChildNotify,它调用ReflectChildNotify函数进行标准的处理...限于篇幅,一些细节问题,请阅读MFC中对应的源代码 什么是消息反射? ...所以在高版本的MFC中,提出了一种更方便的机制:消息反射。 ...不过需要注意的是:消息反射是MFC实现的,不是windows实现的;要让你的消息反射机制工作,你得类必须从CWnd类派生。 ...消息处理的过程 (1)子窗口向父窗口发送通知消息,激发父窗口去调用它的虚函数CWnd::OnNotify。
PreTranslateMessage是消息在送给TranslateMessage函数之前被调用的,绝大多数本窗口的消息都要通过这里,比较常用,当需要在MFC之前处理某些消息时,常常要在这里添加代码....MFC 消息控制流最具特色的地方是CWnd类的虚拟函数PreTranslateMessage(),通过重载这个函数,可以改变MFC的消息控制流程,甚至可 以作一个全新的控制流出来。...TranslateMessage和DispatchMessage发生之前会调用 AfxPreTranslateMessage,AfxPreTranslateMessage又会调用 CWnd::WalkPreTranslateTree...(虽然也会调用其他函数,但是这个最为关键),其代码如下: BOOL PASCAL CWnd::WalkPreTranslateTree(HWND hWndStop, MSG* pMsg) ...hWnd对应的CWnd MFC 中PreTranslateMessage是GetMessage(…)函数的下一级操作,即GetMessage(…)从消息队列中获取消息 后,交由PreTranslateMessage
在MFC软件开发中,界面操作或者线程之间通信都会经常用到消息,通过对消息的处理实现相应的操作。 比较典型的过程是,用户操作窗口,然后有消息产生,送给窗口的消息处理函数处理,对用户的操作做出响应。...二、什么是消息映射机制? MFC使用一种消息映射机制来处理消息,在应用程序框架中的表现就是一个消息与消息处理函数一一对应的消息映射 表,以及消息处理函数的声明和实现等代码。...CWnd的派生类都可以接收到标准Windows消息、通知消息和命令消息。命令消息还可以由文档类等接收。 ...消息映射除了在CMainFrame的实线文件中 添加消息映射表外,在类的定义文件MainFrame.h中还会添加一个宏调用: DECLARE_MESSAGE_MAP() 一般这个宏调用写在类定义的结尾处...本节对MFC消息映射机制只是做了比较简单的讲解,让大家对它有一定的认识,编程入门这不必强求完全掌握。在以后的教程中会经常涉及 到消息的使用,大家会逐渐熟悉MFC的消息映射机制。
VC++ MFC 常用技巧(一) MFC时的痛苦还记忆犹新。...如何修改窗体的标题: 1.)修改主窗口的标题:m_pMainWnd->SetWindowText("你的标题"); 2.)如果在你的document类中进行改,则直接调用SetTitle(".....怎样禁止改变窗口的大小和不能移动的窗口: 再 CMainFrame的OnCreate函数中加入: CMenu *pTopMenu=GetSystemMenu(false);...等我上学之后,我会碌碌徐徐的总结出来,和大家分享编程的乐趣!欢迎大家和我联系:citychaser@163.com 待续………….
MFC消息机制 MFC是使用一种消息映射机制来处理消息,在应用程序框架中的表现就是一个消息与消息处理函数一一对应的消息映射表,以及消息处理函数的声明和实现等代码。...SDK编程时需要在窗口过程中一一判断消息值进行相应的处理,相比之下MFC的消息映射机制要方便好用的多。 ?...以窗口消息为例: 如下是消息的动态添操作图,在类向导直接添加,vs会自动在类的头文件和源文件中自动添加。 ?.../ device context for painting // TODO: 在此处添加消息处理程序代码 // 不为绘图消息调用...flag = FALSE; CWnd::OnLButtonUp(nFlags, point); }
以及为什么全局应用程序对象要初始化. 也就是我们的theApp这个变量. 也就是MFC的初始化过程. 二丶Winmain查找. ...这样直接定位到Winmain 2.因为我们的InitInstance调用.我们可以下段点.然后栈回朔可以看到上一层也就是winmain调用的一层. 第一种方法. ? 第二种方法: ?...因为MFC框架太大.现在不利于我们直接看MFC源码学习.所以我们要从最简单的模拟开始. 三丶MFC的初始化过程之theApp为什么全局. ...所以说.TheApp应用对象数据在main之后经常使用.所以必须编写....为什么还需要第二个 m_pCurApp指针.原因是 MFC在调用的时候.不能直接使用 theApp. 而是通过一个函数 AfxGetTheApp来获取的.
在上述三个函数中, OnCreate()负责在状态栏第一次被创建时接收控制,继而创建进度指示器并将它初始化为一个子窗口,它的实现代码如下: int CProgStatusBar::OnCreate(LPCREATESTRUCT...解决这个问题最简单的方法是调用CStatusBar::SetWindowText(NULL)函数在显示进度指示器之前打扫一下环境卫生,清除以前的文本。 ...反之,当调用OnProgress(0)清除进度控制时也存在类似的问题,CProgStatusBar::OnProgress 隐藏进度控制后,状态栏第一个窗格该显示什么信息呢?...当应用程序不做任何事情时,MFC程序总是在这个位置显示资源串AFX_IDS_IDLEMESSAGE表示的文本,其缺省值为”就绪”,当然读者朋友们可以在当前项目的RC文件中任意修改这个值,不管怎样,在MFC...如果你不想从文档发送Windows消息,可以用MFC的视图更新机制来做。你可以发明一个”暗示”代码以及一个小结构来保存进度百分比数据,并通过向框架发送MYWM_PROGRESS消息调用暗示信息。
bIsInjected){ //保证只调用1次 bIsInjected=TRUE; // 获取函数地址 HMODULE hmod=::LoadLibrary(_T("User32....这意味着 // 它必须作为函数中的第一个语句 // 出现,甚至先于所有对象变量声明, // 这是因为它们的构造函数可能生成 MFC // DLL 调用。...) // CTest_DllmfcApp 构造 CTest_DllmfcApp::CTest_DllmfcApp() { // TODO: 在此处添加构造代码, // 将所有重要的初始化放置在...LIBRARY EXPORTS StartHook StopHook ; 此处可以是显式导出 然后开始写调用 Dll 的代码:(这里要用 MFC 项目,因为全局鼠标钩子需要用到 CWnd 中的...(LPCREATESTRUCT lpCreateStruct) { if (CDialogEx::OnCreate(lpCreateStruct) == -1) return -1; // TODO
MFC中句柄、指针、ID之间的关联 win32直接操作的是句柄HANDLE。...m_hObject (2)CGdiObject::GetSafeHandle (3)能够使用FromHandle函数来通过句柄得到其想要的指针 4.窗体、控件的指针和句柄的相互转化 (1)指针转化为句柄 在MFC...应用程序中首先要获得窗体的指针,然后将其转化为句柄 CWnd* pWnd; HANDLE hWnd = pWnd->GetSafeHwnd(); (2)句柄转化为指针 在MFC应用程序中首先获得对话框控件的句柄...(不论什么时候都能够用,仅仅要是MFC程序中) CWnd* pWnd = AfxGetMainWnd(); (2)获得对话框中控件指针 CWnd* pWnd = GetDlgItem(IDC_xxx...*GetWindow获得窗体指针,pWnd->m_hWnd(The handle of the Windows window attached to this CWnd)在::FromHandle(hWnd
编译时我们向这个目标前进,首先证实了VC 6.0的确不能编译ARX 2004,之后发现VS .NET 2002编译出的动态库在VC 6.0下不能正常使用,很可能是两种编译器产生的动态库导出函数命名规则不一样...3. const 问题 3.1 拷贝构造函数须声明为 XXX( const XXX& obj ) 3.2 声明这样的函数: void dosomething( const XXX*& ptr );在调用的地方...在VS .NET 2005之后已只支持这种写法,写会提示找不到头文件。它里面声明的函数和类型都在名字空间 std 下。 7. 字符串的使用 字符串使用问题有两种。...MFC提供的派生自CWnd的类,有很多统一的接口和数据结构。...ON_WM_CREATE()消息映射宏 该宏在MFC头文件 afxmsg_.h 中定义: // Message map tables for Windows messages #define ON_WM_CREATE
CWnd::GetDlgItem CWnd* GetDlgItem( int nID ) const; void CWnd::GetDlgItem( int nID, HWND* phWnd ) const...CButton*)GetDlgItem(IDC_RADIO1 + m_Radio - 1); Radiobutton->GetWindowText(str); MessageBox(str); } 拓展:MFC...(IDC_RADIO1 + m_Radio - 1) ( IDC_RADIO1 + m_Radio – 1 )是一个int型数值,也就是说在函数调用的时候会将 IDC_RADIO1 转换为 1000 但是在...MFC中通过拖动添加按钮后会出现宏定义不连续的现象,即: IDC_RADIO 1000 IDC_RADIO1 1002 是不是通过以下方式查找按钮会出现问题 void CGetRadioDlg...CButton*)GetDlgItem(IDC_RADIO1 + m_Radio - 1); Radiobutton->GetWindowText(str); 不推荐用这种方法来访问控件的特有功能,因为MFC
Q:CCriticalSection是什么? A:CCriticalSection是一种线程同步策略 或者说技术 或者方法 总之呢就是这么个意思。。。。...并运行 确定创建过程OK 第二步:在视图类头文件里面添加头文件#include “afxmt.h” 并在视图类的实现文件里面实例化一个CCriticalSection对象。...CCriticalSection Gsz_CriticalSection; 第三步:在视图里的实现文件里面 定义这两个函数。这两个函数带回会被指定为线程函数。这两个函数不是视图类的成员函数。...程序中的主框架类指针是一个常用作法 CWnd *pMainWnd = AfxGetMainWnd(); ::MessageBox(pMainWnd->m_hWnd, pMessage, _T("Thread...void CTestGszView::OnLButtonDown(UINT nFlags, CPoint point) { // TODO: 在此添加消息处理程序代码和/或调用默认值 AfxBeginThread
MFC 的浏览版本对于通过 MFC 调用结构本身进行跟踪非常有用。该目录中的 Readme.Txt 文件解释了如何使用此生成文件。...注意 大类(如 CDC 和 CWnd)的成员可能非常多,若只是在一组中列出所有属性,对清楚地描述成员并没有多大帮助。在这种情况下,类库使用标头形式的其他注释来进一步描述成员。...// Operations 注释 MFC 类声明中的 // Operations 节包含成员函数;可以在对象上调用这些函数,以使该对象执行任务或执行操作。...例如,CWnd::Create 位于构造函数节中,因为在使用 CWnd 对象之前,必须首先调用 C++ 构造函数,然后调用 Create 函数来“完整构造”它。这些成员通常是公共的。...在 MFC 本身中,纯虚函数总是放在此节中。
CWnd::OnCommand+0x99 (FPO: [Non-Fpo]) 0014f8d0 68b2c3b5 0000e101 00000000 e409f6df MFC42u!...CWnd::OnWndMsg+0x51 (FPO: [Non-Fpo]) 0014f980 68b2887a 00000111 0000e101 00000000 MFC42u!...CWnd::WindowProc+0x2e (FPO: [Non-Fpo]) 0014f9e8 68b287d2 0032ed08 00000000 00000111 MFC42u!...CDrawDoc::Remove之后调用析构函数,再调用msvcrt!free,再之后通过ntdll的函数真正去free 那我们尝试在msvcrt!...CObject::`vftable' 所以非常明显,这是一个double free 补丁对比 其实这个很难调试去发现为什么会双重释放,补丁对比会发现为什么 因为是doc那个函数出的错,我们去看这个函数
领取专属 10元无门槛券
手把手带您无忧上云