孙鑫VC学习笔记:第三讲 MFC应用程序框架

MFCApplication1.cpp MFCApplication1.cpp,很强的 立即下载

1.在MFC的源代码中查找入口函数WinMain().
 X:/Program Files/Microsoft Visual Studio/VC98/MFC/SRC

 APPMODUL.CPP文件中
------------------------------------------------------------------------
extern "C" int WINAPI
_tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
 LPTSTR lpCmdLine, int nCmdShow)
{                                                            //Breakpoint1
 // call shared/exported WinMain
 return AfxWinMain(hInstance, hPrevInstance, lpCmdLine, nCmdShow);
}
-------------------------------------------------------------------------
TCHAR.H
------------------------------------------------------------------------
#define _tWinMain   WinMain
------------------------------------------------------------------------
Test.cpp
------------------------------------------------------------------------
CTestApp::CTestApp()
{                                                             //Breakpoint2
 // TODO: add construction code here,
 // Place all significant initialization in InitInstance
}
------------------------------------------------------------------------
RUNNING: Breakpoint2->Breakpoint1
首先进入CTestApp的构造函数,然后才到达_tWinMain()函数
Test.cpp
--------------------------------------------------------------------------
CTestApp theApp;  //全局对象                                 //Breakpoint3
--------------------------------------------------------------------------
RUNNING: Breakpoint3->Breakpoint2->Breakpoint1

2.在MFC程序中,通过产生一个应用程序类的对象来表示应用程序本身
   在X:/Program Files/Microsoft Visual Studio/VC98/MFC/SRC搜索WinApp
   得到:
   APPCORE.CPP
--------------------------------------------------------------------------
   CWinApp::CWinApp(LPCTSTR lpszAppName)                 //CWinApp的构造函数
   {
 if (lpszAppName != NULL)
  m_pszAppName = _tcsdup(lpszAppName);
 else
  m_pszAppName = NULL;

 // initialize CWinThread state
 AFX_MODULE_STATE* pModuleState = _AFX_CMDTARGET_GETSTATE();
 AFX_MODULE_THREAD_STATE* pThreadState = pModuleState->m_thread;
 ASSERT(AfxGetThread() == NULL);
 pThreadState->m_pCurrentWinThread = this;   //this指针指向CTestApp对象(theApp)
                                                    //根据继承性的原理(使用程序测试)
 ASSERT(AfxGetThread() == this);
 m_hThread = ::GetCurrentThread();
 m_nThreadID = ::GetCurrentThreadId();

 // initialize CWinApp state
 ASSERT(afxCurrentWinApp == NULL); // only one CWinApp object please
 pModuleState->m_pCurrentWinApp = this;
 ASSERT(AfxGetApp() == this);

 // in non-running state until WinMain
 m_hInstance = NULL;
 m_pszHelpFilePath = NULL;
 m_pszProfileName = NULL;
 m_pszRegistryKey = NULL;
 m_pszExeName = NULL;
 m_pRecentFileList = NULL;
 m_pDocManager = NULL;
 m_atomApp = m_atomSystemTopic = NULL;
 m_lpCmdLine = NULL;
 m_pCmdInfo = NULL;

 // initialize wait cursor state
 m_nWaitCursorCount = 0;
 m_hcurWaitCursorRestore = NULL;

 // initialize current printer state
 m_hDevMode = NULL;
 m_hDevNames = NULL;
 m_nNumPreviewPages = 0;     // not specified (defaults to 1)

 // initialize DAO state
 m_lpfnDaoTerm = NULL;   // will be set if AfxDaoInit called

 // other initialization
 m_bHelpMode = FALSE;
 m_nSafetyPoolSize = 512;        // default size
   }
--------------------------------------------------------------------------------
CWinApp的构造函数带有参数LPCTSTR lpszAppName,而CTestApp的构造函数不带有任何参数.
在AFXWIN.H文件中
-----------------------------------------------------------------------------
class CWinApp : public CWinThread
{
 DECLARE_DYNAMIC(CWinApp)
public:

// Constructor
 CWinApp(LPCTSTR lpszAppName = NULL); //CWinApp的构造函数有缺省的参数   
 ..............................
}
------------------------------------------------------------------------------
3. 回到_tWinMain(...)函数
   查找AfxWinMain()函数,Afx表示应用程序框架类函数,相当于全局函数
-------------------------------------------------------------------------------
   int AFXAPI AfxWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
 LPTSTR lpCmdLine, int nCmdShow)
   {
 ASSERT(hPrevInstance == NULL);

 int nReturnCode = -1;
 CWinThread* pThread = AfxGetThread(); //线程的指针,也是指向子类
 CWinApp* pApp = AfxGetApp(); //获得指针,这里pApp指向派生类的指针(theApp)

 // AFX internal initialization
 if (!AfxWinInit(hInstance, hPrevInstance, lpCmdLine, nCmdShow))
  goto InitFailure;

 // App global initializations (rare)
 if (pApp != NULL && !pApp->InitApplication())//pApp->InitApplication()MFC内部
                                              //管理的函数
  goto InitFailure;

 // Perform specific initializations
 if (!pThread->InitInstance())  //pThread->InitInstance()       //Breakpoint4
                                //在AFXWIN.H中
           //virtual BOOL InitInstance();
           //InitInstance是一个虚函数
           //此时调用的InitInstance函数是
           //CTestApp::InitInstance()

 {
  if (pThread->m_pMainWnd != NULL)
  {
   TRACE0("Warning: Destroying non-NULL m_pMainWnd/n");
   pThread->m_pMainWnd->DestroyWindow();
  }
  nReturnCode = pThread->ExitInstance();
  goto InitFailure;
 }
 nReturnCode = pThread->Run();//Run()方法完成我们的消息循环

InitFailure:
#ifdef _DEBUG
 // Check for missing AfxLockTempMap calls
 if (AfxGetModuleThreadState()->m_nTempMapLock != 0)
 {
  TRACE1("Warning: Temp map lock count non-zero (%ld)./n",
   AfxGetModuleThreadState()->m_nTempMapLock);
 }
 AfxLockTempMaps();
 AfxUnlockTempMaps(-1);
#endif

 AfxWinTerm();
 return nReturnCode;
   }
------------------------------------------------------------------------------------
4.在CTestApp的InitInstance()函数设置断点
------------------------------------------------------------------------------------
   BOOL CTestApp::InitInstance()
   {                                                      //Breakpoint5
 AfxEnableControlContainer();
        .............
   }
-------------------------------------------------------------------------------------
RUNNING:<1> 定义全局对象  CTestApp theApp;    (Breakpoint3)
        <2> 构造全局对象  CTestApp::CTestApp()(Breakpoint2)
 <3> 构造基类对象 
 <4> 进入_tWinMain函数                 (Breakpoint1)
 <5> 到达AfxWinMain函数
     if (!pThread->InitInstance())     (Breakpoint4)
 <6> 到达CTestApp::InitInstance()      (Breakpoint5)
5.注册窗口类
  AfxEndDeferRegisterClass函数
  WINCORE.CPP中                       (注册窗口类应该在PreCreateWindow中调用)
  由于是单文档应用程序的原因,事先调用AfxEndDeferRegisterClass函数注册窗口                     
-------------------------------------------------------------------------------------
BOOL AFXAPI AfxEndDeferRegisterClass(LONG fToRegister)
{                                                                  // Breakpoint6
 // mask off all classes that are already registered
 AFX_MODULE_STATE* pModuleState = AfxGetModuleState();
 fToRegister &= ~pModuleState->m_fRegisteredClasses;
 if (fToRegister == 0)
  return TRUE;

 LONG fRegisteredClasses = 0;
 ........................
 wndcls.lpfnWndProc = DefWindowProc;       
}
-------------------------------------------------------------------------------------
BOOL AFXAPI AfxRegisterClass(WNDCLASS* lpWndClass)
{
 WNDCLASS wndcls;
 if (GetClassInfo(lpWndClass->hInstance, lpWndClass->lpszClassName,
  &wndcls))                  //判断窗口是否注册
 {
  // class already registered
  return TRUE;
 }

 if (!::RegisterClass(lpWndClass))              //调用RegisterClass,API函数
 {
  TRACE1("Can't register window class named %s/n",
   lpWndClass->lpszClassName);
  return FALSE;
 }
 .................................................
}
-------------------------------------------------------------------------------------
        <7> 注册窗口类
    BOOL AFXAPI AfxEndDeferRegisterClass(LONG fToRegister)  (Breakpoint6)
6.产生窗口
 CMainFrm.CPP
-------------------------------------------------------------------------------------
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{                                                                   (Breakpoint7)
 if( !CFrameWnd::PreCreateWindow(cs) )  //函数调用
  return FALSE;
 // TODO: Modify the Window class or styles here by modifying
 //  the CREATESTRUCT cs

 return TRUE;
}
-------------------------------------------------------------------------------------
 <8>BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)        (Breakpoint7)
WINFRM.CPP
-------------------------------------------------------------------------------------
BOOL CFrameWnd::PreCreateWindow(CREATESTRUCT& cs)
{                                                                    (Breakpoint8)
 if (cs.lpszClass == NULL)
 {
  VERIFY(AfxDeferRegisterClass(AFX_WNDFRAMEORVIEW_REG));
  //AfxDeferRegisterClass(AFX_WNDFRAMEORVIEW_REG)判断当前的窗口类有没有
  //注册,没有就注册
  cs.lpszClass = _afxWndFrameOrView;  // COLOR_WINDOW background
 }

 if ((cs.style & FWS_ADDTOTITLE) && afxData.bWin4)
  cs.style |= FWS_PREFIXTITLE;

 if (afxData.bWin4)
  cs.dwExStyle |= WS_EX_CLIENTEDGE;

 return TRUE;
}
-------------------------------------------------------------------------------------
AFXIMPL.h
-------------------------------------------------------------------------------------
#define AfxDeferRegisterClass(fClass) AfxEndDeferRegisterClass(fClass)
-------------------------------------------------------------------------------------
 <9> BOOL CFrameWnd::PreCreateWindow(CREATESTRUCT& cs)         (Breakpoint8)

WINCORE.cpp
-------------------------------------------------------------------------------------
BOOL CWnd::CreateEx(DWORD dwExStyle, LPCTSTR lpszClassName,
 LPCTSTR lpszWindowName, DWORD dwStyle,
 int x, int y, int nWidth, int nHeight,
 HWND hWndParent, HMENU nIDorHMenu, LPVOID lpParam)
{                                                                      (Breakpoint9)
 // allow modification of several common create parameters
 CREATESTRUCT cs;
 cs.dwExStyle = dwExStyle;
 cs.lpszClass = lpszClassName;
 ..............................
 if (!PreCreateWindow(cs))      //PreCreateWindow是一个虚函数
 {
  PostNcDestroy();
  return FALSE;
 }
 ...............................
}
-------------------------------------------------------------------------------------
BOOL CWnd::CreateEx(DWORD dwExStyle, LPCTSTR lpszClassName,
  LPCTSTR lpszWindowName, DWORD dwStyle,
  const RECT& rect, CWnd* pParentWnd, UINT nID,
  LPVOID lpParam /* = NULL */)     //调用上面的CreateEx函数
{                                                                      (Breakpoint10)
 return CreateEx(dwExStyle, lpszClassName, lpszWindowName, dwStyle,
  rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top,
  pParentWnd->GetSafeHwnd(), (HMENU)nID, lpParam);
}
-------------------------------------------------------------------------------------

WINFRM.CPP
-------------------------------------------------------------------------------------
BOOL CFrameWnd::Create(LPCTSTR lpszClassName,
 LPCTSTR lpszWindowName,
 DWORD dwStyle,
 const RECT& rect,
 CWnd* pParentWnd,
 LPCTSTR lpszMenuName,
 DWORD dwExStyle,
 CCreateContext* pContext)
{                                                                  (Breakpoint11)         
 ..........................
 if (!CreateEx(dwExStyle, lpszClassName, lpszWindowName, dwStyle,
  rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top,
  pParentWnd->GetSafeHwnd(), hMenu, (LPVOID)pContext)) //调用上面的
 {                                                            //CreateEx函数
  TRACE0("Warning: failed to create CFrameWnd./n");
  if (hMenu != NULL)
   DestroyMenu(hMenu);
  return FALSE;
 }
 ....................................................
}
-----------------------------------------------------------------------------------
7.显示更新窗口
  Test.CPP
-----------------------------------------------------------------------------------
 m_pMainWnd->ShowWindow(SW_SHOW);
 m_pMainWnd->UpdateWindow();      //m_pMainWnd指向框架窗口对象的指针
-----------------------------------------------------------------------------------

8.消息循环
THRDCORE.CPP
-----------------------------------------------------------------------------------
int CWinThread::Run()
{
 ASSERT_VALID(this);

 // for tracking the idle time state
 BOOL bIdle = TRUE;
 LONG lIdleCount = 0;

 // acquire and dispatch messages until a WM_QUIT message is received.
 for (;;)
 {
  // phase1: check to see if we can do idle work
  while (bIdle &&
   !::PeekMessage(&m_msgCur, NULL, NULL, NULL, PM_NOREMOVE))
  {
   // call OnIdle while in bIdle state
   if (!OnIdle(lIdleCount++))
    bIdle = FALSE; // assume "no idle" state
  }

  // phase2: pump messages while available
  do
  {
   // pump message, but quit on WM_QUIT
   if (!PumpMessage())
    return ExitInstance();

   // reset "no idle" state after pumping "normal" message
   if (IsIdleMessage(&m_msgCur))
   {
    bIdle = TRUE;
    lIdleCount = 0;
   }

  } while (::PeekMessage(&m_msgCur, NULL, NULL, NULL, PM_NOREMOVE));
 }

 ASSERT(FALSE);  // not reachable
}
------------------------------------------------------------------------------------
BOOL CWinThread::PumpMessage()
{
 ASSERT_VALID(this);

 if (!::GetMessage(&m_msgCur, NULL, NULL, NULL))
 {
#ifdef _DEBUG
  if (afxTraceFlags & traceAppMsg)
   TRACE0("CWinThread::PumpMessage - Received WM_QUIT./n");
  m_nDisablePumpCount++; // application must die
   // Note: prevents calling message loop things in 'ExitInstance'
   // will never be decremented
#endif
  return FALSE;
 }

#ifdef _DEBUG
 if (m_nDisablePumpCount != 0)
 {
  TRACE0("Error: CWinThread::PumpMessage called when not permitted./n");
  ASSERT(FALSE);
 }
#endif

#ifdef _DEBUG
 if (afxTraceFlags & traceAppMsg)
  _AfxTraceMsg(_T("PumpMessage"), &m_msgCur);
#endif

 // process this message

 if (m_msgCur.message != WM_KICKIDLE && !PreTranslateMessage(&m_msgCur))
 {
  ::TranslateMessage(&m_msgCur);
  ::DispatchMessage(&m_msgCur);
 }
 return TRUE;
}
----------------------------------------------------------------------------------

9.窗口过程 (在AfxEndDeferRegisterClass函数中设置)
 wndcls.lpfnWndProc = DefWindowProc;   //缺省的窗口过程

10.在MFC如何整合CMainFrm类,CTestView类,CTestDoc类?
   在
 BOOL CTestApp::InitInstance()中:
------------------------------------------------------------------------------------
CSingleDocTemplate* pDocTemplate;     //定义一个单文档的类模板
 pDocTemplate = new CSingleDocTemplate(
  IDR_MAINFRAME,
  RUNTIME_CLASS(CTestDoc),       //通过单文档的模板组合在一起
  RUNTIME_CLASS(CMainFrame),       // main SDI frame window
  RUNTIME_CLASS(CTestView));
 AddDocTemplate(pDocTemplate);           //增加到文档模板中
-------------------------------------------------------------------------------------

11.窗口与C++类的关系

   窗口销毁,C++的对象不一定销毁,窗口与C++窗口类的关系只不过是窗口类保存了窗口的句柄.
12.CButton
   m_btn.Create("维新",WS_CHILD | WS_VISIBLE | BS_AUTO3STATE,
  CRect(0,0,100,100),/*GetParent(),*/this,123);
   CButton的窗口风格 WS_CHILD | WS_VISIBLE | BS_AUTO3STATE
   CTestView的父窗口是CMainFrm,在CTestView里面使用GetParent()函数,得到CMainFrm对象的
   指针.

【obj To 3DTiles 进阶实战】 从零配置地理坐标系与扩展属性元数据 本文详细解析了如何将OBJ模型转换为3DTiles格式,重点介绍了地理坐标系配置与属性元数据扩展的实战技巧。通过obj23dtiles工具,开发者可以精准定位模型经纬高坐标,并添加结构化属性表,实现城市规划模型在数字孪生平台的高效应用。 阅读详情

相关推荐

光流法实战:如何用OpenCV的Farneback算法实现图像对齐(附调参技巧)

本文详细介绍了如何使用OpenCV的Farneback稠密光流算法实现图像对齐,包括核心原理、参数调优和工程实现。通过实战代码和参数优化策略,帮助开发者解决动态场景中的图像对齐问题,提升多帧融合和视频处理的效果。

weixin_29266007的博客 290

Lesson3 MFC应用程序框架 ---孙鑫VC++教程

Lesson3 MFC应用程序框架state:1.在MFC的源代码中查找入口函数WinMain(). X:/Program Files/Microsoft Visual Studio/VC98/MFC/SRC APPMODUL.CPP文件中------------------------------------------------------------------------ex

lxu的专栏 1751

【 Git学习记录(三)】推荐四款主流的Git代码托管平台 —— GitHub、GitLab、Gitee、Coding

了解过Git之后,作为一个程序猿最基本的,你还需要了解目前主流的在线代码托管平台,并至少选择其中一款在平时开发中使用。这里特别介绍以下四款: 国外平台 GitHub —— 全球最流行的代码托管平台 GitLab —— 基于git的仓库管理程序 国内平台 Gitee —— 开源中国旗下的代码托管平台 Coding —— 支持社交元素的代码托管平台 一. GitHub 链接地址:https://github.com/ GitHub目前是全球最流行的代码托管平台(别称:全球最大的同性交友.

JZevin的博客 6091

孙鑫MFC笔记教程(3)--MFC应用程序框架

<br />单文档应用程序启动流程 1.Tess.cpp --> CTestApp theApp 2.Tess.cpp --> CTestApp::CTestApp() 3.APPMODUL.cpp --> _tWinMain() !!! 4.WINMAIN.cpp --> AfxWinMain(); 5.WINMAIN.cpp AfxWinMain() --> InitInstance(); 6.Tess.cpp --> InitInstance(); 7.WINCORE.cpp --> A

liufei_learning--脚踏实地,戒骄戒躁! 1149

从零开始掌握Simscape Multibody:机械系统建模与仿真入门

本文为机械系统建模与仿真入门指南,详细介绍了如何从零开始使用Simscape Multibody。通过构建曲柄摇块机构的实战案例,系统讲解了刚体、关节、约束等核心模块的使用,以及模型验证、参数化设计和多领域系统集成等进阶技巧,帮助工程师和学生高效进行虚拟设计与测试。

weixin_29229261的博客 310

开源TMS系统cortex-tms私有化部署与二次开发实战指南

运输管理系统(TMS)是现代物流数字化的核心组件,它通过将线下零散的物流操作转化为线上标准化、可追溯的数据流,实现订单、调度、跟踪与结算的全流程管理。其技术原理通常基于微服务架构,采用Spring Boot、Vue.js等成熟技术栈构建,确保系统的稳定性和可扩展性。TMS的技术价值在于显著提升物流企业的运营效率、降低成本并增强过程可控性,尤其适用于中小型物流企业实现从手工管理到系统化管理的跨越。在应用场景上,TMS广泛应用于车队管理、订单跟踪和财务结算等环节。本文聚焦于开源TMS项目cortex-tms,深

weixin_42523907的博客 746

孙鑫VC++讲座笔记-(3)MFC程序框架的剖析(修订版)

摘要:讲述MFC AppWizard的原理与MFC程序框架的剖析。AppWizard是一个源代码生成工具,是计算机辅助程序设计工具,WinMain在MFC程序中是 如何从源程序中被隐藏的,theApp全局变量是如何被分配的,MFC框架中的几个类的作用与相互关系,MFC框架窗口是如何产生和销毁的,对窗口类的 PreCreateWindow和OnCreate两个函数的着重分析,Windows窗口与C+...

AIP 173

uniapp - 使用web-view加载本地网页vue页面,用webview导入本地网页,uniAPP中使用web-view加载的本地及远程vue页面+双向通讯功能(兼容微信小程序、安卓苹果APP)

uniapp的App端web-view加载本地html,uniapp微信小程序webview加载本地HTML文件,在uniAPP中使用web-view加载的本地及远程vue页面且进行双向通讯,uni-app的web-view组件,支持加载远程网页,在app环境下,还支持加载本地HTML页面。uniapp WebView组件实现本地网页加载与通讯传值,uniAPP如何内嵌webView引入本地的vue网页示例代码,uniapp在web-view加载的本地及远程HTML中调用uni的API及网页和vue页面跳转

🏆 前端领域优质创作者 5226

孙鑫VC++深入详解六到十章

资源管理器→menu项→双击IDR_MAINFRAME打开菜单编辑器pop-up类型的菜单是弹出式菜单,不能进行命令响应。ID号的命名规则:IDM菜单资源IDC光标资源IDI图标资源。

He Zexian的博客 1222

看28377代码笔记

使用的是20MHz外部晶振,为取200MHz系统时钟,倍频设为20,分频设为2,这样sysclock = 20MHz * 20 / 2,正好200MHz。注意:SPISTE配置成普通的GPIO端口,是为了更好控制芯片,配置芯片的时序。FMULT_0:小数点位数,小数只能有0,0.25,0.5,0.75四个选择。XTAL_OSC:表示使用外部晶振。GPIO_MUX_CPU1:复用类型。GPIO_MUX_CPU1:复用类型。PLLCLK_BY_2:表示2分频。IMULT_20:表示倍频数。

小柚子的博客 805

如何解除“无法完成操作 因为文件包含病毒或潜在垃圾软件”

当运行软件遇到“无法完成操作 因为文件包含病毒或潜在垃圾软件”时,如何解决?控制面板-系统和安全-Windows Defender防火墙-自定义设置,将专用网络及公用网络关闭。点击后,选择“病毒和威胁防护”-管理配置。进入安全中心后,选择“病毒和威胁防护”将需要排斥的选项输入后,保存配置即可。2:打开windows安全中心。

笔者从事电信媒体开发多年,愿意将多年的开发经验分享给同行 6万+

VC++MFC框架窗口(一)AfxEndDeferRegisterClass AfxRegisterClass PreCreateWindow AfxDeferRegisterClass

MFC框架窗口 有了 WinMain 函数,根据创建 Win32应用程序的步接下来设计窗口类和注册窗口类。MFC已经为我们预定义了一些默认的标准窗口类,只需要选择所需的窗口类,然后注册就可以了。窗口类的注册是由 AfxEndDeferRegisterClass 函数完成的,该函数的定义位于 wincore.cpp 文件中。其定义代码较长,由于篇幅所限,在这里仅列出部分代码,如例4-9所示。 ...

当路danglu0010 1197

基于 Qt 的轻量化工业组态软件设计与实现

本文设计并实现了一种基于Qt框架的轻量化工业组态软件,解决了传统组态软件体积庞大、部署复杂等问题。该软件采用模块化架构,集成可视化图形编辑、设备数据采集、脚本扩展等核心功能,具有跨平台运行、资源占用低、启动速度快等特点。通过关键技术优化,实现了高效稳定的数据采集、脚本控制和网络通信,可广泛应用于工业机器人HMI、小型PLC监控等轻量化场景。测试结果表明,该软件体积约30MB,运行内存占用60-80MB,启动时间1.2秒,满足工业轻量化监控需求。未来可扩展更多工业组件和协议支持,进一步提升应用价值。

谢谢大家的关注和点赞!这里只有纯纯的知识干货,没有一句废话。希望能实实在在帮到大家~要是觉得有用,别忘了给我点支持哟,你 140

孙鑫VC学习笔记:第三讲 MFC应用程序框架 收藏

 1.在MFC的源代码中查找入口函数WinMain(). X:/Program Files/Microsoft Visual Studio/VC98/MFC/SRC APPMODUL.CPP文件中------------------------------------------------------------------------extern "C" int WINAPI_tWinMa

vooohooodooo的专栏 294

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

孙鑫C++视频教程

(注意以下为FTP下载地址,建议使用迅雷等下载工具下载,全20CD,已添加完整) 孙鑫C++教程(全20讲)PPT讲义.rar 孙鑫C++教程01.rar 孙鑫C++教程02.rar 孙鑫C++教程03.rar 孙鑫C++教程04.rar 孙鑫C++教程05.rar 孙鑫C++教程06.rar 孙鑫C++教程07.rar 孙鑫C++教程08.rar 孙鑫C++教程0

又见炊烟 6280

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

孙鑫VC学习系列教程

教程简介 1、循序渐进  从Win32SDK编程开始讲解,帮助大家理解掌握Windows编程的核心 —— 消息循环机制。 2、通俗易懂  编程语言枯燥难懂,然而通过孙鑫老师形象化的讲解,Windows和MFC编程中的难点、重点,让你轻松掌握。 3、实战性强  编程中要注意什么?如何阅读出错提示?如何调试运行程序?如何排查错误,解决问题?通过孙鑫老师的一步步操作讲解,带你迅速掌握程序

学如逆水行舟,不进则退 1821

孙鑫VC++第三章 2.基于MFC的程序框架剖析

基于MFC的程序框架剖析

qq_38446366的博客 1863

孙鑫VC++LESSON3:MFC框架程序剖析

孙鑫VC++LESSON3:MFC框架程序剖析

p975468132的博客 1372

孙鑫VC第三课学习笔记

孙鑫VC第三课学习笔记剖析基于MFC的应用程序知识点一MFC中是如何来对应传统的windows程序? 首先在CXXXApp中会定义一个全局变量 CXXXApp theApp我们知道,在C/C++中,编译器会在进入main/WinMain函数之前会给全局变量分配内存空间,所以在MFC中,首先会调用theAPP,当然会进入CXXXApp类的构造函数CXXXApp()。在VC

张戟的专栏-H.264学习乐园 6142

mfc编程 孙鑫_MFC(ActiveX编程,孙鑫C++第十八讲笔记整理)

一:在VB中调用X控件,添加方法project->Add components。另外可以用Object Browser来查看控件二:在VC中创建X控件1.新建一个X工程名为Clock,注意一个文件中可以包含多个控件。2.保持缺省设置,完成。注意它生成的三个类,以及相关的接口。3.运行它。选择TSTCON32.exe作为容器。4.选择Insert Control,此时我们可以看到,它画了一个椭...

weixin_42298881的博客 611

孙鑫VC学习笔记:第三讲

第三讲2个半小时,听得好累啊!在网上找到了别人做得笔记,非常好,于是拿过来用,在他的基础上增加一些内容。不然全部自己写的话,估计写不到他那么好!  在MFC生成的应用程序口,窗口的生成跟第一讲不太一样,是怎样生成的?1,寻找WinMain入口:(MFC向导生成的程序找不到WinMain函数,它是在编译的时候由链接器链接到程序当中的)在安装目录下找到MFC文件夹下的SRC文件夹,

遐迩思的专栏 1756

孙鑫老师总结的vc小知识

孙鑫老师总结的vc小知识 收藏转自程序员之家论坛。下面的知识都是孙鑫老师总结的一些常见问题和解决方案。转载自此处以备查学。VC小知识总结(续)(1)当文档被修改时,如何在标题上加上标志'*'?重载CDocument类的虚函数virtual SetModifiedFlag:void CTest2Doc::SetModifiedFlag(BOOL bModified){    CString strT

tony的专栏 2748

[MFC学习笔记]--孙鑫第三课

我新建了一个MFC app工程,名字叫mfcTest,然后VC6++给我自动生成了一些类。CAboutDlg类,CMainFrame类,CMfcTestApp类,CMfcTestDoc类,CMfcTestView类.     接下来,我要一个个学习这种类。这些类都有基类,这些基类都是MFC的类库里面的。     CMfcTestApp 是继承了CWinApp类。     The CWinAp

dp_huang的博客 672

孙鑫VC学习笔记:第八讲 逃跑按钮的巧妙实现和MFC中指针的获取

1.如何改变按纽的字体?在对话框的属性中改变字体的属性即可 2.逃跑按纽的实现   1.从CButton派生一个类,CWeixinBtn   2.将IDC_EDIT1关联成员变量m_btn1,类型为CWeixinBtn,注意要包含头文件。   3.在CWeixinBtn中加一个指针成员变量CWeixinBtn *pWeixinBtn,然后将其地址初始化。   4.在新类中增加鼠标移动的消

464
上一篇: 孙鑫VC学习笔记:第二讲 掌握C++
下一篇: 孙鑫VC学习笔记:第四讲 MFC消息映射机制和CDC类的使用
Savitch
博客等级 码龄16年 84粉丝 130原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值