青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

道。道。道

安全特性不等于安全的特性

   :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理

常用鏈接

搜索

  •  

最新評論

一、序言

  在絕大多數(shù)的Windows應(yīng)用程序中,其窗體都是使用的正規(guī)正矩的矩形窗體,例如我們常用的,“記事本”,“掃雷”,等等。矩形窗體,具有編程實(shí)現(xiàn)簡單,風(fēng)格簡潔的優(yōu)點(diǎn),所以在普通文檔應(yīng)用程序和簡單小游戲中使用足矣。但在某些娛樂游戲程序中使用就略顯呆板些了,這時(shí)若用不規(guī)則窗體替代原先的矩形窗體,將會使這類程序更添情趣。典型的例子有windows 自代的Media Player,新版本的Media Player有個(gè)控制面板的選項(xiàng),選中這些面板,播放器就以選中的面板形狀出現(xiàn),這時(shí)的播放器比以前版本的Media Player的古老矩形界面要生動有趣的多了。 要實(shí)現(xiàn)不規(guī)則窗體不是太難,知道了基本原理后,你也可以創(chuàng)建各種有趣的不規(guī)則窗體。

  二、實(shí)現(xiàn)原理

  所有的 Windows 窗體都位于一個(gè)稱為“region”中,窗體的大小如果超出“region”的范圍,windows 會自動裁剪超出"region"范圍那部分的窗體,使其不可見。所以,要創(chuàng)建不規(guī)則窗體有兩個(gè)步驟:第一步就是創(chuàng)建不規(guī)則"region".第二步就是將窗體放到創(chuàng)建的“region”中。

  其中第二步很簡單就調(diào)用一條語句即可。在SDK中調(diào)用API函數(shù)SetWindowRgn,該函數(shù)原型如下:

int SetWindowRgn( HWND hWnd, HRGN hRgn, BOOL bRedraw );

  其中hWnd為待設(shè)置的窗體句柄,hRgn為已經(jīng)創(chuàng)建的"region"句柄,bRedraw代表是否要重繪窗體。在MFC 中使用窗口類CWnd的成員函數(shù)int CWnd::SetWindowRgn(HRGN hRgn, BOOL bRedraw );該函數(shù)的參數(shù)意義與API中同名函數(shù)相同。

  相對與第二步,創(chuàng)建不規(guī)則窗體的第一步要復(fù)雜許多,并且不規(guī)則窗體越復(fù)雜,創(chuàng)建其"region"的過程也越復(fù)雜。接下去我們將由淺入深地介紹各種創(chuàng)建”region”的方法。

  在MFC中"region"對象,由CRgn類實(shí)現(xiàn)。CRgn的幾乎每個(gè)成員函數(shù)都有同名的SDK API函數(shù)對應(yīng)。

  三、簡單“region”的創(chuàng)建

  類CRgn創(chuàng)建一個(gè)新的"region"的簡單方法有以下幾個(gè)成員函數(shù): BOOL CRgn::CreateRectRgn( int x1, int y1, int x2, int y2 ); 創(chuàng)建矩形的“region”。

BOOL CRgn::CreateEllipticRgn( int x1, int y1, int x2, int y2 ); 創(chuàng)建圓形或橢圓形“region”。
BOOL CRgn::CreateRoundRectRgn( int x1, int y1, int x2, int y2, int x3, int y3 ); 創(chuàng)建圓角矩形“region”。
BOOL CRgn::CreatePolygonRgn( LPPOINT lpPoints, int nCount, int nMode ); 創(chuàng)建多邊形“region”。

  這里以創(chuàng)建橢圓窗體為例,介紹橢圓窗體創(chuàng)建的方法。在創(chuàng)建橢圓“region”的CreateEllipticRgn函數(shù)中,x1,y1指橢圓所在矩形的左上角坐標(biāo),x2,y2指該矩形的右下角坐標(biāo)。

  下面的代碼加入到MFC對話框程序的OnInitDialog函數(shù)中,可將該對話框變成橢圓窗體:

BOOL CTestDlg::OnInitDialog()
{
CDialog::OnInitDialog();
...
CRgn rgn;
rgn. CreateEllipticRgn(0,0,200,100);
SetWindowRgn(rgn,TRUE);
}


圖一 橢圓窗體效果圖

  四、作圖路徑法創(chuàng)建”region”

  使用該方法創(chuàng)建”region”的過程如下:

  第一步繪制所要創(chuàng)建的窗體形狀。
 
  該步驟中使用到CDC類中的一些成員函數(shù)如下:BOOL CDC::BeginPath( );

  調(diào)用該函數(shù)后當(dāng)前設(shè)備環(huán)境(DC)開始追蹤繪圖的過程。

int CDC::SetBkMode( int nBkMode );

  設(shè)置繪圖時(shí)的背景模式,此應(yīng)用中nBkMode必須取值為TRANSPARENT 。即設(shè)置繪圖時(shí)背景不發(fā)生變化。

BOOL CDC::EndPath( );

  調(diào)用該函數(shù)后當(dāng)前設(shè)備環(huán)境(DC)結(jié)束追蹤繪圖的過程。

  開始繪圖前,先調(diào)用BeginPath,然后調(diào)用SetBkMode。接下去就可調(diào)用CDC的其他繪圖函數(shù)作圖,例如Arc,AngleArc,LineTo,MoveTo,RoundRect,,Textout等等。繪圖完畢調(diào)用EndPath().

  第二步將繪制的結(jié)果轉(zhuǎn)成”region”.

  此步驟中使用SDK API函數(shù)

HRGN PathToRegion( HDC hdc );

  Hdc為作圖DC的句柄, CDC類中的m_hDC成員變量可做此參數(shù)傳入。示例,將下面代碼加入某個(gè)按鈕單擊事件中,可以將當(dāng)前窗體變?yōu)樽址県ello”的形狀

void CTestDlg::OnTest()
{
 HRGN wndRgn;
 CClientDC dc(this);
 CFont mFont;

 if (dc.m_hDC!=NULL)
 {
  VERIFY(mFont.CreateFont(200, 50, 0, 0, FW_HEAVY, TRUE, FALSE, 0, ANSI_CHARSET, OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_SWISS, "宋體"));

  //開始記錄窗體輪廓路徑
  dc.BeginPath();

  //設(shè)置背景為透明模式,這句話是必須有的。
  dc.SetBkMode(TRANSPARENT);

  CFont * pOldFont;
  pOldFont = dc.SelectObject( &mFont );
  dc.TextOut(0, 0, "Hello");

  //結(jié)束記錄窗體輪廓路徑
  dc.SelectObject( pOldFont );
  dc.EndPath();

  //把所記錄的路徑轉(zhuǎn)化為窗體輪廓句柄
  wndRgn = ::PathToRegion(dc.m_hDC);

  //賦予窗體指定的輪廓形狀
  this->SetWindowRgn(wndRgn, TRUE);
 }
}

  CClientDC是CDC的派生類,故此該類具有所有CDC類的成員變量和成員函數(shù)。


圖二 hello形狀的窗體效果圖

  五、根據(jù)圖像創(chuàng)建”region”

  此法創(chuàng)建不規(guī)則窗體比較復(fù)雜。首先準(zhǔn)備一張含有目標(biāo)窗體形狀的圖片,設(shè)置透明色即將圖片中部不屬于窗體形狀的部分,標(biāo)記成同一種顏色,例如藍(lán)色RGB(0,0,255).程序運(yùn)行后先裝入圖片。然后逐個(gè)掃描圖片的每個(gè)像素,如這個(gè)像素不屬于透明色,則在相應(yīng)位置創(chuàng)建一個(gè)只含一個(gè)像素的“region”然后將這些小”region ”合并起來組成一個(gè)任意形狀的”region”.這里將使用到CRgn的一個(gè)成員函數(shù) :int CRgn::CombineRgn( CRgn* pRgn1, CRgn* pRgn2, int nCombineMode );

  其中pRgn1,pRgn2為要合并的兩個(gè)“region”,nCombineMode為合并的方式,此應(yīng)用中取RGN_OR,即兩”region”全部合并去處重復(fù)部分。代碼實(shí)現(xiàn)如下:

void SetupRegion(
 CDC *pDC, //窗體的DC指針
 CBitmap &cBitmap, //含有窗體形狀的位圖對象
 COLORREF TransColor //透明色
)
{
 CDC memDC;
 //創(chuàng)建與傳入DC兼容的臨時(shí)DC
 memDC.CreateCompatibleDC(pDC);

 CBitmap *pOldMemBmp=NULL;
 //將位圖選入臨時(shí)DC
 pOldMemBmp=memDC.SelectObject(&cBitmap);

 CRgn wndRgn;
 //創(chuàng)建總的窗體區(qū)域,初始region為0
 wndRgn.CreateRectRgn(0,0,0,0);

 BITMAP bit;
 cBitmap.GetBitmap (&bit);//取得位圖參數(shù),這里要用到位圖的長和寬

 int y;
 for(y=0;y<=bit.bmHeight ;y++)
 {
  CRgn rgnTemp; //保存臨時(shí)region

  int iX = 0;
  do
  {
   //跳過透明色找到下一個(gè)非透明色的點(diǎn).
   while (iX <= bit.bmWidth && memDC.GetPixel(iX, y) == TransColor)
    iX++;
    //記住這個(gè)起始點(diǎn)
    int iLeftX = iX;

    //尋找下個(gè)透明色的點(diǎn)
    while (iX <= bit.bmWidth && memDC.GetPixel(iX, y) != TransColor)
     ++iX;

    //創(chuàng)建一個(gè)包含起點(diǎn)與重點(diǎn)間高為1像素的臨時(shí)“region”
    rgnTemp.CreateRectRgn(iLeftX, y, iX, y+1);

    //合并到主"region".
    wndRgn.CombineRgn(&wndRgn, &rgnTemp, RGN_OR);

   //刪除臨時(shí)"region",否則下次創(chuàng)建時(shí)和出錯(cuò)
   rgnTemp.DeleteObject();
  }while(iX GetWindow();
  pWnd->SetWindowRgn(wndRgn,TRUE);
  pWnd->SetForegroundWindow();
 }

  上述代碼創(chuàng)建的不規(guī)則窗體中,在OnEraseBkgnd事件中繪制該位圖,就可得到與該位圖形狀一模一樣的窗體。


圖三 根據(jù)位圖和位圖中的透明色創(chuàng)建的窗體效果圖

  六、小結(jié)

  三種創(chuàng)建“region”的方法,第一種最簡單,如果所需的窗體形狀是簡單的幾何圖形,這種方法最合適;第二種稍微復(fù)雜些,但是創(chuàng)建的窗體形狀更多些;第三種方法可以創(chuàng)建任何在圖片中畫出的窗體形狀,但是實(shí)現(xiàn)的復(fù)雜度也最高。
posted on 2006-11-26 00:28 獨(dú)孤九劍 閱讀(544) 評論(0)  編輯 收藏 引用 所屬分類: Win32Visual C++ 8.0
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            国产精品视频久久| 亚洲欧洲av一区二区| 亚洲一区二区精品视频| 最新国产成人av网站网址麻豆| 亚洲先锋成人| 中文在线一区| 欧美激情在线免费观看| 欧美**字幕| 在线观看欧美一区| 欧美主播一区二区三区| 欧美在线视频一区| 国产精品毛片大码女人| 日韩亚洲视频| 亚洲深夜激情| 欧美日韩成人在线观看| 亚洲高清一区二| 1000精品久久久久久久久| 欧美专区日韩专区| 久久精品一区四区| 国内不卡一区二区三区| 欧美在线视频观看免费网站| 欧美一区二区三区视频在线| 国产精品视频免费| 亚洲欧美福利一区二区| 欧美一区成人| 国产视频精品网| 欧美中文字幕在线播放| 久久中文在线| 亚洲电影视频在线| 女同一区二区| 日韩亚洲精品在线| 午夜国产精品视频免费体验区| 欧美无乱码久久久免费午夜一区| 日韩视频在线一区二区| 亚洲午夜影视影院在线观看| 国产精品久线观看视频| 亚洲欧美精品在线观看| 久久免费视频在线| 亚洲欧洲另类国产综合| 欧美日韩国产限制| 亚洲欧美日韩成人| 噜噜噜噜噜久久久久久91| 亚洲国产精品成人| 欧美—级a级欧美特级ar全黄| 亚洲欧洲在线看| 亚洲一区二区三区精品在线 | 久久精品一区二区三区不卡| 久久一区二区三区国产精品 | 在线观看免费视频综合| 美国成人直播| 一区二区日韩免费看| 久久激情五月激情| 亚洲电影免费| 国产精品成人av性教育| 久久成人在线| 日韩一级免费| 久久婷婷久久| 一区二区动漫| 雨宫琴音一区二区在线| 欧美日韩在线电影| 久久精品系列| 在线一区观看| 欧美国产综合一区二区| 亚洲自拍都市欧美小说| 在线观看日产精品| 国产精品欧美日韩一区二区| 久久久久欧美精品| 99re66热这里只有精品3直播| 午夜免费久久久久| 最新日韩在线视频| 国产午夜精品在线| 欧美日韩一区自拍| 久久只精品国产| 一区二区日韩欧美| 欧美激情精品久久久六区热门| 亚洲欧洲99久久| 亚洲美女av黄| 亚洲国产精品国自产拍av秋霞| 国产精品激情电影| 欧美国产精品劲爆| 久久久天天操| 欧美一区二粉嫩精品国产一线天| 亚洲欧洲日韩综合二区| 麻豆视频一区二区| 久久精品中文| 欧美中文在线观看国产| 亚洲一区二区在线观看视频| 亚洲国产一区二区a毛片| 国内久久视频| 国产麻豆9l精品三级站| 欧美深夜福利| 欧美精品在线观看播放| 暖暖成人免费视频| 久久久之久亚州精品露出| 亚洲免费小视频| 99综合视频| 99国产精品99久久久久久粉嫩 | 一区二区三区视频在线| 欧美激情自拍| 欧美黄色精品| 欧美成黄导航| 欧美激情精品久久久久久蜜臀| 乱人伦精品视频在线观看| 久久久久久久精| 久久久蜜桃精品| 久久久www成人免费精品| 久久精品九九| 久久亚洲国产成人| 久久婷婷综合激情| 裸体一区二区| 欧美国产日韩一区二区在线观看| 免费欧美电影| 亚洲电影免费观看高清完整版在线| 久久在线免费观看| 免费看成人av| 亚洲成色精品| 99亚洲伊人久久精品影院红桃| 亚洲乱码国产乱码精品精可以看 | 免费久久99精品国产自| 鲁大师影院一区二区三区| 欧美国产精品人人做人人爱| 欧美激情第1页| 亚洲精品久久嫩草网站秘色| 99re热这里只有精品视频| 一区二区三区蜜桃网| 午夜精品剧场| 毛片一区二区三区| 欧美日本国产| 国产免费成人av| 在线精品亚洲一区二区| 一区二区三区成人| 欧美一区二区三区日韩视频| 老司机67194精品线观看| 欧美激情四色| 亚洲一区二区视频| 久久资源av| 欧美天天视频| **网站欧美大片在线观看| 亚洲日本成人网| 先锋影音国产一区| 美女日韩欧美| 亚洲美女中文字幕| 久久国产精品免费一区| 欧美精品乱人伦久久久久久| 国产精品第一区| 亚洲第一中文字幕在线观看| 日韩一区二区精品| 久久精品国产清自在天天线| 欧美激情无毛| 午夜精品影院| 欧美日韩福利在线观看| 国产欧美一区二区精品忘忧草| 亚洲国产欧美另类丝袜| 亚欧成人精品| 亚洲乱码精品一二三四区日韩在线| 欧美在线视频一区二区三区| 欧美日韩高清一区| 精品成人一区二区三区四区| 亚洲小说欧美另类社区| 欧美成人亚洲成人日韩成人| 国产精品99久久久久久久久久久久| 久久久精品国产一区二区三区| 欧美日韩性生活视频| 亚洲福利国产精品| 欧美在线一级va免费观看| 亚洲伦理久久| 免费av成人在线| 国产日韩高清一区二区三区在线| 一区二区欧美在线| 亚洲福利在线看| 久久久久欧美| 精品999网站| 久久精品一区二区三区四区| 这里只有精品在线播放| 欧美日韩激情网| 亚洲精品少妇30p| 欧美电影免费观看高清| 欧美在线视频一区| 国产亚洲a∨片在线观看| 午夜国产不卡在线观看视频| 日韩午夜在线电影| 欧美日韩国产电影| 一区二区三区成人精品| 亚洲欧洲在线看| 欧美国产日韩视频| 日韩视频一区二区三区在线播放| 欧美国产精品久久| 久热精品视频在线观看| 在线观看欧美视频| 免费成人黄色| 久热re这里精品视频在线6| 狠狠色狠狠色综合日日小说| 久久网站热最新地址| 久久精品欧美| 精品69视频一区二区三区| 免播放器亚洲一区| 免费观看在线综合| 亚洲精品一区二区三区99| 亚洲三级影院| 国产精品免费区二区三区观看|