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

道。道。道

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

   :: 首頁 :: 聯系 :: 聚合  :: 管理

常用鏈接

搜索

  •  

最新評論

一、序言

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

  二、實現原理

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

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

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

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

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

  在MFC中"region"對象,由CRgn類實現。CRgn的幾乎每個成員函數都有同名的SDK API函數對應。

  三、簡單“region”的創建

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

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

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

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

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


圖一 橢圓窗體效果圖

  四、作圖路徑法創建”region”

  使用該方法創建”region”的過程如下:

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

  調用該函數后當前設備環境(DC)開始追蹤繪圖的過程。

int CDC::SetBkMode( int nBkMode );

  設置繪圖時的背景模式,此應用中nBkMode必須取值為TRANSPARENT 。即設置繪圖時背景不發生變化。

BOOL CDC::EndPath( );

  調用該函數后當前設備環境(DC)結束追蹤繪圖的過程。

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

  第二步將繪制的結果轉成”region”.

  此步驟中使用SDK API函數

HRGN PathToRegion( HDC hdc );

  Hdc為作圖DC的句柄, CDC類中的m_hDC成員變量可做此參數傳入。示例,將下面代碼加入某個按鈕單擊事件中,可以將當前窗體變為字符串”hello”的形狀

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();

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

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

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

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

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

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


圖二 hello形狀的窗體效果圖

  五、根據圖像創建”region”

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

  其中pRgn1,pRgn2為要合并的兩個“region”,nCombineMode為合并的方式,此應用中取RGN_OR,即兩”region”全部合并去處重復部分。代碼實現如下:

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

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

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

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

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

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

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

    //創建一個包含起點與重點間高為1像素的臨時“region”
    rgnTemp.CreateRectRgn(iLeftX, y, iX, y+1);

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

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

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


圖三 根據位圖和位圖中的透明色創建的窗體效果圖

  六、小結

  三種創建“region”的方法,第一種最簡單,如果所需的窗體形狀是簡單的幾何圖形,這種方法最合適;第二種稍微復雜些,但是創建的窗體形狀更多些;第三種方法可以創建任何在圖片中畫出的窗體形狀,但是實現的復雜度也最高。
posted on 2006-11-26 00:28 獨孤九劍 閱讀(540) 評論(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>
            狠狠操狠狠色综合网| 久久综合久久美利坚合众国| 欧美精品在线观看| 麻豆精品在线视频| 久久综合狠狠综合久久综青草| 久久国产一区| 久久久久在线| 欧美成人精品不卡视频在线观看 | 99国产精品| 亚洲欧洲在线视频| 中日韩美女免费视频网站在线观看| 99国产精品自拍| 欧美亚洲一区| 欧美成人在线免费视频| 亚洲激情视频在线| 欧美成人精品影院| 亚洲精品免费一区二区三区| 中文久久精品| 久久看片网站| 国产精品一区二区三区成人| 亚洲成色最大综合在线| 亚洲午夜免费视频| 开心色5月久久精品| 99ri日韩精品视频| 久久久久一区二区三区四区| 欧美日韩成人免费| 激情综合网址| 欧美亚洲视频在线看网址| 欧美电影免费观看大全| 亚洲永久免费观看| 欧美精品日韩一区| 在线观看一区| 久久国产精品99国产| 亚洲精品日产精品乱码不卡| 欧美中文字幕在线观看| 欧美性猛交xxxx免费看久久久| 在线观看日韩欧美| 欧美一区二区国产| 亚洲国产精品日韩| 午夜欧美视频| 亚洲精品乱码久久久久久久久| 久久精品一区二区三区四区 | 国产精品视频一区二区高潮| 亚洲欧洲日产国产网站| 久久av资源网站| 国产精品99久久久久久久女警 | 国产日韩视频| 亚洲女人小视频在线观看| 欧美激情一区二区| 久久精品中文字幕一区| 国产精品视频一二| 亚洲男人影院| 亚洲一区二区视频在线| 欧美日韩成人一区二区三区| 亚洲精品乱码久久久久| 欧美a级片一区| 久久精品一区二区三区不卡| 国产一区二区成人| 久久精品一区二区三区中文字幕| 9i看片成人免费高清| 欧美日韩精品免费看| 在线亚洲高清视频| 一区二区国产日产| 国产精品xxx在线观看www| 亚洲视频一区二区免费在线观看| 亚洲精品日韩在线观看| 欧美理论电影在线播放| 日韩亚洲在线| 亚洲久久在线| 欧美视频在线观看| 午夜精品久久久久久99热软件| 这里只有精品在线播放| 国产精品jizz在线观看美国 | 在线观看欧美视频| 亚洲第一天堂无码专区| 欧美大片第1页| 夜夜嗨一区二区| 在线视频你懂得一区二区三区| 国产精品久久午夜夜伦鲁鲁| 性久久久久久| 久久精品中文字幕免费mv| 91久久精品美女高潮| 亚洲伦理网站| 国产日韩欧美综合精品| 免费观看久久久4p| 欧美精品亚洲二区| 性刺激综合网| 欧美国产精品久久| 亚洲欧美国产视频| aa成人免费视频| 国产欧美一区二区三区国产幕精品 | 亚洲精品午夜精品| 一区二区三区视频观看| 国产一区二区三区精品欧美日韩一区二区三区 | 亚洲女ⅴideoshd黑人| 久久精品成人一区二区三区蜜臀| 亚洲国产精彩中文乱码av在线播放| 亚洲国产高清自拍| 国产精品久久久久免费a∨| 久久中文字幕导航| 欧美午夜一区二区| 欧美www视频在线观看| 欧美日韩精品| 美女主播精品视频一二三四| 欧美精品一区二区三区很污很色的| 亚洲欧美日韩中文在线制服| 久久久午夜精品| 亚洲欧美日本在线| 欧美精品免费在线| 奶水喷射视频一区| 国产精品入口福利| 亚洲人在线视频| 黄色日韩在线| 亚洲视频二区| 一区二区免费看| 另类图片综合电影| 久久久精品动漫| 国产精品区一区二区三| 亚洲精品免费在线播放| 精品盗摄一区二区三区| 亚洲一区综合| 亚洲欧美偷拍卡通变态| 欧美日本一区二区视频在线观看| 美国成人毛片| 国产日韩在线亚洲字幕中文| 一本久久综合亚洲鲁鲁| 亚洲精品国产精品国产自| 久久精品91| 久久se精品一区二区| 国产精品v亚洲精品v日韩精品 | 久久精品伊人| 国产亚洲欧美一区二区三区| 一本久久a久久免费精品不卡| 亚洲精品孕妇| 欧美3dxxxxhd| 亚洲国产美女| 日韩一级裸体免费视频| 欧美精品v日韩精品v国产精品| 亚洲电影免费观看高清| 最新成人在线| 欧美精品videossex性护士| 亚洲靠逼com| 欧美国产日本高清在线| 亚洲国产高清一区二区三区| 久久一区二区三区四区| 免费在线看成人av| 在线欧美视频| 欧美大片免费观看在线观看网站推荐 | 国产精品国产三级国产普通话99| 亚洲毛片在线观看.| 在线一区亚洲| 国产精品嫩草99a| 欧美在线一二三| 老司机67194精品线观看| 亚洲高清自拍| 欧美精品日日鲁夜夜添| 一区二区三区日韩| 久久精品国产视频| 亚洲第一偷拍| 欧美日韩精品在线视频| 亚洲一级黄色片| 玖玖玖免费嫩草在线影院一区| 亚洲欧洲日产国产网站| 国产精品久久久久久久午夜| 久久av一区| 亚洲精品免费在线播放| 久久成人18免费网站| 亚洲福利精品| 欧美午夜宅男影院在线观看| 欧美一区二区视频在线| 亚洲成色www8888| 国产精品v欧美精品∨日韩| 99re8这里有精品热视频免费| 亚洲欧美日韩国产一区| 狠狠色综合网站久久久久久久| 欧美成人精精品一区二区频| 亚洲一区二区在线免费观看| 免费在线观看一区二区| 亚洲视频图片小说| 狠狠噜噜久久| 欧美午夜在线一二页| 老司机一区二区| 小黄鸭视频精品导航| 亚洲精品123区| 久久久美女艺术照精彩视频福利播放 | 欧美日韩一区二区在线视频| 欧美亚洲一区三区| 亚洲精品中文字幕女同| 久久久亚洲人| 亚洲欧美99| 一区二区三区不卡视频在线观看 | 一本一本久久a久久精品综合妖精| 久久久久久穴| 午夜在线a亚洲v天堂网2018| 亚洲日韩视频| 激情综合色丁香一区二区| 国产一区二区久久久| 国产精品中文字幕欧美| 欧美日韩国内| 欧美国产先锋|