VC异形窗体
方法一:
異形窗口的原理很簡單,首先加載一張位圖畫刷作窗口背景,然后設置透明色就可以使得窗口由矩形變成任意形狀。這樣使得窗口的顯示更加美觀。?
1.重寫OnCreate方法
int?CClientUpdateDlg::OnCreate(LPCREATESTRUCT?lpCreateStruct)
{
if?(CDialog::OnCreate(lpCreateStruct)?==?-1)
return?-1;
?
//?TODO:??在此添加您專用的創建代碼
//?設置分層屬性
SetWindowLong(m_hWnd,?GWL_EXSTYLE,?GetWindowLong(m_hWnd,?GWL_EXSTYLE)?|?WS_EX_LAYERED);
//?設置透明色
COLORREF?clTransparent?=?RGB(0,?0,?0);
::SetLayeredWindowAttributes(m_hWnd,?clTransparent,?0,?LWA_COLORKEY);
?
return?0;
}
2.把背景圖片貼上去
BOOL?CClientUpdateDlg::OnEraseBkgnd(CDC*?pDC)
{
//?TODO:?在此添加消息處理程序代碼和/或調用默認值
?
//窗口寬和高
int?frameWidth;
int?frameHeight;
?
//背景圖片
CImage?imageBKG;
//imageBKG.Load(_T("res\\UpdateBKG.bmp"));
imageBKG.Load(_T("res\\Kitty.bmp"));
frameWidth=imageBKG.GetWidth();
frameHeight=imageBKG.GetHeight();
imageBKG.BitBlt(pDC->GetSafeHdc(),0,0,frameWidth,frameHeight,0,0,SRCCOPY);
?
CRect?rc;
GetWindowRect(&rc);
MoveWindow(rc.left,rc.top,frameWidth,frameHeight);
return?true;//CDialog::OnEraseBkgnd(pDC);
}
方法二:
#define PICWIDTH??? 365
#define PICHEIGHT?? 160
//創建一個由一系列點圍成的區域
#define BIANKUANG? 5
??? ?CPoint pts[8] = {CPoint(BIANKUANG, 0), CPoint(PICWIDTH-BIANKUANG, 0), CPoint(PICWIDTH, BIANKUANG), CPoint(PICWIDTH, 150),
??? ??? ?CPoint(PICWIDTH-BIANKUANG, PICHEIGHT), CPoint(BIANKUANG, PICHEIGHT), CPoint(0, PICHEIGHT-BIANKUANG), CPoint(0,BIANKUANG)};
??? ?HRGN rgnPolygonRect=CreatePolygonRgn(pts,_countof(pts),ALTERNATE);
???? SetWindowRgn(rgnPolygonRect,true);
//不用時一定要用DeleteObject函數刪除該區域
DeleteObject(rgnPolygonRect);
方法三:
按照掩碼剪切窗體
/*
在OnCreate()里面添加如下代碼
int CttDlg::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CDialog::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO:? 在此添加您專用的創建代碼
#define IMG "Res\\0.bmp"
YiXingWnd(RGB(255,255,255),IMG);
return 0;
}
在OnEraseBkgnd()里面添加如下代碼
BOOL CttDlg::OnEraseBkgnd(CDC* pDC)
{
// TODO: 在此添加消息處理程序代碼和/或調用默認值
CImage BKimage;
BKimage.Load(IMG);
BKimage.BitBlt(pDC->GetSafeHdc(),0,0,BKimage.GetWidth(),BKimage.GetHeight(),0,0,SRCCOPY);
return TRUE;//CDialog::OnEraseBkgnd(pDC);
}
*/
void CttDlg::YiXingWnd(COLORREF MaksRGB, char * ImageSource)
{
?? ?CImage BKimage;
?? ?BKimage.Load(ImageSource);
?? ?CRect rc;
?? ?GetWindowRect(&rc);
?? ?MoveWindow(rc.left,rc.top,BKimage.GetWidth(),BKimage.GetHeight());
?? ?HRGN hRgnCommbine;
?? ?hRgnCommbine=CreateRectRgn(0,0,0,0);
?? ?HRGN hRgnNew;
?? ?COLORREF transClr=MaksRGB;
?? ?//y豎著的,x是橫著的
?? ?for (int y=0;y<BKimage.GetHeight();y++)
?? ?{
?? ??? ?int leftx=0;
?? ??? ?for (int x=0;x<BKimage.GetWidth();x++)
?? ??? ?{
?? ??? ??? ?while (x < BKimage.GetWidth() && BKimage.GetPixel(x,y) == transClr)
?? ??? ??? ?{
?? ??? ??? ??? ?++x;
?? ??? ??? ?}
?? ??? ??? ?leftx = x;
?? ??? ??? ?while (x < BKimage.GetWidth() && BKimage.GetPixel(x,y) != transClr)
?? ??? ??? ?{
?? ??? ??? ??? ?++x;
?? ??? ??? ?}
?? ??? ??? ?if (leftx != x)
?? ??? ??? ?{
?? ??? ??? ??? ?hRgnNew=CreateRectRgn(leftx, y, x, y + 1);
?? ??? ??? ??? ?CombineRgn(hRgnCommbine, hRgnCommbine,hRgnNew, RGN_OR);
?? ??? ??? ?}
?? ??? ?}
?? ?}
?? ?SetWindowRgn(hRgnCommbine,TRUE);
}
總結