经过在网上一番折腾,终于将这个功能得以实现,现在总结如下:
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使用的是消息机制,我们还没有对消息进行处理,换句话说,就是上面的设置分层属性也是要在消息处理函数中进行的,不断的接收消息,然后过滤消息,对特定消息进行处理