关于WM_MOUSEHOVER和WM_MOUSELEAVE消息的用法以及按钮的变色问题!

如何让MFC窗口捕获并响应WM_MOUSEHOVER和WM_MOUSELEAVE消息 如何让窗口捕获并响应WM_MOUSEHOVER和WM_MOUSELEAVE消息 阅读详情

本文用代码的方式详细说明了Windows编程中WM_MOUSEHOVER和WM_MOUSELEAVE消息的用法,以及按钮的变色问题,实现的功能也很多,主要是示例了这两个消息的用法和具体实现按钮的变色。

代码的注释还算详细,就不多做说明了!看代码!

另外做一下功能的说明:

1: 在客户区点鼠标右键,弹出菜单可以关闭窗口!

2: 客户区中的那个巨大的按钮,鼠标移入和移出时可以变色和改变文字,单击鼠标左键可以更改客户区窗口的背景颜色!

3:在最上面的按钮上按住鼠标左键可以移动窗口!(按钮)

建一个空的win32工程,复制下面的代码就可以运行了,vs2012调试通过!!!

编译使用cpp文件,c++方式编译。



//#undef UNICODE  // 加上这行代码,可以编译非UNICODE版本

//如果达不到按钮变色的效果,加上下面这行代码
//#define _WIN32_WINNT  0x0400 

//如有问题,请批评指正。
//本程序在vs2012调试通过
#include<Windows.h>



#define ID_MINIMIZE   0
#define ID_MAXIMIZE   1
#define ID_CLOSE      2
#define ID_CAPTION    3
#define ID_CLICK      4


int indicator_color = 0; 

COLORREF m_color[6] = {RGB(255,0,0),RGB(0,255,0),RGB(0,0,255),
                       RGB(0,0,0),RGB(100,100,100),RGB(0,125,0)};
HBRUSH   m_hBrush[6];  //画刷句柄
HWND     btn_hwnd[5];  //按钮句柄
HINSTANCE m_hInstance;  //应用程序实例句柄


BOOL click_entry   = FALSE;  //FALSE 表示鼠标没有移入button上
BOOL min_entry     = FALSE;
BOOL max_entry     = FALSE;
BOOL close_entry   = FALSE;

// 主窗口过程
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);  
//ID号为ID_CAPTION的button窗口过程
LRESULT CALLBACK btn_CaptionProc(HWND,UINT,WPARAM,LPARAM);  
//ID号为ID_MINIMIZE的button窗口过程
LRESULT CALLBACK btn_MinProc(HWND,UINT,WPARAM,LPARAM); 
//ID号为ID_MAXIMIZE的button窗口过程
LRESULT CALLBACK btn_MaxProc(HWND,UINT,WPARAM,LPARAM); 
//ID号为ID_CLOSE的button窗口过程
LRESULT CALLBACK btn_CloseProc(HWND,UINT,WPARAM,LPARAM); 
//ID号为ID_CLICK的button窗口过程
LRESULT CALLBACK btn_ClickProc(HWND,UINT,WPARAM,LPARAM); 



//以下变量为更改button的窗口过程之用
WNDPROC old_btn_CaptionProc;
WNDPROC old_btn_MinProc;
WNDPROC old_btn_MaxProc;
WNDPROC old_btn_CloseProc;
WNDPROC old_btn_ClickProc;



//一个内部使用的函数,主要用于在ID为ID_CAPTION的按钮上输出文字
void MySetWindowText(const TCHAR *str)
{
	HDC hdc = GetDC(btn_hwnd[ID_CAPTION]);		
	SetBkColor(hdc,m_color[5]);
	SetTextColor(hdc,RGB(255,255,255));  //白色
	RECT rect;
	GetClientRect(btn_hwnd[ID_CAPTION],&rect);
	InvalidateRect(btn_hwnd[ID_CAPTION],NULL,TRUE);
	UpdateWindow(btn_hwnd[ID_CAPTION]);
	TextOut(hdc,0,rect.bottom / 3 * 2,str,lstrlen(str));
	ReleaseDC(btn_hwnd[ID_CAPTION],hdc);
}

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd)
{
	//初始化画刷
	for(int i = 0; i < 6; ++i)
		m_hBrush[i] = CreateSolidBrush(m_color[i]);

	m_hInstance = hInstance;

	WNDCLASS wndclass;
	wndclass.cbClsExtra = 0;
	wndclass.cbWndExtra = 0;
	wndclass.hbrBackground = m_hBrush[3]; // 黑色
	wndclass.hCursor = LoadCursor(NULL,IDC_CROSS);
	wndclass.hIcon = LoadIcon(NULL,IDI_APPLICATION);
	wndclass.hInstance = hInstance;
	wndclass.lpfnWndProc = WndProc;
	wndclass.lpszClassName = TEXT("sunkang");
	wndclass.lpszMenuName = NULL;
	wndclass.style = CS_HREDRAW | CS_HREDRAW;
	RegisterClass(&wndclass);

	HWND hwnd = CreateWindow(TEXT("sunkang"),TEXT(""),WS_OVERLAPPEDWINDOW,
		CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,
		hInstance,NULL);

	ShowWindow(hwnd,nShowCmd);
	UpdateWindow(hwnd);

	MSG msg;

	while(GetMessage(&msg,NULL,0,0))
	{
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}

	//释放资源
	for(int i = 0; i < 6; ++i)
		DeleteObject(m_hBrush[i]);
}


LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
	//static HINSTANCE hInstance;
	static int cxClient,cyClient;
	static int click_btn_width,click_btn_height;
	switch(message)
	{
	case WM_CREATE:
		{
			//m_hInstance = (LPCREATESTRUCT(lParam))->hInstance;
			btn_hwnd[ID_CAPTION] = CreateWindow(TEXT("button"),TEXT(""),WS_CHILD | WS_VISIBLE | BS_OWNERDRAW,
				0,0,0,0,hwnd,HMENU(ID_CAPTION),m_hInstance,NULL);
			btn_hwnd[ID_CLICK] = CreateWindow(TEXT("button"),TEXT(""),WS_CHILD | WS_VISIBLE | BS_OWNERDRAW,
				0,0,0,0,hwnd,HMENU(ID_CLICK),m_hInstance,NULL);

			old_btn_CaptionProc = (WNDPROC)SetWindowLong(btn_hwnd[ID_CAPTION],
				                   GWL_WNDPROC,(LONG)btn_CaptionProc);
			old_btn_ClickProc = (WNDPROC)SetWindowLong(btn_hwnd[ID_CLICK],
				                   GWL_WNDPROC,LONG(btn_ClickProc));
			//以下三个按钮的父窗口为btn_hwnd[ID_CAPTION]
			btn_hwnd[ID_MINIMIZE] = CreateWindow(TEXT("button"),TEXT(""),WS_CHILD | WS_VISIBLE | BS_OWNERDRAW,
				0,0,0,0,btn_hwnd[ID_CAPTION],HMENU(ID_MINIMIZE),m_hInstance,NULL);
			btn_hwnd[ID_MAXIMIZE] = CreateWindow(TEXT("button"),TEXT(""),WS_CHILD | WS_VISIBLE | BS_OWNERDRAW,
				0,0,0,0,btn_hwnd[ID_CAPTION],HMENU(ID_MAXIMIZE),m_hInstance,NULL);
			btn_hwnd[ID_CLOSE] = CreateWindow(TEXT("button"),TEXT(""),WS_CHILD | WS_VISIBLE | BS_OWNERDRAW,
				0,0,0,0,btn_hwnd[ID_CAPTION],HMENU(ID_CLOSE),m_hInstance,NULL);
			//分别更改button的窗口过程

			
			old_btn_MinProc = (WNDPROC)SetWindowLong(btn_hwnd[ID_MINIMIZE],
				               GWL_WNDPROC,(LONG)(btn_MinProc));
			old_btn_MaxProc = (WNDPROC)SetWindowLong(btn_hwnd[ID_MAXIMIZE],
				               GWL_WNDPROC,(LONG)(btn_MaxProc));
			old_btn_CloseProc = (WNDPROC)SetWindowLong(btn_hwnd[ID_CLOSE],
				               GWL_WNDPROC,(LONG)(btn_CloseProc));
			
			break;
		}
	case WM_SIZE:
		{
			cxClient = LOWORD(lParam);
			cyClient = HIWORD(lParam);
			// 模拟标题栏的button
			MoveWindow(btn_hwnd[ID_CAPTION],0,0,cxClient,cyClient / 5,TRUE);
			click_btn_width = cxClient / 2;
			click_btn_height = cyClient / 5 * 2;
			//客户区中的button
			MoveWindow(btn_hwnd[ID_CLICK],cxClient / 4,cyClient / 5 * 2,click_btn_width,click_btn_height,TRUE);

			break;
		}
	case WM_CTLCOLORBTN:
		{
			if(HWND(lParam) == btn_hwnd[ID_CAPTION])
				return (LRESULT)m_hBrush[5];
			else
			{
				HDC hdc = HDC(wParam);
				LOGFONT lf;
				lf.lfCharSet = ANSI_CHARSET;
				lstrcpy(lf.lfFaceName,TEXT("宋体"));
				//lf.lfWidth = click_btn_width / 5;
				lf.lfHeight = click_btn_height;
				lf.lfItalic = FALSE;
				lf.lfClipPrecision = 0;
				lf.lfEscapement = 0;
				lf.lfOrientation = 0;
				lf.lfOutPrecision = 0;
				lf.lfPitchAndFamily = 0;
				lf.lfQuality = 0;
				lf.lfStrikeOut = FALSE;
				lf.lfUnderline = FALSE;
				lf.lfWeight = 400;
				if(click_entry == FALSE)
				{
					TCHAR name[] = TEXT("HELLO");
					lf.lfWidth = click_btn_width / lstrlen(name);
					HFONT hFont = CreateFontIndirect(&lf);
					HFONT old_font = (HFONT)SelectObject(hdc,hFont);
					SetBkColor(hdc,m_color[0]);
					SetTextColor(hdc,m_color[2]);
					TextOut(hdc,0,0,name,lstrlen(name));
					SelectObject(hdc,old_font);
					return (LRESULT)m_hBrush[0];
				}
				else
				{
					TCHAR name[] = TEXT("WORLD");
					lf.lfWidth = click_btn_width / lstrlen(name);
					HFONT hFont = CreateFontIndirect(&lf);
					HFONT old_font = (HFONT)SelectObject(hdc,hFont);
					SetBkColor(hdc,m_color[5]);
					SetTextColor(hdc,m_color[1]);
					TextOut(hdc,0,0,name,lstrlen(name));
					SelectObject(hdc,old_font);
					return (LRESULT)m_hBrush[5];
				}
			}
			break;
		}
	case WM_RBUTTONDOWN:
		{
			HMENU hMenu = CreatePopupMenu();
			AppendMenu(hMenu,MF_STRING,ID_CLOSE,TEXT("退出!"));
			POINT pt = {LOWORD(lParam),HIWORD(lParam)};
			ClientToScreen(hwnd,&pt);
			TrackPopupMenu(hMenu,TPM_LEFTALIGN | TPM_TOPALIGN,
				pt.x,pt.y,0,hwnd,NULL);
			DeleteObject(hMenu);
			break;
		}
	case WM_MOUSEMOVE:
		{
			TCHAR buf[] = TEXT("右键有惊喜!!!");
			MySetWindowText(buf);
			break;
		}
	case WM_COMMAND:
		{
			switch(LOWORD(wParam))
			{
	            case ID_CLOSE:
					 {
						 SendMessage(hwnd,WM_CLOSE,0,0);
						 break;
					 }
				case ID_CLICK:
					{
						indicator_color = ++indicator_color % 5;
						SetClassLong(hwnd,GCL_HBRBACKGROUND,(LONG)(m_hBrush[indicator_color]));
						InvalidateRect(hwnd,NULL,TRUE);
						UpdateWindow(hwnd);
						break;
					}
				default:
					break;
			}
			break;
		}
	case WM_NCCALCSIZE:
		{ //完全去掉标题栏和边框
			break;
		}
	case WM_SYSKEYDOWN:
		{  //屏蔽Alt + F4关闭窗口的功能
			if(wParam == VK_F4)
				;
			else
				return DefWindowProc(hwnd,message,wParam,lParam);
			break;
		}
	case WM_CLOSE:
		{
			if(IDOK == MessageBox(hwnd,TEXT("确定退出吗?"),TEXT("关闭窗口!"),MB_OKCANCEL | MB_ICONQUESTION))
				DestroyWindow(hwnd);
			break;
		}
	case WM_DESTROY:
		{
			PostQuitMessage(0);
			break;
		}
	default:
		return DefWindowProc(hwnd,message,wParam,lParam);
	}
	return 0;
}



LRESULT CALLBACK btn_CaptionProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
	//static HINSTANCE hInstace = 
	switch(message)
	{
	case WM_SIZE:
		{
			int cxClient = LOWORD(lParam);
			int cyClient = HIWORD(lParam);
			int btn_width = cxClient / 15;
			int btn_height = cyClient / 4;
			MoveWindow(btn_hwnd[ID_MINIMIZE],cxClient - btn_width * 3, 0,
				         btn_width,btn_height,TRUE);
			MoveWindow(btn_hwnd[ID_MAXIMIZE],cxClient - btn_width * 2, 0,
				         btn_width,btn_height,TRUE);
			MoveWindow(btn_hwnd[ID_CLOSE],cxClient - btn_width, 0,
				         btn_width,btn_height,TRUE);
			break;
		}
	case WM_CTLCOLORBTN:
		{
			HDC hdc = HDC(wParam);
			switch(GetDlgCtrlID(HWND(lParam)))
			{
			case ID_MINIMIZE:
				{
					if(min_entry == FALSE)
					{
						SetBkColor(hdc,m_color[5]);
						SetTextColor(hdc,m_color[0]);
						RECT rect;
						GetClientRect(HWND(lParam),&rect);
						DrawText(hdc,TEXT("最小化"),lstrlen(TEXT("最小化")),&rect,DT_BOTTOM | DT_CENTER);
						return LRESULT(m_hBrush[5]);
					}
					else
					{
						SetBkColor(hdc,m_color[0]);
						SetTextColor(hdc,m_color[1]);
						RECT rect;
						GetClientRect(HWND(lParam),&rect);
						DrawText(hdc,TEXT("最小化"),lstrlen(TEXT("最小化")),&rect,DT_BOTTOM | DT_CENTER);
						return LRESULT(m_hBrush[0]);
					}
					break;
				}
			case ID_MAXIMIZE:
				{
					if(max_entry == FALSE)
					{
						SetBkColor(hdc,m_color[5]);
						SetTextColor(hdc,m_color[1]);
						RECT rect;
						GetClientRect(HWND(lParam),&rect);
						DrawText(hdc,TEXT("最大化"),lstrlen(TEXT("最大化")),&rect,DT_BOTTOM | DT_CENTER);
						return LRESULT(m_hBrush[5]);
					}
					else
					{
						SetBkColor(hdc,m_color[1]);
						SetTextColor(hdc,m_color[0]);
						RECT rect;
						GetClientRect(HWND(lParam),&rect);
						DrawText(hdc,TEXT("最大化"),lstrlen(TEXT("最大化")),&rect,DT_BOTTOM | DT_CENTER);
						return LRESULT(m_hBrush[1]);
					}
					break;
				}
			case ID_CLOSE:
				{
					if(close_entry == FALSE)
					{
						SetBkColor(hdc,m_color[5]);
						SetTextColor(hdc,m_color[3]);
						RECT rect;
						GetClientRect(HWND(lParam),&rect);
						DrawText(hdc,TEXT("关闭"),lstrlen(TEXT("关闭")),&rect,DT_BOTTOM | DT_CENTER);
						return LRESULT(m_hBrush[5]);
					}
					else
					{
						SetBkColor(hdc,m_color[0]);
						SetTextColor(hdc,m_color[2]);
						RECT rect;
						GetClientRect(HWND(lParam),&rect);
						DrawText(hdc,TEXT("关闭"),lstrlen(TEXT("关闭")),&rect,DT_BOTTOM | DT_CENTER);
						return LRESULT(m_hBrush[0]);
					}
					break;
				}
			default:
				break;
			}
			break;
		}
	case WM_COMMAND:
		{
			switch(LOWORD(wParam))
			{
			case ID_MINIMIZE:
				{
					SendMessage(GetParent(hwnd),WM_SYSCOMMAND,SC_MINIMIZE,lParam);
					break;
				}
			case ID_MAXIMIZE:
				{
					SendMessage(GetParent(hwnd),WM_SYSCOMMAND,SC_MAXIMIZE,lParam);
					break;
				}
			case ID_CLOSE:
				{
					SendMessage(GetParent(hwnd),WM_CLOSE,0,0);
					break;
				}
			default:
				break;
			}
			break;
		}
	case WM_LBUTTONDOWN:
		{ //模拟标题栏的鼠标左键双击
			SendMessage(GetParent(hwnd),WM_NCLBUTTONDOWN,HTCAPTION,lParam);
			break;
		}
	case WM_LBUTTONDBLCLK:
		{
			SendMessage(GetParent(hwnd),WM_NCLBUTTONDBLCLK,HTCAPTION,lParam);
			break;
		}
	case WM_MOUSEMOVE:
		{	
			TCHAR buf[] = TEXT("温馨提示:双击鼠标左键可以最大化窗口,\
按住鼠标左键可以拖动窗口!");
			MySetWindowText(buf);
			break;
		}
	default:
		return CallWindowProc(old_btn_CaptionProc,hwnd,message,wParam,lParam);
		// 也可以用下面的方式,一样的。
		// return old_btn_CaptionProc(hwnd,message,wParam,lParam);
	}
	return 0;
}

LRESULT CALLBACK btn_ClickProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
	
	switch(message)
	{
	case WM_MOUSEMOVE:
		{


			if(click_entry == FALSE)
			{
				TRACKMOUSEEVENT tme;
				tme.cbSize = sizeof(TRACKMOUSEEVENT);
				tme.dwFlags = TME_HOVER | TME_LEAVE;
				tme.dwHoverTime = 1; //1ms 立即显示
				tme.hwndTrack = hwnd;
				//激活WM_MOUSEHOVER消息
				TrackMouseEvent(&tme);
			}
			break;
		}
	case WM_MOUSEHOVER:
		{
			click_entry = TRUE;
			InvalidateRect(hwnd,NULL,TRUE);
			UpdateWindow(hwnd);

			TCHAR buf[] = TEXT("点击鼠标左键可以更改窗口颜色!");
			MySetWindowText(buf);
			break;
		}
	case WM_MOUSELEAVE:
		{
			click_entry = FALSE;
			InvalidateRect(hwnd,NULL,TRUE);
			UpdateWindow(hwnd);
			break;
		}
	default:
		return CallWindowProc(old_btn_ClickProc,hwnd,message,wParam,lParam);
		//return old_btn_ClickProc(hwnd,message,wParam,lParam);
	}
	return 0;
}



LRESULT CALLBACK btn_MinProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
	
	switch(message)
	{
	case WM_MOUSEMOVE:
		{
			if(min_entry == FALSE)
			{
				TRACKMOUSEEVENT tme;
				tme.cbSize = sizeof(TRACKMOUSEEVENT);
				tme.dwFlags = TME_HOVER | TME_LEAVE;
				tme.dwHoverTime = 1; //1ms 立即显示
				tme.hwndTrack = hwnd;
				//激活WM_MOUSEHOVER消息
				TrackMouseEvent(&tme);
			}
			break;
		}
	case WM_MOUSEHOVER:
		{
			min_entry = TRUE;
			InvalidateRect(hwnd,NULL,TRUE);
			UpdateWindow(hwnd);

			TCHAR buf[] = TEXT("最小化窗口!!!");
			MySetWindowText(buf);
			break;
		}
	case WM_MOUSELEAVE:
		{
			min_entry = FALSE;
			InvalidateRect(hwnd,NULL,TRUE);
			UpdateWindow(hwnd);
			break;
		}
	default:
		return CallWindowProc(old_btn_MinProc,hwnd,message,wParam,lParam);
		//return old_btn_ClickProc(hwnd,message,wParam,lParam);
	}
	return 0;
}


LRESULT CALLBACK btn_MaxProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
	
	switch(message)
	{
	case WM_MOUSEMOVE:
		{
			if(max_entry == FALSE)
			{
				TRACKMOUSEEVENT tme;
				tme.cbSize = sizeof(TRACKMOUSEEVENT);
				tme.dwFlags = TME_HOVER | TME_LEAVE;
				tme.dwHoverTime = 1; //1ms 立即显示
				tme.hwndTrack = hwnd;
				//激活WM_MOUSEHOVER消息
				TrackMouseEvent(&tme);
			}
			break;
		}
	case WM_MOUSEHOVER:
		{
			max_entry = TRUE;
			InvalidateRect(hwnd,NULL,TRUE);
			UpdateWindow(hwnd);

			TCHAR buf[] = TEXT("最大化窗口+++");
			MySetWindowText(buf);
			break;
		}
	case WM_MOUSELEAVE:
		{
			max_entry = FALSE;
			InvalidateRect(hwnd,NULL,TRUE);
			UpdateWindow(hwnd);
			break;
		}
	default:
		return CallWindowProc(old_btn_MaxProc,hwnd,message,wParam,lParam);
		//return old_btn_ClickProc(hwnd,message,wParam,lParam);
	}
	return 0;
}


LRESULT CALLBACK btn_CloseProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
	
	switch(message)
	{
	case WM_MOUSEMOVE:
		{
			if(close_entry == FALSE)
			{
				TRACKMOUSEEVENT tme;
				tme.cbSize = sizeof(TRACKMOUSEEVENT);
				tme.dwFlags = TME_HOVER | TME_LEAVE;
				tme.dwHoverTime = 1; //1ms 立即显示
				tme.hwndTrack = hwnd;
				//激活WM_MOUSEHOVER消息
				TrackMouseEvent(&tme);
			}
			break;
		}
	case WM_MOUSEHOVER:
		{
			close_entry = TRUE;
			InvalidateRect(hwnd,NULL,TRUE);
			UpdateWindow(hwnd);

			TCHAR buf[] = TEXT("关闭窗口XXXXXXX");
			MySetWindowText(buf);
			break;
		}
	case WM_MOUSELEAVE:
		{
			close_entry = FALSE;
			InvalidateRect(hwnd,NULL,TRUE);
			UpdateWindow(hwnd);
			break;
		}
	default:
		return CallWindowProc(old_btn_CloseProc,hwnd,message,wParam,lParam);
		//return old_btn_ClickProc(hwnd,message,wParam,lParam);
	}
	return 0;
}



下面试程序运行的效果图!











AVS3代码阅读HPM4.0 参考AVS3代码阅读(HPM6.0)(一.整体架构以及CU划分部分代码) 版本:HPM4.0 核心文件:app_encoder.c   要做的是帧间预测,所以前面的函数先暂时不管了,挖个坑以后再填。直接从enc_pic看起。 enc_pic()    ... 阅读详情

相关推荐

支付宝H5支付唤醒协议全解析:从alipays://到动态orderSuffix的抓取与拼接

本文深入解析支付宝H5支付唤醒协议,从alipays://协议设计到动态orderSuffix参数的抓取与拼接,详细介绍了支付宝H5支付的底层机制。内容包括协议架构剖析、动态令牌生成与捕获、浏览器兼容性解决方案以及安全机制设计,为开发者提供全面的技术指南和实践建议。

weixin_27972919的博客 3483

WM_MOUSEHOVER/WM_MOUSELEAVE

程序要检测到鼠标进入或离开了窗口,需要用到WM_MOUSEHOVER和WM_MOUSELEAVE消息。 VC默认是不产生这两个消息的,它们必须使用_TrackMouseEvent产生。方法是: 1、响应WM_MOUSEMOVE消息,在其中             if (!m_bEnter)// 必须定义一个鼠标进入或离开的标志,否则在MOUSEMOVE的时候,程序总不停的调用_TrackM

学而不思则罔 1765

优化NEXYS A7开发板(Xilinx Artix-7)Microblaze核的FLASH读写性能实战

本文针对NEXYS A7开发板(Xilinx Artix-7)上Microblaze核读写FLASH速度慢的问题,提供了系统性的优化实战指南。通过深入分析SPI控制器配置、Flash指令模式选择、Microblaze核的Cache与硬件加速器优化,以及程序运行位置(BRAM vs DDR)的调整,有效将FLASH读写性能从“龟速”提升至接近理论峰值。文章结合实测数据,为FPGA嵌入式开发者提供了清晰的性能瓶颈分析与解决方案。

carrot的博客 256

OnMouseHover()和OnMouseLeave()(让窗口捕获并响应WM_MOUSEHOVER和WM_MOUSELEAVE消息)

当鼠标停留在程序窗口一定时间后,会产生一个WM_MOUSEHOVER消息;当鼠标离开程序窗口后,会产生一个WM_MOUSELEAVE消息。那如何才能使窗口响应这两个消息呢?按下面的步骤,即可让指定的窗口能捕获并响应WM_MOUSEHOVER和WM_MOUSELEAVE消息了: 1、在窗口类的头文件中添加: [cpp] view plaincopy

u012999771的专栏 771

云计算虚拟化实验(一)——虚拟机软件VMware的安装以及虚拟机系统的安装(Windows7+CentOS7)

主要内容: 1、虚拟机软件的安装(以VMware为例) 2、虚拟机系统的安装(Window7 + CentOS7) 3、虚拟主机网络互访 4、不同局域网内的虚拟主机互访(软路由——海蜘蛛) 0 ——首先介绍一下什么是虚拟化? 虚拟化,是指通过虚拟化技术将一台计算机虚拟为多台逻辑计算机。在一台计算机上同时运行多个逻辑计算机,每个逻辑计算机可运行不同的操作系统,并且应用程序都可以在

gg_asd的博客 1万+

【JS】自定义上传组件,文件上传与回显,自定义进度条显示(基于element-plus与axios)

公司是做B 端产品的,有sass平台也有源码交付的项目,最近开发了很多小系统,这里记录一下开发遇到的问题。 需要定制一个上传组件,要求可以自定义文件存储路径,自定义可上传的文件类型,限制文件大小等,并且提供基础的文件回显功能,例如上传一张图片到服务器指定目录的`/file`文件夹下面,并且实现可以查看预览的功能。

余浩的博客 1161

WM_MOUSELEAVE和WM_MOUSEHOVER使用

默认情况下,窗口是不响应WM_MOUSEHOVER 和 WM_MOUSELEAVE (这个消息上次测试是默认下也响应的)消息的。 所以需要调用 ::_TrackMouseEvent  函数来激活这两个消息。  WM_MOUSEHOVER 是调用::_TrackMouseEvent (当次设置后有效) 当鼠标在指定的窗口上停留超过一定时间后; WM_MOUSELEAVE 是鼠

x993407990的专栏 698

软考高级-系统架构设计师 知识点整理 (一篇就够了 建议收藏)

软考高级-系统架构设计师知识点整理---十万字总结,助你通过高级

片言可决讼,半纸能缚龙 7342

WM_MOUSEHOVER

case WM_MOUSEMOVE: {  m_bTrackMouse=TRUE; if (m_bTrackMouse)    //若允许追踪,则。  {   TRACKMOUSEEVENT csTME;  csTME.cbSize = sizeof(csTME);  csTME.dwFlags = TME_LEAVE|TME_HOVER;    csTME.hwndTrack =

雄鹰梦,菜鸟路 839

【四足机器人实战】四足机器人运动学、动力学模型

认知有限,望大家多多包涵,有什么问题也希望能够与大家多交流,共同成长!四足机器人的运动学和动力学模型是其设计和控制的基础,涉及到如何精确描述和预测机器人在不同条件下的运动状态和行为本文先对四足机器人运动学、动力学模型做个简单的介绍,具体内容后续再更,其他模块可以参考去我其他文章运动学模型主要关注四足机器人的几何形态和时间序列下的运动特性,而动力学模型则进一步考虑了引起这些运动的力和扭矩的作用效果。运动学模型:运动学模型描述了四足机器人在没有考虑力的影响下的运动特性。

qq_35635374的博客 1055

ansys非线性分析中接触类型

不分离(No Separation)‌:法向始终保持接触不分离,切向允许自由滑动,属于线性接触,适合需要法向约束、允许微小切向位移的场景,比如过盈配合的简化模拟。有摩擦(Frictional)‌:法向允许分离,切向根据用户设置的摩擦系数计算摩擦力,是工程中最符合实际机械接触的类型,绝大多数装配体分析都选择该类型。无摩擦(Frictionless)‌:法向允许接触面分离,切向无摩擦、允许自由滑动,适合模拟理想润滑的光滑接触面,图中当前选择的就是该类型。非线性接触(需要多次迭代,属于真正的非线性接触行为)‌。

qq_15963745的博客 71

win32自绘按钮,使用GDI+(二)

一、解决上一篇的两个问题。 1、按钮背景透明 方法是,在绘制按钮之前,向按钮的父窗口发生WM_CTLCOLORBTN消息。该消息返回一个画刷句柄,系统使用该画刷句柄画出按钮的背景。所以我们在处理这个消息的时候,为系统返回一个空的画刷句柄就可以了。 直接在回调函数中添加代码 1 case WM_CTLCOLORBTN: 2 { 3 HBR...

weixin_30832143的博客 499

SAP_MM模块-服务类采购详细讲解案例

SAP_MM模块服务类采购订单配置及业务测试案例详解,包括前台业务操作、后台配置以及使用过程中的问题处理

风沙的博客 5123

详细介绍Windows中的子类化

​​定义​​子类化是指​​继承现有窗口类(如按钮、编辑框)并重写其消息处理逻辑​​的过程。通过替换默认的窗口过程函数WNDPROC),开发者可以截获控件的消息流,插入自定义处理逻辑,同时保留原始功能。​​消息传递流程​​​​默认流程​​:系统控件(如按钮)的窗口消息由系统预定义的窗口过程处理。​​子类化后​​:消息先传递到自定义的窗口过程,开发者可在此修改消息或调用原始窗口过程(继续默认处理。​​关键函数​(替换窗口过程)、CallWindowProc(调用原始处理函数)。

felicity_one的博客 933

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

request.getHeader("Referer")中的Referer是从哪里来的?

request.getHeader("Referer")中的Referer是从哪里来的? 括号里面的值还可以是什么呢? 在api里面没查到 更多1分享到: 相关主题推荐: api 相关推荐: 关于WM_MOUSEHOVER和WM_MOUSELEAVE消息的用法以及按钮的变色问题! 联通WO + 开放平台的API上线后,如果在调用的过程中出现错误怎么办?

evilcry2012的专栏 2771

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

C语言游戏必备:光标定位与颜色设置的实现方法

本篇文章是对c语言中光标定位与颜色设置的方法进行了详细的分析介绍,需要的朋友参考下 喜欢编写游戏的朋友们,你们有福了,这个资料足以让你玩转WINDOWS和Linux下的光标定位以及颜色,enjoy it。 一、WINDOWS: 1.光标定位函数: 代码如下: #include #include /****** 光标移到指定位置 ********************

3344

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

纯C语言原生实现可视化彩色按钮效果

你还在通过“请输入数字选择下一步操作”来做用户交互界面吗? 本文详细讲述了如何通过纯C语言实现可以直接点击生效,并能够放置在任意位置的彩色按钮。

2194

处理鼠标离开窗口的消息 (WM_MOUSELEAVE)

处理鼠标离开窗口的消息 (WM_MOUSELEAVE)处理鼠标离开窗口的消息 (WM_MOUSELEAVE)WM_MOUSELEAVE 是鼠标离开窗口时发出的消息,但是这个消息与普通的鼠标消息不同,要收到WM_MOUSELEAVE消息必须先调用TrackMouseEvent,并且每调用一次TrackMouseEvent 窗口只能收到一次WM_MOUSELEAVE,也就说

lanxch的专栏 8717

MFC WM_MOUSELEAVE和WM_MOUSEHOVER消息

MFC WM_MOUDELEAVE和WM_MOUSEHOVER消息写自定义目录标题前言::TrackMouseEvent介绍示例 前言 学习书本,博客记录,便于往后回顾。 因为窗口接收WM_MOUSEMOVE消息,所以很容易知道光标何时进入了窗口或在窗口中移动了。使用**::TrackMouseEvent**,可以很容易确定光标何时离开窗口或在窗口上停止不动。 一个应用程序可以注册**::TrackMouseEvent**,当光标离开窗口时接收WM_MOUSELEAVE消息,而光标在窗口上方停滞时接收WM

GODOOOO的博客 901

WM_MOUSELEAVE 消息

void CroundDlg::OnLButtonDown(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default CDialogEx::OnLButtonDown(nFlags, point); PostMessage(WM_NCLBUTTONDOWN, H

aa1991的专栏 688

MFC重载鼠标停留WM_MOUSEHOVER和离开WM_MOUSELEAVE消息

1. 重载OnMouseMove()消息,在消息的实现中添加代码:void CMainWindow::OnMouseMove(UINT nFlags, CPoint point) { TRACKMOUSEEVENT tme; tme.cbSize = sizeof(tme); //结构体缓冲区大小 tme.dwFlags = TME_HOVER; //注册WM_MOUSEHOVER消息 t...

超频化石鱼的博客 2967

VC编程时关于 WM_MOUSEENTER 和 WM_MOUSELEAVE消息

关于 WM_MOUSEENTER 和 WM_MOUSELEAVE消息 这两个消息比较古怪,虽然你能找到他们的定义,看起来也似乎挺有用,但是却接收不到。 如果要处理这两个消息需要手动在WM_MOUSEMOVE消息处理函数中添加: 添加变量: BOOL m_bTracking; m_bTracking = FALSE; 添加消息处理函数: afx_msg

Matrix_Designer的专栏 1227

如何处理鼠标离开窗口的消息

首先,WM_MOUSELEAVE是鼠标离开窗口时发出的消息,但是这个消息与普通消息不同,要收到WM_MOUSELEAVE消息必须先调用TrackMouseEvent,并且每调用一次TrackMouseEvent窗口只能收到一次WM_MOUSELEAVE,也就是说如果要获得WM_MOUSELEAVE消息的话,当鼠标重新进入窗口时必须调用一次TrackMouseEvent。   接下来,那我们有必

vigoss331的专栏 2853

捕捉鼠标停留WM_MOUSEHOVER和离开WM_MOUSELEAVE消息

捕捉鼠标停留WM_MOUSEHOVER和离开WM_MOUSELEAVE消息当鼠标停留在程序窗口一定时间后,会产生一个WM_MOUSEHOVER消息;当鼠标离开程序窗口后,会产生一个WM_MOUSELEAVE消息。鼠标离开程序窗口的消息一般很少用,想了半天也想不到在什么情况下会用到这个消息。到是鼠标停留消息会经常用到,比如需要对程序中的某些操作进行提示时,就需要用到WM_MOUSEHOVER消息。要

冷寒生读书笔记 2686

VC窗口鼠标停留与离开效果

需要响应三个消息 ON_MESSAGE(WM_MOUSEHOVER, OnMouseHover) ON_MESSAGE(WM_MOUSELEAVE, OnMouseLeave) ON_WM_MOUSEMOVE() myWnd::m_bTracking = false; void myWnd::OnMouseMove(UINT nFlags, CPoint point) { if (!m_bTracking) //鼠标轨迹跟踪 { TRACKMOUSEEVENT tme; tme.cbS

cfz751740465的博客 448
上一篇: 快速排序,c++ 模板技术表述,完全兼容标准库!!!
下一篇: c++ char_traits模板类的实现!!!
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值