版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第一章WindowsCE程序框架1.1程序设计环境1.2WindowsCE程序工作方式1.3WindowsCE程序框架1.4程序框架的解释1.5匈牙利表示法1.6VisualStudio开发环境1.7EmbeddedVisualC++开发环境1.8小结
1.1程序设计环境
WindowsCE程序设计平台是基于VisualStudio2005/2008或EmbeddedVisualC++4.0SP4开发环境的,同时,需要具有WindowsCE操作系统模拟器或智能设备模拟器,特别是PocketPC2005模拟环境或WindowsMobile6模拟环境。
1.2WindowsCE程序工作方式
WindowsCE程序采用所谓的消息响应工作方式,这也是桌面Windows程序的工作方式,即WindowsCE操作系统管理设备的一切资源。
1.3WindowsCE程序框架
笔者得益于DouglasBoling先生的《ProgrammingMicrosoftWindowsCE.NET》一书,当然,10年前从Petzold先生的书中也得到了类似的启发。WindowsCE程序设计具有明显的框架特性,任何复杂的程序设计都可以以此框架为基础,通过添加窗口和消息处理过程来完成。
该框架程序运行结果如图1-1所示。图1-1框架程序在WindowsMobile6仿真器上的运行结果
1.4程序框架的解释
这里再次强调一下WindowsCE程序的工作原理:WindowsCE操作系统仍然是窗口操作系统,即界面上的各种元素都是窗口,不但对话框等窗体属于窗口,各种控件也都属于窗口,这些窗口接收到WindowsCE操作系统发送来的事件消息后,指示WindowsCE操作系统调用窗口的窗口过程,这个窗口过程就是窗口的事件消息处理程序;WindowsCE操作系统调用窗口过程时,会把窗口句柄、消息ID号和与消息相关的两个32位参数传递给窗口过程;窗口过程的执行就是对传递来的各种消息做出响应和处理。因此,WindowsCE程序工作在事件消息驱动模式下。可以想象一下,显示屏是前台,WindowsCE操作系统是后台,前台与后台之间通过一条电话线连接,通过电话线前台与后台可以交互通信。但是,只能后台向前台拨号,即通信建立的方式是:后台WindowsCE操作系统主动发送消息到窗口,窗口被动地收到消息后告诉WindowsCE操作系统它的窗口过程在哪里;然后,WindowsCE操作系统再去执行相应的窗口过程。当然,WindowsCE操作系统在执行窗口过程前可以进行适当的初始化工作。因此,编写WindowsCE程序的关键是创建窗口,并编写窗口过程。下面回到上一节提到的程序框架,首先看一下主程序入口文件myFirst.c。
主程序入口文件包括的头文件名是myFirst.h,在myFirst.h里面定义的以下部分是主程序入口文件用到的,即
#include<windows.h>
intregisterWnd(HINSTANCE);
intshowMainWnd(HINSTANCE,LPWSTR,int);
intquitMainWnd(HINSTANCE,int);
windows.h头文件是所有的WindowsCE程序必须包括的头文件,是WindowsCE的预定义常量、类型和过程的声明文件。主程序入口文件中包括一个主过程,即WinMain过程,如下:
intWINAPIWinMain(HINSTANCEhInstance,
HINSTANCEhPrevInstance,
LPWSTRlpCmdLine,intnShowCmd)
WinMain过程源码的第一步是定义一个MSG结构体对象msg,该结构体定义如下:
WinMain过程源码的第二步是调用自定义的registerWnd过程注册窗口类,该过程体位于mainWndProc.c中,过程体如下:
WinMain过程源码的第三步为调用自定义过程showMainWnd创建主窗口并显示主窗口。showMainWnd的过程体位于mainWndProc.c中,过程体如下:该过程首先定义一个窗口句柄hWnd,然后使用全局变量hInst存储程序实例句柄,接着调用系统过程CreateWindow创建窗口,CreateWindow过程的原型如下:
WinMain过程的第四步为消息循环,使用GetMessage过程获取WindowsCE操作系统发送来的消息。GetMessage过程原型如下:
WinMain过程的第五步,即最后一步为调用自定义过程quitMainWnd关闭主窗口,退出程序。该过程体位于mainWndProc.c中,过程体如下:首先是包括自定义头文件myFirst.h,这个头文件将稍后再作解释。
然后定义全局常量字符串TEXT(“myFirst”)作为主窗口类名,接着定义全局应用程序实例句柄hInst。
接着定义结构体消息查找表,这里自定义类型MessageProc是在头文件myFirst.h中声明的,具体如下:这里定义了四个消息的消息处理过程,在此,稍微多说几句,谈一下都是什么情况下WindowsCE操作系统才会产生并发送这四个消息,并且具体地阐明这四个消息的参数都是什么值。
(1) WM_CREATE消息:当应用程序调用CreateWindowEx或CreateWindow过程创建窗口时,在窗口被显示之前,WindowsCE操作系统向新创建的窗口发送WM_CREATE消息,其原型如下:
WM_CREATElpcs=(LPCREATESTRUCT)lParam;
(2) WM_PAINT消息:在介绍这个消息之前,需要介绍一个客户区有效和无效的概念。客户区在前文中已提到过,是指由用户管理和维护的窗口显示区域,当窗口显示后,如果有其他的窗口显示在其上,其他的窗口将遮挡一部分该窗口,被遮挡的这部分窗口即称为无效区域,当上面的窗口关闭后,这部分无效区域必须进行重新绘制,这时WindowsCE操作系统向当前窗口发送WM_PAINT消息。
WM_PAINT消息原型如下:
WM_PAINThdc=(HDC)wParam;
该消息只有wParam参数,没有lParam参数。
hdc指向需要绘图的设备环境,如果为NULL,则使用缺省的设备环境绘图。设备环境由wParam参数传递。
(3) WM_DESTROY消息:当窗口被破坏和关闭时,例如,用户用任务管理器关闭正在运行的程序时,窗口将收到WM_DESTROY消息,由于WindowsCE的DefWindowProc过程不会自动地处理WM_DESTROY消息,所以需要编写该消息的处理过程,即收到该消息后,执行自定义过程goDestroyMain,破坏主窗口后,所有主窗口的子窗口自动被破坏和关闭。WM_DESTROY消息的原型如下:
WM_DESTROYwParam=0;
lParam=0;
该消息的wParam和lParam参数均为0。
(4) WM_CLOSE消息:窗口或应用程序结束时系统产生WM_CLOSE消息。本实例中,点击窗口右上角的Close按钮“×”将导致系统产生并发送WM_CLOSE消息。WM_CLOSE消息的原型如下:
WM_CLOSEwParam=0;
lParam=0;
该消息的wParam和lParam参数均为0。此外,自定义的消息处理过程的返回值建议为0,本实例中所有消息处理过程的最后一条语句均为
return0;
当然,其他的正整数型返回值也是可以用的,只是-1是不能使用的。WindowsCE约定返回值为0表示消息处理成功,可以继续新的消息接收和处理过程。主窗口过程如下:熟悉了窗口过程对消息处理的方式之后,下面逐个介绍本实例中的四个消息处理过程。
第一个为goCreateMain,前文也提到过消息处理过程名称的命名方法,这里再强调一下,即go+首字母大写的消息名+首字母大写的窗口名。尽管如此,消息处理过程是可以随意取合法的名称的,而且这个名称与变量名的命名方法相同。每个消息处理过程的参数都相同,并且与窗口过程的参数表相同,这样做是为了可以使用消息查找表的方法而设计的。当然,对于某些消息的处理过程,其参数表可以与窗口过程不同。这种使用消息查找表循环定位消息号与消息处理过程的方法,是DouglasBoling先生的书上使用的,笔者参考使用了这一技巧,同时,笔者建议读者也采用这种方法。
goCreateMain过程体如下:在goCreateMain中,首先定义了一个窗口句柄wndCB,调用CommandBar_Create过程创建一个命令栏控件,该过程的声明在头文件commctrl.h中,其原型如下:在goCreateMain中的CommandBar_Create调用中,全局程序实例hInst(与形参形式相同)、主窗口句柄hWnd和在头文件myFirst.h中宏定义的整型量IDC_CMDBAR依次传递给形参。这里IDC_CMDBAR是自定义的命令栏ID号,必须是程序中独一无二的整型数,该整型数不能再用于表示同一程序文件中其他控件的ID号。然后,调用CommandBar_AddAdornments过程在命令栏上创建一个Close按钮,该过程的原型如下:最后一个参数dwReserved为保留参数,设为0。
goPaintMain为WM_PAINT消息的处理过程,其过程体如下:
goPaintMain过程首先定义了画板ps、矩形区rect和设备环境hdc。画板ps结构体对象包含了绘制窗口客户区域所用的绘图信息,其声明如下:矩形区RECT结构体的声明如下:
typedefstruct_RECT{LONGleft;LONGtop;LONGright;LONGbottom;}RECT;四个形参分别表示矩形区域的左边界、上边界、右边界和下边界,最左上角的点的坐标为(LEFT,TOP),最右下角的点的坐标为(RIGHT,BOTTOM)。在WindowsCE屏幕坐标中,例如对于240×320的显示屏,则左上角坐标为(0,0),而右下角为(239,319),而对于定义的任何矩形区域来说,必须保证RIGHT>LEFT,BOTTOM>TOP。图1-2中表示了客户区的坐标体系。图1-2客户区坐标体系
goPaintMain过程接着使用GetClientRect过程得到当前绘图用的窗口客户区,GetClientRect过程的原型如下:
BOOLGetClientRect(HWNDhWnd,LPRECTlpRect);
其中,hWnd为绘图客户区所在的窗口句柄,lpRect为一个长指针,指向代表客户区大小的矩形RECT结构体对象。本实例中调用GetClientRect(hWnd,&rect)之后,rect矩形区的左上角和右下角的坐标点限制了绘图客户区域的大小,即绘图客户区的左边界为rect.left,顶边界为rect.top,右边界为rect.right,底边界为rect.bottom。由于客户区的顶部为命令栏,真正的绘图客户区应该为此命令栏下方的区域,故通过以下语句将客户区的顶部下移命令栏的高度,即
rect.top+=CommandBar_Height(GetDlgItem(hWnd,IDC_CMDBAR));
CommandBar_Height过程取得命令栏的高度值,以像素点为单位,其原型如下:
intCommandBar_Height(HWNDhwndCB);
其中,hwndCB为命令栏的窗口句柄。一般地,返回的命令栏的高度值约为26。
GetDlgItem过程的原型如下:
HWNDGetDlgItem(HWNDhDlg,intnIDDlgItem);
其中,hDlg指向控件的父窗口;nIDDlgItem指定控件的ID号。这里使用IDC_CMDBAR参数调用该过程可取得主窗口中的命令栏窗口句柄。
然后,调用BeginPaint过程获得绘图窗口的设备环境hdc,并将绘图信息填充到画板ps中,如下:
hdc=BeginPaint(hWnd,&ps);
BeginPaint过程的原型如下:
HDCBeginPaint(HWNDhwnd,LPPAINTSTRUCTlpPaint);
其中,hwnd为绘图的窗口句柄;lpPaint为指向画板结构的长指针,调用结束后将被填充绘图信息。
WindowsCE程序对于资源的管理十分有规律,一些共用资源被开辟出来后,必须在使用完后释放,以供其他过程使用。例如,这里的BeginPaint过程获得了设备环境hdc资源,在使用完后,必须调用EndPaint过程释放hdc。因此,可以说BeginPaint和EndPaint是配对使用的过程。WindowsCE中有很多配对使用的过程。在我们对各种资源有更充分的认识和理解之前,可以把WindowsCE的资源理解为内存中的关键存储区域。
EndPaint过程的调用比较固定,如下:
EndPaint(hWnd,&ps);
在BeginPaint和EndPaint之间为绘图的语句,本实例中只有一条语句,即在窗口中央显示一行文字“学好WindowsCE程序设计!”,如下:
DrawText(hdc,TEXT(“学好WindowsCE程序设计!”),-1,&rect,
DT_CENTER|DT_VCENTER|DT_SINGLELINE);
DrawText过程用于在矩形区中显示文本,其原型如下:在WindowsCE中对文本输出的支持函数较少,除了DrawText过程外,还有一个更加常用的ExtTextOut过程,ExtTextOut过程使用当前选择的字体在矩形区中输出文本,其原型如下:下面接着介绍goDestroyMain消息处理过程,其过程体如下:当主窗口收到WM_DESTROY消息后,将调用该过程,该过程将执行PostQuitMessage过程,导致窗口收到WM_QUIT消息。PostQuitMessage过程的原型如下:
voidPostQuitMessage(intnExitCode);
其中,nExitCode整型数传递给WM_QUIT消息的wParam参数。当用户点击右上角的Close按钮时,主窗口即收到WM_CLOSE消息,执行goCloseMain消息处理过程,其过程体如下:
goCloseMain过程将调用MessageBox过程创建一个简单消息对话框。MessageBox过程原型如下:此外,缺省设置MB_APPLMODAL表示消息对话框为有模式对话框。所谓的有模式对话框是指当对话框打开后,对话框会拥有焦点,表现为对话框的标题栏颜色加深,如果不关闭该模式对话框,则不能对其父窗口进行操作。对立概念的无模式对话框则在不关闭对话框的情况下,可以对其父窗口操作,典型的例子是OfficeWord软件中的查找对话框即为无模式对话框。如果消息对话框不在窗口顶层显示,还可以指定MB_SETFOREGROUND使消息对话框浮到顶层显示,或指定MB_TOPMOST限制对话框总处于顶层显示。
消息对话框返回0表示创建对话框失败,否则,将返回预定义的按钮ID号,例如,IDABORT、IDCANCEL、IDIGNORE、IDNO、IDOK、IDRETRY或IDYES,表示对应的按钮被按下了。
本实例中创建的对话框如图1-3所示,该对话框将返回IDYES或IDNO,取决于用户点击哪个按钮。
当用户点击“否”按钮时,对话框返回IDNO,则调用return0返回;否则,调用PostQuitMessage(1)导致主窗口接收WM_QUIT消息,退出程序。图1-3包含两个按钮的消息对话框
1.5匈牙利表示法
由于WindowsCE支持长变量名,所以,变量名或过程名的命名应尽可能地做到见名知意,此外,可以采用约定的匈牙利表示法,在变量名或过程名等标识符前加上一个表示变量类型或返回值类型的小写字母或字母组合前缀,将使得变量名和程序更易读懂。
一般地,匈牙利表示法对前缀的定义如表1-1所示。
1.6VisualStudio开发环境
读到这里,可能有些读者急于上机调试一下本章的程序了。本节和1.7节将给出实现和运行WindowsCE程序的具体方法和步骤。
WindowsCE程序设计可以基于多种开发环境,这里重点介绍两种,即VisualStudio2008和EmbeddedVisualC++4.0SP4。本节将介绍VisualStudio2008,下一节将介绍EmbeddedVisualC++4.0SP4。在WindowsXP或Vista上安装VisualStudio2008是件简单愉快的事情,选好安装目录后,按照安装提示一步步地进行,便可安装完成。安装完成后,在Windows开始菜单中会有MicrosoftVisualStudio2008的快捷启动菜单项,点击便可进入VisualStudio2008(简称VS9。之所以简称VS9,是因为VisualStudio2008的版本号是9.0),如图1-4
所示。
在图1-4中点击“文件 | 新建 | 项目”,进入图1-5所示界面。图1-4VS9启动界面图1-5VS9新建项目对话框在如图1-5所示的“新建项目”对话框中,选择“VisualC++ | 智能设备 | Win32智能设备项目”,在“名称”一栏中输入项目名称为myFirstWithVS9,点选右上角的下拉列表框,选中“.NETFramework2.0”(如果选择 .NETFramework3.5,且使用外部智能手机设备进行程序设计,VS9会自动在智能手机上安装 .NETFramework3.5软件包)。点击“确定”按钮进入下一步,如图1-6所示。图1-6Win32智能设备项目向导点击图1-6左侧的“平台”,并把“WindowsMobile5.0PocketPCSDK”和“WindowsMobile6ProfessionalSDK”选到右边的“选定的SDK”栏中,如图1-7所示。图1-7Win32智能设备项目向导平台设置点击图1-7中的“下一步”按钮或“应用程序设置”,选中复选框“空项目”。如图1-8所示。图1-8Win32智能设备项目设置点击图1-8中的“完成”按钮结束“Win32智能设备项目向导 - myFirstWithVS9”的设置,进入如图1-9所示界面。图1-9myFirstWithVS9空项目点击图1-10所示的“文件 | 新建 | 文件”菜单,得到如图1-11所示“新建文件”对话框。图1-10文件菜单选项图1-11“新建文件”对话框在图1-11中选择“VisualC++ | 头文件(.h)”,点击“打开”按钮,然后编写头文件,并存盘为myFirst.h,如图1-12所示。接着,选择菜单“文件 | 将myFirst.h移入(I) | 1myFirstWithVS9(1)”,把头文件加入到当前项目中。按照上述方法,依次编写myFirst.cpp和mainWndProc.cpp文件,并把这两个文件加入到项目中,如图1-13所示。图1-12新建myFirst.h头文件图1-13myFirstWithVS9工程文件注意这里程序文件的扩展名为 .cpp。
然后,按图1-14和图1-15所示选取WindowsMobile6为程序工作平台,这需要外接WindowsMobile6智能设备,这里使用了一台WindowsMobile6PPC智能手机。图1-14选取WindowsMobile6ProfessionalSDK图1-15选取WindowsMobile6ProfessionalDevice通过USB口将WindowsMobile6智能手机与计算机连接。对于WindowsXP系统,计算机上需要安装软件MicrosoftActiveSync4.5,连接成功后,如图1-16所示。图1-16MicrosoftActiveSync为了向读者展示在WindowsMobile6智能手机上的运行结果,我们使用了掌智手机助手软件,该软件可以把手机屏幕截取到计算机上。如图1-17和图1-18所示。图1-17掌智手机助手图1-18掌智手机助手屏幕截取图下面,我们再回到VS9来,如图1-19所示,点击菜单“生成(B) | 生成解决方案(B)”或按F6,则会编译连接整个项目,如果有语法错误,请逐个改正。如果生成成功,会在图1-19所示窗口的左下角显示“已保存的项”的地方,显示“生成成功”。过一会儿后,会显示“就绪”。
接着,如图1-20所示,点击菜单“生成(B) | 部署解决方案(D)”。图1-19生成解决方案图1-20部署解决方案稍后,在图1-20左下角的状态栏中显示“就绪”的地方,会显示“部署已成功”,表示程序已成功下载到了WindowsMoblie6智能手机上。如图1-21所示,可见程序自动部署(或下载)到了智能手机的ProgramFiles目录下的同名目录(myFirstWithVS9)下。
有两种方法可在WindowsMobile6手机上执行myFirstWithVS9程序。方法一如图1-21和图1-22所示,
在图1-22所示的手机屏幕上,用触摸笔点击myFirstWithVS9,即可在手机上运行该程序,运行结果如图1-23和图1-24所示。图1-24为点击屏幕左上角的Close按钮后弹出的消息对话框。
图1-21智能手机ProgramFiles目录图1-22智能手机myFirstWithVS9目录图1-23程序运行结果
图1-24程序弹出的消息对话框方法二如图1-25所示。点击菜单“调试(D) | 开始执行(不调试)(H)”或按Ctrl+F5,则直接在智能手机上执行程序。如图1-26和图1-27所示。图1-25调试菜单项图1-26掌智手机助手截图运行结果
图1-27运行结果如果不使用WindowsMobile6智能手机设备,可以选用图1-15中的“CHSWindowsMobileProfessionalEmulator”,表示中文版的WM6专业仿真器,WindowsMobile6简称为WM6。然后,选择“生成(B) | 部署解决方案(D)”,部署成功后,会弹出WM6中文版仿真器,如图1-28所示。一般地,仿真器上能正常运行的程序,在WM6智能手机设备上仍然能正常运行,因此,中文版WM6仿真器是调试WindowsCE程序的首选。在中文版WM6仿真器上运行myFirstWithVS9工程,也有两种方法。方法一:首先,按图1-29所示选择菜单“文件 | 配置”,进入图1-30。在图1-30中,设置“共享文件夹”为“D:\MyCEBook\chap01\myFirstWithVS9\myFirstWithVS9\
WindowsMobile6ProfessionalSDK(ARMV4I)”,即为myFirstWithVS9项目的目录。该目录将作为WM6仿真器的存储卡“StorageCard”,如图1-31和图1-32所示。图1-28中文版WM6仿真器
图1-29文件菜单图1-30仿真程序属性对话框图1-31资源管理器
图1-32StorageCard下的Release目录在图1-32中,点击“myFirstWithVS9”可执行文件,程序执行结果如图1-33和图1-34所示。
图1-33WM6仿真器上程序运行结果
图1-34点击命令栏上关闭按钮的响应结果借助中文版WM6仿真器执行myFirstWithVS9项目的另一种方法是点击图1-25中的菜单“调试(D) | 开始执行(不调试)(H)”,这时直接在WM6仿真器上执行myFirstWithVS9项目,如图1-35所示。图1-35程序运行结果要把VS9集成开发环境完整、细致地介绍一下,是件很费篇幅且不太容易的事情。更深入地了解VS9集成开发环境的使用方法,还要靠平时不间断地使用VS9进行程序设计。本书第二章起的所有程序,均使用VS9进行开发和调试。
1.7EmbeddedVisualC++开发环境
这里还要介绍一种使用经典的EmbeddedVisualC++ 集成开发环境进行WindowsCE程序设计的方法。EmbeddedVisualC++ 简称EVC,有时也写做eVC。EVC体积小,是专用于开发WindowsCE程序的集成开发环境,因此使用EVC开发更加简单易行。安装EVC软件只需花几分钟时间就可以了,需要同时安装标准的StandardSDK仿真器和PocketPC2003SDK仿真器。EVC编写的程序同样可以运行在WM6智能设备上。安装完成后,WindowsXP的开始菜单中会出现“MicrosofteMbeddedVisualC++4.0 | eMbeddedVisualC++4.0”快捷菜单,点击后进入EVC集成开发环境,如图1-36所示。
如图1-37所示,选择菜单“File | New”,进入图1-38。图1-36EVC环境主界面图1-37File菜单项图1-38新建工程对话框在图1-38中,选择“WCEPocketPC2003Application”,在“Projectname”栏中输入myFirstEVC,然后点击“OK”,进入图1-39。选择单选钮“Anemptyproject”,然后点击“Finish”,将弹出图1-40所示的工程信息对话框,点击“OK”,进入图1-41。之后,在图1-41所示界面上编写myFirst.h、myFirst.c和mainWndProc.c程序。
图1-39WCEPocketPC2003应用程序向导
图1-40工程信息图1-41工程文件主界面在图1-41中的工具条上,选择POCKETPC2003、Win32(WCEARMV4)Release和POCKETPC2003Emulator。然后,如图1-42所示,点击菜单“Build | B
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 工资按时发放民工保障书
- 赠与合同借款租赁问题探讨
- 育苗种子生产合作
- 跑步机预售合同补充协议
- 工程质量保证保函
- 旅游服务合同的合规观察
- 高强度水泥砖供应合同
- 公路工程分包商的劳务
- 品质保证信誉保
- 外贸绿植购销协议
- 燃气有限公司突发环境专项应急预案
- 【课件】供应商现场与质量管理
- 2024年立式碾米机项目可行性研究报告
- 狼疮性脑病的护理
- 2024年全国统一高考英语试卷(新课标Ⅰ卷)含答案
- 2024年认证行业法律法规及认证基础知识 CCAA年度确认 试题与答案
- Unit 1 - Unit 6 知识点(知识清单)-2024-2025学年人教PEP版(2024)英语三年级上册
- 花卉学智慧树知到期末考试答案章节答案2024年浙江农林大学暨阳学院
- T∕ACSC 01-2022 辅助生殖医学中心建设标准(高清最新版)
- 在全市现代生态渔业现场推进会上的讲话
- (完整版)消防工程施工进度计划表
评论
0/150
提交评论