程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> MFC繪制不規矩窗體的辦法

MFC繪制不規矩窗體的辦法

編輯:關於C++

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法式設計有所贊助。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved