win32程序的变形窗口的实现

经过在网上一番折腾,终于将这个功能得以实现,现在总结如下:

1.在WNDCLASS当中的lpszMenuName一定要为空,因为不能有菜单栏

2.hbrBackground要以图片为背景

3.创建窗口时,要使用CreateWindowEx第一个参数是WS_EX_TOPMOST

4.在窗口消息的处理过程当中,一定要拦截WM_CREATE消息,然后设置分层属性

5.完成了以上五步,则异形窗口即可实现

#include
  
  
   
   
HBITMAP hBitmap;
LRESULT WINAPI CALLBACK DlgProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
	switch(msg)
	{
	case WM_CREATE:
		{
			SetWindowLong(hWnd,GWL_EXSTYLE,GetWindowLong(hWnd,GWL_EXSTYLE)|WS_EX_LAYERED);
			COLORREF Ta=RGB(0,0,0);
			::SetLayeredWindowAttributes(hWnd,Ta,0,LWA_COLORKEY);
		}
	case WM_DESTROY:
		PostQuitMessage(0);
		break;
	default:
		return DefWindowProc(hWnd,msg,wParam,lParam);
	}
}
BOOL Register(HINSTANCE hInstance,int nCmdShow)
{
	hBitmap=(HBITMAP)LoadImageA (hInstance,"005.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
	HWND hWnd=NULL;
	WNDCLASS wndclass;
	wndclass.cbClsExtra=0;
	wndclass.cbWndExtra=0;
	wndclass.hbrBackground=::CreatePatternBrush(hBitmap);
	wndclass.hIcon=NULL;
	wndclass.lpfnWndProc=DlgProc;
	wndclass.lpszClassName=L"wndClass";
	wndclass.lpszMenuName=NULL;
	if(RegisterClass(&wndclass))
	{
		return true;
	}
	else
		 return false;
}
int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPreInstance,LPSTR lpCMdLine,int nCmdShow)
{
	if(!Register(hInstance,nCmdShow))
	{
		return 0;
	}
	BITMAP bitmap;
	GetObject(hBitmap,sizeof(bitmap),&bitmap);
	HWND hWnd=CreateWindowEx(WS_EX_TOPMOST,
		L"wndClass",
		NULL,
		WS_POPUP,
		0,
		0,
		bitmap.bmWidth,
		bitmap.bmHeight,
		NULL,
		NULL,
		hInstance,
		NULL);
	::ShowWindow(hWnd,nCmdShow);
	
	::UpdateWindow(hWnd);
	MSG msg;
	while(GetMessage(&msg,hWnd,0,0))
	{
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}
}

  
  

这样就复习了下windows窗口的创建过程,一是声明一个WNDCLASS类,来对其进行说明,填充,然再RegisterClass函数进行对类进行注册,注册成功后,就可以使用CreateWindowEx,来创建窗口了,这两者的联系使用的是类的名称,创建完成之后就可以显示窗口了,即ShowWIndow函数,然后是UpdateWindow,显示完成后,还没有结束,因为我们知道windows使用的是消息机制,我们还没有对消息进行处理,换句话说,就是上面的设置分层属性也是要在消息处理函数中进行的,不断的接收消息,然后过滤消息,对特定消息进行处理

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

世纪殇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值