主要是记录下SetLayeredWindowAttributes函数和SetWindowLong函数在VC6当中的使用,以便今后查询!
1、首先在OnInitDialog函数中加载位图和修改窗体样式,代码如下
m_hBitmap = (HBITMAP)LoadImage(NULL, "1.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION); //载入位图
m_hBrush=CreatePatternBrush(m_hBitmap);//创建画刷
SetWindowLong(m_hWnd,
GWL_EXSTYLE,
GetWindowLong(m_hWnd, GWL_EXSTYLE)| WS_EX_LAYERED);//主要是增加WS_EX_LAYERED属性
2、在结束使用位图时,应该释放位图占用的内存
DeleteObject(m_hBitmap);
3、相应OnCtlColor函数,为窗口画上自定义的位图背景,添加代码:
if(pWnd==this) return m_hBrush;
4、响应函数修改异性窗体和或者设置窗体透明度:
if(!::SetLayeredWindowAttributes(this->m_hWnd,RGB(0,0,0),0,LWA_COLORKEY)) //异型窗体,将黑色像素全部去除
MessageBox("error");
if(!::SetLayeredWindowAttributes(hDlg, 0, 200, LWA_ALPHA)) MessageBox("error!");//设置窗口透明度 200
5、为了能拖动窗体,这里响应鼠标左键按下的消息函数:
PostMessage(WM_SYSCOMMAND, SC_MOVE | HTCAPTION, 0);
6、如果读者是VC6,会发现编译不通过,原因是因为VC6不支持函数SetLayeredWindowAttributes,所以需要手动加载函数库,可以在头文件中增加代码:
#define WS_EX_LAYERED 0x00080000
#define LWA_COLORKEY 0x00000001
#define LWA_ALPHA 0x00000002
typedef BOOL (FAR WINAPI *LAYERFUNC)(HWND,COLORREF,BYTE,DWORD);
BOOL SetLayeredWindowAttributes(HWND hwnd,COLORREF crKey,BYTE bAlpha,DWORD dwFlags)
{
LAYERFUNC SetLayer;
HMODULE hmod = LoadLibrary("user32.dll");
SetLayer=(LAYERFUNC)GetProcAddress(hmod,"SetLayeredWindowAttributes");
BOOL bReturn = SetLayer(hwnd,crKey,bAlpha,dwFlags);
FreeLibrary(hmod);
return bReturn;
}
好了。开始咱们的编程之旅吧!