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

首頁 > 編程 > C > 正文

使用C++繪制不規(guī)則的窗體

2023-06-09 12:08:08
字體:
供稿:網(wǎng)友

  一、序言

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

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

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

  其中第二步很簡(jiǎn)單就調(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ù)相同。

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

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

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

  類CRgn創(chuàng)建一個(gè)新的"region"的簡(jiǎn)單方法有以下幾個(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對(duì)話框程序的OnInitDialog函數(shù)中,可將該對(duì)話框變成橢圓窗體:
 
BOOL CTestDlg::OnInitDialog()
{
CDialog::OnInitDialog();
...
CRgn rgn;
rgn. CreateEllipticRgn(0,0,200,100);
SetWindowRgn(rgn,TRUE);
}
 

圖一 橢圓窗體效果圖

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

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

  第一步繪制所要?jiǎng)?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)樽址?rdquo;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();

  //設(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, //含有窗體形狀的位圖對(duì)象
 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ù),這里要用到位圖的長(zhǎng)和寬

 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”的方法,第一種最簡(jiǎn)單,如果所需的窗體形狀是簡(jiǎn)單的幾何圖形,這種方法最合適;第二種稍微復(fù)雜些,但是創(chuàng)建的窗體形狀更多些;第三種方法可以創(chuàng)建任何在圖片中畫出的窗體形狀,但是實(shí)現(xiàn)的復(fù)雜度也最高。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
国产精品久久777777换脸| 国产精品极品尤物在线观看| 亚洲免费电影在线观看| 欧美三级黄网| 色婷婷综合久久久久中文字幕1| 久久精品欧美一区二区三区麻豆| 久久久精品日韩| 国产精品水嫩水嫩| 国产欧美日韩第一页| www.毛片| 午夜av免费在线观看| 国产真实的和子乱拍在线观看| 国产免费一区二区三区网站免费| 999在线观看免费大全电视剧| 手机免费av片| eeuss影院www在线播放| 最近国语视频在线观看免费播放| 日韩欧美精品| 欧美一级视频免费观看| 午夜精品影视国产一区在线麻豆| 在线毛片观看| 非洲一级黄色片| 宅男午夜电影| 亚洲精品黑牛一区二区三区| 在线视频观看亚洲| 精品久久久久久中文字幕人妻最新| 亚洲人成网77777色在线播放| 男女全黄做爰文章| 欧美性xxxx极品hd欧美风情| 国产精品国产三级欧美二区| 精品视频在线观看日韩| 欧美日韩在线观看免费| 伊人在线视频| www.xxxx欧美| 精品一区二区三区高清免费不卡| 日本高清中文字幕二区在线| 人妻大战黑人白浆狂泄| 精品国产一区二区三区久久| 伊人色综合久久天天五月婷| www.91av视频.com| 国产精品天天av精麻传媒| 免费观看成人www动漫视频| 中文在线观看免费| 国产v片在线观看| 亚洲性受xxx喷奶水| 国产精品天天操| 国产美女视频黄a视频免费| 欧美日韩综合一区二区| 欧美激情在线免费观看| wwwjizzjizzcom| 99久久久无码国产精品衣服| caoporn超碰国产公开| 永久免费网站视频在线观看| 在线看国产日韩| 欧美xxxxxbbbbb| 激情综合网俺也去| 夜夜摸夜夜操| 精品久久久在线观看| 中文字幕第四页| 国产自产高清不卡| 国产乱女淫av麻豆国产| 成人h动漫精品一区二区| 亚洲美女爱爱视频| 日韩国产在线不卡视频| 91综合久久| 欧美精品一区二区三区高清aⅴ| 韩日欧美一区二区| 欧美18—19性高清hd4k| 亚洲神马久久| 久本草在线中文字幕亚洲| 亚洲a级在线播放观看| 久草综合在线观看| 亚洲欧美制服丝袜| 可以直接在线观看的av| 欧美丝袜一区二区三区| 国产在线精品视频| 深爱五月综合网| 欧美大片在线免费观看| 99在线精品视频免费观看20| 久久蜜桃av一区二区天堂| 成年大片免费视频播放二级| 久久午夜羞羞影院免费观看| 欧美日韩成人在线观看| 日韩欧美一区三区| 亚洲四色影视在线观看| 精品日韩在线播放| 国产一区深夜福利| 国产精品亚洲片在线播放| 久久99国产精品久久99小说| 国产精品1区2区| 热99re久久精品这里都是免费| 天堂在线中文| 欧美喷水视频| 国产视频一区欧美| 日韩黄色短视频| 激情欧美国产欧美| 色av成人天堂桃色av| 99精品女人在线观看免费视频| 中文字幕观看在线| 成人午夜免费av| 欧美精品生活片| 九九热免费在线视频| 五月天视频在线观看| 美女久久久久久久久久| 天堂在线免费观看| 久久国产精品99久久久久久丝袜| 午夜精品三级视频福利| 亚洲视频在线观看网站| 欧美日韩蜜桃| 久久久久电影| 欧美日韩国产免费观看| 国产精品区一区| 91久久久一线二线三线品牌| 中文字幕v亚洲ⅴv天堂| 男人添女荫道口喷水视频| 青青草一区二区| 久久久老熟女一区二区三区91| 天堂中文在线资| 午夜精品一区二区三级视频| 久久五月天色综合| 清纯唯美亚洲经典中文字幕| 日本免费高清不卡| av免费在线电影| 无码人妻一区二区三区在线| 麻豆一区在线观看| 性一交一乱一精一晶| 波多野结衣不卡视频| 最新国产在线拍揄自揄视频| 99c视频在线| 日韩欧美理论片| 天天av天天翘天天综合网| 色版视频在线观看| 欧美黄色大片在线观看| 黄色视屏免费在线观看| 亚洲欧洲综合另类在线| 蜜桃成人精品| 男人的天堂在线免费视频| 日韩福利电影在线| 第九色区av在线| 日本精品入口免费视频| 欧美激情久久久久久久久久久| 精品国产乱码久久久久久免费| 青青青伊人色综合久久| 91视频免费在观看| 少妇av在线| 国产精品地址| 欧美日韩久久一区| 国产日产欧美视频| 日韩精品一级| 亚洲综合久久av一区二区三区| 99er精品视频| 暖暖视频在线免费观看| 美女91在线| 亚洲精品一区二区在线| 在线 丝袜 欧美 日韩 制服| 午夜写真片福利电影网| 精品捆绑调教一区二区三区| 国产97免费视| 最新亚洲精品国自产在线观看| 欧美wwwsss9999| 欧美性猛交xxxx乱大交3| 特级西西444www大精品视频免费看| 国产亚洲精品久久久久动| 日本综合视频| 欧美军同video69视频| 在线观看一区二区三区四区| 精品国产免费人成在线观看| 成人av在线一区二区| 色激情天天射综合网| 亚洲一区二区三区高清| 少妇高潮一区二区三区喷水| 精品视频国内| 日本电影全部在线观看网站视频| 国产成人av网站| 国产日韩亚洲欧美| 欧美日韩一区二区三区不卡| 免费国产一区二区| 国内精品一区二区三区四区| 国产精品欧美一区二区| 婷婷久久综合九色综合绿巨人| 国产精品av在线播放| 麻豆入口视频在线观看| 91福利小视频| 青青青免费视频在线2| 哪个网站能看毛片| 久久精品a一级国产免视看成人| 久久99精品久久久久久水蜜桃| 国产超碰在线一区| 午夜精彩国产免费不卡不顿大片| 久久久999久久久| 日韩欧美在线综合网| 美洲天堂一区二卡三卡四卡视频| 亚洲欧美一区二区三区| 一区av在线播放| 国产精品亚洲综合在线观看| 欧美性大战久久久久久久蜜臀| 国产特级黄色片| 中文视频一区视频二区视频三区| 欧美精品video| 日韩精品一区二区三区视频播放| 精彩国产在线| 亚洲日韩成人| 高清不卡日本v二区在线| 久久影视精品| 色婷婷国产精品| 欧美xxxx少妇| 欧美写真视频网站| 久久涩涩网站| 欧美日韩亚洲一区在线观看| 日本性视频网站| 99久久99久久精品国产片桃花| 日韩欧美一区在线观看| 成人免费av资源| 久草免费资源| 海角社区69精品视频| 一二三区中文字幕| 中文字幕精品—区二区| 亚洲国产高清自拍| 欧美精品少妇| 精品成人在线观看| 999福利在线视频| 无颜之月在线看| 99精品在线免费在线观看| 欧洲中文字幕国产精品| 欧美国产日韩a欧美在线观看| 色婷婷亚洲综合| 亚洲制服中文字幕| 成人性生交xxxxx网站| 另类一区二区三区| av在线免费播放网站| 人人干狠狠干| 日韩精品成人免费观看视频| 欧美不卡在线视频| 亚洲黄色小说网址| 自拍偷拍中文字幕| 99re这里都是精品| 超碰在线观看免费| 成年人视频大全| 日本成人午夜影院| 国产69精品久久久久久久久久| 97免费视频观看| 久久国产福利| 99久久国产热无码精品免费| 99精品免费视频| 国产丝袜在线| 免费看黄网站在线观看| 精品中文字幕一区二区小辣椒| 久久久人成影片一区二区三区观看| 精品婷婷色一区二区三区蜜桃| 日本黄色电影网站| 午夜精品久久久久久久久久久| 国产精品欧美激情| 男男互摸gay网站| 美女在线视频一区二区| а√天堂官网中文在线| 亚洲欧洲精品一区二区| 久久成人亚洲| eeuss国产一区二区三区| 久久精品亚洲麻豆av一区二区| 久久99久久久久久| 亚洲黄色毛片| 一本色道**综合亚洲精品蜜桃冫| 亚洲日本欧美| 亚洲天堂男人的天堂| 最新中文字幕av专区| 亚洲aa在线观看| 最新一本之道波多野结衣| 四虎影视成人精品国库在线观看| 欧美三级黄网| 国产呦小j女精品视频| 色噜噜狠狠色综合中国| 宅男66日本亚洲欧美视频| 亚洲va天堂va国产va久| 国产精品自拍偷拍| swag国产精品一区二区| 青青视频在线播放| 传媒av在线| www.四虎网站| 欧美大片黄色| 日本调教视频在线观看| 成人av观看| 欧美精品不卡| 亚洲成人激情综合网| 国产69精品一区二区亚洲孕妇| 欧美一区二区精品| 无圣光视频在线观看| 久久成人激情视频| 日韩免费观看高清完整版| 国产主播在线播放| 亚洲熟妇国产熟妇肥婆| 26uuu精品一区二区三区四区在线| 亚洲女人小视频在线观看| 日本一级黄色录像| 精品无人国产偷自产在线| 黄色影院在线看| 日本wwwxx| 天天综合色天天综合色h| 国产网站欧美日韩免费精品在线观看| 手机在线观看av网站| 久久躁狠狠躁夜夜爽| 中文字幕影片免费在线观看| 91色porny蝌蚪| 亚洲女同精品视频| 日韩网址在线观看| 日韩欧美一区二区不卡| 国产精品久久777777换脸| 国产一级电影网| 日韩av自拍偷拍| 91在线观看免费| aa级大片免费在线观看| 欧美视频国产视频| 免费三片在线播放| 精品久久免费看| 久久久久久久精| 男人的天堂av社区在线| 韩日成人影院| 国产精品欧美综合亚洲| 欧美美乳视频网站在线观看| 国产精品调教视频| 日本成人在线免费观看| 色悠久久久久综合欧美99| 久久久精品免费观看| 日韩激情在线观看| 亚洲色图第一页| 无套内谢大学处破女www小说| 国产一级二级视频| 99精品视频在线观看免费播放| 美女被男人操网站|