MFC--自设半透明窗口
白月隐于市
2022年06月20日 17:29
收录于文集
共2篇

创建一个完整窗体要经历的步骤: 1)设计一个窗口类; 2)注册窗口类; 3)创建窗口; 4)显示及更新窗口。 第一步: windows 已经为用户定义了一个完整的窗口类,用户只需要将各个属性填满既可以。窗口类是一个 结构体,其定义如下: typedef struct _WNDCLASS{ UINT style;//class style WNDPROC lpfnWndProc; int cbClsExtra; int cbWndExtra; HANDLE hInstance; HICON hIcon; HCURSOR hCursor; HBRUSH hbrBackground; LPCTSTR lpszMenuName; LPCTSTR lpszClassName; }WNDCLASS;

第二步: 用RegisterClass(&wndclass)来定义的窗口注册。

第三步:创建窗口 1)定义一个句柄,然后用CreateWindow()来为句柄赋值。函数用法参看MSDN。创建窗口必须依据已经声明并且已经注册的窗口类型来创建。 HWND CreateWindow( LPCTSTR lpClassName,//定义的窗口类名 LPCTSTR lpWindowName,//窗口的名字,将会在标题栏上显示出来的 DWORD dwStyle,//窗口的风格(窗口的外观模式和功能按钮等等) int x,//窗口初始位置ws_usedefault int y,//同上 int nWidth,//窗口的宽度,可以用ws_usedefault int nHeight,//窗口高度,可以用ws_usedefault HWND hWndParent,//父窗口的句柄,单一窗口则设置为空 HMENU hMenu,//菜单的句柄,如果没有菜单则将这个句柄设置为空 HINSTANCE hInstance,//由系统进行分配标识 LPVOID lpParam//一般设置为空 );

第四步:显示窗口 调用ShowWindow()函数来显示窗口。 ShowWindow( HWND hWnd,//要显示的窗口的句柄 int nCmdShow//显示窗口的模式,如:最大化最小花显示 )

第五步:更新窗口 在显示窗口的函数调用完毕以后调用UpdateWindow()来对窗体进行更新 UpdateWindow(hwnd);//这个函数没有并不影响消息产生。 //消息循环 MSG msg;//定义了一个消息结构体变量 while(GetMessage(&msg,NULL,0,0)) { TranslateMessage(&msg); DispatchMessage(&msg); } /* GetMessage( LPMSG lpMsg, //消息结构提的指针,无需对这个消息结构提的内部成员初始化, //这个只需将定义的结构体的地址传到这里 HWND hWnd, //窗口句柄,指明要获得的是那个窗口的消息,如果要获取所有窗口的消息则 //定义为NULL UINT wMsgFilterMin, //用来指定要从消息队列里边取得的最小值, UINT wMsgFilterMax //用来指定要从消息队列里边取得的最大值, /////////////////////////////////////////////////////////////////////// //这两个参数用来限制GETMESSAGE 在消息队列里边的取值范围,// //以去处调一些确定不感兴趣的消息 // //if要从消息队列中所有的消息中提取的话则两个参数均设定为 // //零 // /////////////////////////////////////////////////////////////////////// );//从调用程序线程消息队列中取消息 */ 有了创建窗口的整个流程以后,现在就开始定义窗口过程,用WindowProc() LRESULT CALLBACK WindowProc(/*函数名字可以更改,但是参数不允许改变*/ HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam );//参数和消息结构提的前四个参数相同,事实上系统在调用窗口过程函数 //的时候自动将消息结构体的前四个参数传递到窗口过程

例:

代码块
C++
自动换行
复制代码
//在OnInitDialog中初始化窗体
		//新建二维码覆盖窗体
		QRCOVERTEXT_Init();
		QRCOVERTEXT_Create(m_hWnd, _T("1111111"));

//绘制二维码半透明覆盖窗体
void QRCOVERTEXT_OnPaint(HWND hWnd)
{

	HDC hdc;
	TCHAR text[256] = _T("testttcolor\ntttttttt");
	CRect rect;
	GetClientRect(hWnd, &rect);
	rect.top = rect.top + 40;
	rect.left = rect.left + 40;
	PAINTSTRUCT ps;
	hdc = ::BeginPaint(hWnd, &ps);
	//SetBkMode(hdc, TRANSPARENT);
	SetTextColor(hdc, RGB(255,0,0));
	HFONT _hFont = ::CreateFontIndirect(&appAFXData.lfLittleFont);
	//_gpen = CreatePen(PS_SOLID, 2, rgb);
	SelectObject(hdc, _hFont);
	DrawText(hdc, text, -1, &rect, DT_LEFT | DT_VCENTER);
	EndPaint(hWnd, &ps);
}

//初始化窗口属性
void QRCOVERTEXT_OnCreate(HWND hWnd, LPCREATESTRUCT cs)
{
	//::SetLayeredWindowAttributes(hWnd, 0, 0, LWA_COLORKEY);
	::SetLayeredWindowAttributes(hWnd, 0, 128, LWA_COLORKEY);
}

LRESULT CALLBACK QRCOVERTEXT_WindowProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{
	switch (Msg)
	{
	case WM_CREATE:
		QRCOVERTEXT_OnCreate(hWnd, (LPCREATESTRUCT)lParam);
		return 1;
	case WM_PAINT:
		QRCOVERTEXT_OnPaint(hWnd);
		return 1;
	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
	}
	return ::DefWindowProc(hWnd, Msg, wParam, lParam);
}

//初始化窗口
BOOL UsrLogin::QRCOVERTEXT_Init()
{
	WNDCLASS wc;
	wc.cbClsExtra = 0;
	wc.cbWndExtra = 0;
	wc.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
	wc.hCursor = NULL;
	wc.hIcon = NULL;
	wc.hInstance = 0;
	wc.lpfnWndProc = QRCOVERTEXT_WindowProc;
	wc.lpszClassName = _T("QRCOVERTEXT");
	wc.lpszMenuName = NULL;
	wc.style = NULL;
	return RegisterClass(&wc);
}

//创建窗口
//WS_EX_LAYERED      实现窗口背景透明
//WS_EX_TRANSPARENT  实现鼠标穿透
//WS_EX_TOOLWINDOW   实现不在任务栏显示
//WS_EX_TOPMOST      实现文本置顶
BOOL UsrLogin::QRCOVERTEXT_Create(HWND mainHwnd, LPCTSTR text)
{
	DWORD dwStyle;
	DWORD dwExStyle;
	//dwStyle = WS_POPUP | ES_MULTILINE | WS_VISIBLE | WS_CHILD;
	dwStyle = ES_MULTILINE | WS_VISIBLE | WS_POPUP;
	dwExStyle = WS_EX_LAYERED | WS_EX_TRANSPARENT;// | WS_EX_TOPMOST | WS_EX_APPWINDOW | WS_EX_TOOLWINDOW;
	CRect rect;
	m_lbQRPic.GetWindowRect(&rect);
	QRCOVERTEXTHwnd = CreateWindowEx(dwExStyle, _T("QRCOVERTEXT"), text, dwStyle, rect.left, rect.top, rect.Width(), rect.Height(), mainHwnd, 0, 0, this);
	//QRCOVERTEXTHwnd = CreateWindowEx(WS_EX_LAYERED|WS_EX_TRANSPARENT, _T("static"), _T(""), WS_VISIBLE | WS_CLIPCHILDREN | WS_POPUP, 0, 0, 300, 300, GetParent()->m_hWnd, 0, 0, 0);

	if (QRCOVERTEXTHwnd != NULL)
	{
		::ShowWindow(QRCOVERTEXTHwnd, SW_HIDE);
		return TRUE;
	}
	return FALSE;
}
//login界面大小修改 end: add by zhanghao 2022/06/10//绘制二维码半透明覆盖窗体
void QRCOVERTEXT_OnPaint(HWND hWnd)
{

	HDC hdc;
	TCHAR text[256] = _T("testttcolor\ntttttttt");
	CRect rect;
	GetClientRect(hWnd, &rect);
	rect.top = rect.top + 40;
	rect.left = rect.left + 40;
	PAINTSTRUCT ps;
	hdc = ::BeginPaint(hWnd, &ps);
	//SetBkMode(hdc, TRANSPARENT);
	SetTextColor(hdc, RGB(255,0,0));
	HFONT _hFont = ::CreateFontIndirect(&appAFXData.lfLittleFont);
	//_gpen = CreatePen(PS_SOLID, 2, rgb);
	SelectObject(hdc, _hFont);
	DrawText(hdc, text, -1, &rect, DT_LEFT | DT_VCENTER);
	EndPaint(hWnd, &ps);
}

//初始化窗口属性
void QRCOVERTEXT_OnCreate(HWND hWnd, LPCREATESTRUCT cs)
{
	//::SetLayeredWindowAttributes(hWnd, 0, 0, LWA_COLORKEY);
	::SetLayeredWindowAttributes(hWnd, 0, 128, LWA_COLORKEY);
}

LRESULT CALLBACK QRCOVERTEXT_WindowProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{
	switch (Msg)
	{
	case WM_CREATE:
		QRCOVERTEXT_OnCreate(hWnd, (LPCREATESTRUCT)lParam);
		return 1;
	case WM_PAINT:
		QRCOVERTEXT_OnPaint(hWnd);
		return 1;
	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
	}
	return ::DefWindowProc(hWnd, Msg, wParam, lParam);
}

//初始化窗口
BOOL UsrLogin::QRCOVERTEXT_Init()
{
	WNDCLASS wc;
	wc.cbClsExtra = 0;
	wc.cbWndExtra = 0;
	wc.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
	wc.hCursor = NULL;
	wc.hIcon = NULL;
	wc.hInstance = 0;
	wc.lpfnWndProc = QRCOVERTEXT_WindowProc;
	wc.lpszClassName = _T("QRCOVERTEXT");
	wc.lpszMenuName = NULL;
	wc.style = NULL;
	return RegisterClass(&wc);
}

//创建窗口
//WS_EX_LAYERED      实现窗口背景透明
//WS_EX_TRANSPARENT  实现鼠标穿透
//WS_EX_TOOLWINDOW   实现不在任务栏显示
//WS_EX_TOPMOST      实现文本置顶
BOOL UsrLogin::QRCOVERTEXT_Create(HWND mainHwnd, LPCTSTR text)
{
	DWORD dwStyle;
	DWORD dwExStyle;
	//dwStyle = WS_POPUP | ES_MULTILINE | WS_VISIBLE | WS_CHILD;
	dwStyle = ES_MULTILINE | WS_VISIBLE | WS_POPUP;
	dwExStyle = WS_EX_LAYERED | WS_EX_TRANSPARENT;// | WS_EX_TOPMOST | WS_EX_APPWINDOW | WS_EX_TOOLWINDOW;
	CRect rect;
	m_lbQRPic.GetWindowRect(&rect);
	QRCOVERTEXTHwnd = CreateWindowEx(dwExStyle, _T("QRCOVERTEXT"), text, dwStyle, rect.left, rect.top, rect.Width(), rect.Height(), mainHwnd, 0, 0, this);
	//QRCOVERTEXTHwnd = CreateWindowEx(WS_EX_LAYERED|WS_EX_TRANSPARENT, _T("static"), _T(""), WS_VISIBLE | WS_CLIPCHILDREN | WS_POPUP, 0, 0, 300, 300, GetParent()->m_hWnd, 0, 0, 0);

	if (QRCOVERTEXTHwnd != NULL)
	{
		::ShowWindow(QRCOVERTEXTHwnd, SW_HIDE);
		return TRUE;
	}
	return FALSE;
}
复制成功