日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

VC异形窗体

發布時間:2024/4/11 c/c++ 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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);
}














總結

以上是生活随笔為你收集整理的VC异形窗体的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。