MFC繪制不規矩窗體的辦法。本站提示廣大學習愛好者:(MFC繪制不規矩窗體的辦法)文章只能為提供參考,不一定能成為您想要的結果。以下是MFC繪制不規矩窗體的辦法正文
本文實例講述了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法式設計有所贊助。