WTL 界面设计篇(CSkinComboBox)

2023-11-17

头文件声明(CSkinComboBox.h):

#pragma once

#include "SkinManager.h"

#define		WM_CBO_EDIT_MOUSE_HOVER		WM_USER + 1
#define		WM_CBO_EDIT_MOUSE_LEAVE		WM_USER + 2
#define		WM_CBO_LIST_HIDE			WM_USER + 3

class CSkinComboBoxEdit : public CWindowImpl<CSkinComboBoxEdit, CEdit>
{
public:
	CSkinComboBoxEdit(void);
	~CSkinComboBoxEdit(void);

	BEGIN_MSG_MAP_EX(CSkinComboBoxEdit)
		MSG_WM_ERASEBKGND(OnEraseBkgnd)
		MSG_WM_MOUSEMOVE(OnMouseMove)
		MSG_WM_MOUSELEAVE(OnMouseLeave)
		MSG_WM_SETFOCUS(OnSetFocus)
		MSG_WM_KILLFOCUS(OnKillFocus)
		MSG_OCM_CTLCOLOREDIT(OnCtlColor)
		DEFAULT_REFLECTION_HANDLER()
	END_MSG_MAP()

public:
	void SetOwnerWnd(HWND hWnd);
	void SetDefaultText(LPCTSTR lpszText);
	BOOL IsDefaultText();
	void SetDefaultTextMode(BOOL bIsDefText);

	BOOL SubclassWindow(HWND hWnd);

private:
	BOOL OnEraseBkgnd(CDCHandle dc);
	void OnMouseMove(UINT nFlags, CPoint point);
	void OnMouseLeave();
	void OnSetFocus(CWindow wndOld);
	void OnKillFocus(CWindow wndFocus);
	HBRUSH OnCtlColor(CDCHandle dc, CEdit edit);

	BOOL StartTrackMouseLeave();
	void SetMarginsEx(int nLeft, int nTop, int nRight, int nBottom);	// 设置上下左右边距函数

private:
	HWND m_hOwnerWnd;
	BOOL m_bMouseTracking;
	BOOL m_bIsDefText;
	CString m_strDefText;
	HBRUSH m_hBrush;
};

class CSkinComboBoxListBox : public CWindowImpl<CSkinComboBoxListBox, CListBox>
{
public:
	CSkinComboBoxListBox(void);
	~CSkinComboBoxListBox(void);

	BEGIN_MSG_MAP_EX(CSkinComboBoxListBox)
		MSG_WM_SHOWWINDOW(OnShowWindow)
	END_MSG_MAP()

public:
	void SetOwnerWnd(HWND hWnd);

private:
	void OnShowWindow(BOOL bShow, UINT nStatus);

private:
	HWND m_hOwnerWnd;
};

class CSkinComboBox : public CWindowImpl<CSkinComboBox, CComboBox>
{
public:
	CSkinComboBox(void);
	~CSkinComboBox(void);

	BEGIN_MSG_MAP_EX(CSkinComboBox)
		MSG_WM_CREATE(OnCreate)
		MSG_WM_ERASEBKGND(OnEraseBkgnd)
		MSG_WM_SIZE(OnSize)
		MSG_WM_PAINT(OnPaint)
		MSG_WM_LBUTTONDOWN(OnLButtonDown)
		MSG_WM_LBUTTONUP(OnLButtonUp)
		MSG_WM_MOUSEMOVE(OnMouseMove)
		MSG_WM_MOUSELEAVE(OnMouseLeave)
		MSG_WM_DESTROY(OnDestroy)
		MESSAGE_HANDLER_EX(WM_CBO_EDIT_MOUSE_HOVER, OnEditMouseHover)
		MESSAGE_HANDLER_EX(WM_CBO_EDIT_MOUSE_LEAVE, OnEditMouseLeave)
		MESSAGE_HANDLER_EX(WM_CBO_LIST_HIDE, OnListHide)
		DEFAULT_REFLECTION_HANDLER()
	END_MSG_MAP()

public:
	BOOL SetBgNormalPic(LPCTSTR lpszFileName, RECT * lpNinePart = NULL);
	BOOL SetBgHotPic(LPCTSTR lpszFileName, RECT * lpNinePart = NULL);
	BOOL SetArrowNormalPic(LPCTSTR lpszFileName);
	BOOL SetArrowHotPic(LPCTSTR lpszFileName);
	BOOL SetArrowPushedPic(LPCTSTR lpszFileName);
	void SetTransparent(BOOL bTransparent, HDC hBgDC);
	void SetDefaultText(LPCTSTR lpszText);
	BOOL IsDefaultText();
	void SetMarginsEx(int nLeft, int nTop, int nRight, int nBottom);	// 设置上下左右边距函数
	void SetArrowWidth(int nWidth);
	BOOL SubclassWindow(HWND hWnd);
	
private:
	int OnCreate(LPCREATESTRUCT lpCreateStruct);
	BOOL OnEraseBkgnd(CDCHandle dc);
	void OnPaint(CDCHandle dc);
	void OnLButtonDown(UINT nFlags, CPoint point);
	void OnLButtonUp(UINT nFlags, CPoint point);
	void OnMouseMove(UINT nFlags, CPoint point);
	void OnMouseLeave();
	void OnSize(UINT nType, CSize size);
	void OnDestroy();
	LRESULT OnEditMouseHover(UINT uMsg, WPARAM wParam, LPARAM lParam);
	LRESULT OnEditMouseLeave(UINT uMsg, WPARAM wParam, LPARAM lParam);
	LRESULT OnListHide(UINT uMsg, WPARAM wParam, LPARAM lParam);

	BOOL StartTrackMouseLeave();
	void CalcCenterRect(CRect& rcDest, int cx, int cy, CRect& rcCenter);

	void DrawParentWndBg(HDC hDC);

private:
	CImageEx * m_lpBgImgN;
	CImageEx * m_lpBgImgH;
	CImageEx * m_lpArrowImgN;
	CImageEx * m_lpArrowImgH;
	CImageEx * m_lpArrowImgP;
	BOOL m_bFocus, m_bPress, m_bHover, m_bMouseTracking;
	BOOL m_bArrowPress, m_bArrowHover;
	BOOL m_bTransparent;
	HDC m_hBgDC;
	int m_nArrowWidth;
	CRect m_rcArrow;
	CSkinComboBoxEdit m_Edit;
	CSkinComboBoxListBox m_ListBox;
};

源码定义(CSkinComboBox.cpp):

#include "StdAfx.h"
#include "SkinComboBox.h"

CSkinComboBoxEdit::CSkinComboBoxEdit(void)
{
	m_hOwnerWnd = NULL;
	m_bMouseTracking = FALSE;
	m_bIsDefText = FALSE;
	m_hBrush = NULL;
}

CSkinComboBoxEdit::~CSkinComboBoxEdit(void)
{
	if (m_hBrush != NULL)
	{
		::DeleteObject(m_hBrush);
		m_hBrush = NULL;
	}
}

void CSkinComboBoxEdit::SetOwnerWnd(HWND hWnd)
{
	m_hOwnerWnd = hWnd;
}

void CSkinComboBoxEdit::SetDefaultText(LPCTSTR lpszText)
{
	m_strDefText = lpszText;
}

BOOL CSkinComboBoxEdit::IsDefaultText()
{
	return m_bIsDefText;
}

void CSkinComboBoxEdit::SetDefaultTextMode(BOOL bIsDefText)
{
	if (bIsDefText == m_bIsDefText)
		return;

	m_bIsDefText = bIsDefText;
	if (m_bIsDefText)
	{
		SetWindowText(m_strDefText);
	}
	else
	{
		SetWindowText(_T(""));
	}
}

BOOL CSkinComboBoxEdit::SubclassWindow(HWND hWnd)
{
	__super::SubclassWindow(hWnd);

	SetDefaultText(m_strDefText);

// 	CRect rcClient;
// 	GetClientRect(&rcClient);
// 	rcClient.left += 200;
// 	this->SetRect(rcClient);
// 	SetMarginsEx(30, 0, 0, 0);

	return TRUE;
}

BOOL CSkinComboBoxEdit::OnEraseBkgnd(CDCHandle dc)
{
	return TRUE;
}

void CSkinComboBoxEdit::OnMouseMove(UINT nFlags, CPoint point)
{
	SetMsgHandled(FALSE);

	if (!m_bMouseTracking)
	{
		m_bMouseTracking = TRUE;
		StartTrackMouseLeave();

		if (::IsWindow(m_hOwnerWnd))
			::SendMessage(m_hOwnerWnd, WM_CBO_EDIT_MOUSE_HOVER, 0, 0);
	}
}

void CSkinComboBoxEdit::OnMouseLeave()
{
	SetMsgHandled(FALSE);

	m_bMouseTracking = FALSE;
	if (::IsWindow(m_hOwnerWnd))
		::SendMessage(m_hOwnerWnd, WM_CBO_EDIT_MOUSE_LEAVE, 0, 0);
}

void CSkinComboBoxEdit::OnSetFocus(CWindow wndOld)
{
	SetMsgHandled(FALSE);

	if (m_bIsDefText)
	{
		m_bIsDefText = FALSE;
		SetWindowText(_T(""));
	}
}

void CSkinComboBoxEdit::OnKillFocus(CWindow wndFocus)
{
	SetMsgHandled(FALSE);

	if (GetWindowTextLength() <= 0 && !m_strDefText.IsEmpty())
	{
		m_bIsDefText = TRUE;
		SetWindowText(m_strDefText);
	}
}

HBRUSH CSkinComboBoxEdit::OnCtlColor(CDCHandle dc, CEdit edit)
{
	CRect rcWindow;
	GetWindowRect(&rcWindow);

	CRect rcClient;
	GetClientRect(&rcClient);

	ClientToScreen(&rcClient);
	rcClient.OffsetRect(-rcWindow.left, -rcWindow.top);

	rcWindow.OffsetRect(-rcWindow.left, -rcWindow.top);
	
	if (NULL == m_hBrush)
		m_hBrush = ::CreateSolidBrush(RGB(255,255,255));
	
	if (m_bIsDefText)
		::SetTextColor(dc, RGB(128,128,128));
	else
		::SetTextColor(dc, RGB(0,0,0));

	return (HBRUSH)m_hBrush;
}

BOOL CSkinComboBoxEdit::StartTrackMouseLeave()
{
	TRACKMOUSEEVENT tme = { 0 };
	tme.cbSize = sizeof(tme);
	tme.dwFlags = TME_LEAVE;
	tme.hwndTrack = m_hWnd;
	return _TrackMouseEvent(&tme);
}

// 设置上下左右边距函数
void CSkinComboBoxEdit::SetMarginsEx(int nLeft, int nTop, int nRight, int nBottom)
{
	CRect rtClient;
	GetClientRect(rtClient);

	CRect rt(rtClient.left + nLeft, rtClient.top + nTop, 
		rtClient.right - nRight, rtClient.bottom - nBottom);
	SetRectNP(rt);
}

CSkinComboBoxListBox::CSkinComboBoxListBox(void)
{
	m_hOwnerWnd = NULL;
}

CSkinComboBoxListBox::~CSkinComboBoxListBox(void)
{

}

void CSkinComboBoxListBox::SetOwnerWnd(HWND hWnd)
{
	m_hOwnerWnd = hWnd;
}

void CSkinComboBoxListBox::OnShowWindow(BOOL bShow, UINT nStatus)
{
	SetMsgHandled(FALSE);

	if (!bShow)
	{
		::SendMessage(m_hOwnerWnd, WM_CBO_LIST_HIDE, 0, 0);
	}
}

CSkinComboBox::CSkinComboBox(void)
{
	m_lpBgImgN = NULL;
	m_lpBgImgH = NULL;
	m_lpArrowImgN = NULL;
	m_lpArrowImgH = NULL;
	m_lpArrowImgP = NULL;
	m_bFocus = m_bPress = m_bHover = m_bMouseTracking = FALSE;
	m_bTransparent = FALSE;
	m_hBgDC = NULL;
	m_bArrowPress = FALSE;
	m_bArrowHover = FALSE;
	m_nArrowWidth = 17;
	m_rcArrow.SetRectEmpty();
}

CSkinComboBox::~CSkinComboBox(void)
{
}

BOOL CSkinComboBox::SetBgNormalPic(LPCTSTR lpszFileName, RECT * lpNinePart/* = NULL*/)
{
	CSkinManager::GetInstance()->ReleaseImage(m_lpBgImgN);
	m_lpBgImgN = CSkinManager::GetInstance()->GetImage(lpszFileName);
	if (m_lpBgImgN != NULL)
		m_lpBgImgN->SetNinePart(lpNinePart);
	return (m_lpBgImgN != NULL) ? TRUE : FALSE;
}

BOOL CSkinComboBox::SetBgHotPic(LPCTSTR lpszFileName, RECT * lpNinePart/* = NULL*/)
{
	CSkinManager::GetInstance()->ReleaseImage(m_lpBgImgH);
	m_lpBgImgH = CSkinManager::GetInstance()->GetImage(lpszFileName);
	if (m_lpBgImgH != NULL)
		m_lpBgImgH->SetNinePart(lpNinePart);
	return (m_lpBgImgH != NULL) ? TRUE : FALSE;
}

BOOL CSkinComboBox::SetArrowNormalPic(LPCTSTR lpszFileName)
{
	CSkinManager::GetInstance()->ReleaseImage(m_lpArrowImgN);
	m_lpArrowImgN = CSkinManager::GetInstance()->GetImage(lpszFileName);
	return (m_lpArrowImgN != NULL) ? TRUE : FALSE;
}

BOOL CSkinComboBox::SetArrowHotPic(LPCTSTR lpszFileName)
{
	CSkinManager::GetInstance()->ReleaseImage(m_lpArrowImgH);
	m_lpArrowImgH = CSkinManager::GetInstance()->GetImage(lpszFileName);
	return (m_lpArrowImgH != NULL) ? TRUE : FALSE;
}

BOOL CSkinComboBox::SetArrowPushedPic(LPCTSTR lpszFileName)
{
	CSkinManager::GetInstance()->ReleaseImage(m_lpArrowImgP);
	m_lpArrowImgP = CSkinManager::GetInstance()->GetImage(lpszFileName);
	return (m_lpArrowImgP != NULL) ? TRUE : FALSE;
}

void CSkinComboBox::SetTransparent(BOOL bTransparent, HDC hBgDC)
{
	m_bTransparent = bTransparent;
	m_hBgDC = hBgDC;
}

void CSkinComboBox::SetDefaultText(LPCTSTR lpszText)
{
	m_Edit.SetDefaultText(lpszText);
}

BOOL CSkinComboBox::IsDefaultText()
{
	return m_Edit.IsDefaultText();
}

// 设置上下左右边距函数
void CSkinComboBox::SetMarginsEx(int nLeft, int nTop, int nRight, int nBottom)
{
// 	CRect rtClient;
// 	GetClientRect(rtClient);
// 
// 	CRect rt(rtClient.left + nLeft, rtClient.top + nTop, 
// 		rtClient.right - nRight, rtClient.bottom - nBottom);
// 	SetRectNP(rt);
}

void CSkinComboBox::SetArrowWidth(int nWidth)
{
	m_nArrowWidth = nWidth;
}

BOOL CSkinComboBox::SubclassWindow(HWND hWnd)
{
	BOOL bRet = __super::SubclassWindow(hWnd);

 	COMBOBOXINFO stComboBoxInfo;
 	stComboBoxInfo.cbSize = sizeof(stComboBoxInfo);
 	GetComboBoxInfo(&stComboBoxInfo);

	m_Edit.SetOwnerWnd(m_hWnd);
	m_Edit.SubclassWindow(stComboBoxInfo.hwndItem);

	m_ListBox.SetOwnerWnd(m_hWnd);
	m_ListBox.SubclassWindow(stComboBoxInfo.hwndList);

	return TRUE;
}

int CSkinComboBox::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
	SetMsgHandled(FALSE);
	return 0;
}

BOOL CSkinComboBox::OnEraseBkgnd(CDCHandle dc)
{
	return TRUE;
}

void CSkinComboBox::OnPaint(CDCHandle dc)
{
	CPaintDC PaintDC(m_hWnd);

	HDC hDC = PaintDC.m_hDC;

	CRect rcClient;
	GetClientRect(&rcClient);

	CRect rcArrow;
	HRGN hRgn2 = NULL;
	if (m_lpArrowImgN != NULL && !m_lpArrowImgN->IsNull())
	{
		int cxIcon = m_nArrowWidth;
		int cyIcon = m_lpArrowImgN->GetHeight();

		CalcCenterRect(rcClient, cxIcon, cyIcon, rcArrow);
		rcArrow.right = rcClient.right - 2;
		rcArrow.left = rcArrow.right - cxIcon;
	}

	//PaintDC.FillSolidRect(rcClient, RGB(255, 255, 255));

	if (m_bTransparent)
		DrawParentWndBg(hDC);

	if (m_bHover)
	{
		if (m_lpBgImgH != NULL && !m_lpBgImgH->IsNull())
		{
			m_lpBgImgH->Draw2(hDC, rcClient);
		}
		else
		{
			if (m_lpBgImgN != NULL && !m_lpBgImgN->IsNull())
				m_lpBgImgN->Draw2(hDC, rcClient);
		}
	}
	else
	{
		if (m_lpBgImgN != NULL && !m_lpBgImgN->IsNull())
			m_lpBgImgN->Draw2(hDC, rcClient);
	}

	if (m_bArrowPress)
	{
		if (m_lpArrowImgP != NULL && !m_lpArrowImgP->IsNull())
			m_lpArrowImgP->Draw2(hDC, rcArrow);
	}
	else if (m_bArrowHover)
	{
		if (m_lpArrowImgH != NULL && !m_lpArrowImgH->IsNull())
			m_lpArrowImgH->Draw2(hDC, rcArrow);
	}
	else
	{
		if (m_lpArrowImgN != NULL && !m_lpArrowImgN->IsNull())
			m_lpArrowImgN->Draw2(hDC, rcArrow);
	}
}

void CSkinComboBox::OnLButtonDown(UINT nFlags, CPoint point)
{
	//SetMsgHandled(FALSE);

	if (m_rcArrow.PtInRect(point))
	{
		if (!m_ListBox.IsWindowVisible())
		{
			m_bArrowPress = TRUE;
			Invalidate();
			ShowDropDown(TRUE);
		}
	}
}

void CSkinComboBox::OnLButtonUp(UINT nFlags, CPoint point)
{
	//SetMsgHandled(FALSE);
	
// 	if (m_bPress)
// 	{
// 		m_bPress = FALSE;
// 		::InvalidateRect(m_hWnd, NULL, TRUE);
// 	}
}

void CSkinComboBox::OnMouseMove(UINT nFlags, CPoint point)
{
	//SetMsgHandled(FALSE);

	BOOL bRePaint = FALSE;

	if (!m_bMouseTracking)
	{
		StartTrackMouseLeave();
		m_bMouseTracking = TRUE;
		m_bHover = TRUE;
		bRePaint = TRUE;
	}

	if (m_rcArrow.PtInRect(point))
	{
		if (!m_bArrowHover)
		{
			m_bArrowHover = TRUE;
			bRePaint = TRUE;
		}
	}
	else
	{
		if (m_bArrowHover)
		{
			m_bArrowHover = FALSE;
			bRePaint = TRUE;
		}
	}

	if (bRePaint)
		Invalidate();
}

void CSkinComboBox::OnMouseLeave()
{
	//SetMsgHandled(FALSE);

	m_bMouseTracking = FALSE;

	if (!m_ListBox.IsWindowVisible())
	{
		CPoint pt;
		GetCursorPos(&pt);

		CRect rcWindow;
		GetWindowRect(&rcWindow);

		if (!rcWindow.PtInRect(pt))
			m_bHover = FALSE;

		m_bArrowHover = FALSE;
		Invalidate();
	}
}

void CSkinComboBox::OnDestroy()
{
	SetMsgHandled(FALSE);

	CSkinManager::GetInstance()->ReleaseImage(m_lpBgImgN);
	CSkinManager::GetInstance()->ReleaseImage(m_lpBgImgH);
	CSkinManager::GetInstance()->ReleaseImage(m_lpArrowImgN);
	CSkinManager::GetInstance()->ReleaseImage(m_lpArrowImgH);
	CSkinManager::GetInstance()->ReleaseImage(m_lpArrowImgP);
}

void CSkinComboBox::OnSize(UINT nType, CSize size)
{
	DefWindowProc();

	CRect rcClient;
	GetClientRect(&rcClient);

	CRect rcEdit;
	m_Edit.GetWindowRect(&rcEdit);
	ScreenToClient(&rcEdit);

	CDCHandle dc = m_Edit.GetDC();
	TEXTMETRIC tm = {0};
	dc.GetTextMetrics(&tm);
	int nFontHeight = tm.tmHeight + tm.tmExternalLeading;
	int nMargin = (rcEdit.Height() - nFontHeight) / 2;
	m_Edit.ReleaseDC(dc);

	rcEdit.DeflateRect(0, nMargin);
	rcEdit.right = rcClient.right - 2 - m_nArrowWidth;

	m_Edit.MoveWindow(&rcEdit, FALSE);

	m_rcArrow.left = rcClient.right - 2 - m_nArrowWidth;
	m_rcArrow.right = m_rcArrow.left + m_nArrowWidth;
	m_rcArrow.top = rcClient.top;
	m_rcArrow.bottom = rcClient.bottom;
}

LRESULT CSkinComboBox::OnEditMouseHover(UINT uMsg, WPARAM wParam, LPARAM lParam)
{
	if (!m_bHover)
	{
		m_bHover = TRUE;
		Invalidate();
	}

	return 0;
}

LRESULT CSkinComboBox::OnEditMouseLeave(UINT uMsg, WPARAM wParam, LPARAM lParam)
{
	CPoint pt;
	GetCursorPos(&pt);

	CRect rcWindow;
	GetWindowRect(&rcWindow);

	if (!rcWindow.PtInRect(pt))
	{
		if (m_bHover)
		{
			m_bHover = FALSE;
			Invalidate();
		}
	}

	return 0;
}

LRESULT CSkinComboBox::OnListHide(UINT uMsg, WPARAM wParam, LPARAM lParam)
{
	m_bHover = FALSE;
	m_bArrowHover = FALSE;
	m_bArrowPress = FALSE;
	Invalidate();
	return 0;
}

BOOL CSkinComboBox::StartTrackMouseLeave()
{
	TRACKMOUSEEVENT tme = { 0 };
	tme.cbSize = sizeof(tme);
	tme.dwFlags = TME_LEAVE;
	tme.hwndTrack = m_hWnd;
	return _TrackMouseEvent(&tme);
}

void CSkinComboBox::CalcCenterRect(CRect& rcDest, int cx, int cy, CRect& rcCenter)
{
	int x = (rcDest.Width() - cx + 1) / 2;
	int y = (rcDest.Height() - cy + 1) / 2;

	rcCenter = CRect(rcDest.left+x, rcDest.top+y, rcDest.left+x+cx, rcDest.top+y+cy);
}

void CSkinComboBox::DrawParentWndBg(HDC hDC)
{
	HWND hParentWnd = ::GetParent(m_hWnd);

	CRect rcWindow;
	GetWindowRect(&rcWindow);
	::ScreenToClient(hParentWnd, (LPPOINT)&rcWindow); 
	::ScreenToClient(hParentWnd, ((LPPOINT)&rcWindow)+1);

	::BitBlt(hDC, 0, 0, rcWindow.Width(), rcWindow.Height(), m_hBgDC, rcWindow.left, rcWindow.top, SRCCOPY);
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

WTL 界面设计篇(CSkinComboBox) 的相关文章

  • webpack从入门到放弃(二:基本属性)

    本节介绍webpack五大核心概念 一 entry 入口 指示 Webpack 从哪个文件开始打包 webpack是根据依赖关系进行打包 以入口文件为起点 根据依赖关系形成依赖树 在生产模式打包时 根据tree shaking未引用的文件不
  • 8259初始化命令字(ICW1-ICW4)

    8259A的中断操作功能很强 包括中断的请求 屏蔽 排队 结束 级联以及提供中断类型号和查询等操作 并且其操作的方式又有不同 它既能实现向量中断 又能进行中断查询 它可以用于16位机 也可用于8位机 因此 使用起来感到复杂且不好掌握 为此
  • idea 提交远程库冲突解决

    idea 提交远程库冲突解决 github团队协作 正常开发 管理得好的话 不会出现代码冲突问题 项目经理会划分模块 每个小组成员各自开发模块 公共的代码由专门的人负责维护 但是偶尔管理沟通问题导致出现冲突偶尔也是会出现的 冲突出现场景过程
  • Visual Studio Code中英文的切换

    我在学习 Flutter 的时候 使用过 VsCode 来开发 一般来说 安装好的 VsCode 都是英文版的 有些人可能不太习惯用英文版的 不过没有关系 我在这里提供中英文切换的方法给大家 切换为中文 1 点击 1 中的选项 在 2 中的
  • java栈溢出现象_JVM源码分析之栈溢出完全解读

    概述 之所以想写这篇文章 其实是因为最近有不少系统出现了栈溢出导致进程crash的问题 并且很隐蔽 根本原因还得借助coredump才能分析出来 于是想从JVM实现的角度来全面分析下栈溢出的这类问题 或许你碰到过如下的场景 日志里出现了St
  • python uiautomator2 init 作用

    目录 背景 具体步骤 总结 背景 在搭建Python的自动化测试环境时 执行脚本一直报错 ions GatewayError Uiautomator started failed

随机推荐

  • (Linux)docker容器安装Kibana--简单安装

    docker容器安装Kibana docker容器安装Kibana 启动Kibana docker容器安装Kibana 使用docker命令安装Kibana容器 sudo docker pull kibana 7 4 2 等待下载安装完成
  • matlab 2022更新

    matlab 2022b dictionary 对象 将唯一键映射到值以便快速查找 深度学习工具箱 直接导入 PyTorch 模型 将模型导出到 TensorFlow Simulink 将库浏览器停靠在模型中 MATLAB NET 引擎 A
  • Bootstrap JavaScript插件:警告信息 (alert.js)

    作者 WangMin 格言 努力做好自己喜欢的每一件事 CSDN原创文章 博客地址 WangMin 警告框插件 alert js 为警告框组件一个关闭功能 就是点击警告框的关闭按钮 可以让警告框消失 并将它从 DOM 中删除 使用方法 1
  • SpringBoot+ActiveMQ-点对点队列模式(消费端)

    ActiveMQ消息中间件的点对点模式point to point 消息队列 生产端案例 配合消费端测试 SpringBoot ActiveMQ生产端 ActiveMQ版本 apache activemq 5 16 5 SpringBoot
  • C#基础教程

    我的第一个 C 程序 Console WriteLine Hello World Console ReadKey 编写 Console Readkey 这个函数是为了在控制台窗口停留一下 直到敲击键盘为止 不然运行时 Hello World
  • 树莓派开机启动终端运行方法

    在路径 home pi config autostart 下建立一个文本文本 并以后缀名 desktop 结尾 根据是否需要显示终端 写入下面两段内容之一 显示终端启动 Desktop Entry Name testboot Icon ut
  • 基于SpringBoot的校园请假管理系统

    全网粉丝20W csdn特邀作者 博客专家 CSDN新星计划导师 java领域优质创作者 博客之星 掘金 华为云 阿里云 InfoQ等平台优质作者 专注于Java技术领域和毕业项目实战 文末获取项目下载方式 一 项目背景介绍 校园请假信息管
  • ruoyi若依获取当前登录用户以及用户信息

    this store state user 登录成功 有token情况下 直接打印这个
  • matlab knn回归,(25条消息)KNN算法matlab函数 ClassificationKNN.fit

    mdl ClassificationKNN fit X Y 基于特征和分类标签返回分类模型 X 每行表示一个特征向量 每列表示特征向量中一个变量 Y 每行代表的是X中特征向量说代表的标签或种类 mdl ClassificationKNN f
  • 关于用vector管理CImage时遇到的坑

    假设有一个类A 里面有一个CImage 如果用vector储存 erase前面的元素后 后面的CImage就无法使用 会报ATLASSERT hBitmap m hBitmap 检查失败 struct A CImage img int tm
  • YoloV8改进策略:将CIoU替换成Wise-IoU,幸福涨点,值得拥有,还支持EIoU、GIoU、DIoU、SIoU无缝替换。

    文章目录 摘要 Wise IoU 论文翻译 摘要 简介 A ln norm损失 B 交集 并集 C 聚焦机制 相关工作 A BBR的损失函数 B 带FM的损失函数 方法 仿真实验 B 梯度消失问题的解决方法 C 提出的方法 实验 A 实验设
  • 乐观锁和悲观锁

    在学习Java时 我们常常会听到乐观锁和悲观锁 那么什么是乐观锁 什么是悲观锁呢 我们先来看一下如下情况 乐观锁就是先更新再检验 而悲观锁就是先进行保护然后再修改 为什么要保护 什么是保护 我们设想如下情况 A 100 现在有两个线程T1和
  • python wow自动打怪脚本官方教程_【按键精灵】魔兽世界LR 自动打怪脚本

    Hwnd Plugin Window Find 0 魔兽世界 设置换视角标志1 刚切换视角 0否 UserVar Flag1 0 Rem 开始 按Tab寻找目标 Call Plugin Bkgnd KeyPress Hwnd 9 Delay
  • (5)项目中DTO代替@Transient使用

    Transient 实体类字段上 此实体类和数据库表对应 某实体类对象字段要返回给前端 数据库里面没有 查询忽视数据库里面对应的字段 上面这种方法很乱也不见得好 使用DTO对象在每层数据中传输
  • Python连接MySQL

    Python连接MySQL可以使用多种库 比如pymysql mysql connector python PyMySQL等 这里以pymysql为例 介绍Python连接MySQL的基本操作 1 安装pymysql库 pip instal
  • 《ReactNative系列讲义》进阶篇---05.FlatList(二)

    版权声明 本文为博主原创文章 未经博主允许不得转载 一 简介 上篇文章中我们了解到了FlatList组件的基本用法 其实FlatList还有很多丰富的功能 可实现更多更灵活的业务需求 接下来让我们一起来看看吧 二 基础知识 支持单独的头部文
  • CUDA Samples: 获取设备属性信息

    通过调用CUDA的cudaGetDeviceProperties函数可以获得指定设备的相关信息 此函数会根据GPU显卡和CUDA版本的不同得到的结果也有所差异 下面code列出了经常用到的设备信息 include funset hpp in
  • 求助 oss异步回调 自定义参数接受不到

    客户端app服务器php获取方式 file get contents php input 获取到的值 只有系统参数
  • 网络字节序与主机字节序 高低位

    最近在项目开发过程中 需要在采用JAVA作为语言的服务器与采用C 作为语言的服务器间进行通信 这就涉及到这两种语言间数据类型的转换以及网络字节序与主机字节序的区别 该文主要说说网络字节序和主机字节序的区别以及Little endian与Bi
  • WTL 界面设计篇(CSkinComboBox)

    头文件声明 CSkinComboBox h pragma once include SkinManager h define WM CBO EDIT MOUSE HOVER WM USER 1 define WM CBO EDIT MOUS