熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> C編程 >> 正文

Windows 中不規則窗體的編程實現

2022-06-13   來源: C編程 

  Windows 中不規則窗體的編程實現
     
     下載源代碼

     序言

       在絕大多數的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"的簡單方法有以下幾個成員函數


  1. BOOL CRgn::CreateRectRgn( int x int y int x int y ); 創建矩形的region        


  2. BOOL CRgn::CreateEllipticRgn( int x int y int x int y ); 創建圓形或橢圓形region        


  3. BOOL CRgn::CreateRoundRectRgn( int x int y int x int y int x int y ); 創建圓角矩形region        


  4. BOOL CRgn::CreatePolygonRgn( LPPOINT lpPoints int nCount int nMode ); 創建多邊形region

  這裡以創建橢圓窗體為例介紹橢圓窗體創建的方法在創建橢圓region的CreateEllipticRgn函數中xy指橢圓所在矩形的左上角坐標xy指該矩形的右下角坐標
       下面的代碼加入到MFC對話框程序的OnInitDialog函數中可將該對話框變成橢圓窗體
     

  BOOL CTestDlg::OnInitDialog(){ CDialog::OnInitDialog(); CRgn rgn; rgn CreateEllipticRgn(); SetWindowRgn(rgnTRUE);}


     圖一 橢圓窗體效果圖
     
作圖路徑法創建region

使用該方法創建region的過程如下
第一步繪制所要創建的窗體形狀
該步驟中使用到CDC類中的一些成員函數如下

  BOOL CDC::BeginPath( );

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

  int CDC::SetBkMode( int nBkMode );

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

  BOOL CDC::EndPath( );

  調用該函數後當前設備環境(DC)結束追蹤繪圖的過程
  開始繪圖前先調用BeginPath然後調用SetBkMode接下去就可調用CDC的其他繪圖函數作圖例如ArcAngleArcLineToMoveToRoundRectTextout等等繪圖完畢調用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 (dcm_hDC!=NULL)    {        VERIFY(mFontCreateFont(             FW_HEAVY TRUE FALSE             ANS    


From:http://tw.wingwit.com/Article/program/c/201401/30248.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.