在ObjectARX(VC)中使用MFC-可停靠窗体

news2024/11/15 23:45:50

目录

前言

一、使用CAD的CAcUiDockControlBar类

二、在入口程序中注册命令

三、窗口实现

四、目录结构

五、注意事项

六、效果展示


前言

CAD中经常会看到这样的窗口,下面就看看是如何实现的。


提示:以下是本篇文章正文内容,下面案例可供参考

一、使用CAD的CAcUiDockControlBar类

自己重写CAcUiDockControlBar类,实现creat方法,在里面弹出窗口。

 MyDockControlBar.h

#pragma once
#include "resource.h"

class CMyDockControlBar :public CAcUiDockControlBar
{
	DECLARE_DYNAMIC(CMyDockControlBar)

public:
	CMyDockControlBar();
	CString m_sTitle;
	virtual BOOL Create(CWnd* pParent, LPCSTR lpszTitle);
	void RedrawData();
	//其他内容
	BOOL      m_bMouseOver;
	COLORREF  m_clrNormal;
	COLORREF  m_clrHover;
	int m_cBorder;
	
protected:
	afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
	virtual void SizeChanged(CRect* lpRect, BOOL bFloating, int flags);
	//其他功能函数
	afx_msg void OnPaint();
	virtual void PaintControlBar(CDC* pDC);
	afx_msg void OnMouseMove(UINT nFlags, CPoint point);
	afx_msg BOOL OnEraseBkgnd(CDC* pDC);
	afx_msg void OnSize(UINT nType, int cx, int cy);
	afx_msg LRESULT OnMouseLeave(WPARAM wParam, LPARAM lParam);
	void OnClose();
	void RepositionBtn(); 
	CRect GetInsideRect();
	DECLARE_MESSAGE_MAP()
};

MyDockControlBar.cpp 

#include "stdafx.h"
#include "MyDockControlBar.h"
#include "DlgDockableForm.h"
static CLSID clsCModBar = { 0x7b771e1d, 0xf13e, 0x40d8, { 0xad, 0x0c, 0xd7, 0x45, 0xb3, 0xf8, 0x7b, 0xd7 } };

extern CDlgDockableForm* g_DlgDockableForm;

//-----------------------------------------------------------------------------
IMPLEMENT_DYNAMIC(CMyDockControlBar, CAcUiDockControlBar)

BEGIN_MESSAGE_MAP(CMyDockControlBar, CAcUiDockControlBar)
	//{{AFX_MSG_MAP(CModBar)
	ON_WM_CREATE()
	//以下响应的是增强内容
	/*ON_WM_CLOSE()
	ON_WM_PAINT()
	ON_WM_MOUSEMOVE()
	ON_WM_ERASEBKGND()
	ON_MESSAGE(WM_MOUSELEAVE, OnMouseLeave)*/

END_MESSAGE_MAP()
CMyDockControlBar::CMyDockControlBar() 
{
	m_cBorder = 4;                                //通用间距或边距
	m_bMouseOver = FALSE;                         //鼠标是否位于控件条主窗口区
	m_clrNormal = GetSysColor(COLOR_ACTIVECAPTION);//正常背景色
	m_clrHover = GetSysColor(COLOR_ACTIVECAPTION);      //鼠标在其上时的背景色
}

BOOL CMyDockControlBar::Create(CWnd* pParent, LPCSTR lpszTitle)
{
	CString strWndClass;
	int ScreenWidth = GetSystemMetrics(SM_CXSCREEN);
	int ScreenHeight = GetSystemMetrics(SM_CYSCREEN) ;
	strWndClass = AfxRegisterWndClass(CS_DBLCLKS, LoadCursor(NULL, IDC_ARROW));
	CRect rect(0, 0, ScreenWidth*0.3 , ScreenHeight*0.9);
	
	if (!CAcUiDockControlBar::Create(
		strWndClass,
		m_sTitle,
		WS_VISIBLE | WS_CHILD | WS_CLIPCHILDREN,
		rect,
		pParent, 0
	)
		)
		return (FALSE);

	SetToolID(&clsCModBar);


	return (TRUE);
}
int CMyDockControlBar::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
	if (CAcUiDockControlBar::OnCreate(lpCreateStruct) == -1)
		return (-1);
	//创建对话框
	g_DlgDockableForm = new CDlgDockableForm;
	BOOL bRtn = g_DlgDockableForm->Create(IDD_DIALOG_DOCKABLEFORM, this);
	g_DlgDockableForm->ShowWindow(SW_SHOW);
	ModifyStyle(0, WS_CLIPCHILDREN);
	return (0);
}
void CMyDockControlBar::RedrawData()
{
	if (g_DlgDockableForm)
	{
		g_DlgDockableForm->SetActiveWindow();
		g_DlgDockableForm->ShowWindow(SW_SHOW);
		if (g_DlgDockableForm->IsIconic() != 0)
		{
			g_DlgDockableForm->ShowWindow(SW_RESTORE);
		}

	}
	else
	{
		if ((g_DlgDockableForm = new CDlgDockableForm()) == NULL)
		{
			ads_printf(_T("Unable to allocate a CDlgItemMange."));
		}
		CAcModuleResourceOverride resOverride;

		BOOL succeeded = g_DlgDockableForm->Create(IDD_DIALOG_DOCKABLEFORM, this);
		if (!succeeded)
		{
			ads_printf(_T("\nUnable to create the dialog."));

		}
		g_DlgDockableForm->ShowWindow(SW_SHOW);
		g_DlgDockableForm->SetActiveWindow();
	}
}


//控件条尺寸或状态发生变化
void CMyDockControlBar::SizeChanged(CRect* lpRect, BOOL bFloating, int flags)
{
	CRect rc;
	//重定位关闭按钮
	RepositionBtn();
	//获取可直接使用的空间
	rc = GetInsideRect();

	if (g_DlgDockableForm->GetSafeHwnd() != NULL)
	{
		g_DlgDockableForm->MoveWindow(&rc);
	}
}


//以下是增强内容
//自定义绘制过程
void CMyDockControlBar::OnPaint()
{
	CPaintDC dc(this);
	PaintControlBar(&dc);
}
void CMyDockControlBar::PaintControlBar(CDC* pDC)
{
	CRect rect;
	//按照鼠标状态填充整个客户区
	GetClientRect(&rect);
	pDC->FillSolidRect(rect, m_bMouseOver ? m_clrHover : m_clrNormal);
	CFont font;
	font.CreateFont(
		15, // nHeight
		0, // nWidth
		0, // nEscapement
		0, // nOrientation
		FW_LIGHT, // nWeight
		FALSE, // bItalic
		FALSE, // bUnderline
		0, // cStrikeOut
		GB2312_CHARSET, // nCharSet
		OUT_DEFAULT_PRECIS, // nOutPrecision
		CLIP_DEFAULT_PRECIS, // nClipPrecision
		DEFAULT_QUALITY, // nQuality
		DEFAULT_PITCH | FF_SWISS,
		_T("Terminal") // nPitchAndFamily Arial
	);
	pDC->SelectObject(&font);
	//外边界向内收缩一个边宽度
	rect.DeflateRect(m_cBorder, m_cBorder);
	rect.left += 5;
	if (m_dwStyle & CBRS_ORIENT_HORZ)//水平停靠,把手画在右侧
	{
		pDC->DrawText(m_sTitle, rect, DT_LEFT);
	}
	else//垂直停靠,把手画在顶部
	{
		pDC->DrawText(m_sTitle, rect, DT_LEFT);
	}

}

//重新定位关闭按钮的位置
void CMyDockControlBar::RepositionBtn()
{
	CWnd* pBtn;
	CRect rect;
	if (IsFloating())
		return;

	pBtn = GetDlgItem(idCloseBtn);
	if (pBtn == NULL)
		return;

	GetClientRect(&rect);
	rect.DeflateRect(m_cBorder, m_cBorder);
	rect.left = rect.right - btnWidth;
	if (m_dwStyle & CBRS_ORIENT_HORZ)//水平停靠,按钮移至右下角
		rect.top = rect.bottom - btnHeight;
	else//垂直停靠,按钮移至右上角
		rect.bottom = rect.top + btnHeight;
	pBtn->MoveWindow(&rect);
	pBtn->ShowWindow(SW_SHOW);

	//框架浮动再停靠后,会多显示一个按钮,因为是CAD的无法删除,故而隐藏
	CWnd* pBtnPin = GetDlgItem(idPinBtn);
	if (pBtnPin != NULL)
	{
		pBtnPin->ShowWindow(SW_HIDE);
	}
}
//计算控件条内部可直接使用的空间
CRect CMyDockControlBar::GetInsideRect()
{
	CRect rect;
	GetClientRect(&rect);
	rect.DeflateRect(m_cBorder, m_cBorder);

	if (IsFloating())
		return rect;

	if (m_dwStyle & CBRS_ORIENT_HORZ)//水平停靠
		rect.DeflateRect(0, 0, m_cBorder + btnWidth, 0);
	else//垂直停靠
		rect.DeflateRect(0, m_cBorder + btnHeight, 0, 0);
	return rect;
}
void CMyDockControlBar::OnMouseMove(UINT nFlags, CPoint point)
{
	if (!m_bMouseOver)
	{
		//鼠标进入了控件条的主窗体
		m_bMouseOver = TRUE;
		TRACKMOUSEEVENT tme;
		tme.cbSize = sizeof(tme);
		tme.dwFlags = TME_LEAVE;
		tme.hwndTrack = m_hWnd;
		_TrackMouseEvent(&tme);
		Invalidate(FALSE);
	}
	CAcUiDockControlBar::OnMouseMove(nFlags, point);
}
BOOL CMyDockControlBar::OnEraseBkgnd(CDC* pDC)
{
	//防止重绘时的屏幕闪烁
	return TRUE;
}
void CMyDockControlBar::OnSize(UINT nType, int cx, int cy)
{
	if (g_DlgDockableForm->GetSafeHwnd() == NULL)
		return;
	CRect rc;
	rc = GetInsideRect();
	if (::IsWindow(g_DlgDockableForm->GetSafeHwnd())) {
		//- Forward the call
		CRect rect;
		GetWindowRect(&rect);
		//- Move the window over so we can see the control lines
		g_DlgDockableForm->MoveWindow(0, 0, rect.Width(), rect.Height(), TRUE);
	}
}
LRESULT CMyDockControlBar::OnMouseLeave(WPARAM wParam, LPARAM lParam)
{
	//鼠标离开了控件条主窗体
	if (m_bMouseOver)
	{
		m_bMouseOver = FALSE;
		Invalidate(FALSE);
	}
	return 0;
}
void CMyDockControlBar::OnClose()
{

	CAcUiDockControlBar::OnClose();
}

二、在入口程序中注册命令

 acrxEntryPoint.cpp


//-----------------------------------------------------------------------------
//----- acrxEntryPoint.cpp
//-----------------------------------------------------------------------------
#include "StdAfx.h"
#include "resource.h"
#include "DlgDockableForm.h"
#include "MyDockControlBar.h"

//-----------------------------------------------------------------------------
#define szRDS _RXST("ADSK")
CMyDockControlBar* g_pgModBar;
extern CDlgDockableForm* g_DlgDockableForm;
void EndDockableFormDlg()
{
	if (g_DlgDockableForm)
	{
		g_DlgDockableForm->DestroyWindow();
		delete(g_DlgDockableForm);
		g_DlgDockableForm = NULL;
	}



	if (g_pgModBar)
	{
		g_pgModBar->DestroyWindow();
		delete g_pgModBar;
		g_pgModBar = NULL;
	}
}

//-----------------------------------------------------------------------------
//----- ObjectARX EntryPoint
class CDockableDlgInCADApp : public AcRxArxApp {

public:
	CDockableDlgInCADApp () : AcRxArxApp () {}

	virtual AcRx::AppRetCode On_kInitAppMsg (void *pkt) {
		// TODO: Load dependencies here

		// You *must* call On_kInitAppMsg here
		AcRx::AppRetCode retCode =AcRxArxApp::On_kInitAppMsg (pkt) ;
		
		// TODO: Add your initialization code here

		return (retCode) ;
	}

	virtual AcRx::AppRetCode On_kUnloadAppMsg (void *pkt) {
		// TODO: Add your code here

		// You *must* call On_kUnloadAppMsg here
		AcRx::AppRetCode retCode =AcRxArxApp::On_kUnloadAppMsg (pkt) ;

		EndDockableFormDlg();

		return (retCode) ;
	}

	virtual void RegisterServerComponents () {
	}
	

	static void ADSKMyGroupMyCommand () {
		// Put your command code here

	}

	// Modal Command with pickfirst selection
	// ACED_ARXCOMMAND_ENTRY_AUTO(CDockableDlgInCADApp, ADSKMyGroup, MyPickFirst, MyPickFirstLocal, ACRX_CMD_MODAL | ACRX_CMD_USEPICKSET)
	static void ADSKMyGroupMyPickFirst () {
		ads_name result ;
		int iRet =acedSSGet (ACRX_T("_I"), NULL, NULL, NULL, result) ;
		if ( iRet == RTNORM )
		{
			// There are selected entities
			// Put your command using pickfirst set code here
		}
		else
		{
			// There are no selected entities
			// Put your command code here
		}
	}

	// Application Session Command with localized name
	// ACED_ARXCOMMAND_ENTRY_AUTO(CDockableDlgInCADApp, ADSKMyGroup, MySessionCmd, MySessionCmdLocal, ACRX_CMD_MODAL | ACRX_CMD_SESSION)
	static void ADSKMyGroupMySessionCmd () {
		// Put your command code here
	}
	static void ADSKMyGroupShowDockableDlg() 
	{
		CAcModuleResourceOverride override;
		CMDIFrameWnd* pAcadFrame = acedGetAcadFrame();
		CString strTitle = _T("停靠窗口");
		if (g_pgModBar == NULL)
		{
			g_pgModBar = new CMyDockControlBar;
			g_pgModBar->m_sTitle = strTitle;
			USES_CONVERSION;
			g_pgModBar->Create(pAcadFrame, W2A(strTitle));
			g_pgModBar->EnableDocking(CBRS_ALIGN_LEFT | CBRS_ALIGN_RIGHT);
			pAcadFrame->DockControlBar(g_pgModBar, AFX_IDW_DOCKBAR_LEFT);
			g_pgModBar->ShowWindow(SW_HIDE);
		}
		else
		{
			g_pgModBar->RedrawData();
		}

		acedGetAcadFrame()->SetActiveWindow();
		acedGetAcadFrame()->SetFocus();

		pAcadFrame->ShowControlBar(g_pgModBar, TRUE, FALSE);
		pAcadFrame->RecalcLayout();
		g_pgModBar->ShowWindow(SW_SHOW);
	}

	
	static int ads_MyLispFunction () {
		//struct resbuf *args =acedGetArgs () ;
		
		// Put your command code here

		//acutRelRb (args) ;
		
		// Return a value to the AutoCAD Lisp Interpreter
		// acedRetNil, acedRetT, acedRetVoid, acedRetInt, acedRetReal, acedRetStr, acedRetPoint, acedRetName, acedRetList, acedRetVal

		return (RTNORM) ;
	}
	
} ;

//-----------------------------------------------------------------------------
IMPLEMENT_ARX_ENTRYPOINT(CDockableDlgInCADApp)

ACED_ARXCOMMAND_ENTRY_AUTO(CDockableDlgInCADApp, ADSKMyGroup, MyCommand, MyCommandLocal, ACRX_CMD_MODAL, NULL)
ACED_ARXCOMMAND_ENTRY_AUTO(CDockableDlgInCADApp, ADSKMyGroup, MyPickFirst, MyPickFirstLocal, ACRX_CMD_MODAL | ACRX_CMD_USEPICKSET, NULL)
ACED_ARXCOMMAND_ENTRY_AUTO(CDockableDlgInCADApp, ADSKMyGroup, MySessionCmd, MySessionCmdLocal, ACRX_CMD_MODAL | ACRX_CMD_SESSION, NULL)
ACED_ARXCOMMAND_ENTRY_AUTO(CDockableDlgInCADApp, ADSKMyGroup, ShowDockableDlg, ShowDockableDlg, ACRX_CMD_MODAL, NULL)
ACED_ADSSYMBOL_ENTRY_AUTO(CDockableDlgInCADApp, MyLispFunction, false)

 三、窗口实现

 DlgDockableForm.cpp: 实现文件

// DlgDockableForm.cpp: 实现文件
//

#include "stdafx.h"
#include "DlgDockableForm.h"
#include "afxdialogex.h"

CDlgDockableForm* g_DlgDockableForm;
// CDlgDockableForm 对话框

IMPLEMENT_DYNAMIC(CDlgDockableForm, CDialog)

CDlgDockableForm::CDlgDockableForm(CWnd* pParent /*=nullptr*/)
	: CDialog(IDD_DIALOG_DOCKABLEFORM, pParent)
{

}

CDlgDockableForm::~CDlgDockableForm()
{
}

void CDlgDockableForm::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
}


BEGIN_MESSAGE_MAP(CDlgDockableForm, CDialog)
	ON_BN_CLICKED(IDC_BUTTON_CREATLINE, &CDlgDockableForm::OnBnClickedButtonCreatline)
	ON_WM_CLOSE()
END_MESSAGE_MAP()


// CDlgDockableForm 消息处理程序

LRESULT CDlgDockableForm::OnAcadKeepFocus(WPARAM, LPARAM)
{
	return TRUE;
}

void CDlgDockableForm::OnBnClickedButtonCreatline()
{
	ads_point ptStart;
	ads_point ptEnd;
	AcApDocument* pDoc = acDocManager->mdiActiveDocument();
	acDocManager->lockDocument(pDoc);

	AcDbBlockTable* pBlockTable;//声明指向块表的指针
	if (acdbHostApplicationServices()->workingDatabase()->getBlockTable(pBlockTable, AcDb::kForRead) == Acad::eOk)
	{
		AcDbBlockTableRecord* pBlockTableRecord;//声明一个块表记录区的指针
		if (pBlockTable->getAt(ACDB_MODEL_SPACE, pBlockTableRecord, AcDb::kForWrite) == Acad::eOk)
			//将空间模型区域的记录地址赋给上声明的变量 模式为写
		{
			if ((ads_getpoint(NULL, _T("\n请选择起点:"), ptStart)) == RTNORM)
			{
				if (ads_getpoint(NULL, _T("\n请选择终点:"), ptEnd) == RTNORM)
				{
					AcDbLine* pLine = new AcDbLine(asPnt3d(ptStart), asPnt3d(ptEnd));//这个类代表了CAD里面的线实体,起始点终结点
					AcDbObjectId lineld;//声明ID
					pBlockTableRecord->appendAcDbEntity(lineld, pLine);//将ID与实体传入
				//关闭所有这个很关键 用到了什么就要吧所有的都关闭不然会出现问题。
					pLine->close();
					pBlockTableRecord->close();
				}

			}


		}
		pBlockTable->close();
	}//获取块表织针
	acDocManager->unlockDocument(pDoc);//解锁

}



void CDlgDockableForm::OnClose()
{
	if (g_DlgDockableForm)
	{
		g_DlgDockableForm->DestroyWindow();
		delete(g_DlgDockableForm);
		g_DlgDockableForm = NULL;
	}

	CDialog::OnClose();
}


 DlgDockableForm.h

#pragma once

#include"resource.h"
// CDlgDockableForm 对话框

class CDlgDockableForm : public CDialog
{
	DECLARE_DYNAMIC(CDlgDockableForm)

public:
	CDlgDockableForm(CWnd* pParent = nullptr);   // 标准构造函数
	virtual ~CDlgDockableForm();

// 对话框数据
#ifdef AFX_DESIGN_TIME
	enum { IDD = IDD_DIALOG_DOCKABLEFORM };
#endif

protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持
	afx_msg LRESULT OnAcadKeepFocus(WPARAM, LPARAM);
	DECLARE_MESSAGE_MAP()
public:
	afx_msg void OnBnClickedButtonCreatline();
	afx_msg void OnClose();

};

 四、目录结构

五、注意事项

对话框的边框和样式一定要设置对,

六、效果展示

参考

 在ObjectARX中使用MFC-可停靠窗体_GeekBuilding的博客-CSDN博客

源码地址:

我的sun&shine / DockableDlgInCAD · GitCode

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/187357.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ESP-IDF:传统链表测试

ESP-IDF:传统链表测试 在ESP-IDF环境下简单地写个传统链表 /--------------Test 传统链表-------------/ //链表结点 typedef struct LINKNODE11 { void * data; LINKNODE11 * next; }linknode11; //链表头 typedef struct LINKLIST11 { linknode11 * head; int size; }linkli…

SpringBoot快速搭建WebSocket并测试

目录简介Pom文件服务端Service代码服务端配置代码服务端Controller:发送消息给客户端测试开启ws服务端简介 WebSocket协议通过在客户端和服务端之间提供全双工通信来进行Web和服务器的交互功能。 在ws应用程序中,服务器发布websocket端点。 一个ws连接的…

通用`Query`解决方案

文章目录通用Query解决方案简介什么是QueryQuery类别Query基本使用SQL Query基本使用自定义Query基本使用现状方案通过Json数据或方法动态生成Query 通过Select Sql语句动态生成Query通过Query生成动态Query支持传统的Query并通过参数形式生成Query列定义通用Query,…

nacos区分权限

背景 nacos的默认是不进行分配权限的,那么这样就带来了一个问题,如果多项目共同使用一个nacos,可以带了一个情况是开发人员误操作,把其他项目的nacos配置文件更改或者删除。那么如何解决这个问题呢?就是把nacos进行分…

TF-A源码移植

1.对tf-a源码进行解压$> tar xfz tf-a-stm32mp-2.2.r2-r0.tar.gz 2.打补丁进入/home/ubuntu/FSMP1A/tf-a-stm32mp-2.2.r2-r0/tf-a-stm32mp-2.2.r2-r0/tf-a-stm32mp-2.2.r2目录执行for p in ls -1 ../../*.patch; do patch -p1 < $p; done3.配置工具链1)进入/home/ubuntu/…

GJB 5000B二级-ESM外部供方管理

一、主要变化情况 新增3项(红色)、删除1项(黄色)、合并2项(绿色)、修订4项(蓝色) 将原标准过程域名称“供方协议管理”改为“外部供方管理”,其适应范围包括所以形式的外部提供过程、产品和服务协议,同时增加对外部供方按协议提供过程、产品和服务能力评价的内容,…

小偷和抢劫是被怎么遏制的?

小偷和抢劫是怎么被消灭的&#xff1f; 是被摄像头消灭的&#xff01; 一切土地和实物都会被安装传感设备监控 农业生产用地也会被物联检测 趣讲大白话&#xff1a;万物互联时代稳步实现 *********** 全国有5000万亩茶园 20年内一定会被物联网化 进入精耕农业时代 20年后&…

一篇文章带你了解自动化测试开发

都讲自动化测试开发&#xff0c;当然要把开发自动化测试框架也当做一个项目来做。这时候&#xff0c;就需要考虑应该选择何种类型的自动化测试框架&#xff1a;数据驱动、关键字驱动、还是Junit ,TestNG ? 抑或直接利用现有的开源自动化测试框架&#xff0c;如Robot Framework…

Mysql内核查询成本计算实战(一)

目录 Mysql内核查询成本计算实战&#xff08;一&#xff09; Optimizer Trace 什么是成本 I/O成本 CPU成本 单表查询的成本 MySQL查询成本计算实战 1.根据搜索条件&#xff0c;找出所有可能使用的索引 2. 计算全表扫描的代价 3. 计算使用不同索引执行查询的代价 4. 对…

CAD中怎么局部升降桥架?CAD局部升降操作技巧

在使用浩辰CAD电气软件绘制电气图纸的时候&#xff0c;常常会用到三维桥架中的一些功能来进行桥架的CAD设计工作&#xff0c;为了让大家对此有更深入的了解&#xff0c;接下来的CAD设计教程就和小编一起来看看正版CAD软件——浩辰CAD电气软件的三维桥架中局部升降功能的相关使用…

Magisk模块开发指南

BusyBox Magisk整合了功能完整的BusyBox二进制文件(包括对SELinux的完整支持)。执行文件位于/data/adb/magisk/busybox。Magisk的BusyBox支持运行时可切换的“ASH Standalone Shell Mode(ASH独立Shell模式)”。这种独立模式的意思是,在ashshell的中的BusyBox运行时,无论PATH…

MySQL核心参数优化文件my.ini详解

一.数据库服务器配置 CPU&#xff1a;48C 内存&#xff1a;128G DISK&#xff1a;3.2TSSD 二.CPU的优化 innodb_thread_concurrency32 表示SQL经过解析后&#xff0c;允许同时有32个线程去innodb引擎取数据&#xff0c;如果超过32个&#xff0c;则需要排队&#xff1b; 值太…

spring系列 SpringMVC-拦截器

拦截器&#xff08;Interceptor&#xff09;是在SpringMVC中动态拦截控制器方法的执行。 拦截器执行流程&#xff1a; 拦截器与过滤器区别 归属不同&#xff1a;Filter属于Servlet技术&#xff0c;Interceptor属于SpringMVC技术 拦截内容不同&#xff1a;Filter对所有访问进…

【Mysql第二期 MySQL环境搭建】

文章目录01.为什么要安装新版本&#xff1f;02.官网下载mysql03.安装配置初始化mysql04.查看 MySQL服务05.验证是否安装成功06.修改root密码07.如果有navicat工具可以在测试一下&#xff1a;01.为什么要安装新版本&#xff1f; mysql8.x版本和msyql5.x版本zip安装的方式大同小…

证券交易金融知识学习(1)

学习目标&#xff1a; 需要做一些关于投资交易软件的测试&#xff0c;需要了解操作背后的交易意义&#xff0c;需要学习一些金融基础知识。本人是金融证券交易的小白&#xff0c;从0开始学习。故记录一些金融知识学习的笔记&#xff0c;比较零散&#xff0c;目的是为了让自己复…

Spring-DI相关内容

Spring-DI相关内容 5&#xff0c;DI相关内容 前面我们已经完成了bean相关操作的讲解&#xff0c;接下来就进入第二个大的模块DI依赖注入&#xff0c;首先来介绍下Spring中有哪些注入方式? 我们先来思考 向一个类中传递数据的方式有几种? 普通方法(set方法)构造方法 依赖注…

【数据结构】8.4 选择排序

文章目录1. 简单选择排序简单选择排序算法简单排序算法分析2. 堆排序堆的定义堆的调整堆的建立堆排序算法堆排序算法分析1. 简单选择排序 基本思想 在待排序的数据中选出最大&#xff08;小&#xff09;的元素放在其最终的位置。 基本操作 首先通过 n - 1 次关键字比较&…

计算机SCI期刊能一稿多投吗? - 易智编译EaseEditing

首先建议不要一稿多投&#xff0c;投稿前要对目标期刊了解清楚&#xff0c;是什么方向&#xff0c;什么水平的。 可以看看期刊近期发表的文章&#xff0c;是什么方向的&#xff0c;这样会更精准。 一稿多投就是广撒网嘛&#xff0c;还不如做好功课&#xff0c;找到对应期刊&a…

网络知识详解之:HTTPS通信原理剖析(对称、非对称加密、数字签名、数字证书)

网络知识详解之&#xff1a;HTTPS通信原理剖析&#xff08;对称、非对称加密、数字签名、数字证书&#xff09; 计算机网络相关知识体系详解 网络知识详解之&#xff1a;TCP连接原理详解网络知识详解之&#xff1a;HTTP协议基础网络知识详解之&#xff1a;HTTPS通信原理剖析&…

Es6 扩展运算符... ,以及rest和arguments

扩展运算符... … 扩展运算符能将 数组 转换为逗号分隔的 参数序列 应用场景&#xff1a; 多个数组的合并 var arr4 [1, 2, 3];var arr5 [4, 5, 6];var arr6 [...arr4, ...arr5];//合并数组 也可以为数组的一部分arr6的值应为[1,2,3,4,5,6] 数组的克隆&#xff0…