文档库 最新最全的文档下载
当前位置:文档库 › 深入浅出MFC学习笔记:(第三章MFC六大关键技术之仿真:类型识别,动态创建)

深入浅出MFC学习笔记:(第三章MFC六大关键技术之仿真:类型识别,动态创建)

深入浅出MFC学习笔记:(第三章MFC六大关键技术之仿真:类型识别,动态创建)
深入浅出MFC学习笔记:(第三章MFC六大关键技术之仿真:类型识别,动态创建)

软件英才网软件行业驰名招聘网站第三章:MFC六大关键技术之仿真:类型识别

深入理解MFC的内部运行原理,是本次学习《深入浅出MFC》的主要目的。要模仿的六大技术包括:

1:MFC程序的初始化过程。

2:RTTI(Runtime type identification)运行时类型识别。

3:Dynamic creation 动态创建

4:Persistence永久保存

5:消息映射

6:消息传递。

RTTI(运行时类型识别)

IsKindOf能够侦测某个对象是否属于某种类。即判断某一对象所属的类是否是父类或当前类;

要达到动态类型识别的能力,必须在构建类继承体系时记录必要的信息,这被称为类型型录表。MFC以链表的方式建立了此表。

类型型录表的每个元素为CRuntimeClass类型,其定义为:

1class CRuntimeClass

2

3{

4

5public:

6

7LPCSTR m_lpszClassName;//对象所属类名

8

9 Int m_nObjectSize;//对象大小

10

软件英才网软件行业驰名招聘网站11UINT m_wSchema;//模式号

12

13 CObject *(PASCAL*m_pfnCreateObject)();//构建函数抽象类为NULL

14

15 CRuntimeClass *pBaseClasss;//基类CRuntimeClass对象指针。

16

17 Static CRuntimeClass *pFirstClass;//链表头指针。

18

19 CRuntimeClass *m_pNextClass;//下一指针。

20

21};

MFC使用此类作为每个类的成员变量。使用宏定义为每个类定义了自己的CRuntimeClass成员变量。

DECLAR_DYNAMIC和IMPLENMENT_DYNAMIC宏

使用这两个宏将CRuntimeClass对象不知不觉放到类之中。

DECLARE_DYNMIC宏定义如下:

22#define DELCARE_DYNMIC ( class_name ) \

23

24public:\

25

26static CRuntimeClass class##class_name \

27

28virtual CRuntimeClass *GetRuntimeClass()const;

##用来告诉编译器把两个字符串连接起来。

如果使用这个宏:DELCARE_DYNMIC(CView);

那么预编译器将生成下列代码:

软件英才网软件行业驰名招聘网站

29public:

30

31static CRuntimeClass classCView;

32

33virtual CRuntimeClass*GetRuntimeClass()const;

以上代码仅仅是在类中定义CRuntimeClass对象,并定义一个返回CRuntimeClass对象地址的函数。注意CRuntimeClass是static的,也就是说同一种类继承体系的对象共享一个CRuntimeClass对象。

初始化对象的内容以及建立类型型录表需要使用IMPLEMENT_DYNMIC宏。

34#define IMPLEMENT_DYNMIC (class_name,base_class_name)\

35

36_IMPLEMENT_RUNTIMECLASS(class_name,base_class_name,0xFFFF,NULL);

37

38_IMPLEMENT_RUNTIMECLASS又是一个宏,它定义如下:

39

40#define _IMPLEMENT_RUNTIMECLASS(class_name,\

41

42 base_class_name,wSchema,pfnNew)\

43

44static char _lpsz##class_name[]=#class_name;\

45

46 CRuntimeClass class_name::class##class_name=\

47

48 { _lpsz##class_name,sizeof(class_name),\

49

50 wSchema,pfnNew,\

51

52 RUNTIME_CLASS(base_class_name),NULL\

53

软件英才网软件行业驰名招聘网站55

56static AFX_CLASSINIT _init##class_name \

57

58 ( & class_name::class##class_name);\

59

60 CRuntimeClass *class_name::GetRuntimeClass()const\

61

62 {\

63

64return &class_name::class##classname;\

65

66 }

67

68#define RUNTIME_CLASS(class_name)\

69

70 ( &class_name::class##class_name);

AFX_CLASSINIT是一个类,看着跟宏定义似的,这样做很容易让人迷惑。它用于将本节点连接到类型型录表,定义如下:

71class AFX_CLASSINIT

72

73{

74

75public:

76

77 AFX_CLASSINIT(CRuntimeClass*pNewClass)//构造函数

78

79 {

80

81 pNewClass->m_pNextClass=CRuntime::pFirstClass;

82

83 CRuntimeClass::pFirstClass =pNewClass;

84

85 }

86

87};

软件英才网软件行业驰名招聘网站用法:

88class CWnd:public CCmdTarget

89

90{

91

92public:

93

94 DECLARE_DYNAMIC(CWnd);

95

96

97};

IMPLEMENT_DYNMIC(CWnd,CCmdTarget);

代码展开后为;

98class CWnd:public CCmdTarget

99

100{

101

102public:

103

104static CRuntimeClass classCView;

105

106virtual CRuntimeClass*GetRuntimeClass()const

107

108

109

110};

111

112

113

114static char _lpszCWnd[]="CWnd";

软件英才网软件行业驰名招聘网站115

116CRuntimeClass CWnd::classCWnd=

117

118{

119

120_lpszCView , sizeof(CWnd) , FFFF,NULL , &Wnd::classCWnd , NULL);

121

122};

123

124static AFX_CLASSINIT _init_CWnd(&CWnd::classCWnd);

125

126{

127

128 Return &CWnd::classCWnd;

129

130}

定义宏的过程很复杂,但是一旦定义好之后,在使用时仅仅两句话就可以完成定义CRuntimeClass对象并且连接类型型录链表的工作。

CObject是所有类的基类,也是链表的头,此类应特别定义,不能在CObject内使用定义好的宏。

131class CObject

132

133{

134

135public:

136

137virtual CRuntimeClass*GetRuntimeClass()const;

138

139static CRuntimeClass classCObject;

140

141};

142

软件英才网软件行业驰名招聘网站143static char szCobject[]="CObject";

144

145struct CRuntimeClass CObject::classCObject=

146

147{

148

149 szCObject ,sizeof(CObject),0xFFFF,NULL,NULL,NULL

150

151};

152

153static AFX_CLASSINIT _init_CObject(&Cobject::classObject);

154

155CRuntimeClass *CObject::GetRuntimeClass()const

156

157{

158

159return &CObject::classCObject;

160

161}

由于CRuntimeClass对象是static成员变量,因此需要在类外初始化。如果忘记初始化将会报链接错误。

CRuntimeClass*CRuntimeClass::pFirstClass=NULL;

建好了类类型路表,要实现IsKindOf功能很容易。首先在CObject加上一个IsKindOf函数,于是所有继承自此类的类都具有类型识别的功能。能够将某个CRuntimeClass对象与类类型型录中的元素进行比较。如:

162class CObject

163

164{

软件英才网软件行业驰名招聘网站166public:

167

168bool IsKindOf(const CRuntimeClass*pClass)const

169

170{

171

172 CRuntimeClass *pClassThis=GetRuntimeClass();

173

174while(pClassThis)

175

176 {

177

178if(pClassThis==pClass)

179

180return true;

181

182 pClassThis=pClassThis->m_pBaseClass;//沿着基类寻找。

183

184 }

185

186return false;

187

188}

189

190};

如果我们调用CWnd *cw=new CWnd;

cw->IsKindOf(RUNTIME_CLASS(CFrameWnd));

RUNTIME_CLASS实际就是&CFrameWnd::classCFrameWnd,它就是CFrameWnd的static的CRuntimeClass类型成员。函数内利用GetRuntimeClass取得本类的CRuntimeClass对象的地址,即&CWnd::classCWnd,然后进行比较。因为每一类型共用一个static的CRuntimeClass对象,因此属于同于类的CRuntimeClass对象的地址

软件英才网软件行业驰名招聘网站

相同。

动态创建

每一类的构建函数可以记录在类型别录中,当获得一个类名称,通过查找类别型录表找出对应的元素,然后调用其构建函数产生新对象。

在CRuntimeClass中m_pfnCreateObject即为构建函数首地址。为了实现动态创建,需要添加两个宏:

DECLARE_DYNCREATE和IMPLEMENT_DYNCREA TE。

如:

191#define DECLARE_DYNCREATE(class_name)\

192

193 DECLARE_DYNCREATE(class_name)\

194

195static CObject *PASCAL CreateObject();

196

197#define IMPLEMENT_DYNCREATE (class_name,base_class_name)\

198

199 CObject*PASCAL class_name::CreateObject()\

200

201 {return new classname;};\

202

203 _IMPLEMENT_RUNTIMECLASS(class_name,base_class_name,

204

205 0xFFFF,class_name::CreateObject)

以CFrameWnd为例,下列程序代码:

软件英才网软件行业驰名招聘网站207

208{

209

210public:

211

212 DECLEARE_DYNCREATE(CFrameWnd);

213

214};

IMPLEMENT_DYNCREATE(CFrameWnd,CWnd);

展开如下:

215class CFrame:public CWnd

216

217{

218

219public:

220

221static CRuntimeClass classCFrameWnd;

222

223virtual CRuntimeClass *GetRuntimeClass()const;

224

225static CObject *PASCAL CreateObject();

226

227};

228

229CObject _PASCAL CFrameWnd::CreateObject()

230

231{

232

233return new CFrameWnd;

234}

235

236static char _lpszCFrameWnd[]="CFrameWnd";

237

238CRuntimeClass CFrameClass::classCFrameWnd={

软件英才网软件行业驰名招聘网站240

_lpszCFrameWnd,sizeof(CFrameWnd),0xFFFF,CFrameWnd::CreateObject,RUNTIME_CALSS(CW nd),NULL};

241

242static AFX_CLASSINIT _init_CFrameWnd

243

244 (&CFrameWnd::classCFrameWnd);

245

246CRuntimeClass*CFrameWnd::GetRunimeClass()const

247

248{return &CFrameWnd::classCFrameWnd;}

注意对象构建函数为static函数。

为了支持动态创建需要在CRuntimeClass内添加两个函数:CreateObject和CRuntimeClass::Load成员函数。

249CObject *CRuntimeClass::CreateObject()

250

251{

252

253 If(m_pfnCreateObject==NULL)//不支持动态创建。

254

255 {

256

257throw runtime_error("此类不支持动态创建");

258

259 Return NULL;

260

261 }

262

263 CObject*pObject=(*m_pfnCreateObject)();

264

265 Return pObject;

266

267}

268

269CRuntimeClass*PASCL CRuntimeClass::Load()

软件英才网软件行业驰名招聘网站270

271{

272

273 Char szClassName[64];

274

275 CRuntimeClass*pClass

276

277 cout<<"输入一个类名:";

278

279 cin>>szClassName;

280

281for(pClass=pFirstClass;pClass;pClass=pClass->m_pNextClass)

282

283 {

284

285if(strcmp(szClassName,pClass->m_lpszClassName)==0)

286

287return pClass;

288

289return NULL;

290

291 }

292

293}

以下为类型识别及动态创建的完整代码:

294#include

295#include

296#include

297using namespace std;

298

299class CObject;

300class CRuntimeClass

301{

302public:

303char* m_lpszClassName;//对象所属类名

304int m_nObjectSize;//对象大小

软件英才网软件行业驰名招聘网站305int m_wSchema;//模式号

306 CObject*(PASCAL*m_pfnCreateObject)();//构建函数,抽象类为NULL

307 CRuntimeClass *m_pBaseClasss;//基类CRuntimeClass对象指针。

308static CRuntimeClass *pFirstClass;//链表头指针。static

309 CRuntimeClass *m_pNextClass;//下一指针。

310public:

311 CObject*CreateObject()

312 {

313if(m_pfnCreateObject==NULL)

314 {

315 cout<<"该类型不支持动态创建!!"<

316return NULL;

317 }

318 CObject*pClass=(*m_pfnCreateObject)();

319return pClass;

320 }

321static CRuntimeClass*Load()

322 {

323 cout<<"请输入要动态创建的类名:";

324 string s;

325 cin>>s;

326

for(CRuntimeClass*pClass=pFirstClass;pClass;pClass=pClass->m_pBaseClasss) 327 {

328if(pClass->m_lpszClassName==s)

329 {

330return pClass;

331 }

332 }

333return NULL;

334 }

335};

336

337class AFX_CLASSINIT

338{

339public:

340 AFX_CLASSINIT(CRuntimeClass*pNewClass)//构造函数

341 {

342 pNewClass->m_pNextClass=CRuntimeClass::pFirstClass;

343 CRuntimeClass::pFirstClass =pNewClass;

344 }

345 };

软件英才网软件行业驰名招聘网站

347/************************************************************************/

348/* 动态类型识别宏定义

349//与CRuntimeClass类中的构建函数相区别。此处的CreateObject函数在每个类中都以static成员函数存在,用以

350//初始化类型型录表,而CRuntimeClass中的CreateObject用于调用每个类的构建函数。仅仅是函数名相同罢了。*/

351/************************************************************************/

352

353#define DECLARE_DYNAMIC(class_name)\

354public:\

355static CRuntimeClass Class##class_name;\

356virtual CRuntimeClass*GetRuntimeClass()const;\

357

358

359#define DECLARE_DYNCREATE(class_name)\

360 DECLARE_DYNAMIC(class_name)\

361static CObject*PASCAL CreateObject();\

362

363#define RUNTIME_CLASS(class_name)\

364 (&class_name::Class##class_name)\

365

366#define _IMPLEMENT_RUNTIMECLASS(class_name,base_class_name,wSchema,pfnNew)\ 367class CRuntimeClass class_name::Class##class_name ={\

368 #class_name,\

369sizeof(class_name),wSchema,pfnNew,RUNTIME_CLASS(base_class_name),NULL};\ 370static AFX_CLASSINIT _init##class_name( RUNTIME_CLASS(class_name));\

371 CRuntimeClass *class_name::GetRuntimeClass()const\

372 {return&class_name::Class##class_name;}//此处将class_name写成了classname 花了一两天才查出来。啊啊啊啊啊。20120605

373

374

375#define IMPLEMENT_DYNAMIC(class_name,base_class_name)\

376 _IMPLEMENT_RUNTIMECLASS(class_name,base_class_name,0xFFFF,NULL)\

377

378#define IMPLEMENT_DYNCREATE(class_name,base_class_name)\

379 CObject*PASCAL class_name::CreateObject(){return new class_name;}\

380

_IMPLEMENT_RUNTIMECLASS(class_name,base_class_name,0xFFFF,class_name::CreateObje ct)\

381

382

383/************************************************************************/

384/* 对CObject特殊处理。 */

软件英才网软件行业驰名招聘网站385/************************************************************************/ 386class CObject

387{

388public:

389 CObject()

390 {

391//cout<<"CObject constructor!"<

392 }

393 ~CObject()

394 {

395//cout<<"CObject destructor!"<

396 }

397public:

398virtual CRuntimeClass*GetRuntimeClass();

399static CRuntimeClass ClassCObject;

400public:

401bool IsKindOf(CRuntimeClass*pClass)

402 {

403 CRuntimeClass *pThis=GetRuntimeClass();

404for(;pThis;pThis=pThis->m_pBaseClasss)

405 {

406if(pThis==pClass)

407 {

408return true;

409 }

410 }

411return false;

412 }

413};

414class CRuntimeClass CObject:: ClassCObject=

415{

416"CObject",sizeof(CObject),0xFFFF,NULL,NULL,NULL

417};

418static AFX_CLASSINIT _init_CObject(&CObject:: ClassCObject);

419CRuntimeClass *CObject::GetRuntimeClass()

420{

421return &CObject::ClassCObject;

422}

423CRuntimeClass*CRuntimeClass::pFirstClass=NULL;

424

425/************************************************************************/ 426/* */

软件英才网软件行业驰名招聘网站428class CCmdTarget:public CObject

429{

430 DECLARE_DYNCREATE(CCmdTarget)

431public:

432 CCmdTarget()

433 {

434//cout<<"CCmdTarget constructor!"<

435//CreateObject();

436 }

437 ~CCmdTarget()

438 {

439//cout<<"CCmdTarget destructor!"<

440 }

441

442};

443IMPLEMENT_DYNCREATE(CCmdTarget,CObject)

444

445

446 ;

447class CWnd:public CCmdTarget

448{

449 DECLARE_DYNCREATE(CWnd)

450public:

451 CWnd()

452 {

453//cout<<"CWnd constructor"<

454 }

455 ~CWnd()

456 {

457//cout<<"CWnd destructor"<

458 }

459public:

460virtual bool Create()

461 {

462 cout<<"CWnd::Create"<

463 CreateEx();

464return true;

465 }

466bool CreateEx()

467 {

468 cout<<"CWnd::CreateEx"<

469 PreCreateWindow();

软件英才网软件行业驰名招聘网站471 }

472virtual bool PreCreateWindow()

473 {

474 cout<<"CWnd::PreCreateWindow"<

475return true;

476 }

477};

478IMPLEMENT_DYNCREATE(CWnd,CCmdTarget)

479

480class CView :public CWnd

481{

482 DECLARE_DYNCREATE(CView)

483public:

484 CView()

485 {

486//cout<<"CView constructor"<

487

488 }

489 ~CView()

490 {

491//cout<<"CView destructor"<

492 }

493

494};

495IMPLEMENT_DYNCREATE(CView,CWnd)

496

497class CFrameWnd:public CWnd

498{

499 DECLARE_DYNCREATE(CFrameWnd)

500public:

501 CFrameWnd()

502 {

503//cout<<"CFrameWnd constructor"<

504

505 }

506 ~CFrameWnd()

507 {

508//cout<<"CFrameWnd destructor"<

509 }

510public:

511virtual bool Create()

512 {

软件英才网软件行业驰名招聘网站514 CreateEx();

515return true;

516 }

517virtual bool PreCreateWindow()

518 {

519 cout<<"CFrameWnd::PreCreateWindow"<

520return true;

521 }

522};

523IMPLEMENT_DYNCREATE(CFrameWnd,CWnd)

524

525class CWinThread:public CCmdTarget

526{

527public:

528 CWinThread()

529 {

530//cout<<"CWinThread constructor"<

531 }

532 ~CWinThread()

533 {

534//cout<<"CWinThread destructor"<

535 }

536public:

537virtual bool InitInstance()

538 {

539 cout<<"CWinThread::InitInstance"<

540return true;

541 }

542virtual bool Run()

543 {

544 cout<<"CWinThread::Run"<

545return true;

546 }

547};

548class CWinApp:public CWinThread

549{

550public:

551 CWinApp()

552 {

553//cout<<"CWinApp Constructor "<

554 m_currentApp=this;

555 }

软件英才网软件行业驰名招聘网站557 {

558//cout<<"CWinApp destructor "<

559 }

560virtual bool InitApplication()

561 {

562 cout<<"CWinApp::InitApplication"<

563return true;

564

565 }

566virtual bool InitInstance()

567 {

568 cout<<"CWinApp:InitInstance"<

569return true;

570 }

571virtual bool Run()

572 {

573 cout<<"CWinApp::Run"<

574return CWinThread::Run();

575 }

576public:

577 CWinApp*m_currentApp;

578 CFrameWnd*m_currentFrameWnd;

579};

580class CDocument:public CCmdTarget

581{

582public:

583 CDocument()

584 {

585//cout<<"CDocument constructor "<

586 }

587 ~CDocument()

588 {

589//cout<<"CDocunment destructor "<

590 }

591};

592class CMyFrameWnd:public CFrameWnd

593{

594 DECLARE_DYNCREATE(CMyFrameWnd)

595public:

596 CMyFrameWnd()

597 {

598//cout<<"CMyFrameWnd constructor "<

软件英才网软件行业驰名招聘网站600 }

601 ~CMyFrameWnd()

602 {

603//cout<<"CMyFrameWnd destructor "<

604 }

605};

606IMPLEMENT_DYNCREATE(CMyFrameWnd,CFrameWnd)

607

608class CMyWinApp:public CWinApp

609{

610public:

611 CMyWinApp()

612 {

613//cout<<"CMyWinApp constructor "<

614

615 }

616 ~CMyWinApp()

617 {

618//cout<<"CMyWinApp destructor "<

619 }

620public:

621bool InitInstance()

622 {

623 cout<<"CMyWinApp::InitInstance"<

624 m_currentFrameWnd=new CMyFrameWnd;

625return true;

626 }

627};

628

629CMyWinApp myApp;

630CWinApp*AfxGetApp()

631{

632return myApp.m_currentApp;

633}

634int main(int argc,char**argv)

635{

636 CWinApp *pApp=AfxGetApp();

637 pApp->InitApplication();

638 pApp->InitInstance();

639 pApp->Run();

640

641 CRuntimeClass *pClass;

智慧树知到《果树栽培学基础》章节测试答案

智慧树知到《果树栽培学基础》章节测试答案绪论 1、多数木本果树栽植后进入结果期一般需要几年 A:1~2年 B:3~5年 C:6~7年 D:8年以上 答案: 3~5年 2、我国有记载的果树栽培历史有() A:2000年以上 B:3000年以上 C:4000年以上 D:5000年以上 答案: 3000年以上 3、属于木本果树的树种有() A:苹果 B:桃 C:菠萝 D:梨 E:核桃 答案: 苹果,桃,梨,核桃 4、属于草本果树的树种有() A:葡萄 B:草莓 C:菠萝

D:树莓 E:香蕉 答案: 草莓,菠萝,香蕉 5、加工是我国果品的主要利用形式。 A:对 B:错 答案: 错 第一章 1、以下属于局部地区有一定栽培面积,有较大经济效益的果树树种是A:苹果 B:越橘 C:梨 D:葡萄 答案: 越橘 2、地型变化复杂,果树具有明显的重直分布特点的果树带是 A:热带常绿果树带 B:云贵高原常绿落叶果树混交带 C:温带落叶果树带 D:旱温落叶果树带 答案: 云贵高原常绿落叶果树混交带 3、目前对其果树情况了解较少,有待进一步考察与开发的果树带是A:耐寒落叶果树带 B:温带落叶果树带 C:青藏高寒落叶果树带 D:干寒落叶果树带

答案: 青藏高寒落叶果树带 4、不属于坚果类的果树是 A:板栗 B:核桃 C:桃 D:阿月浑子 答案: 桃 5、落叶果树种类多、数量大,是我国苹果和梨的最大生产基地的果树带是 A:干寒落叶果树带 B:旱温落叶果树带 C:温带落叶果树带 D:耐寒落叶果树带 答案: 温带落叶果树带 6、根据植株形态特征进行分类,果树可分为乔木果树、灌木果树、藤本果树、草本果树和常绿果树。 A:对 B:错 答案: 错 7、耐寒落叶果树带可种植中小苹果。 A:对 B:错 答案: 对 8、葡萄属于仁果类的果树。 A:对 B:错 答案: 错

关于单文档多视与MFC的初始化过程

单文档多视的实现 多视图是VC开发中经常要用到的技术之一,一般地实现单文档多视图有两种方式1)通过视图分割的技术(使用CSplitterWnd实现),将窗口分割为多个部分,每个部分显示各自显示不同的视图,这种技术实现起来比较简单,并且相关的资料也很多。2)通过一个文档关联多个视图,窗口显示整个视图。第二种实现较第一种复杂,这里给出详细的实现方法。 Step 1:使用VC 6.0新建一个Project,命名为:MultiView。除选择单文档属性外,一切使用“默认”方式。于是你可以获得五个类:CMainFrame,CMultiViewApp,CMultiViewDoc,CMultiViewView,和CAboutDlg; Step 2:新建一个新的视图View,添加一个新的MFC Class(Insert->New Class),基类为CView(或者CView的派生子类,如CEditView等)。类的名字为CAnotherView,这就是新的视图;并为CAnotherView添加GetDocument 个子菜单“视图一”和“视图二”,添加相应函数: (void CMultiViewApp::OnShowFirstview()和 void CMultiViewApp::OnShowSecondview()); 注意这里将菜单消息的响应都放在app对象里面,而不是放到MainFrame对象中进行。 Step 4:创建新的视图:在BOOL CMultiViewApp::InitInstance()中添加

Step 5:现在已经创建了视图,并且都和文档关联起来了。现在要作的就是视图间的转换。在void CMultiViewApp::OnShowFirstview()中添加实现代

优秀雇员必备六大关键技能

Why do I need Key Skills? 为什么我需要关键技能? Key Skills are basic skills that affect everything else you do - they can help you achieve higher grades and do better at work. Because employers, colleges and universities value Key Skills, they can help you get into the job or course you want. Key Skills widen your job choice now and they’ll give you flexibility in job and career moves throughout your life. They’re even pretty useful in your personal life! 关键技能是能影响到你做其它事情的基本技能——它们能帮助你获得更好的成绩,也可以使你在工作中有更好的表现。因为雇主、高等院校都重视关键技能,所以它们能帮助你获得你想要的工作或是希望学习的课程。关键技能还可以拓宽你的职业选择,并且使你在一生的工作和事业发展中更具灵活性。它们甚至对你的个人生活也是很有帮助的! The six key skills are 六大关键技能是 communication 交流 information technology 信息技术 application of number 数字应用 improving own learning and performance 提高知识水平和自身表现 problem solving 解决问题 working with others 与他人一起工作 COMMUNICATION交流 Communication is about using your speaking, writing, listening and reading skills effectively for different tasks. You should be able to understand information and give a proper spoken or written response. 交流是指有效运用言谈、书写、倾听及阅读来完成各种任务。你应该能理解信息,然后做出适当的口头或书面回应。 Examples of communication skills: 交流技能的例子 summarizing information 概括信息

mfc资料

你创建的是一个对话框程序,所以只有CMyApp 和CMyDlg 两个类。 但如果创建的是个单文档或者多文档程序。那么就有5个类。 程序是按顺序执行的,虽然都被封装成了类对象,看起来模块话,其实还是按顺序执行的,APP这个对象那个先于dlg构建。所以很多需要初始化的东西直接在App的成员initInstance 中编写。dlg中编写的基本都是一些与对话框相关的逻辑。 CMyApp是主线程类。他的InitInstance函数中会用CMyDlg构造一个对象,产生主对话框,CMyDlg是对话框类的一个派生类。两个类功能不同。 MFC的东西很复杂,不是三言两语可以说清楚的,可以参考下深入浅出mfc等书。CMyApp负责程序主框架的工作,可以理解为WinMain的封装。 CMyDlg是主对话框了,负责界面显示,消息循环等。 ------解决方案-------------------- CMyApp派生于CWinApp类,CMyDlg派生于CDialog类 程序运行时先执行CMyApp的InitInstance()函数 在InitInstance()中会有这样的代码 CMyDlg dlg; m_pMainWnd = &dlg; int nResponse = dlg.DoModal(); 一个最基本的单文档视图的MFC程序,包含CxxApp、CxxDoc、CMainFrame、CxxView和CAboutDlg五个类。 它们在程序开始运行时被创建的顺序是:CxxApp 、CxxDoc 、CMainFrame 、CxxView 、CAboutDlg 。

C**App()定义了窗体加载之前需要做的预处理。比如一个加密的软件,打 开后提示用户输入密码。这个事件的处理程序就要写在C**App()的 InitInstance(中。 CMainFrame()包含了对工具栏、状态栏、窗口的定义。 C**View包含了最主要的处理功能,如菜单操作、快捷键、用户交互操作等。 CAboutDlg定义了ABOUT对话框。 其中,前四个都是在程序主窗口出现之前被创建的,CAboutDlg是在“关于”对话框弹出 时被创建的 1CAboutDlg //这个是关于对话框里面是构造和析构2CMainFrame //主框架`是在窗口生成之前准备工作全在这吗 ?3CTestApp//这个是什么`initlnstance()在这里也是初始化什 么对象 ? 4CTestDoc//这是文档`是管理哪些文档`对初学者来说很少用 呐 ?5CTestView视图`这个常用 OnDraw我了解一些`我想知道`是不是默认就调 用一次 ? 还有个问题啊`我想加个音乐`虽然加成功了`但是`我一直不明白加在哪个函数里 `运行就有音乐?看过孙鑫的教程后来忘了`各位高手各抒已见,互相学习 LZ需要系统地学习一下。 CTestApp是基于WinApp的,WinApp封装了程序的主入口WinMain,WinMain就和c语言的main函数地位一样,是Win32程序的入口。在MFC的封装中,一个程序启动,Windows调用WinMain,这个WinMain函数现在由MFC事先写好藏好了,你不能也不需要修改,在这个预定义的WinMain里面会调用CWinApp的InitInstrance函数。你仔细看你CTestApp::InitInstrance函数,在这里一个CMainFrame的对象被创建,文档模板被创建,主窗口通过ShowWindow(SW_SHOW)被显示出来。 CMainFrame是个框架,是你整个应用程序的主窗口,他负责管理应用程序的菜单,工具栏,状态栏等。中间的区域,成为客户区,由View类来管理,View类也是一个窗口,他是MainFrame的子窗口。OnDraw函数负责绘制客户区的内容,该函数会被多次调用,他可以被你自己调用,比如你调用View类的UpdateWindow,或者在Document类中调用UpdateAllViews等等,MFC自动会调用OnDraw。他还会被Windows调用,Windows在需要刷新窗口的时候发送给窗口WM_PAINT消息,MFC事先已经预定义了,在响应WM_PAINT消息的时候会调用OnDraw。何时Windows会发送WM_PAINT呢,比如窗口从最小化还原,比如窗口被用户改变了 大小等等。这部分内容最好看看Windows GDI,Windows GDI是Windows操作系统整个可视化界面的基础。

香蕉种植解决方案及用肥推荐

香蕉种植解决方案及用肥推荐 一、香蕉(主要种植地区、面积、历史等) 1.1香蕉主要种植地区 香蕉为芭蕉科植物甘蕉的果实。中国香蕉主要分布在广东、广西、福建、台湾、云南和海南,贵州、四川、重庆也有少量栽培。广东以湛江、茂名、中山、东莞、广州、惠州、潮州为主。产区;广西以灵山、浦北、玉林、南宁、钦州为主产区,福建主要集中在漳浦、平和、南靖、长泰等地。海南的香蕉主要聚集在儋州、澄迈、三亚、东方等地,其中产量最多东方。 1.2香蕉种植面积 2010年开始中国香蕉种植面积增长5%至10%,现达到530万亩左右,总产量850万吨以上。 1.3香蕉种植历史 我国南部是香蕉原产地之一,有二千年以的栽培历史。据古籍记载,汉武帝元鼎六年(公元前面111年)破南越建扶荔宫,以植所得奇花异木,有甘蕉二本(一作十二本)。 可知在公元前一百多年,广东已有香蕉栽培。 2、两广地区主要品种: 我国香蕉优良品种繁多,依其假茎高矮可分为高型、中型和矮型三大品种群。适于广东、广西栽培的良种有如下几种: 矮脚顿地雷:原产于广东高州县,属于中型种。植株生长粗壮,茎高230-250厘米,干周70-85厘米,上下大小近乎一致,鞘色青绿而带褐斑。叶柄粗短,叶罗直立,叶尖平齐,色浓绿,鞘距较密。果轴较细,较短,果梳距中等。单果较粗大,丰产性能好,品质较好。抗寒性较强,霜冻后恢复快,抗风力较强。 矮香蕉:包括广东矮香蕉、福建天宝矮脚蕉及广西矮香蕉。假茎高150-170厘米,叶柄较短,仅15-32厘米,叶距较密。果穗较短,单果多,果细短,果梳距密。抗风力强,耐瘠瘦,利于密植,易管理,产量也较高。 二、主要栽培技术 2.1丰产指标: 香蕉是我国最大宗的热带果树之一。农业产业结构调整以来,我国水果产业化不断发展,通过近几年来香蕉组培苗的推广应用,香蕉适应性强、产量高、生产周期短、栽培后一年左右即可收果,管理得好,可连续多年收获。一般亩产3000公斤左右。 2.2种植地与小苗的挑选和处理: 一般是肥田宜疏,瘦田宜密。因土层深厚、土壤肥沃的蕉园,植株生长很快,干粗叶大,栽植密度高了,容易封行,应采用多造蕉留芽或单株留双芽的形式来啬单位面积的收获株数。土质瘦瘠的蕉园,香蕉生长慢,株型瘦弱,结果较迟,提高单株产是潜力受限制,应从啬株数来提高单位面积产量,所以宜采用密植或丛植的形式栽种。在阳光充足的土地或一般土质的蕉园种植,由于地面水分蒸发量大,容易形成局部气候的剧烈变化,对香蕉的生长不利,因引也应采取丛植形式栽种,才能获得增产。 2.3整地与种植密度: 选好园地后,应进行全园深翻一次,晒白一个月以上。以使土壤疏松有利于养分释放。还要清除前作残留物,除虫及土壤消毒,保证园地免疫。有条件可进行客土改良土壤,沙质土掺黏土,黏质土掺沙,瘦瘠土地施足基肥、掺塘泥,或挖0.6米见方的植穴,施足基肥。

5G的基本特点与关键技术

5G的基本特点与关键技术 第五代移动通信技术(5G)是目前移动通信技术发展的最高峰,也是人类希望不仅改变生活,更要改变社会的重要力量。 5G是在4G基础上,对于移动通信提出更高的要求,它不仅在速度而且还在功耗、时延等多个方面有了全新的提升。由此业务也会有巨大提升,互联网的发展也将从移动互联网进入智能互联网时代。 5G的三大场景 国际标准化组织3GPP定义了5G的三大场景。其中,eMBB指3D/超高清视频等大流量移动宽带业务,mMTC指大规模物联网业务,URLLC指如无人驾驶、工业自动化等需要低时延、高可靠连接的业务。 通过3GPP的三大场景定义我们可以看出,对于5G,世界通信业的普遍看法是它不仅应具备高速度,还应满足低时延这样更高的要求,尽管高速度依然是它的一个组成部分。从1G到4G,移动通信的核心是人与人之间的通信,个人的通信是移动通信的核心业务。但是5G的通信不仅仅是人的通信,而且是物联网、工业自动化、无人驾驶等业务被引入,通信从人与人之间通信,开始转向人与物的通

信,直至机器与机器之间的通信。 5G的三大场景显然对通信提出了更高的要求,不仅要解决一直需要解决的速度问题,把更高的速率提供给用户;而且对功耗、时延等提出了更高的要求,一些方面已经完全超出了我们对传统通信的理解,把更多的应用能力整合到5G中。这就对通信技术提出了更高要求。在这三大场景下,5G具有6大基本特点。 5G的六大基本特点 高速度 相对于4G,5G要解决的第一个问题就是高速度。网络速度提升,用户体验与感受才会有较大提高,网络才能面对VR/超高清业务时不受限制,对网络速度要求很高的业务才能被广泛推广和使用。因此,5G第一个特点就定义了速度的提升。 其实和每一代通信技术一样,确切说5G的速度到底是多少是很难的,一方面峰值速度和用户的实际体验速度不一样,不同的技术不同的时期速率也会不同。对于5G的基站峰值要求不低于20Gb/s,当然这个速度是峰值速度,不是每一个用户的体验。随着新技术使用,这个速度还有提升的空间。 这样一个速度,意味着用户可以每秒钟下载一部高清电影,也可能支持VR视频。这样的高速度给未来对速度有

MFC如何在文档(CXXXDoc)类或框架(CMainFrame)类中获得视类(CMyView

MFC如何在文档(CXXXDoc)类或框架(CMainFrame)类中获得视类(CMyView)指针 在文档类中只要使用(多文档的,单文档的更简单一点儿) POSITION pos=this->GetFirstViewPosition();//要写在文档类中,在其他类中把this换成文档指针就可以了 while(pos) { CView *pView=this->GetNextView(pos); } 而在框架类中只要选取得文档对象,然后再使用上面的代码 以下是从一个对象得到另一个对象有方面(摘自MFC深入浅出) 从一个对象得到另一个对象的方法 本对象要得到的对象使用的成员函数 CDocument对象视列表 GetFirstViewPosition,GetNextView 文档模板 GetDocTemplate CView 对象文档对象 GetDocument 边框窗口 GetParentFrame CMDIChildWnd或 CFrameWnd 对象活动视 GetActiveView 活动视的文档 GetActiveDocument CMDIFrameWnd对象活动文档边框窗口 MDIGetActive 在框架类中使用 GetActiveView(); 在文档类中(CMainFrame*)(AfxGetApp()->m_pMainWnd))->GetActiveView(); MFC中怎么在CMainFrame下获得View类的指针 使用GetActiveView()函数 MFC中普通类如何获取view类的指针? 在普通类(Generic class)中怎么得到view类的指针?我试过这样: CMainFrame *p=(CMainFrame*)AfxGetMainWnd(); CView *pv=p->GetActiveView(); 按照你的用法应该就是可以的! 是不是在这样用时,View还没有创建完成啊,所以pv才是空的。 CMainFrame *m_pfm = (CMainFrame*)AfxGetApp()->m_pMainWnd; ...*m_pView = (...*)m_pfm->GetActiveView(); 少一句:AfxGetApp() CMainFrame *p=(CMainFrame*)AfxGetApp()->m_pMainWnd;

c面向对象程序设计MFC简单计算器实验报告

计算机与信息工程学院 《程序设计基础》课程设计报告 题目名称:60.编写一个能实现简单功能的计算器学生姓名:刘沛东 学生学号:2011508154 专业班级:电子信息工程(1)班 指导教师:高攀

1 课程设计的题目 编写一个能实现简单功能的计算器 2 题目要求 1. 有一个计算器图形。 2. 能实现加、减、乘、除及乘方的运算。 3. 当输入题目时,屏幕上要在指定位置上显示出相应的题目内容,且相应的数字键要改变颜色 例如:输入数字1 时,在计算器图形上的1键变为红色。 4. 屏幕、图形颜色、形状自定 3 总体设计 3.1 总体框架 图1 系统框架

3.2 系统功能说明 在VC++6.0中绘制计算器界面,各控件的设置 对0~9控件设定相应的ID和其他属性: 图2 “1”控件设置 对“+、-、*、\”控件设定相应的ID和其他属性: 图2 “+”控件设置 对其它控件设定相应的ID和其他属性: 图3 其它控件设置

主要使用到Layout菜单中的Align功能对各个按钮进行对其,使界面更加整洁。拖出的控件有上面的一个Edit控件用于显示数字,Button控件用于处理鼠标的消息。 4 程序详细设计 4.1系统主调模块 图5 程序流程图

4.2各模块详细设计 4.2.1 建立的变量,控件的命名,对应的消息处理函数对应表 double poz; //保存小数点的位置,初始化为1,表示poz-1个小数点。 double m_Dis; //Edit控件上需要显示的数字 BOOL point_flag; //小数点表示位,判定是否是小数,是小数为1,不是小数为0。 double numfirst; //保存计算过程中的前一个数字, double numsecond;//保存计算过程中的第二个数字 char op;//记录当前的计算符号,可以为’+’,’-’,’*’,’/’,’=’,’c’,’n’ 变量初始化: poz=1; m_Dis = 0.0; numfirst=0; numsecond=0; op=0;

详解5G的六大关键技术

详解5G的六大关键技术 2013年12月,第四代移动通信(4G)牌照发放,4G技术正式走向商用。与此同时,面向下一代移动通信需求的第五代移动通信(5G)的研发也早已在世界范围内如火如荼地展开。5G研发的进程如何,在研发过程中会遇到哪些问题本版将从即日起陆续刊发“5G发展系列报道”,敬请关注。 在移动通信的演进历程中,我国依次经历了“2G跟踪,3G突破,4G同步”的各个阶段。在5G时代,我国立志于占据技术制高点,全面发力5G相关工作。组织成立IMT-2020(5G)推进组,推动重大专项“新一代宽带无线移动通信网”向5G转变,启动“5G系统前期研究开发”等,从5G业务、频率、无线传输与组网技术、评估测试验证技术、标准化及知识产权等各个方面,探究5G的发展愿景。 在5G研发刚起步的情况下,如何建立一套全面的5G关键技术评估指标体系和评估方法,实现客观有效的第三方评估,服务技术与资源管理的发展需要,同样是当前5G技术发展所面临的重要问题。 作为国家无线电管理技术机构,国家无线电监测中心(以下简称监测中心)正积极参与到5G相关的组织与研究项目中。目前,监测中心频谱工程实验室正在大力建设基于面向服务的架构(SOA)的开放式电磁兼容分析测试平台,实现大规模软件、硬件及高性能测试仪器仪表的集成与应用,将为无线电管理机构、科研院所及业界相关单位等提供良好的无线电系统研究、开发与验证实验环境。面向5G关键技术评估工作,监测中心计划利用该平台搭建5G系统测试与验证环境,从而实现对5G各项关键技术客观高效的评估。 为充分把握5G技术命脉,确保与时俱进,监测中心积极投入到5G关键技术的跟踪梳理与研究工作当中,为5G频率规划、监测以及关键技术评估测试验证等工作提前进行技术储备。下面对其中一些关键技术进行简要剖析和解读。 关键技术1:高频段传输 移动通信传统工作频段主要集中在3GHz以下,这使得频谱资源十分拥挤,而在高频段(如毫米波、厘米波频段)可用频谱资源丰富,能够有效缓解频谱资源紧张的现状,可以实现极高速短距离通信,支持5G 容量和传输速率等方面的需求。 高频段在移动通信中的应用是未来的发展趋势,业界对此高度关注。足够量的可用带宽、小型化的天线和设备、较高的天线增益是高频段毫米波移动通信的主要优点,但也存在传输距离短、穿透和绕射能力差、容易受气候环境影响等缺点。射频器件、系统设计等方面的问题也有待进一步研究和解决。 监测中心目前正在积极开展高频段需求研究以及潜在候选频段的遴选工作。高频段资源虽然目前较为丰富,但是仍需要进行科学规划,统筹兼顾,从而使宝贵的频谱资源得到最优配置。 关键技术2:新型多天线传输 多天线技术经历了从无源到有源,从二维(2D)到三维(3D),从高阶MIMO到大规模阵列的发展,将有望

香蕉深加工关键技术研究

香蕉深加工关键技术研究 摘要 香蕉是世界第四大水果,产量高,营养丰富,保健功能特别突出,除了能促进肠蠕动,防止便秘外,还有抗氧化、降血脂、降血压、降血糖、防止动脉硬化等功能,2005年被誉为“新水果之王”。但香蕉加工特性及加工技术研究不多,水平很低。严重影响了香蕉的深加工和综合利用。 本文以香蕉的三个主要品种巴西蕉、粉蕉、大蕉为试验材料,全面研究了香蕉的护色、加工特性,重点对香蕉淀粉的理化指标及其特性进行了较为深入的研究。研究发现酶促褐变是香蕉褐变的主要原因;对香蕉打浆护色的不同条件(温度和O2)进行了系统研究,研究护色剂在香蕉加工过程中的护色效果,对护色条件进行了优化;探讨了液氮对香蕉打浆过程的影响规律,得到了适宜的打浆护色方法;初步研究了香蕉淀粉提取工艺,并对工艺参数进行了优化;采用微波灭酶、超高压杀菌生产香蕉汁的工艺研究和探讨了香蕉挤压膨化的制备工艺。主要结果如下: 1. 香蕉淀粉的特性 主要研究了香蕉淀粉颗粒的大小、偏光十字、x-衍射图谱和晶结构,测定了香蕉淀粉糊的透光率、凝沉性、冻融性等性质。结果表明:香蕉淀粉糊透光率低、冻融性差、凝沉好。香蕉淀粉糊的粘度随着pH值的升高而增加,食盐和蔗糖有利于提高其粘度。香蕉(大蕉、粉蕉、巴西蕉)淀粉中直链淀粉平均含量分别为20.14%、26.25%、14.21%(干基);香蕉(巴西蕉、淀粉、大蕉)淀粉的初始糊化温度分别为68℃、66.9℃、67.9℃,较马铃薯淀粉糊化温度低;香蕉淀粉糊的粘度热稳定性、凝胶性和凝沉性均高于马铃薯淀粉;但香蕉淀粉糊的冷粘度稳定性、透明度和冻融稳定性均低于马铃薯淀粉糊;香蕉淀粉糊冻融稳定性与玉米淀粉糊相当。 2. 香蕉浆的护色研究 褐变是香蕉加工的首要难题,酶促褐变是导致香蕉皮褐变的主要因素。研究发现香蕉PPO的最适温度为20~35℃,30℃时酶活力最大,低于20℃酶活力较低,高于40℃开始被逐渐钝化。POD的最适温度为35~45℃之间,在40℃酶活力最大,同PPO趋势一样,温度过高或过低,酶活都会受到抑制。研究发现POD 比PPO更耐热,所以在香蕉加工过程中应以POD失活作为香蕉钝酶充分的标志。 采用二次旋转回归的方法,研究了香蕉浆灭酶过程中通过添加护色剂亚硫酸氢钠进行护色的工艺,得到最佳护色的条件为:微波灭酶时间80s、加1.5倍的

5G的基本特点与关键技术

5G的基本特点与关键技术 第五代移动通信技术(5G)是目前移动通信技术发展的最高峰,也是人类希望不仅改变生活,更要改变社会的重要力量。 5G是在4G基础上,对于移动通信提出更高的要求,它不仅在速度而且还在功耗、时延等多个方面有了全新的提升。由此业务也会有巨大提升,互联网的发展也将从移动互联网进入智能互联网时代。 5G的三大场景 国际标准化组织3GPP定义了5G的三大场景。其中,eMBB指3D/超高清视频等大流量移动宽带业务,mMTC指大规模物联网业务,URLLC指如无人驾驶、工业自动化等需要 低时延、高可靠连接的业务。 通过3GPP的三大场景定义我们可以看出,对于5G,世界通信业的普遍看法是它不仅应具备高速度,还应满足低时延这样更高的要求,尽管高速度依然是它的一个组成部分。从1G到4G,移动通信的核心是人与人之间的通信,个人的通信是移动通信的核心业务。但是5G的通信不仅仅是人的 通信,而且是物联网、工业自动化、无人驾驶等业务被引入,通信从人与人之间通信,开始转向人与物的通信,直至机器

与机器之间的通信。 5G的三大场景显然对通信提出了更高的要求,不仅要解决一直需要解决的速度问题,把更高的速率提供给用户;而且对功耗、时延等提出了更高的要求,一些方面已经完全超出了我们对传统通信的理解,把更多的应用能力整合到5G 中。这就对通信技术提出了更高要求。在这三大场景下,5G 具有6大基本特点。 5G的六大基本特点 高速度 相对于4G,5G要解决的第一个问题就是高速度。网络速度提升,用户体验与感受才会有较大提高,网络才能面对VR/超高清业务时不受限制,对网络速度要求很高的业务才能被广泛推广和使用。因此,5G第一个特点就定义了速度的提升。 其实和每一代通信技术一样,确切说5G的速度到底是多少是很难的,一方面峰值速度和用户的实际体验速度不一样,不同的技术不同的时期速率也会不同。对于5G的基站峰值要求不低于20Gb/s,当然这个速度是峰值速度,不是每一个用户的体验。随着新技术使用,这个速度还有提升的空间。 这样一个速度,意味着用户可以每秒钟下载一部高清电影,也可能支持VR视频。这样的高速度给未来对速度有很

MFC程序的启动过程与相关函数的执行顺序

MFC程序的启动过程与相关函数的执行顺序 1、创建Application object对象theApp 程序一开始生产一个(且只有一个)Application object对象theApp,也即一个CWinApp 对象,这个全局对象一产生,便执行其构造函数,因为并没有定义CMyWinApp构造函数,所以即执行CWinApp类的构造函数。该函数定义于APPCORE.CPP第75行,你可以自己搜出来啃一啃,因此,CWinApp之中的成员变量将因为theApp这个全局对象的诞生而获得配置与初值。 2、WinMain登场 用SDK编程序时,程序的入口点是WinMain函数,而在MFC程序里我们并没有看到WinMain函数,哦!~ 原来她是被隐藏在MFC代码里面了。当theApp配置完成后,WinMain 登场,慢!细看程序,并没连到WinMain函数的代码啊!这个我也不知道,MFC早已准备好并由链接器直接加到应用程序代码中了,原来她在APPMODUL.CPP里面,好,我们就认为当theApp配置完成后,程序就转到APPMODUL.CPP来了。那执行什么呢?看看下面从APPMODUL.CPP摘出来的代码: extern "C" int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { // call shared/exported WinMain return AfxWinMain(hInstance, hPrevInstance, lpCmdLine, nCmdShow); } _tWinMain函数的“_t”是为了支持Unicode而准备的一个宏。 _tWinMain函数返回值是AfxWinMain函数的返回值,AfxWinMain函数定义于WINMAIN.CPP第21行,稍加整理,去芜存菁,就可以看到这个“程序进入点”主要做些什么事: int AFXAPI AfxWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { int nReturnCode = -1; CWinApp* pApp = AfxGetApp(); AfxWinInit(hInstance, hPrevInstance, lpCmdLine, nCmdShow); pApp->InitApplication(); pApp->InitInstance() nReturnCode = pApp->Run();

香蕉产业化关键技术创新与产业升级

成果附件 项目名称:香蕉新品种选育及产业升级关键技术创新与集成应用 项目简介:香蕉是世界贸易的大宗水果,在鲜果贸易中排名第一。我国是香蕉生 产大国,也是消费大国,消费量在全球排名第一。香蕉栽培品种是三倍体,无法 进行杂交育种,导致高产优质主栽品种缺乏,同时还存在种苗繁殖效率低、生产 技术落后等瓶颈问题。因此,中国热带农业科学院组织国内相关科研单位及企业,在科技项目支持下,开展跨部门跨领域的联合科技攻关,历经20多年,取得了 一批重要科技成果,研究成果得到大规模产业化应用,有力地促进了我国香蕉产 业科技进步和产业升级。主要创新性成果如下: 创新点1.创新利用收集的种质资源,选育出桂蕉6号、巴西蕉2个香蕉主栽品 种和广粉1号等6个特色品种,推广面积占全国香蕉种植面积80%,显著提高我 国香蕉产业的良种覆盖率。创新利用收集的302份核心种质资源,其中引自澳 大利亚的GB6-3和Nanicao两份种质材料, 经过多代组培纯化和连续继代诱变 培养,选育出桂蕉6 号和巴西蕉两个优良的主栽品种,平均产量分别比威廉斯 品种高14.3%和12.9%,推广面积占全国75%;从核心种质资源中选育出6 个特 色新品种,推广面积约占全国5%,其中广粉1号和金粉1 号占全国粉蕉面积90%。 创新点2:国内首创了香蕉组培苗“袋培养”、“暗培养”和病毒检测三项核心 技术,优化组培快繁技术及生产工艺流程,提高种苗繁殖效率2000 倍,构建国际 领先的香蕉组培苗繁育技术体系,培育并形成了独具特色的香蕉生物技术产业, 建成世界最大的组培苗生产基地,占全国组培苗市场70%。袋培养技术简化了组 培苗生产全过程,使各生产环节效率倍增;暗培养技术采用自然弱光,使空间利 用率提高3 倍,省电约0.01度/株;组培苗病毒检测技术及时淘汰带病毒的组培 快繁种芽,使发病率由92.5%降至1%以下;通过种芽遴选、培养基配方优化、 增殖代数限制、培养温度调控、变异芽和变异苗筛除等技术的研发与应用,优化 组培快繁技术及生产工艺流程,提高质量。 创新点3. 研发了香蕉防寒关键技术,实现香蕉种植区域北移,研发病虫害防 控、高效施肥、果实养护和保鲜贮运核心技术,并集成无伤采收等配套技术,创 建香蕉标准化生产技术体系,使国产蕉自给率达到96%。抗寒技术使冬季寒害发 生时,寒害发生率由96%降至5.7%,促进植蕉区安全北扩,收获期提早60-65 天;高效施肥技术实现节水40%,节省劳力40%,节省化肥48公斤/亩;保鲜 贮运技术延长保鲜期40天,延长货架期3 天,减少采后损失25%;果实养护技 术和无伤采收技术显著改善香蕉品质,减少损伤,节省劳力,使优质果率提高 到90%。 选育的新品种累计推广7419万亩,占我国香蕉面积80%;建成世界最大的 香蕉组培苗生产基地,累计推广组培苗24 亿株,市场占有率70%,并远销东盟 多国;建立了全产业链香蕉标准化生产技术体系,使全国香蕉种植面积由1995 年的307万亩发展到2015年的646万亩,单产从980公斤/亩提高到2248 公斤/

MFC聊天系统设计报告

客户/服务器模式下的网络聊天系统的设计与实现 摘要: 计算机网络技术发展至今已经大大超越了人们当初的预想,无论是人们日常的工作还是学习,我们都越来越多的依靠到互联网。各种实时性的聊天娱乐软件也同时诞生,而且为我们的即时通讯带来了众多的方便,比如说大家所熟知的腾讯QQ、微软的MSN、移动的Fetion等,都是做的比较成功的实时聊天工具。随着网络的日益普及,各种聊天工具也层出不穷,我们这一次的课程设计就是针对一个简单的网络聊天程序,利用MFC为开发工具,实现基本的通讯功能。在课程设计中,系统开发平台为Windows7,程序设计设计语言采用Visual C++。 关键字:聊天软件;网络通讯;MFC;课程设计;Visual C++ 第一章引言 近年来,随着全球信息化技术的发展,聊天软件也得到了快速的发展,而且规模越来越大,功能也越来越强。即时聊天软件使人们的沟通突破了时空和级别的界限,使陌生人之间的沟通突破了环境界限,使自我与外界的沟通突破心理界限。聊天软件的广泛应用,已经不仅仅是一种技术工具,它成为了人们交流的一种重要方式,并构建起一种新的社会关系。目前的聊天软件—般采用UDP或者TCP协议体系来实现,开发技术已经比较成熟。本文在VC开发环境下设计和实现了一种聊天软件,可以实现在线用户的即时聊天和文件传输功能。 第二章设计依据及框图 2.1 设计平台 本课程采用Visual C++6.0平台编程。MFC,微软基础类(Microsoft Foundation Classes),实际上是微软提供的,用于在C++环境下编写应用程序的一个框架和引擎。应用程序向导通过创建和继承MFC库的基本类以及派生出的新类生成一个应用软件。MFC类是一组预先定义的C++。应用程序向导通过创建和继承MFC库的基本类以及派生出的新类生成一个应用

mfc各种类

1 必备基础知识概述 1.1 MFC 文档视图结构程序结构总揽 当我们使用MFC AppWizard 生成一个MFC 程序,选用所有默认的设置(当然也是Multiple Documents ,本文讨论主要基于Multiple Documents ,对于Single Document 情况仅以简单表述提及,皆因后者和前者很多相似相同之处,但前者更为复杂,并且更加常用。),假设你的程序名称为A ,则你会得到CMainFrame 、CChildFrame 、CAboutDlg 、CADoc 、CAView 、CAApp 6 个类(Single Document 仅少一个 CChildFrame 类,其余均同)。这些类的具体含义将在后面给出,这里先要给出一个MFC 支持文档视图结构程序(以下简称App )的主要组成: u 一个App (对应类CAApp )可以包含多个文档模版(CDocTemplate ),但是MFC AppWizard (无论是SDI 还是MDI )都只是默认生成一个。但是在实际开发中一个文档模版不够,需要自己手工添加(在后面实际项目例子提供示例)。这个结构是通过MFC 中CWinApp 的成员变量CDocManager* m_pDocManager 实现的,我们的CAApp 正是继承自MFC 提供的 CWinApp 类。 u CDocManager 类则拥有一个指针链表CPtrList m_templateList 来维护这些文档模版。这些文档模版都是在CAApp ::InitInstance ()中通过 AddDocTemplate(pDocTemplate) 。 u CDocTemplate 拥有3 个成员变量,分别保存着Document 、View 、Frame 的CRuntimeClass 指针,另外持有成员变量m_nIDResource ,用来指定这个Document 显示时候采用的菜单资源。这 4 份数据都在 CAApp ::InitInstance ()中CDocTemplate 的构造函数中指定。在Document 中拥有一个回指CDocTemplate 的指针 (m_pDocTemplate )。 u 一个文档可以有多个视图,由Document 中成员变量CPtrList m_ViewList 维护。 u CFrameWnd 拥有一个成员变量CView* m_pActiveView 指向当前活动的View 。

香蕉标准化栽培技术

香蕉标准化栽培技术 主讲:李仲科

标准化栽培的必要性 为提升香蕉的质量安全水平,并与国际市场接轨,香蕉产业必须积极开展设施栽培。实施标准化栽培,是香蕉产业的一个主攻方向,对于调整优化香蕉产业种植结构,突破国际绿色壁垒和技术壁垒,确保产品质量达到国际市场准入要求,提高市场竞争力,促进产业增效、农民增收具有重要的作用。

香蕉标准化生产的显著特点就是病虫害防治这一关键措施,要求减少农药残留,将有毒有害物质控制在规定的范围内。 进行病虫害防治时不能用高毒、高残留农药,少用化学农药,提倡农业防治和生物防治,贯彻“预防为主,综合防治”的植保方针,改善生态环境,加强栽培管理,增强植株抗病能力。在病虫害防治过程中,优先采用农业防治、生物防治和物理防治措施,并通过轮作、果实套袋等,减少病虫为害。

一、香蕉介绍 香蕉,芭蕉科芭蕉属植物,又指其果实。热带地区广泛栽培食用。植株丛生,具匐匍茎,矮型的高3.5米以下,一般高不及2米,高型的高4~5米,假茎均浓绿而带黑斑,被白粉,尤以上部为多。催熟后,果皮则由青变为黄色,果肉松软,黄白色,味甜,无种子,香味特浓。生育期10~15个月,株产一般在40~60斤。 玉林适宜种植的香蕉品种有:威廉斯、巴西、桂蕉1号等。

桂蕉1号 从威廉斯香蕉芽变单株选育而成。中秆香蕉,全生育期约12个月。假茎高度2.4m~3.0m,基茎围70cm~90cm;果穗长 90cm~130cm,每穗果指7~14梳,每梳果指数16~38条,果 指长24cm~30cm,果皮厚0.35cm~0.48cm,每500g平均3~4条果指;果指微弯,果指排列紧凑,果梳排列整齐,果形美观,成熟后果色金黄色,甜度适中,香味浓,品质好。

MFC课程设计报告-贪吃蛇

MFC课程设计报告 MFC实现贪食蛇小游戏 1.需求分析,系统功能 贪吃蛇游戏需求分析 贪吃蛇游戏作为一款经典小游戏,版本多样,娱乐性也很高,适合在闲暇时放松心神。并且可在多个平台上实现,程序简单易懂,非常适合MFC初学者学习制作。 贪吃蛇游戏功能介绍 一条蛇在密闭的围墙内,在围墙内随机出现一个食物,通过按键盘上的四个方向键控制蛇向上接着又出现食物,等待被蛇吃掉,如果蛇在移动过程中,撞到墙壁或身体交叉蛇头撞到自己的身体游戏结束。并且可以在游戏开始前自由选择游戏难度,游戏过程中可暂停游戏,并有积分系统,且积分每满一定值,蛇的运行速度会逐步增加。 2. 分工情况 为在设计过程中实现小组成员能力最大化,进行了以下分工: 1、张施展:负责前期系统需求分析,系统结构设计,图标设计,界面美化调整工作,以及 课程设计报告的撰写。 2、张清扬:负责主要程序的编写工作,菜单的设计及代码编写工作。 3、资料收集,程序调试共同进行。 3. 程序及系统结构设计 贪吃蛇程序设计思路 1、方案讨论 贪吃蛇游戏作为一款经典的休闲类小游戏,深受同学喜爱,因此我们将贪吃蛇作为此次MFC课程设计题目。在最初的方案中,我们倾向于单文档(SDI)的形式设计,但最初尝试都因缺少一些文件等情况而失败。考虑到windows中自带小游戏大多采用对话框形式,为能更好的与同学们的使用习惯相一致,最终决定使用对话框(Dialogue)的形式。 2、数据结构

在数据结构的选取,我们选择了链表,链表具有用多少空间就开多少空间的优点,使程序执行更稳定,高效。 游戏控制模块框 函数成员

贪吃蛇程序整体间调用关系

MFC程序结构分析

主题: MFC深入浅出 1.MFC深入浅出 MFC概述 2. 3. 1.MFC是一个编程框架 2. 3.MFC (Microsoft Foundation Class Library) 中的各种类结 合起来构成了一个应用程序框架,它的目的就是让程序员在此基础 上来建立Windows下的应用程序,这是一种相对SDK来说更为简单 的方法。因为总体上,MFC框架定义了应用程序的轮廓,并提供了 用户接口的标准实现方法,程序员所要做的就是通过预定义的接口 把具体应用程序特有的东西填入这个轮廓。Microsoft Visual C++ 提供了相应的工具来完成这个工作:AppWizard可以用来生成初步 的框架文件(代码和资源等);资源编辑器用于帮助直观地设计用 户接口;ClassWizard用来协助添加代码到框架文件;最后,编译, 则通过类库实现了应用程序特定的逻辑。 4. 5. 6. 7. 1.封装 2. 3.构成MFC框架的是MFC类库。MFC类库是C++类库。这 些类或者封装了Win32应用程序编程接口,或者封装了应用 程序的概念,或者封装了OLE特性,或者封装了ODBC和DAO 数据访问的功能,等等,分述如下。 4. 5.(1)对Win32应用程序编程接口的封装 6. 7.用一个C++ Object来包装一个Windows Object。例 如:class CWnd是一个C++ window object,它把Windows window(HWND)和Windows window有关的API函数封装在C++ window object的成员函数内,后者的成员变量m_hWnd就 是前者的窗口句柄。 8. 9.(2)对应用程序概念的封装

相关文档
相关文档 最新文档