创建一个基于Dialog的工程(MFC)
在 BOOL CDialogXXXApp::InitInstance()中添加以下代码
SetDialogBkColor(RGB(100, 100, 228), RGB(225, 100, 100));
//将下面店面放在初始化函数中
在 BOOL CDialogXXXDlg::OnInitDialog()中添加以下代码
//设置类型,添加WS_EX_LAYERED 早起版本没有这个需要直接设定为 0x80000
SetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE,
GetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE)^0x80000);
HINSTANCE hInst = LoadLibrary("User32.DLL");
if(hInst)
{
typedef BOOL (WINAPI *DFUNC)(HWND,COLORREF,BYTE,DWORD);
DFUNC Func = NULL;
fun=(DFunc)GetProcAddress(hInst, "SetLayeredWindowAttributes");
if(fun)fun(this->GetSafeHwnd(),RGB(100, 100, 228)/*要透明的颜色*/,255/*0-255 0:透明*/,2 | 1);
FreeLibrary(hInst);
}
在 void CDialogXXXDlg::OnPaint() 中添加以下代码
if (IsIconic())
{
}
else {
CClientDC *pDC = new CClientDC(this);
CRect rectClient;
GetClientRect(rectClient); //GetDlgItem(IDC_BUTTON5)->
CBrush bsh;
bsh.CreateSolidBrush(RGB(122, 122, 255));
CBrush* pOldbsh = pDC->SelectObject(&bsh);
pDC->Ellipse(rectClient);//只要是背景色不是RGB(100, 100, 228)的区域都可以显示出来,
//这样就可以对要显示的区域设置不同的颜色来显示。
pDC->SelectObject(pOldbsh);
pOldPen = pDC->SelectObject(&penBlue);
}
*以下是说明
BOOL SetLayeredWindowAttributes( HWND hwnd, // handle to the layered window COLORREF crKey, // specifies the color key BYTE bAlpha, // value for the blend function DWORD dwFlags // action );
hWnd是透明窗体的句柄, crKey为掩码的颜色,可以用RGB(r,g,b)来指定。 bAlpha是不透明度,取值范围是(0,255),其中0代表全透明,255代表不透明。 dwFlags是透明方式,可以取两个值: 当取值为LWA_ALPHA时,crKey参数无效,bAlpha参数有效; 当取值为LWA_COLORKEY时,窗体中的所有颜色为crKey的地方将变为透明,bAlpha参数无效。 LWA_ALPHA = 0x2 LWA_COLORKEY=0x1 也可以取两个值的组合:LWA_ALPHA Or LWA_COLORKEY。这样crKey的地方将变为全透明,而其它地方根据bAlpha参数确定透明度。