DSP

Visual C++ 6.0 读书笔记

2019-07-13 16:58发布

VC++工程的文件 l          *.dsw         工作区文件                 保存本工程所在的工作区的信息 l          *.opt          工作区选项文件         保存了用户为所建工作区所定制的一些选项 l          *.dsp                  工程文件                     保存了用户所建工程的有关信息 l          *.clw          类的信息文件             保存了工程中所有类的相关信息,Classwizard使用此文件对类进行编辑 l          *.ncb          非编译的浏览文件     包含了由分析起产生的一些信息,这些信息可被ClassViewWizardBar等使用 l          *.rcResource.h                   主要资源文件及其头文件            其中还包含了标准的MFC资源文件Afxres.rc l          *.rc2           工程的资源文件         用于VC++不能直接进行编辑的资源,以及被多个工程使用的资源。   应用程序的运行过程 当运行用户应用程序时,程序中的应用程序框架最先获取控制权。然后依次执行以下功能: l          做部分初始化工作 l          构造应用程序的唯一应用类对象 l          调用WinMain函数 n          获取唯一的应用类对象指针 n          进行一些内部初始化 n          进行应用程序初始化,也就是调用应用类的InitApplication进行初始化。 n          进一步初始化应用程序,也就是调用应用类的InitInstance函数进行初始化; n          调用应用类的Run函数,运行消息,不断的获取消息和处理消息,知道获取WM_QUIT消息; n          调用应用类的ExitInstance函数 n          退出应用程序之前的首尾工作。 l          WinMain函数返回后,删除唯一的应用程序对象, l          终止应用程序   应用程序窗口 l          边框窗口 n          SDI            边框窗口就是主窗口                    CMainFrame派生 n          MDI          边框窗口   主边框窗口                                    CMDIFrameWnd派生 子边框窗口                                    CMDIChildWnd派生 l          视图窗口   文档模板类 InitInstance方法内的主要操作就是:文档模板类的创建。 文档负责数据的存储,视图负责显示。文档通过视图和用户打交道。 l          单文档模板 l          多文档模板 App对象通过并不直接管理文档模板类,而是通过一个内部类CDocManager来管理。CWinApp类包含有一个CDocManager类的对象m_pDocManager,它是指向CDocManager类对象的指针,在CDocManager类中定义了一个指针列表,列表中的每一项都是一个指针,指向每一个文档模板对象。AddDocTemplate(pDocTemplate )就是将文档模板对象的指针添加到列表中。   CDocManager对象m_pDocManager                                         ---------------------------           文档类 App对象           ---------------------------------------------     文档模板对象             ---------------------------           视图类                                                                                                                                    ---------------------------           窗口类                                                                                                GetFirstDocPosition             GetFirstViewPosition GetFirstDocTemplatePosition                          GetNextDoc                          GetNextView App对象 ------------------------------------ 文档模板对象 --------------------------- 文档类---------------------------视图类                    GetNextDocTemplate                                       AddDocument                       UpdateAllViews                                                                                              RemoveDocument                 AddViewRemoveView l          单文档模板类只有一个文档对象 l          多文档模板类有一个文档对象列表 l          文档对象有一个视图列表 AfxGetApp                           AfxGetInstanceHandle          AfxGetResourceHandle         AfxGetAppName                    消息 三种类型的消息: l          标准的Windows消息                   WM_为前缀的那些消息(WM_COMMAND除外) l          控件通知消息                       由编辑框,列表框等控件或者子窗口发给父窗口的通知消息,以WM_COMMAND为消息名,在消息中含                                                         有消息的通知码,以区分不同的控件通知消息 l          命令消息                               由菜单,工具条,加速键等三种用户接口对象发出的消息,以WM_COMMAND为消息名,在消息中含有 命令的标识符。 其中,标准的Windows消息和控件通知消息必须由窗口类的对象接受,也就是直接或者间接的由CWnd类或者其派生类来处理。命令消息则可以由文档类,窗口类,文档模板类以及应用类等对象来处理。所以下面就涉及到命令消息的处理过程。 命令消息的传递途径: l          MDI主边框窗口首先接收到此命令消息; l          主窗口消息将处理命令的机会让给当前活动的MDI活动子窗口来处理; l          子窗口消息将处理命令的机会让给当前活动的视图; l          视图搜索自己的消息映射,查找对应的处理函数,没有则将消息传递给此视图相关联的文档; l          文档搜索自己的消息映射,查找对应的处理函数,没有则将消息传递给此文档相关联的文档模板对象; l          文档模板对象搜索自己的消息映射,查找对应的处理函数,没有则将消息回传给子边窗口; l          子边窗口搜索自己的消息映射,查找对应的处理函数,没有则将消息回传给主边框窗口; l          主边框窗口搜索自己的消息映射,查找对应的处理函数,没有则将消息回应用对象; l          如果其中的某个对象处理了命令,则命令传递终止,不再继续。 l          如果所有的对象都没有命令的处理函数,则默认情况下,应用程序框架会禁止使用该命令对象。   对话框 l          消息对话框: MessageBox(                             HWND hWnd,                             LPCTSTR lpText,                             LPCTSTR lpCaption,                             UINT nType                    ); 风格: l          一般对话框 n          模态对话框 n          非模态对话框 l          属性页对话框 n          一般属性页对话框 n          向导对话框 l          通用对话框 n          文件对话框 n          颜 {MOD}对话框 n          字体对话框 n          页面设置对话框 n          打印对话框 n          查找和替换对话框 n          OLE通用对话框   控件 l          Picture控件 l          Static Text控件 l          Edit Box控件 l          Spin控件 l          Combo Box控件 l          Group Box控件 l          Radio Botton控件 l          Check Box控件 l          Button 控件 l          Slider控件 l          ScrollBar控件 l          Tab控件 l          Tree控件 l          List控件 l          Progress控件 l          Animate控件   控件栏 l          工具栏 l          状态栏 l          对话框栏 类图结构:         进程和线程 进程   线程 I   线程 II   线程 III   线程 X 代码 数据 地址空间 进程间的通讯: l          使用同步类控制访问共享数据 七个多线程的同步类: 同步对象:CSyncObject, CSemaphore, CMutex, CCriticalSection, CEvent 同步访问对象:CMultiLockCSingleLock 每个同步对象都有一个信号状态,可用时为有信号态,不可用时为无信号态。           同步对象: CSyncObject包含了LockUnLock等基本的函数: BOOL Lock ( DWORD dwTimeout ) BOOL UnLock() 多线程需要同步控制时,调用Lock函数获取对该同步对象的访问权,之后才能访问共享资源。如果其他线程正使用该资源,则dwTimeout指明了线程等待的实践,缺省INFINITE表示一直等待到同步对象可用。 在程序设计中,首先为需要控制对进程访问的资源创建同步对象,然后在不同的进程中根据需要使用LockUnLock函数即可。为了方便使用,可以创建CSingleLockCMulti Lock对象来管理和使用这些同步对象。 CSemaphore 信号灯对象: 当应用程序的多个线程要访问资源时,可以使用CSemaphore类进行控制。CSemaphore类对象允许一定数目的线程访问共享资源。在访问资源之前,先要访问信号灯对象,在它成为有信号状态时再对资源进行访问。 CMutex 互斥量对象: 用于顺序地访问某一资源,在任一时刻只允许之多一个线程访问资源。 CEvent 事件对象:   当应用程访问资源之前必须等待某事件的发生时,可以使用CEvent类进行控制。 CCriticalSection 临界区对象:    可以将一段代码放入临界区,并制止多余一个线程同时进入,即只允许一个线程进入临界区。 CCriticalSection之外,其他的三种同步对象都可以在系统多个进程中使用。 创建一个同步对象时,调用他们的构造函数,如果系统中存在同名的对象并且类型相同,则返回该对象,如果同名但类型不同,则构造失败。 同步对象:封装对同步对象的访问。 CSingleLock:一次只等待一个同步对象时使用。 CMultiLock:当在某个时刻需要使用多个同步对象时使用。 可以使用LockIsLockUnLock等函数来控制对同步对象的访问。 l          使用消息队列 每个线程都有自己的消息队列,工作者线程也不例外。 用户界面线程: 发送消息:PostThreadMessage(UINT message, LPRARM lParam, WPARAM wparam) 处理消息:ON_THREAD_MESSAGE(messagememberFxn)   CSyncObject CSemaphore CMutex CCriticalSection CEvent             用户界面线程 工作者线程 创建 CWinThread派生,必须使用DECLARE_DYNCREAREIMPLEM ENT_DYNCREARE,必须重载一些成员函数,   启动 AfxBeginThread AfxBeginThread 终止 l          PostQuitMessage l          AfxEndMessage l          TerminateThread   状态 ResumeThreadSuspendThread   优先级 SetThreadProorityGetThreadProority   其他 CWinThread线程和窗口相关,成员m_pMainWnd指向主窗口的指针。 可以通过AfxGetMainWnd()来获取线程的主窗口指针。   获取线程的退出码:GetExitCodeThread