【转】MFC窗口销毁过程

MFC 窗口销毁过程 考虑单窗口情况:   假设自己通过new创建了一个窗口对象pWnd,然后pWnd->Create。则销毁窗口的调用次序: 阅读详情

转载:http://blog.chinaunix.net/u2/64540/showart_657981.html

 

考虑单窗口情况:

  假设自己通过new创建了一个窗口对象pWnd,然后 pWnd->Create。则销毁窗口的调用次序:

  1. 手工调用pWnd->DestroyWindow();

   2. DestroyWindow会发送WM_DESTROY;

  3. WM_DESTROY对应的消息处理函数是OnDestroy();

  4. DestroyWindow会发送WM_NCDESTROY;

  5. WM_NCDESTROY对应的消息处理函数是OnNcDestroy;

  6. OnNcDestroy最后会调用PostNcDestroy;

  7. PostNcDestroy经常被用户重载以提供释放内存操作。例如可以使用delete this;

  通过这种方式,窗口对象对应 的窗口和窗口对象本身都被释放了。

  如果含有子窗口:

  如果含有子窗口,则调用父窗口的 DestroyWindow时,它会向子窗口发送WM_DESTROY和WM_NCDESTROY消息。

  具体调用顺序参考下文的例 子。

  DestroyWindow 对 delete 的 影响:

  应该说前者对后者并没有什么影响。但经常在DestroyWindow间接导致执行的 PostNcDestroy中delete窗口对象指针,即delete this。

  CView::PostNcDestroy中 唯一的操作就是delete this;CframeWnd::PostNcDestory也是如此。而默认的CWnd::PostNcDestroy是空操作,CDialog中也没 有对其进行重载,即也是空。

 
 delete 对 Destroy 的 影响:

  delete会导致析构函数。CWnd的析构函数中有对DestroyWindow的调用,但必须保证:

  m_hWnd != NULL &&

  this != (CWnd*) &wndTop &&this != (CWnd*)&wndBottom &&

   this != (CWnd*)&wndTopMost &&this != (CWnd*)&wndNoTopMost。

  Cdialog的析构函数中也有对DestroyWindow的调用,但条件 比较松,只需要m_hWnd != NULL。另外Cdialog::DoModal也会调用DestroyWindow。

   CFrameWnd的OnClose中会调用DestroyWindow,但其析构中不会调用DestroyWindow。

   CView的析构也不会调用DestroyWindow。

  一个 SDI 程 序的销毁过程

  有CMainFrame类、CMyView类。并且CMyView有两个子窗口CMyDlg和 CmyWnd的实例。

  点击退出按钮,CMainFrame会收到WM_CLOSE消息。CframeWnd(CMainFrame 的父类)间接会调用CWnd::DestroyWindow;它首先向CMyView发送WM_DESTORY和WM_NCDESTROY消息,并引发相 应的处理函数;然后向CMyDlg发送WM_DESTORY和WM_NCDESTROY消息,并引发相应的处理函数;然后向CMyWnd发送 WM_DESTORY和WM_NCDESTROY消息,并引发相应的处理函数。

  具体的执行顺序是:

  1. 调用CMainFrame::DestroyWindow

  2. CFrameWnd::OnDestroy

   3. CMyView::OnDestroy

  4. CmyWnd::OnDestroy

  5. CmyDlg::OnDestroy

  6. CmyWnd::PostNcDestroy

  7. CmyWnd的析构

  8. CmyDlg::PostNcDestroy 

  9. CmyDlg的析构

   10. CMyView::PostNcDestroy

  11. CmyView的析构

  12. CMainFrame的析构

  13. CMainFrame::DestroyWindow退出

  上面情况是假 设我们在CmyWnd和CmyDlg的PostNcDestroy中添加了delete this。如果没有添加,则7,9不会执行。

   因为CView::PostNcDestroy中调用了delete this,所以然后会执行CMyView的析构操作。因为CframeWnd::PostNcDestroy中调用了delete this,所以最后执行CMainFrame的析构操作。

  如果自己的CmyDlg和CmyWnd在PostNcDestroy中有 delete this;则二者会被析构。否则内存泄漏。当然delete也可以放在CMyView的析构中做,只是不够OO。

  总 结

  可以有两种方法销毁窗口对象对应的窗口和释放窗口对象指针。一种是通过DestroyWindow。这是比较好的方法,因为最后 MFC会自动相应WM_CLOSE导致CframWnd::DestroyWindow被调用,然后会一次释放所有子窗口的句柄。用户需要做的是在 PostNcDestroy中释放堆窗口对象指针。但因为某些对象是在栈中申请的,所以delete this可能出错。这就要保证写程序时自己创建的窗口尽量使用堆申请。

  另一种是delete。Delete一个窗口对象指针有的窗 口类(如CWnd,Cdialog)会间接调用DestroyWindow,有的窗口类(如CView,CframeWn)不会调用 DestroyWindow。所以要小心应对。

  二者是相互调用的,很繁琐。

  一段很好的文 章:(作者:闻怡洋)

  一个MFC窗口对象包括两方面的内容:一是窗口对象封装的窗口,即存放在m_hWnd成员 中的HWND(窗口句柄),二是窗口对象本身是一个C++对象。要删除一个MFC窗口对象,应该先删除窗口对象封装的窗口,然后删除窗口对象本身。

   删除窗口最直接方法是调用CWnd::DestroyWindow或::DestroyWindow,前者封装了后者的功能。前者不仅会调用后者,而且 会使成员m_hWnd保存的HWND无效(NULL)。如果DestroyWindow删除的是一个父窗口或拥有者窗口,则该函数会先自动删除所有的子窗 口或被拥有者,然后再删除父窗口或拥有者。在一般情况下,在程序中不必直接调用DestroyWindow来删除窗口,因为MFC会自动调用 DestroyWindow来删除窗口。例如,当用户退出应用程序时,会产生WM_CLOSE消息,该消息会导致MFC自动调用 CWnd::DestroyWindow来删除主框架窗口,当用户在对话框内按了OK或Cancel按钮时,MFC会自动调用 CWnd::DestroyWindow来删除对话框及其控件。

  窗口对象本身的删除则根据对象创建方式的不同,分为两种情况。在 MFC编程中,会使用大量的窗口对象,有些窗口对象以变量的形式嵌入在别的对象内或以局部变量的形式创建在堆栈上,有些则用new操作符创建在堆中。对于 一个以变量形式创建的窗口对象,程序员不必关心它的删除问题,因为该对象的生命期总是有限的,若该对象是某个对象的成员变量,它会随着父对象的消失而消 失,若该对象是一个局部变量,那么它会在函数返回时被清除。

  对于一个在堆中动态创建的窗口对象,其生命期却是任意长的。初学者在学 习C++编程时,对new操作符的使用往往不太踏实,因为用new在堆中创建对象,就不能忘记用delete删除对象。读者在学习MFC的例程时,可能会 产生这样的疑问,为什么有些程序用new创建了一个窗口对象,却未显式的用delete来删除它呢?问题的答案就是有些MFC窗口对象具有自动清除的功 能。

  如前面讲述非模态对话框时所提到的,当调用CWnd::DestroyWindow或::DestroyWindow删除一个 窗口时,被删除窗口的PostNcDestroy成员函数会被调用。缺省的PostNcDestroy什么也不干,但有些MFC窗口类会覆盖该函数并在新 版本的PostNcDestroy中调用delete this来删除对象,从而具有了自动清除的功能。此类窗口对象通常是用new操作符创建在堆中的,但程序员不必操心用delete操作符去删除它们,因为 一旦调用DestroyWindow删除窗口,对应的窗口对象也会紧接着被删除。

  不具有自动清除功能的窗口类如下所示。这些窗口对 象通常是以变量的形式创建的,无需自动清除功能。

  所有标准的Windows控件类。

  1. 从CWnd类直接派生出来的子窗口对象(如用户定制的控件)。

  2. 切分窗口类CSplitterWnd。

   3. 缺省的控制条类(包括工具条、状态条和对话条)。

  4. 模态对话框类。

  

  具有自 动清除功能的窗口类如下所示,这些窗口对象通常是在堆中创建的。

  1. 主框架窗口类(直接或间接从CFrameWnd类派生)。

   2. 视图类(直接或间接从CView类派生)。

  

  读者在设计自己的派生窗口类时,可根据窗口对象的创建方 法来决定是否将窗口类设计成可以自动清除的。例如,对于一个非模态对话框来说,其对象是创建在堆中的,因此应该具有自动清除功能。

   综上所述,对于MFC窗口类及其派生类来说,在程序中一般不必显式删除窗口对象。也就是说,既不必调用DestroyWindow来删除窗口对象封装的窗 口,也不必显式地用delete操作符来删除窗口对象本身。只要保证非自动清除的窗口对象是以变量的形式创建的,自动清除的窗口对象是在堆中创建 的,MFC的运行机制就可以保证窗口对象的彻底删除。

  如果需要手工删除窗口对象,则应该先调用相应的函数(如 CWnd::DestroyWindow)删除窗口,然后再删除窗口对象.对于以变量形式创建的窗口对象,窗口对象的删除是框架自动完成的.对于在堆中动 态创建了的非自动清除的窗口对象,必须在窗口被删除后,显式地调用delete来删除对象(一般在拥有者或父窗口的析构函数中进行).对于具有自动清除功 能的窗口对象,只需调用CWnd::DestroyWindow即可删除窗口和窗口对象。注意,对于在堆中创建的窗口对象,不要在窗口还未关闭的情况下就 用delete操作符来删除窗口对象.

MFC中窗口的销毁过程 MFC的窗口对象包含两个部分:封装的窗口对象和C++对象,其删除顺序:先窗口对象(WM_DESTROY(OnDestory()))然后C++对象(WM_NCDESTROY(OnNcDestroy())) 源码分析如下: 删除窗口对象 void CWnd::OnDestroy() { ............. // Active Accessibility if (m_pProxy != 阅读详情

相关推荐

MFC窗口创建、销毁消息流程

Windows消息处理机制 MFC应用程序中处理消息的顺序   1. AfxWndProc()该函数负责接收消息,找到消息所属的CWnd对象,然后调用AfxCallWndProc 2.AfxCallWndProc()该函数负责保存消息(保存的内容主要是消息标识符和消息参数)供应用程序以后使用,然后调用WindowProc()函数 3.WindowProc()该函数负责发送消息到O

在水一方 1697

MFC如何销毁窗口资源

在做MFC界面时,有一个问题曾经困扰我很长时间,窗口资源到底该如何销毁?这个问题网上也很多,我结合自己的体会,以及MSDN,尝试给出一个解答。如有错误,也请不吝赐教。

_Santiago的博客 2200

深度解析direct path write temp与ASM IO性能问题:Oracle 19.17视图查询优化指南

本文深度解析了Oracle 19.17版本中复杂视图查询出现`direct path write temp`与`ASM IO for non-blocking poll`性能瓶颈的根本原因。通过对比11.2.0.4版本的执行计划差异,文章提供了从CBO参数调整、存储层优化到SQL架构重构的完整实战调优指南,帮助DBA有效解决升级后的查询性能问题。

2y3u4i5o6p的博客 1100

mfc 窗口初始化以及销毁过程

1、模式对话框的创建过程: 1) DoModal()重载函数,重载DoModal()成员函数。 2)PreSubclassWindow()重载函数,允许首先子分类一个窗口。 3)OnCreate()消息响应函数,响应WM_CREATE消息,发送此消息以告诉一个窗口已经被创建。 4)OnSize()消息响应函数,响应WM_SIZE消息,发送此消息以告诉窗口大小发生变化。 5)OnMove()消息...

Bang666的博客 1466

摄像头模组选型避坑指南:如何根据Sensor和Lens参数匹配最佳组合

本文深入解析摄像头模组选型中Sensor与Lens的核心参数匹配要点。重点阐述了主光线角(CRA)匹配对边缘画质的关键影响,并提供了传感器尺寸、像素尺寸、焦距、光圈等参数的协同选型策略与实战避坑指南,帮助工程师在手机、安防、车载等不同应用场景下实现性能与成本的最佳平衡。

ee345的博客 617

从代码学习深度强化学习 - 目标导向的强化学习-HER算法 PyTorch版

经典的深度强化学习算法,如 PPO、SAC 等,在各自擅长的任务中都取得了非常好的效果。但它们通常都局限在解决单个任务上,换句话说,训练好的算法,在运行时也只能完成一个特定的任务。想象一个场景:我们想让一个机械臂能把桌子上的任何一个物体重置到任意一个指定位置。对于传统强化学习而言,如果目标物体的初始位置和目标位置每次都变化,那么这就是一个全新的任务。即便任务的“格式”——抓取并移动——是一样的,但策略本身可能需要重新训练。这显然效率极低。为了解决这类问题,

weixin_43887510的博客 1498

《MFC 学习笔记》 1 —— 窗口

《MFC 学习笔记》 1 —— 窗口

JCY的博客 2089

PyTorch模型生产部署:ONNX/Triton导出与高可用架构实战

机器学习模型部署本质是训练环境与生产环境之间的运行时契约建立过程,涉及序列化协议、推理引擎兼容性、动态批处理及资源隔离等核心问题。ONNX凭借标准化算子集和跨框架支持,成为平衡兼容性、性能与可维护性的首选导出格式;Triton Inference Server则通过原生多框架支持、动态batching和热加载能力,显著提升GPU利用率与服务SLA保障水平。在金融风控、电商推荐等高要求场景中,基于ONNX+Triton+K8s的分层架构可稳定支撑千级QPS与毫秒级P95延迟,同时满足模型热更新、可观测性与版本

weixin_33857679的博客 447

MFC窗口销毁过程

MFC窗口销毁过程 考虑单窗口情况:   假设自己通过new创建了一个窗口对象pWnd,然后pWnd->Create。则销毁窗口的调用次序:   1. 手工调用pWnd->DestroyWindow();   2. DestroyWindow会发送WM_DESTROY;   3. WM_DESTROY对应的消息处理函数

青蛙王子的专栏 1315

Python爬虫实战:实时监控美国SEC官网文件更新,助你第一时间掌握市场动态

在资本市场中,信息就是财富。美国证券交易委员会(SEC)官网公开了大量公司披露文件,涵盖财报、招股说明书、内幕交易等重要信息。对投资者、分析师及法律合规人员来说,实时监控这些公开文件具有重要价值。

2201_76125261的博客 594

通过Robotstudio修改机器人程序的具体方法和步骤

通过Robotstudio修改机器人程序的具体方法和步骤

Robot_PLC_HMI_Automation 6393

MFC中手动create创建的窗口,如何销毁释放?

这通常涉及删除窗口对象并调用其析构函数,这将负责清理与窗口相关联的资源。总之,当你手动创建MFC窗口时,确保通过删除窗口对象或调用适当的销毁函数来正确释放资源。一旦窗口被销毁,任何尝试访问其句柄或成员的操作都应该是无效的。如果你的窗口是父窗口(例如主框架窗口)的子窗口,确保在销毁子窗口之前将其从父窗口中移除。请注意,如果你直接管理窗口句柄,还需要确保在销毁句柄之前释放与该窗口相关的所有资源,例如字体、位图等。删除窗口对象时,其析构函数将被调用,MFC将负责执行必要的清理操作,包括销毁窗口句柄。

学无止尽,谨言慎行! 1859

OpenHarmony 显示Display驱动全栈解析:DisplayLayer + Gralloc + Gfx 三位一体,打造高性能图形底座

OpenHarmony Display显示驱动模块是系统图形渲染和显示功能的基础组件,负责管理显示设备、图层渲染、内存分配等核心功能。该模块采用HDI(Hardware Driver Interface)设计架构,为上层图形服务提供统一的显示能力接口,实现了显示设备的初始化、图层管理、内存分配与映射、硬件加速等关键功能。DisplayLayer:负责显示图层的管理, 包括图层创建、显示属性设置、图层填充及刷新等操作;

m0_67505153的博客 314

总结MFC窗口销毁过程(转)

 考虑单窗口情况:假设自己通过new创建了一个窗口对象pWnd,然后pWnd->Create。则销毁窗口的调用次序:  1.       手工调用pWnd->DestroyWindow();2.       DestroyWindow会发送WM_DESTROY;3.      

725

YOLO26中的PPM空间金字塔池化:改良设计与多尺度特征提取教程

在计算机视觉的语义分割任务中,准确理解图像中的上下文信息至关重要。例如,在街景图像中,可能同时存在远处的小汽车和近处的大建筑物,网络需要具备捕获多尺度上下文信息的能力。例如,要正确识别图像中的"船",不仅需要看到船本身的特征,还需要理解周围的水面环境。金字塔的每一层对应不同的池化尺度,从细粒度到粗粒度,形成了多层次的特征表示。PPM(Pyramid Pooling Module)正是为了解决这一问题而提出的模块,它通过构建金字塔形状的池化结构,有效地聚合不同尺度的上下文信息,从而提升语义分割的精度。

LXY_LOVE36的博客 82

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

MFC窗口销毁过程 (转自 百度 拼搏真理的博客) 好东西 留着看看

 考虑单窗口情况:   假设自己通过new创建了一个窗口对象pWnd,然后pWnd->Create。则销毁窗口的调用次序:   1. 手工调用pWnd->DestroyWindow();   2. DestroyWindow会发送WM_DESTROY;   3. WM_DESTROY对应的消息处理函数是OnDestroy();   4. DestroyWindow会发送WM_NCDESTROY;

icefairy的专栏 1019

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

总结MFC窗口销毁过程

<br /> 考虑单窗口情况:<br />假设自己通过new创建了一个窗口对象pWnd,然后pWnd->Create。则销毁窗口的调用次序:<br /> <br />1.       手工调用pWnd->DestroyWindow();<br />2.       DestroyWindow会发送WM_DESTROY;<br />3.       WM_DESTROY对应的消息处理函数是OnDestroy();<br />4.       DestroyWindow会发送WM_NCDESTROY;<br /

dehuadeng的专栏 1242

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

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

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

VC/MFC中窗口创建和销毁以及MFC应用程序框架

在说明窗口销毁的过程之前要必要先弄清楚窗口类、窗口对象、窗口的概念以及它们的区别和联系。 窗口         即我们在电脑桌面上看到的应用程序界面,系统为每一个窗口维护了一个WNDCLASS结构体用来描述这个窗口的各种属性(如窗口风格、图标、画刷、菜单和窗口过程等)。系统还会为这个窗口保存它的位置、大小状态以及窗口所属的进程。如果你想查询和操作这些属性,你无法直接操作他们,因为你不知道他们的

勤能补拙 2092

MFC DestroyWindow窗口对象和窗口句柄的销毁

考虑单窗口情况:   假设自己通过new创建了一个窗口对象pWnd,然后pWnd->Create。则销毁窗口的调用次序:   1. 手工调用pWnd->DestroyWindow();   2. DestroyWindow会发送WM_DESTROY;   3. WM_DESTROY对应的消息处理函数是OnDestroy();   4. DestroyWindow会发送

leaf6094189的专栏 6445

MFC 创建非模态对话框和销毁过程

今天项目中遇到的问题,记录下来,做个总结。 一个简单的目的是创建一个非模态对话框并在对话框关闭后将其销毁。 这里的销毁包括:销毁对话框对象资源和对话框对象指针; 首先说创建对话框: 一、模态对话框(model dialog box) 在程序运行的过程中,若出现了模态对话框,那么主窗口将无法发送消息,直到模态对话框退出才可以发送。 点击模态对话框中的OK按钮,模态对话框会被销

MachiealFactory的博客 2万+

转:mfc窗口的销毁

<br />一段很好的文章:(作者:闻怡洋) <br /><br />  一个MFC窗口对象包括两方面的内容:一是窗口对象封装的窗口,即存放在m_hWnd成员中的HWND(窗口句柄),二是窗口对象本身是一个C++对象。要删除一个MFC窗口对象,应该先删除窗口对象封装的窗口,然后删除窗口对象本身。 <br /><br />  删除窗口最直接方法是调用CWnd::DestroyWindow或::DestroyWindow,前者封装了后者的功能。前者不仅会调用后者,而且会使成员m_hWnd保存的HWND无效(NU

tompaz的专栏 705

MFC窗口的创建

1.MFC窗口类CWnd 在Windows系统里,一个窗口的属性分两个地方存放:一部分放在“窗口类”里头,如上所述的在注册窗口时指定;另一部分放在Windows Object本身,如:窗口的尺寸,窗口的位置(X,Y轴),窗口的Z轴顺序,窗口的状态(ACTIVE,MINIMIZED,MAXMIZED,RESTORED…),和其他窗口的关系(父窗口,子窗口…),窗口是否可以接收键盘或鼠标消息,等

JUST DO IT 1666

OpenCV在MFC窗口显示图像

OpenCV在MFC窗口显示图像1. OpenCV创建一个窗口并在其中显示图像1.1 读入图像文件1.2 创建一个窗口1.3 在一个窗口中显示一幅图像(属于highgui模块)1.4. 显式地销毁指定窗口1.5. 显式地销毁所有HighGUI窗口1.6 移动窗口到屏幕上指定位置1.7. 重新指定窗口尺寸为指定宽度和高度1.8 把程序中的Mat类型的矩阵保存为图像(imagecodecs.hpp)2. OpenCV读取图像显示在MFC窗口上 1. OpenCV创建一个窗口并在其中显示图像 前言:第一部分是关于

吾名招财的博客 2596
上一篇: 【转】文档类、子框架类及视图类的关系及如何相互调用
下一篇: 【转】C++箴言:避免构造或析构函数中调用虚函数
code09
博客等级 码龄18年 31粉丝 56原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值