亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C > 正文

MFC繪制不規則窗體的方法

2020-01-26 15:06:24
字體:
來源:轉載
供稿:網友

本文實例講述了MFC 繪制不規則窗體的方法。分享給大家供大家參考。具體分析如下:

實現過程:

1、首先創建基于DLG的MFC應用程序,命名為:tryBGDlg,并將DLG的屬性設置為:Title Bar :False ,其它設置不變

2、制作兩幅圖像,其中的一幅黑白圖像,是根據播放器外觀來制作的,其中白色區域是要保留的最終在桌面上顯示的區域。將這兩幅圖像添加到工程中,第一個ID號設置為IDB_INTERFACE,第二個ID號設置為:IDB_MASK

3、在CtryBGDlg類中添加一個在函數:

函數說明:cBitmap是要傳入的掩碼位置變量,這里是指IDB_MASK創建的對象,TransColor是指要設為透明相素的RGB值

void CtryBGDlg::SetupRegion( CDC *pDC, CBitmap &cBitmap, COLORREF TransColor ) {   CDC memDC;   memDC.CreateCompatibleDC(pDC);   CBitmap *pOldMemBmp=NULL;   pOldMemBmp=memDC.SelectObject(&cBitmap);   BITMAP bit;   cBitmap.GetBitmap (&bit);   CRgn crRgn, crRgnTmp;   crRgn.CreateRectRgn(0, 0, 0, 0);//創建一個空區域   int iX = 0;int iY = 0;   for (iY = 0; iY < bit.bmHeight; iY++)   {     do     {       //skip over transparent pixels at start of lines.       while (iX <= bit.bmWidth && memDC.GetPixel(iX, iY) == TransColor)         iX++;       //remember this pixel       int iLeftX = iX;       //now find first non transparent pixel       while (iX <= bit.bmWidth && memDC.GetPixel(iX, iY) != TransColor)         ++iX;       //create a temp region on this info       crRgnTmp.CreateRectRgn(iLeftX, iY, iX, iY+1);       //combine into main region.       crRgn.CombineRgn(&crRgn, &crRgnTmp, RGN_XOR);       //delete the temp region for next pass (otherwise you'll get an ASSERT)       crRgnTmp.DeleteObject();     }while(iX < bit.bmWidth);     iX = 0;   }   SetWindowRgn(crRgn, TRUE);   iX = (GetSystemMetrics(SM_CXSCREEN))-700;   iY = (GetSystemMetrics(SM_CYSCREEN)) / 2 - (bit.bmHeight / 2);   SetWindowPos(&wndTop, iX, iY, bit.bmWidth, bit.bmHeight, NULL);    // Free resources.   memDC.SelectObject(pOldMemBmp);  // Put the original bitmap back (prevents memory leaks)   memDC.DeleteDC();   crRgn.DeleteObject(); }

4、在BOOL CtryBGDlg::OnInitDialog()函數中添加如下代碼:

CBitmap bmp; bmp.LoadBitmapW(IDB_MASK); this->SetupRegion(this->GetWindowDC(),bmp,RGB(0,0,0));

5、添加對WM_ERASEBKGND消息響應,并在BOOL CtryBGDlg::OnEraseBkgnd(CDC* pDC)函數中添加如下代碼

BOOL CtryBGDlg::OnEraseBkgnd(CDC* pDC) {   // TODO: 在此添加消息處理程序代碼和/或調用默認值   CRect rect;   this->GetWindowRect(&rect);   CDC memDC;   CBitmap bmp;   CBitmap *pOldBmp=NULL;   bmp.LoadBitmapW(IDB_INTERFACE);   memDC.CreateCompatibleDC(pDC);   pOldBmp=memDC.SelectObject(&bmp);   pDC->BitBlt(0,0,rect.Width(),rect.Height(),&memDC,0,0,SRCCOPY);   if(pOldBmp)   {     memDC.SelectObject(pOldBmp);   }   return true; // return CDialog::OnEraseBkgnd(pDC); }

到此就實現了不規則窗體的創建,創建后的視圖如開頭所示。

6、一般我們還要實現對窗體的托動操作,實現方法如下:
添加對WM_NCHITTEST消息的響應,并在生成的LRESULT CtryBGDlg::OnNcHitTest(CPoint point)函數中添加如下代碼:

LRESULT CtryBGDlg::OnNcHitTest(CPoint point) {   // TODO: 在此添加消息處理程序代碼和/或調用默認值   CRect rc;   GetClientRect(&rc);   ClientToScreen(&rc);   return rc.PtInRect(point) ? HTCAPTION : CDialog::OnNcHitTest(point); // return CDialog::OnNcHitTest(point); }

至此就完全實現了,不規則窗體的創建和對窗體托動消息的響應部分。

下面將細致的講解具體實現原理及部分的代碼的解析:

總原理:這個程序的原理主要是先用IDB_MASK圖像計算出要設定的窗體的輪廓,然后利用SetWindowRgn()函數來對其進行更改。最后在窗體重繪的時候響應WM_ERASEBKGND消息,將窗體背景圖片IDB_INTERFACE貼到窗體上。
 
利用IDB_MASK圖像計算窗體輪廓的原理:

計算窗體輪廓的代碼主要靠SetupRegion()函數來實現,考慮到窗體的不規則,應采取掩模位圖的方式來對其進行描述,對于本例,其白色區域為要保留的不規則窗體的輪廓區域。這段代碼首先是用crRgn.CreateRectRgn(0, 0, 0, 0)創建一個空的區域,然后對IDB_MASK圖像的像素信息進行一列一列的枚舉,計算出每列中不設為透明的區域,然后跟crRgn合并,所以最后的crRgn就是所要設定的區域。

核心代碼為:

CRgn crRgn, crRgnTmp;   //創建一個空區域   crRgn.CreateRectRgn(0, 0, 0, 0);   int iX = 0;int iY = 0;   for (iY = 0; iY < bit.bmHeight; iY++)   {     do     {       //skip over transparent pixels at start of lines.       //以一個相素列為單位,找到在這一個相素列中,第一個不是要設為透明相素的點iX。       //然后再找到以這個iX為起點的,在這個一個相素列中最后跟他臨近的最后一個不是透明的點。       //然后將他們一起合并到crRgn中。       while (iX <= bit.bmWidth && memDC.GetPixel(iX, iY) == TransColor)         iX++;//在iY和iY+1這個相索列中,第一個不設為透明的點的X坐標       int iLeftX = iX;//保存這個點的坐標       while (iX <= bit.bmWidth && memDC.GetPixel(iX, iY) != TransColor)         ++iX;//這是找到在iX最臨近的不透明的X坐標       crRgnTmp.CreateRectRgn(iLeftX, iY, iX, iY+1);//這四個點連在一起就是現在剛找到的不透明的區域       //合并區域       crRgn.CombineRgn(&crRgn, &crRgnTmp, RGN_OR);       //記得最終要手動刪除crRgnTmp對象       crRgnTmp.DeleteObject();     }while(iX < bit.bmWidth);    //如果iX沒有達到圖片的末尾,說明還沒有枚舉完這一行,則在iY和iY+1這個行上,進行下一輪的//枚舉     iX = 0; }

希望本文所述對大家的MFC程序設計有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美又大粗又爽又黄大片视频| 国产精品美女www爽爽爽视频| 久久影视电视剧免费网站清宫辞电视| 97视频在线观看网址| 国产999视频| 久久久久久12| 精品视频在线播放免| 91亚洲精品一区| 久久精品视频99| 欧美精品久久久久a| 最近日韩中文字幕中文| 北条麻妃久久精品| 亚洲国产精品资源| 国产色婷婷国产综合在线理论片a| 国产精品综合不卡av| 亚洲欧洲日韩国产| 国产精品一区二区女厕厕| 亚洲第一精品夜夜躁人人躁| 欧美性猛交视频| 国产男人精品视频| 57pao国产精品一区| 欧美一区二区大胆人体摄影专业网站| 国产精品一区二区三区在线播放| 成人av在线天堂| 成人免费视频网址| 亚洲欧洲视频在线| 欧美日韩一区二区免费视频| 国产在线a不卡| 欧美视频国产精品| 亚洲午夜久久久影院| 欧美性猛交xxxx乱大交蜜桃| 大桥未久av一区二区三区| 亚洲va欧美va国产综合剧情| 精品夜色国产国偷在线| 热re91久久精品国99热蜜臀| 日韩中文理论片| 国产精品丝袜久久久久久高清| 日本成人激情视频| 久久久视频精品| 国产精品中文字幕在线| 91av视频在线播放| 91天堂在线观看| 欧美重口另类videos人妖| 欧美裸身视频免费观看| 久久天天躁狠狠躁夜夜av| 国产精品视频免费在线| 亚洲一区二区在线| 亚洲三级免费看| 国产日产欧美a一级在线| 丁香五六月婷婷久久激情| 疯狂做受xxxx欧美肥白少妇| 日韩在线视频线视频免费网站| 午夜免费日韩视频| 欧美日韩国产激情| 国产精品99免视看9| 久久久久久久久久婷婷| 国产精品久久中文| 色系列之999| 青青草99啪国产免费| 精品久久久久久久久久国产| 蜜臀久久99精品久久久久久宅男| 亚洲精品国产综合区久久久久久久| 国产精品久久久久久久久久久不卡| 久久久久五月天| 国产精品久久久久久av| 亚洲视频欧洲视频| 日韩欧美在线字幕| 久久久精品中文字幕| 国产精品久久久久久久app| 欧美日韩人人澡狠狠躁视频| 国产精品第8页| 久久久精品国产| 日韩欧美国产免费播放| 97久久久免费福利网址| 亚洲美女在线看| 亚洲欧美日韩网| 国产亚洲欧美日韩精品| 国产亚洲欧美aaaa| 国产成人精品免费视频| 国产午夜精品理论片a级探花| 亚洲第一av网站| 国产欧美日韩免费| 成人免费视频a| 精品国产91久久久| 美女扒开尿口让男人操亚洲视频网站| 欧美在线激情网| 精品国偷自产在线| 日韩电影中文 亚洲精品乱码| 91久久久久久久久| 日韩成人中文字幕在线观看| 亚洲第一精品夜夜躁人人躁| 日本高清久久天堂| 亚洲国产精品va在线观看黑人| 国产精品中文字幕在线| 伦伦影院午夜日韩欧美限制| 国产精品成人aaaaa网站| 亚洲人成电影在线观看天堂色| 精品国产福利在线| 亚洲一区二区中文字幕| www.久久久久久.com| 久久手机精品视频| 日本一本a高清免费不卡| 欧美精品制服第一页| 欧美在线视频一区二区| 中文字幕在线成人| 国产精品第一页在线| 亚洲缚视频在线观看| 欧美激情欧美激情在线五月| 91欧美精品成人综合在线观看| 高清欧美电影在线| 久久久久久国产| 欧美日韩国产在线播放| 久久99热精品这里久久精品| 日韩高清不卡av| 欧美视频一区二区三区…| 亚洲精品一区久久久久久| 91美女片黄在线观看游戏| 97在线观看视频国产| 亚洲国产精品久久久久| 国产一区欧美二区三区| 成人乱人伦精品视频在线观看| 91免费国产网站| 亚洲日韩中文字幕| 欧美激情乱人伦| 国产精品一区二区久久国产| 91精品久久久久久久久中文字幕| 91九色国产社区在线观看| 日韩成人在线视频观看| 国产做受高潮69| xxxxxxxxx欧美| 国产精品视频yy9099| 国产女人18毛片水18精品| 人人做人人澡人人爽欧美| 国产美女91呻吟求| 欧美一级大片在线观看| 亚洲第一精品福利| 国产精品www| 最近的2019中文字幕免费一页| 2021久久精品国产99国产精品| 国产精品91免费在线| 国产主播精品在线| 奇米影视亚洲狠狠色| 亚洲一二三在线| 国内精品久久久| 欧美性猛交xxxx偷拍洗澡| 色一情一乱一区二区| 日韩欧亚中文在线| 亚洲视频在线观看视频| 欧美高清自拍一区| 97视频免费在线看| 国产精品久久网| 在线不卡国产精品| 日本精品免费一区二区三区| 日韩欧美在线网址| 久久久999国产精品| 亚洲mm色国产网站| 亚洲天堂第二页| 黑人巨大精品欧美一区二区一视频| 一区二区成人av| 久久91亚洲精品中文字幕奶水| 久久精品2019中文字幕| 中文字幕亚洲欧美日韩在线不卡| 精品视频久久久久久| 国产精品永久在线|