




已阅读5页,还剩9页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
MFC封装了窗口创建,对程序员来说,开发简单,但理解起来就有点麻烦消息 循环 :在搜索中,搜索CWinThreadRun(),CWinThreadRun() 在文件thrdcore.cpp中,完成了消息循环在WINMAIN.CPP中,nResult = pThread-Run()int CWinThreadRun(). / pump message, but quit on WM_QUIT. if (!PumpMessage() return ExitInstance(); .再查找 PumpMessage()BOOL CWinThread:PumpMessage()在此设置一个断点ASSERT_VALID(this);if (!:GetMessage(&m_msgCur, NULL, NULL, NULL)。if (m_msgCur.message != WM_KICKIDLE & !PreTranslateMessage(&m_msgCur):TranslateMessage(&m_msgCur);:DispatchMessage(&m_msgCur);返回CWinThreadRun() ,在此处if (!PumpMessage() return ExitInstance(); 设置一个断点在if (!PumpMessage()if (!GetMessage(&m_msgCur, NULL, NULL, NULL)前加上断点,调式运行,始终在消息循环内部运行。那么消息循环路由的消息是不是还有窗口过程呢 ?下面我们再看看在WINCORE.CPP中,查找afxend,进入函数BOOL AFXAPI AfxEndDeferRegisterClass(LONG fToRegister)/ mask off all classes that are already registeredAFX_MODULE_STATE* pModuleState = AfxGetModuleState();fToRegister &= pModuleState-m_fRegisteredClasses;if (fToRegister = 0)return TRUE;LONG fRegisteredClasses = 0;/ common initializationWNDCLASS wndcls;memset(&wndcls, 0, sizeof(WNDCLASS); / start with NULL defaultswndcls.lpfnWndProc = DefWindowProc;wndcls.hInstance = AfxGetInstanceHandle();wndcls.hCursor = afxData.hcurArrow;其中红色的那句我们可以看到,窗口类过程指针指向的是缺省窗口 ,实际上很多时候消息循序路由给操作系统的细小并不是都交给缺省窗口来处理,在这里做了个转换,采用了消息映射这种技术,由消息映射函数来处理。到此,整个MFC框架应用程序的内部执行过程和我们在前面讲的在WINDOWS环境下的程序一样,都需要哦一个窗口类,在MFC中所需要的窗口类已经预先设计好,已有了一些默认类名,我们只需利用这些类名注册,注册完再显示,更新窗口,然后是消息循环。我们再演示一遍。、1CTestApp theapp;l利用全局对象启动程序,有了全局对象,所有基类中的this指针指向该对象。2 CTestApp:CTestApp()全局对象对象调用构造函数产生这个对象,当我们调用子类的构造函数时,首先构造父类,所以cwinapp的构造函数首先被调用,完成了应用程序初始化的工作,同时将子类的指针保存起来,进入到winmain函数3winmain函数tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPTSTR lpCmdLine, int nCmdShow)在该函数中我们可以获取子类的指针CWinThread* pThread = AfxGetThread();CWinApp* pApp = AfxGetApp();利用子类指针我们可以虚拟的函数,根据多态性的原理,响应就能调用到子类的函数,也就是if (!pThread-InitInstance()在InitInstance()中完成初始化的工作,包括窗口类的注册,创建,显示,更新。4 进入消息循环。二CView CMainFrame类都是由CWnd类派生出来,CMainFrame类所表示的窗口是CView的表示窗口的父窗口。CTestDoc类由CDocument类派生出来,从MSDN看CDocument类,是文档类,文档类的作用我们要把数据本身和显示分离开,由文档、视图来完成,数据的存储加载由文档完成,数据的显示修改由视类完成。以后有介绍,在这不详细讲解。这些类是如何组织联系到一起,看CTestApp类的InitInstance()CSingleDocTemplate* pDocTemplate;pDocTemplate = new CSingleDocTemplate(IDR_MAINFRAME,RUNTIME_CLASS(CTestDoc),RUNTIME_CLASS(CMainFrame), / main SDI frame windowRUNTIME_CLASS(CTestView);AddDocTemplate(pDocTemplate);class CAboutDlg : public CDialog,可有可无,主要是帮助 等作用,是个对话框。 窗口类,窗口对象与窗口的关系:打开程序WinMain.dsw ,讲述如何利用类封装窗口,CWnd wnd;wnd.CreateEx(.);wnd.ShowWindow(SW_SHOWNORMAL);wnd.UpdateWindow();HWND hwnd;hwnd=CreateWindowEx();:ShowWindow(hwnd,SW_SHOWNORMAL);:UpdateWindow(hwnd);上面语句的区别是相差了句柄hwnd,上面那种少了个句柄,是因为在CWnd类中,定义了成员变量m_hWnd,它就是句柄类型,它保存了句柄,在CreateEx函数调用时,它返回的就是句柄,将它保存到成员变量中,当再次调用ShowWindow时,不用传递句柄,当更新窗口时,也不用传递句柄,因为句柄保存在类的成员中,这就是类的封装。在开发过程中很多人容易混淆的一点是:CWnd wnd,C+的对象wnd代表的就是窗口。其实不是窗口,当我们关闭窗口,销毁窗口,那么这个C+的对象wnd销毁没有?当然没有。当窗口销毁时,仅仅是将句柄设为空。C+的对象wnd的声明周期和窗口的生命周期不是一致的,当一个窗口销毁时跟C+对象没有任何关系,它们之间的纽带是仅仅是在C+内部有一个变量是句柄成员变量,保存了跟窗口相关的句柄。当然在设计类时,当C+对象销毁时,窗口也要销毁,因为联系的纽带断了,窗口占有的资源要回收,所以在析构函数中,一般要释放资源内存,销毁了窗口,正因为如此,让人感觉C+对象就是窗口,刚巧窗口没了,C+对象也没有,C+对象没了窗口也没了。窗口销毁了,对象销毁不销毁要看是不是到了声明周期。当窗口销毁时,类的对象仍可以使用一定要区别开窗口和窗口类,所以说我们的CMainFrame和CTestView或它们的对象就是窗口,当一个窗口销毁时,CTestView内部的成员函数我们仍可以使用。在CWnd类中,查MSDN,查看内部成员,有一个数据成员Data Members m_hWndIndicates the HWND attached to this CWnd为了更好的理解窗口类和窗口,我们现在要在CMainFrame窗口中添加一个按钮,先查MSDN,CButton类,CButton:CButtonCButton( );RemarksConstructs a CButton object.Example/ Declare a button object.CButton myButton;通过构造函数,我们能够看清楚,直接构造函数使用对象,还是使用构造函数之后,还得经过初始化,才能使用对象,CButton 的对象myButton已经可以使用了,但是对于一个窗口来说,还需要调用初始化的函数InitializationCreateCButton:Create BOOL Create( LPCTSTR lpszCaption, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID );在框架窗口上再产生一个CButton控件窗口,要在框架窗口产生后去产生控件。否则该按钮控件没有地方放。Oncreate函数中创建。看程序例子。MFC消息映射机制的剖析,讲述如何运用ClassWizard,理解发送给窗口的消息是如何被MFC框架通过窗口句柄映射表和消息映射表来用窗口类的函数进行响应的。掌握设备描述表及其封装类CDC的使用,CDC是如何与具体的设备发生关联的,融合具体的画图程序进行分析。如何设置封闭图形的填充刷子(位图画刷与透明画刷的使用)。新建以单文档应用程序Draw.这节课我们会介绍一些画图方面的知识,先从画线开始。在程序中画线和在纸上画线不太一样,在纸上只要拖动笔就可以。在程序中,则需要知道两个点,在这两个点间画线,那这两个点如何捕获,想想在第一节课中我们讲到,在windows中编程是基于消息,那么要捕获原点,当鼠标左键按下的时候就是原点,也就是说我们可以捕获鼠标左键按下的消息,在这个消息中就可以得到原点,然后我们按住鼠标左键拖动,当左键松开,另一点有了,就是终点。所以我们需要捕获两个消息,一个是鼠标左键按下的消息WM_LBUTTONDOWN和另一个鼠标左键弹起的消息WM_LBUTTONUP.在这两个消息响应中获取两个点,这两个点就决定一条线。我们在CMaimFrame类中添加鼠标左键按下和弹起的消息响应,可以在CDrawView或CMainFrame类中做消息的捕获。要对消息进行捕获,在框架类名上单击鼠标右键,单击增加消息处理器add windows message handler,左列都是消息处理,找到要添加的消息WM_LBUTTONDOWN,右边选择add handler,增加一个消息响应,然后edit existing.在消息响应函数中假设我们添加一个消息框,表明我们按下了鼠标左键,代码是MessageBox(MaimFrame clicked);注意:在该函数中没有句柄这个参数,原因是MessageBox是CWnd类的成员函数,不需要句柄,有一个成员保存了消息的句柄,所以不需要,剩下两个参数都有缺省值,所以只需要一个参数即可。我们编译运行,发现点击后没有消息框弹出来。原因?我们在CView类中增加鼠标左键按下的消息响应,添加方法可以和刚才的一样,还有另一种方法,在标题栏view视图下classwizard,也可以增加消息和消息响应函数,重载虚函数等。void CDrawView:OnLButtonDown(UINT nFlags, CPoint point)中添加代码:MessageBox(view clicked);点击编译运行,可以弹出消息框。原因:在上次课中我们讲到,在文档/视结构中,CView窗口覆盖于CMainFrame窗口之上,就好像说有一面墙作为框架类窗口,还有一面墙始终挡在框架类墙前面,那么对墙的任何操作都是对前面的墙操作。跟窗口一样,View窗口覆盖于CMainFrame窗口之上,对于窗口的任何操作都是对View窗口的操作,包括鼠标移动,左键点击等,只能由view窗口来捕获,这就是在框架类窗口上捕捉不到消息框的原因。我们删除第一次在CMainFrame中增加的消息WM_LBUTTONDOWN,注意:删除时不能直接删除源代码,在vc采用帮助向导的方式增加的消息响应时,一般还在其他地方增加其他的一些信息,要删除干净,可以在消息响应函数名上按鼠标右键,选择delete.下面我们看看都增加了哪些信息?1 DrawView的头文件DrawView.h中 protected:/AFX_MSG(CDrawView) 注释宏afx_msg void OnLButtonDown(UINT nFlags, CPoint point); 消息响应原型声明,灰色/AFX_MSG 注释宏 afx_msg也是宏,表示OnLButtonDown是消息响应的函数原型声明。2 DrawView的源文件DrawView.cpp中BEGIN_MESSAGE_MAP(CDrawView, CView)/AFX_MSG_MAP(CDrawView)ON_WM_LBUTTONDOWN() 这是一个宏,这个宏把消息WM_LBUTTONDOWN跟消息响应函数void CDrawView:OnLButtonDown(UINT nFlags, CPoint point)联系起来。/AFX_MSG_MAP/ Standard printing commandsON_COMMAND(ID_FILE_PRINT, CView:OnFilePrint)ON_COMMAND(ID_FILE_PRINT_DIRECT, CView:OnFilePrint)ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView:OnFilePrintPreview)END_MESSAGE_MAP()在第一次课讲过消息循环,当有消息产生,OS将消息放到消息队列中,应用程序通过getmesage()从消息队列中取出消息,通过dispatmessage()交给操作系统,Os调用窗口过程函数进行处理。在MFC中不是这样来处理,好像只要有消息,只要按照上面3个步骤走,就可以进行消息响应了,并不是利用switch.case.不同消息来做不同处理。在MFC中这种处理方法我们称为消息映射。 消息映射的实现:一种方法,在基类中指针每种消息做虚函数,这样当子类对消息进行响应,只要重写虚函数,根据派生的特点,调用函数时,子类有的调用子类的,子类没有的调用父类的,也可以完成消息的路由,最终到一个函数。在MFC中类的派生层次很多,如果在基类中对消息响应的话,有超过100多个消息的都进行虚函数的响应函数,凡是从基类中派生的子类,都有一个虚表,这样是对资源的浪费,MFC没有采取这种机制,而是采用消息映射机制。在程序中,MFC在后台维护了句柄和C+对象的指针的对照表,比如说,CDrawView,和CDrawView相关的有一个窗口,窗口有句柄标识,句柄和我们CDrawView对象的指针,也就是CDrawView *,有一个对照表,当我们收到一个消息,消息的第一参数是句柄,通过句柄就能够找到与它对应的c+类对象的指针,然后通过指针传递给基类,基类会去调用一个函数WindowProc(),我们在mfc源代码中查看一下,右键查看virtual LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam);我们可以看到WindowProc是一个虚函数,所以凡是子类继承cwnd类,在后台窗口都有一个WindowProc函数,在WindowProc函数内部调用了OnWndMsg(message, wParam, lParam, &lResult),真正的消息路由由OnWndMsg来完成。在OnWndMsg函数中完成了对消息映射的处理,会判断消息有没有这个消息响应函数,判断过程是先到头文件中看DECLARE_MESSAGE_MAP()之上有没有消息响应函数原型的声明,然后在源文件中看看BEGIN_MESSAGE_MAP(CDrawView, CView)和END_MESSAGE_MAP()之间有没有消息响应映射宏ON_WM_LBUTTONDOWN(),如果找到了,就响应消息映射函数,并进行处理。下面开始画线的功能:1 void CDrawView:OnLButtonDown(UINT nFlags, CPoint point) CPoint point,是一个点,当有了消息,把这个点的位置传递进来,那么为了画图我们就要把这个点保存起来,所以,我们要增加一个成员变量,右键单击CDrawview类名,选择add memble variable2 在构造函数中初始化 m_ptOrign=0;在OnLButtonDown中保存点 m_ptOrign=point;3 确定终点,鼠标弹起来的点,那么我们就要增加消息函数ON_LBUTTONUP,添加方法和上面是一样的。有了终点就可以画图了。 void CDrawView:OnLButtonUp(UINT nFlags, CPoint point)HDC hdc; hdc=:GetDC(m_hWnd);MoveToEx(hdc,m_ptOrign.x,m_ptOrign.y,NULL);LineTo(hdc,point.x,point.y);:ReleaseDC(m_hWnd,hdc);在这个操作中用的都是全局函数,SDK中的函数在MFC中,给我们提供DC封装的类,所有与窗口相关的操作都封装到CWnd中,所有与DC相关的操作都封装到CDC中,设备上下文对象的类。CDC *pDC=GetDC();pDC-MoveTo(m_ptOrign);pDC-LineTo(point);ReleaseDC(pDC);我们再换一个方式,类CClientDC CClientDC dc(this);dc.MoveTo(m_ptOrign);dc.LineTo(point);在这里不用再调用释放函数了,因为dc对象到了函数结束时,生存期就结束,自动调用析构函数。编译运行后,只能画到画布上。假如我们要构造dc,与view窗口的父窗口相关,也就是和框架窗口CMainFrame相关,那么我们就要得到父窗口的指针,在c+程序设计中,如果要查找一个函数时要有一种语义感觉,把英文单词拼写在一起,再查找验证一下。验证Getparent,在MSDN中,CWnd * GetParent() constCClientDC dc(GetParent();dc.MoveTo(m_ptOrign);dc.LineTo(point);编译运行后,发现可以画到工具栏上,但菜单栏还看不到。注意:我们通常作图都在客户区,对于view类来说,客户区只有画布那么大,对于CMainFrame类来说,客户区包括工具栏,但是不包括标题栏和菜单栏。View类没有非客户区域,框架类有客户区域,就是标题栏和菜单栏。工具栏是浮动的。 再介绍一个类CWindowDC. 由cdc类派生出来,好处,CDC 的对象可以访问整个屏幕,包括客户区和非客户区。CWindowDC dc(this);dc.MoveTo(m_ptOrign);dc.LineTo(point);编译运行后,发现只能在view中画线。我们再把指针值换换,指向父窗口的指针。CWindowDC dc(GetParent();dc.MoveTo(m_ptOrign);dc.LineTo(point);编译运行后,发现作图可以做到工具栏。我们再看作图能不能做到后面的vc环境上。这就要看指针指向的对象是谁获取指针桌面的指针。CWnd:GetdesktopWindow()CWindowDC dc(GetDesktopWindow();dc.MoveTo(m_ptOrign);dc.LineTo(point);4 如何画出其他颜色的线条 刚才我们所画的线条都是黑色的,主要因为在当前的设备描述表中默认画笔是黑色的。如果要画出其他颜色的,可以先创建画笔,然后将画笔选到设备描述表中,这样画出的线条就是新画笔颜色的决定。创建画笔,可以用MFC提供的类CPen. ,封装了与画笔相关的操作,构造函数有3个重载的。 CPen(int nPenStyle,int nWidth,COLORREF crColor)nPenStyle 笔的类型,nWidth 笔的宽度crColor 笔的颜色,线条的颜色由这个决定。COLORREF 颜色类型值,利用宏RGB,代表红绿蓝,利用3个取值不同得到不同的颜色,值范围0-255.CPen pen(PS_SOLID,1,RGB(255,0,0); CClientDC dc(this); CPen *pOldPen=dc.SelectObject(&pen);将笔选到设备描述表中,用SelectObject,查MSDNCPen* SelectObject( CPen* pPen ); 返回值是被替换的对象指针pointer to the object being replaced.当我们把新的画笔选到设备描述表中时,它会把先前的对象返回回来。这样的好处,通常在局部范围内作图时,如果要改变画笔画刷的颜色,当把新的画笔选进来后,当作图结束时,把先前的对象还原,这样,如果不还原的话,如果在其他地方也用到DC,那么所选到的新的画笔相关了。所以在做图过程中,我们在一个代码段时,要改变其中一个画笔颜色,那么选进来之后,在我们做完后,我们要把先前的选进来。 dc.MoveTo(m_ptOrign); dc.LineTo(point); dc.SelectObject(pOldPen); 我们可以CPen pen(PS_SOLID,1,RGB(255,0,0);改一下, CPen pen(PS_SOLID,1,RGB(0,255,0); CPen pen(PS_SOLID,10,RGB(0,255,0); 如果我们把线形改成阴影CPen pen(PS_DASH,1,RGB(0,255,0); 运行发现没有变化,原因? PS_DASHCreates a dashed pen. Valid only when the pen width is 1 or less, in device units. 5 画刷的使用创建画刷,可以用MFC提供的类CBrush.,查MSDN, CBrush CBrush brush(RGB(255,0,0); CClientDC dc(this); dc.FillRect(CRect(m_ptOrigin,point),&brush); 运行正常。注意:因为我们用指定的画刷填充一块区域,所以不用将画刷选进设备描述表中,在设备描述表中有它自己缺省的画刷。 这是颜色画刷,有时候我们要建立位图画刷,也就是带图形的画刷,再看MSDN, CBrush( CBitmap* pBitmap ); 再看MSDN中CBitmap 构造函数CBitmap( ); Constructs a CBitmap object. The resulting object must be initialized with one of the initialization member functions. 创建位图对象后不能立即使用,还要进行初始化。初始化函数,BOOL LoadBitmap( UINT nIDResource ); 通过资源ID创建 创建资源有多种方式,我们可以在插入里面选用资源 点击新建,可以新建资源。我们还可以利用快捷方式来创建资源。资源创建好后,就可以填写代码如下:CBitmap bitmap;bitmap.LoadBitmap(IDB_BITMAP1); CBrush brush(&bitmap); CClientDC dc(this); dc.FillRect(CRect(m_ptOrigin,point),&brush);调试运行。透明画刷的创建 先在屏幕上画矩形,CClientDC dc(this); dc.Rectangle(CRect(m_ptOrigin,point);调试运行,发现先画的矩形被后画的矩形遮挡住了,原因:我们画矩形时,当前的DC有一个白色的画刷,它会利用画刷填充矩形的内部,所以将原先的矩形部分给遮住了。有时候我们希望看到原先图形的线条,也就是将矩形内部变成透明的,那么这时候我们就要创建透明画刷,那么原先图形被遮住部分就能看得着了。查MSDN,看CRrush类有没有创建透明画刷的成员函数,查找后没有,那么我们就得另想办法了。查MSDN,看GetStockObjectHGDIOBJ GetStockObject( 返回值是句柄 int fnObject / stock object type);有一个问题:上函数的返回值是句柄,而我们在程序中用画刷时,是对象,那么我们如何将画刷的句柄转换成C+的对象?或者说是转换成C+对象的指针呢?在CBrush类中的成员(查MSDN)有一个函数FromHandle Returns a pointer to a CBrush object when given a handle to a Windows HBRUSH object.CBrush:FromHandlestatic CBrush* PASCAL FromHandle( HBRUSH hBrush );Return ValueA pointer to a CBrush object if successful; otherwise NULL.填写代码CClientDC dc(this);CBrush *pBrush=CBrush:FromHandle(HBRUSH)GetStockObject(NULL_BRUSH); 获取画刷指针CBrush *pOldBrush=dc.SelectObject(pBrush); 将新的画刷选进来dc.Rectangle(CRect(m_ptOrigin,point);dc.SelectObject(pOldBrush); 恢复就的画刷调试运行。问题:CBrush:FromHandle不是用的对象。函数名,或是对象指针加箭头去调用成员函数,这是为什么? 下面通过一个例子看,先新建一个工程win32的,添加C+文件,#include class Pointpublic:void output() static void init();void main()Point pt;pt.init();pt.output(); 调试没有错误#include class Pointpublic:void output() static void init();void main()Point:init();Point:output();调试有错误,error C2352: Point:output : illegal call of non-static member function假如说电脑有播放VCD的功能,那么要播放VCD,就要有一台电脑,有光驱这个功能后才能利用这个功能。而现在这个电脑根本就没购买。仅仅有播放VCD的功能就去播放,很显然是不行的。在这个地方也是这样,output()是类的内部成员,要想去访问内部成员时,必须先构造Point类对象,也就是说在内存中,实实在在的存在空间,这时候才能调用内存中这个output()方法,所以在这里出错,而Point:init();没有出错。init()是类中的静态方法,静态成员不属于某个类对象,他属于类本身,在类加载时,已经给它分配内存。我们把上面的程序改一下: #include class Pointpublic:void output() static void init()x=0; 原因下面没有声明对象,x,y还没有分配内存空间。而静态成员是在程序运行时,还没进入主函数y=0; 就开始给x,y赋值,很显然是不成功的。 静态成员函数是不能引用非静态数据成员。如果把x,y放在非静态成员output()中就没事了。private:int x,y;void main()/*Point pt;pt.init();pt.output(); */Point:init();/Point:output();调试出现两个错误。那么非静态成员函数能不能引用静态成员呢?可以试试。实际没有错误。静态成员函数只能访问静态成员。#include class Pointpublic:void output() static void init() x=0;y=0;private: static innt x,y;void main()/*Point pt;pt.init();pt.output(); */Point:init();/Point:output();编译后还是有3个错误,error C2146: syntax error : missing ; before identifier xD:excerTestTest.cpp(16) : error C2501: x : missing storage-class or type specifiersD:excerTestTest.cpp(16) : error C2501: y : missing storage-class or type specifiers这是链接时的错误。#include class Pointpublic:void output() static void init(
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二零二五年度二手房买卖合同下载:房屋交易流程
- 二零二五年度a轮融资协议范本解析
- 2025版智能家居与安防一体化个人住宅装修合同
- 2025版电视产品定制开发合同范本
- 2025版厂房装修工程劳务分包合同协议书
- 2025版煤矿承包合作开发合同样本
- 二零二五年度消防设施维保服务补充协议范本
- 2025版搬家物流运输合同参考范本
- 二零二五年度房地产项目合作开发与建筑垃圾处理协议
- 二零二五年度绿色建筑房屋买卖中介服务合同
- 亚洲合作资金管理办法
- 低空经济相关政策文件
- 五年级语文上册快乐读书吧阅读记录卡《中国民间故事》
- 2025年社区专职干部招聘考试真题及答案
- 小红书家居家装行业6月月报
- 高等学校科学技术学术规范指南讲解
- 新课标培训课件2022
- 咖啡相关知识培训课件
- 2025年苏州市中考语文试卷真题(含标准答案及解析)
- 新职工保密培训课件
- aeo封条管理制度
评论
0/150
提交评论