`
hcmfys
  • 浏览: 356247 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

duoview1

 
阅读更多
首先在H文件有如下声明:

class CMultiViewApp : public CWinApp

{

public:

CView* m_pFirstView;

CView* m_pOtherView;

int m_currentView;

CView* m_pView2;

CView* m_pView1;

CMultiViewApp();


// Overrides

// ClassWizard generated virtual function overrides

//{{AFX_VIRTUAL(CMultiViewApp)

public:

virtual BOOL InitInstance();

//}}AFX_VIRTUAL


// Implementation

//{{AFX_MSG(CMultiViewApp)

afx_msg void OnAppAbout();

afx_msg void OnViewOtherview();

afx_msg void OnViewFirstview();

//}}AFX_MSG

afx_msg void OnViewChange(UINT nCmdID);

DECLARE_MESSAGE_MAP()

};


其次,在CPP文件有如下消息MAP:

/////////////////////////////////////////////////////////////////////////////

// CMultiViewApp


BEGIN_MESSAGE_MAP(CMultiViewApp, CWinApp)

//{{AFX_MSG_MAP(CMultiViewApp)

ON_COMMAND(ID_APP_ABOUT, OnAppAbout)

ON_COMMAND(ID_VIEW_OTHERVIEW, OnViewOtherview)

ON_COMMAND(ID_VIEW_FIRSTVIEW, OnViewFirstview)

//}}AFX_MSG_MAP

// Standard file based document commands

ON_COMMAND(ID_FILE_NEW, CWinApp::OnFileNew)

ON_COMMAND(ID_FILE_OPEN, CWinApp::OnFileOpen)

// Standard print setup command

ON_COMMAND(ID_FILE_PRINT_SETUP, CWinApp::OnFilePrintSetup)

ON_COMMAND_RANGE( ID_VIEW_VIEW1, ID_VIEW_VIEW2, OnViewChange)

END_MESSAGE_MAP()


说明:SDI程序在CMyApp::InitInstance()已经通过DocTemplate创建一个关联的视图/文档实例,切显示出来.具体实现如下:

BOOL CMultiViewApp::InitInstance()

{

AfxEnableControlContainer();


// Standard initialization

// If you are not using these features and wish to reduce the size

// of your final executable, you should remove from the following

// the specific initialization routines you do not need.


#ifdef _AFXDLL

Enable3dControls(); // Call this when using MFC in a shared DLL

#else

Enable3dControlsStatic(); // Call this when linking to MFC statically

#endif


// Change the registry key under which our settings are stored.

// TODO: You should modify this string to be something appropriate

// such as the name of your company or organization.

SetRegistryKey(_T("Local AppWizard-Generated Applications"));


LoadStdProfileSettings(); // Load standard INI file options (including MRU)


// Register the application's document templates. Document templates

// serve as the connection between documents, frame windows and views.


CSingleDocTemplate* pDocTemplate;

pDocTemplate = new CSingleDocTemplate(

IDR_MAINFRAME,

RUNTIME_CLASS(CMultiViewDoc),

RUNTIME_CLASS(CMainFrame), // main SDI frame window

RUNTIME_CLASS(CMultiViewView));

AddDocTemplate(pDocTemplate);


// Parse command line for standard shell commands, DDE, file open

CCommandLineInfo cmdInfo;

ParseCommandLine(cmdInfo);


// Dispatch commands specified on the command line

if (!ProcessShellCommand(cmdInfo))

return FALSE;


CView* pActiveView = ((CFrameWnd*) m_pMainWnd)->GetActiveView();

m_pFirstView = pActiveView;

m_pOtherView = (CView*) new COtherView;


CDocument* pDoc = ((CFrameWnd*)m_pMainWnd)->GetActiveDocument();

//通过CCreateContext实现第二视图和文档的关联

CCreateContext context;

context.m_pCurrentDoc = pDoc;


UINT m_ID = AFX_IDW_PANE_FIRST + 1;

CRect rect;

//为了演示第一种多视图是实现方法,把Vew的实例创建放在了这里

m_pOtherView->Create(NULL, NULL, WS_CHILD, rect, m_pMainWnd, m_ID, &context);


// The one and only window has been initialized, so show and update it.

m_pMainWnd->ShowWindow(SW_SHOWMAXIMIZED);

m_pMainWnd->UpdateWindow();

m_currentView=1;

return TRUE;

}

1. SDI单文档多视图实现方法1
void CMultiViewApp::OnViewOtherview()

{

// TODO: Add your command handler code here

UINT temp = ::GetWindowLong(m_pOtherView->m_hWnd, GWL_ID);

::SetWindowLong(m_pOtherView->m_hWnd, GWL_ID, ::GetWindowLong(m_pFirstView->m_hWnd, GWL_ID));

::SetWindowLong(m_pFirstView->m_hWnd, GWL_ID, temp);


m_pFirstView->ShowWindow(SW_HIDE);

m_pOtherView->ShowWindow(SW_SHOW);


((CFrameWnd*)m_pMainWnd)->SetActiveView(m_pOtherView);

((CFrameWnd*) m_pMainWnd)->RecalcLayout();

m_pOtherView->Invalidate();


}


void CMultiViewApp::OnViewFirstview()

{

// TODO: Add your command handler code here


UINT temp = ::GetWindowLong(m_pOtherView->m_hWnd, GWL_ID); //GetWindowWord()

::SetWindowLong(m_pOtherView->m_hWnd, GWL_ID, ::GetWindowLong(m_pFirstView->m_hWnd, GWL_ID));//SetWindowWord()

::SetWindowLong(m_pFirstView->m_hWnd, GWL_ID, temp);//SetWindowWord()


m_pOtherView->ShowWindow(SW_HIDE);

m_pFirstView->ShowWindow(SW_SHOW);


((CFrameWnd*)m_pMainWnd)->SetActiveView(m_pFirstView);

((CFrameWnd*)m_pMainWnd)->RecalcLayout();

m_pFirstView->Invalidate();

}

2. SDI单文档多视图实现方法2
void CMultiViewApp::OnViewChange(UINT nCmdID)

{

//另外一种方法实现SDI的多视图切换

CView* pViewAdd;

CView* pViewRemove;

CMainFrame* pMainFrame=(CMainFrame*)AfxGetMainWnd();

CDocument* pDoc = pMainFrame->GetActiveDocument();


if((nCmdID == ID_VIEW_VIEW1) && (m_currentView == 1))

return;

if((nCmdID == ID_VIEW_VIEW2) && (m_currentView == 2))

return;


if (nCmdID == ID_VIEW_VIEW2)

{

if (m_pView2 == NULL)

{

m_pView1 = pMainFrame->GetActiveView();

m_pView2 = new COtherView();


//Note that if OnSize has been overridden in CMyView2

//and GetDocument() is used in this override it can

//cause assertions and, if the assertions are ignored,

//cause access violation.

//使用CCreateContext structure实现view和document的关联

CCreateContext context;

context.m_pCurrentDoc=pDoc;//m_pView1->GetDocument();


m_pView2->Create(NULL, NULL, AFX_WS_DEFAULT_VIEW,

CFrameWnd::rectDefault, AfxGetMainWnd(), AFX_IDW_PANE_FIRST + 1, &context/*NULL*/);

}

pViewAdd = m_pView2;

pViewRemove = m_pView1;

m_currentView= 2;

}

else

{

pViewAdd = m_pView1;

pViewRemove = m_pView2;

m_currentView= 1;

}


// Set the child i.d. of the active view to AFX_IDW_PANE_FIRST,

// so that CFrameWnd::RecalcLayout will allocate to this

// "first pane" that portion of the frame window's client area

// not allocated to control bars. Set the child i.d. of the

// other view to anything other than AFX_IDW_PANE_FIRST; this

// examples switches the child id's of the two views.


int nSwitchChildID = pViewAdd->GetDlgCtrlID();

pViewAdd->SetDlgCtrlID(AFX_IDW_PANE_FIRST);

pViewRemove->SetDlgCtrlID(nSwitchChildID);


// Show the newly active view and hide the inactive view.


pViewAdd->ShowWindow(SW_SHOW);

pViewRemove->ShowWindow(SW_HIDE);


// Connect the newly active view to the document, and

// disconnect the inactive view.

//通过CCreateContext实现视图View和文档Document的关联

//就没有必要手动AddView(),如果需要可以进行手动RemoveView()

//AddView()会在CView::OnCreate()被MFC调用,RemoveView()会在CView::~CView()被调用

//当然可以根据需要手动调用它们,在本例当中,View都是被创建一次,没有被销毁,所以不会自动

//调用RemoveView()

//pDoc->AddView(pViewAdd);

//pDoc->RemoveView(pViewRemove);


pMainFrame->SetActiveView(pViewAdd);

pMainFrame->RecalcLayout();


return ;

}

The code needed to implement view switching depends on the frame window containing the view. There are three common cases: the view is contained within a CFrameWnd (SDI application), the view is contained within a CMDIChildWnd (MDI application) and the view is a pane of a splitter window, either in SDI or MDI applications. In all cases, what we need is a method in our document class to switch to the desired view. This method should receive the new view as a parameter and return the view that was replaced. This returned view is not contained in the document's list anymore. The advantage of having this method in the document class becomes obvious when there are several document types each of which can have different view types. Let's start with an SDI application that doesn't have splitters:

Collapse Copy Code
CView* CMyDocument::SwitchToView ( CView* pNewView )
{
CFrameWnd* pMainWnd = (CFrameWnd*)AfxGetMainWnd();
CView* pOldActiveView = pMainWnd->GetActiveView();
ASSERT(pOldActiveView != NULL);
ASSERT_VALID(pOldActiveView);
ASSERT(pOldActiveView->GetDocument() == this); // must be attached to us

/* Set the child window ID of the active view to AFX_IDW_PANE_FIRST.
This is necessary so that CFrameWnd::RecalcLayout will allocate
this "first pane" to that portion of the frame window's client
area not allocated to control bars. Set the child ID of
the previously active view to some other ID.
*/

::SetWindowLong(pOldActiveView->m_hWnd, GWL_ID, 0);
::SetWindowLong(pNewView->m_hWnd, GWL_ID, AFX_IDW_PANE_FIRST);

// Show the newly active view and hide the inactive view.
pNewView->ShowWindow(SW_SHOW);
pOldActiveView->ShowWindow(SW_HIDE);

// Connect the newly active view to the document,
// and disconnect the inactive view
AddView(pNewView);
RemoveView(pOldActiveView);
pMainWnd->SetActiveView(pNewView);
pMainWnd->RecalcLayout();

return pOldActiveView;
}In the case of an MDI application (again without splitters):

Collapse Copy Code
CView* CMyDocument::SwitchToView ( CView* pNewView )
{
CMDIFrameWnd* pMainWnd = (CMDIFrameWnd*)AfxGetMainWnd();

// Get the active MDI child window.
CMDIChildWnd* pChild = (CMDIChildWnd*)pMainWnd->MDIGetActive();

// Get the active view attached to the active MDI child window.
CView* pOldActiveView = pChild->GetActiveView();

// Set flag so that document will not be deleted when view is dettached.
BOOL bAutoDelete = m_bAutoDelete;
m_bAutoDelete = FALSE;

// Dettach existing view
RemoveView(pOldActiveView);

// restore flag
m_bAutoDelete = bAutoDelete;

// Show the newly active view and hide the inactive view.
pNewView->ShowWindow(SW_SHOW);
pOldActiveView->ShowWindow(SW_HIDE);

// Attach new view
AddView(pNewView);

pChild->RecalcLayout();
pNewView->UpdateWindow();
pChild->SetActiveView(pNewView);
return pOldActiveView;
}When the view to replace is a pane of a splitter window, there is also a small difference between SDI and MDI applications, related to the retrieval of the current active view. In the method below, you must comment out what you don't need depending on your application type:

Collapse Copy Code
CView* CSDISplitDoc::SwitchToView ( CView* pNewView )
{
/* Uncomment this if this is a SDI application
CFrameWnd* pMainWnd = (CFrameWnd*)AfxGetMainWnd();
CView* pOldActiveView = pMainWnd->GetActiveView();
*/

/* Uncomment this if this is a MDI application
CMDIFrameWnd* pMainWnd = (CMDIFrameWnd*)AfxGetMainWnd();

// Get the active MDI child window.
CMDIChildWnd* pChild = (CMDIChildWnd*)pMainWnd->MDIGetActive();

// Get the active view attached to the active MDI child window.
CView* pOldActiveView = pChild->GetActiveView();
*/

CSplitterWnd* pSplitter = (CSplitterWnd *)pOldActiveView->GetParent();
int row, col;
ASSERT(pSplitter->IsChildPane(pOldActiveView, row, col));

// set flag so that document will not be deleted when view is destroyed
m_bAutoDelete = FALSE;

// Dettach existing view
RemoveView(pOldActiveView);

// set flag back to default
m_bAutoDelete = TRUE;
/* Set the child window ID of the active view to the ID of the corresponding
pane. Set the child ID of the previously active view to some other ID.
*/
::SetWindowLong(pOldActiveView->m_hWnd, GWL_ID, 0);
::SetWindowLong(pNewView->m_hWnd, GWL_ID, pSplitter->IdFromRowCol(row, col));

// Show the newly active view and hide the inactive view.
pNewView->ShowWindow(SW_SHOW);
pOldActiveView->ShowWindow(SW_HIDE);

// Attach new view
AddView(pNewView);

// Set active
pSplitter->GetParentFrame()->SetActiveView(pNewView);
pSplitter->RecalcLayout();
pNewView->SendMessage(WM_PAINT);

return pOldActiveView;
}The SwitchToView functions above receive a pointer to an existing view, so a view must have already been created without attaching it to a document. Note that this imposes restrictions on view creation code, which should not make use of the document in any way (for example, the OnInitialUpdate member function). Otherwise, exceptions might occur. The newly activated view is shown before it is attached to the document, so functions in the view that respond to Windows messages such as WM_SIZE or WM_GETMINMAXINFO should not make use of the document either.

The view must be created with correct parent window and window ID. Both parameters depend on the frame windows containing the view, just the same as the SwithToView function. The non-active views could be created the first time the menu to select one of them was selected or somewhere in the document initialization code. Supposing we have a m_pView1 member in the document class that is a pointer to a view, this is how it should be created in a SDI application:

Collapse Copy Code
if (!m_pView1)
{
// create the new view
m_pView1 = new CView1;
m_pView1->Create(NULL, NULL, AFX_WS_DEFAULT_VIEW, CFrameWnd::rectDefault,
AfxGetMainWnd(), AFX_IDW_PANE_FIRST+1, NULL);
}In a MDI application:

Collapse Copy Code
CMDIFrameWnd* pMainWnd = (CMDIFrameWnd*)AfxGetMainWnd();
// Get the active MDI child window.
CMDIChildWnd* pChild = (CMDIChildWnd*)pMainWnd->MDIGetActive();

if (!m_pView1)
{
// create the new view
m_pView1 = new CView1;
m_pView1->Create(NULL, NULL, AFX_WS_DEFAULT_VIEW, CRect(0, 0, 0, 0),
pChild, AFX_IDW_PANE_FIRST, NULL);
}And finally, if the view is a pane of a splitter window (read the comments to difference between SDI and MDI applications):

Collapse Copy Code
/* Uncomment this if this is a SDI application
CFrameWnd* pMainWnd = (CFrameWnd*)AfxGetMainWnd();
CView* pActiveView = pMainWnd->GetActiveView();
CSplitterWnd* pSplitter = (CSplitterWnd *)pActiveView->GetParent();
*/

/* Uncomment this if this is a MDI application
CMDIFrameWnd* pMainWnd = (CMDIFrameWnd*)AfxGetMainWnd();
CMDIChildWnd* pChild = (CMDIChildWnd*)pMainWnd->MDIGetActive();
CView* pActiveView = pChild->GetActiveView();
CSplitterWnd* pSplitter = (CSplitterWnd *)pActiveView->GetParent();
*/

if (!m_pView1)
{
// create the new view
m_pView1 = new CView1;
m_pView1->Create(NULL, NULL, AFX_WS_DEFAULT_VIEW,
CRect(0, 0, 0, 0), pSplitter, 0, NULL);
}When we already have an existing view (m_pView1 in our example), we can make this view active as follows:

Collapse Copy Code
CView* pOldActiveView = SwitchToView(m_pView1);
if (!pOldActiveView)
// there was not an active view
else
// pOldActiveView is a pointer to the now inactive viewNote that inactive views destroy themselves when their parent window is destroyed, so you don't have to worry about destroying them.
分享到:
评论

相关推荐

    威盛 PM880/PM800芯片组产品简介(英文).pdf

    1. 高级内存控制器:支持高速的DDR内存,并具备先进的内存管理能力。 2. 高性能CPU接口:提供了与CPU通信的快速通道,确保了处理器性能的有效发挥。 3. AGP 8X图形接口:支持AGP 8X标准,提供高达2.13Gbps的数据...

    威盛 VX700移动随芯技术简介(英文).pdf

    VIA VX700还具备视频捕捉功能以及DuoView+™,后者是一种先进的双显示器输出技术,能扩展用户的显示体验。 音频方面,VIA VX700集成了VIA Vinyl HD 音频技术,为用户提供高级的音频体验。在内存控制器方面,VIA ...

    威盛电子发布PCI Express芯片组,支持威盛处理器平台

    威盛CN800芯片组内置了威盛UniChrome Pro集成显卡,具备硬件MPEG-2播放能力,这意味着它可以高效地处理视频解码任务,减轻CPU的负担,同时支持DuoView+技术,允许用户在同一时间内实现双屏独立显示,这对于多任务...

    PPT模板 -龙湖新员工转正答辩模板.pptx

    PPT模板 -龙湖新员工转正答辩模板.pptx

    PPT模板 -生产计划管理.pptx

    PPT模板 -生产计划管理.pptx

    生产单元数字化改造23年国赛

    生产单元数字化改造23年国赛

    ECharts柱状图-极坐标系下的堆叠柱状图2.rar

    图表效果及代码实现讲解链接:https://blog.csdn.net/zhangjiujiu/article/details/143997013

    机器人算法的 Python 示例代码 .zip

    Pythonbot高斯网格图射线投射网格图激光雷达至网格地图k-均值对象聚类矩形接头大满贯迭代最近点 (ICP) 匹配FastSLAM 1.0路径规划动态窗口方法基于网格的搜索Dijkstra 算法A* 算法D*算法D* Lite 算法位场算法基于网格的覆盖路径规划国家网格规划偏极采样车道采样概率路线图(PRM)规划快速探索随机树(RRT)回程时间*RRT* 和 reeds-shepp 路径LQR-RRT*五次多项式规划Reeds Shepp 规划基于LQR的路径规划Frenet 框架中的最佳轨迹路径追踪移动到姿势控制斯坦利控制后轮反馈控制线性二次调节器 (LQR) 速度和转向控制模型预测速度和转向控制采用 C-GMRES 的非线性模型预测控制手臂导航N关节臂对点控制带避障功能的手臂导航航空导航无人机三维轨迹跟踪火箭动力着陆双足动物倒立摆双

    sql综合学习基础知识及练习题考试题实测题.zip

    SQL,全称为结构化查询语言(Structured Query Language),是用于管理和操作关系型数据库的标准化语言。它广泛应用于数据插入、查询、更新和删除等操作,并且拥有超过40年的历史,证明了其在数据处理领域的核心地位。以下是对SQL综合学习基础知识及练习题考试题实测题的介绍

    java面向对象 - 类与对象.doc

    java面向对象 - 类与对象 在Java编程语言中,面向对象编程(OOP)是一个核心概念。它强调以对象作为程序的基本单位,并将相关的数据和功能封装在对象中。类和对象是Java OOP的两个关键组成部分。 ### 类(Class) 类是一个模板或蓝图,它定义了对象的属性和行为。我们可以将类视为对象的类型或种类。通过类,我们可以创建(实例化)具有特定属性和行为的对象。 类的组成部分通常包括: 1. **成员变量**(属性):用于存储对象的状态或数据。 2. **方法**(行为):定义了对象可以执行的操作或功能。 3. **构造方法**:一种特殊类型的方法,用于在创建对象时初始化其状态。 4. **块**(如静态块、实例初始化块):用于执行类级别的初始化代码。 5. **嵌套类**:一个类可以包含其他类,这被称为嵌套或内部类。 ### 对象(Object) 对象是类的实例。它是根据类模板创建的具体实体,具有自己的状态和行为。每个对象都是其类的一个唯一实例,可以访问其类中定义的属性和方法。 创建对象的过程通常涉及以下几个步骤: 1. **声明**:指定对象的类型(即其所属的类

    原生JS实现鼠标感应图片左右滚动代码.zip

    原生JS实现鼠标感应图片左右滚动代码.zip

    随机密码生成器,支持字符、数字、字母大小写组合

    随机密码生成器,支持字符、数字、字母大小写组合

    自动化部署管道创建的代码库(含 Concourse 和 Jenkins 相关).zip

    1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。

    高等工程数学试题详解:矩阵分析与最优化方法

    内容概要:本文档为一份高级数学复习试题,内容涵盖线性代数、数值分析及最优化理论等领域,主要包括矩阵范数的计算、遗传算法中的变异操作、内点法解非线性优化问题、证明矩阵有互异特征值、求解矩阵的标准形以及应用单纯形法和FR共轭梯度法解决具体的数学问题等方面。 适合人群:正在备考研究生入学考试或者准备参加各类数学竞赛的学生、对高等数学感兴趣的学习者及从事相关领域科研工作的专业人士。 使用场景及目标:用于巩固和检验个人关于矩阵论、优化方法及概率统计的知识掌握情况,帮助应试者系统地复习相关考点,提高解题技巧。 阅读建议:建议结合具体题目深入理解每一个概念及其应用方式,遇到复杂的计算或证明步骤不妨动手尝试推导一次,这样有助于加深记忆并培养灵活运用知识的能力。同时,在理解算法原理的基础上,还可以参考一些实际案例来进行练习。

    使用了脉冲码调制(PCM).计算了所需的比特率和信号量化误差Matlab代码.rar

    1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。 替换数据可以直接使用,注释清楚,适合新手

    Google 表格 Python API.zip

    Google Spreadsheet Python API v4Google Sheets 配合使用的简单界面。特征通过标题、关键字或URL打开电子表格。读取、写入和格式化单元格区域。共享和访问控制。批量更新。安装pip install gspread要求Python 3.8+。基本用法在 Google API 控制台中创建凭据开始使用 gspreadimport gspreadgc = gspread.service_account()# Open a sheet from a spreadsheet in one gowks = gc.open("Where is the money Lebowski?").sheet1# Update a range of cells using the top left corner addresswks.update([[1, 2], [3, 4]], "A1")# Or update a single cellwks.update_acell("B42", "it's

    AICon 2024全球人工智能开发与应用大会(脱敏)PPT合集(30份).zip

    AICon 2024全球人工智能开发与应用大会(脱敏)PPT合集,共30份。 AI辅助编程测评与企业实践 SmartEV和AI 蔚来的思考与实践 下一代 RAG 引擎的技术挑战与实现 书生万象大模型的技术演进与应用探索 人工智能行业数据集构建及模型训练方法实践周华 全方位评测神经网络模型的基础能力 千亿参数 LLM 的训练效率优化 向量化与文档解析技术加速大模型RAG应用落地 基于大模型的缺陷静态检查 多环境下的 LLM Agent 应用与增强 大模型在华为推荐场景中的探索和应用 大模型在推荐系统中的落地实践 大模型的异构计算和加速 大模型辅助需求代码开发 大语言模型在法律领域的应用探索 大语言模型在计算机视觉领域的应用 大语言模型的幻觉检测 小米大模型端侧部署落地探索 快手可图大模型的技术演进与应用探索 提升大模型知识密度,做高效的终端智能 电商大模型及搜索应用实践 百度大模型 原生安全构建之路 硅基流动高性能低成本的大模型推理云实践 语言模型驱动的软件工具思考:可解释与可溯源 长文本大模型推理实践:以 KVCache 为中心的分离式推理架构 阿里云 AI 搜索 RAG 大模型优

    子弹打穿金属后留下弹痕flash动画.zip

    子弹打穿金属后留下弹痕flash动画.zip

    雷达目标一维距离像仿真实验,以及多目标成像 matlab代码.rar

    1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。 替换数据可以直接使用,注释清楚,适合新手

    原生js竖直动画手风琴下拉菜单代码.zip

    原生js竖直动画手风琴下拉菜单代码.zip

Global site tag (gtag.js) - Google Analytics