メルマガ:■CからウィンドウズDIRECTXプログラミング
タイトル:■CからはじめるWindowsDirectXへの道 Vol32■  2000/07/06


=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-//    PR//-=-=



       イケてる飲み屋さんの情報を交換しませんか?

     URL  http://www.hitobito.net/ct/nomiya10.html 


    知りたいことがきっとある!
       ひとびと・net  http://www.hitobito.net/ct/melct.html
=-=-//000108-00637//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=


発行部数:MagMag 2260  Pubzine 308  カプライト208
     Melten 28  E-Magazine 56  ここでメール 146
     Macky 139 Melma 225  

 総発行部数:3370
    
▼△▼△▼△▼△▼△▼△▼△▼△▼△▼△▼△▼△▼△▼△▼△▼
------------------------------------------------------------
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓

■CからはじめるWindowsDirectXへの道 Vol32■          

┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛

┌─────────────────────────────┐


■第2章 Windows(RGN 編)   


└─────────────────────────────┘
       今回は,少し息抜きとして知っている方も多いと思われますが
    ウィンドウの形を変えるサンプルを載せたいと思います.
    工夫次第ではツールができると思うのでいろいろ研究を
    してみてください.
        
───────────────────────────────
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
                ●   RGN 関連  ●
    
  今回は、RGN について触れていきます.
  関数などの説明は、サンプルのあとに乗せていきます。
  
 それでは、コードを示していきたいと思います。
┌─────────────────────────────┐
        #include<windows.h>


       #undef WindowsName
       #define WindowsName "Windows"
       /*  デバッグ用メッセージボックス   */
       void Mes(char*error);
       void Mes(char*error)
       {
               MessageBox(NULL,error,"Error",MB_OK);
       }
       HWND hwndMain;
       HINSTANCE hInst;
       BOOL fActive;
       LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
       int PASCAL WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
       {

        WNDCLASSEX wc;
           hInst=hInstance;
        wc.hInstance =hInstance;
        wc.lpszClassName=WindowsName;
        wc.lpszMenuName=WindowsName;
        wc.lpfnWndProc =WndProc;
        wc.cbSize =sizeof(WNDCLASSEX);
        wc.hbrBackground =(HBRUSH)GetStockObject(GRAY_BRUSH);
       wc.cbClsExtra =0;
        wc.cbWndExtra =0;
       wc.hIcon =(HICON)LoadIcon(NULL,IDI_APPLICATION);
        wc.hCursor=(HCURSOR)LoadCursor(NULL,IDC_ARROW);
       wc.style =CS_HREDRAW|CS_VREDRAW;
        wc.hIconSm =NULL;


       if(!(ATOM)RegisterClassEx(&wc))
        {
        Mes("レジスタークラスに登録を失敗しました。または、WNDCLASSEXの初期化に失敗しました。") ;
        return 0;
       }
        hwndMain=CreateWindow(
        WindowsName,
        WindowsName,
       WS_OVERLAPPEDWINDOW|WS_CLIPCHILDREN,
        CW_USEDEFAULT,
        CW_USEDEFAULT,
       320,
        320,
        NULL,
       NULL,
        hInstance,
        NULL);
        ShowWindow(hwndMain,nCmdShow);
       UpdateWindow(hwndMain);

        MSG msg;
        while(GetMessage(&msg,NULL,0,0))
        {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
       }

        return msg.wParam;
       }

       LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
       {
       int VERTEX[1]={4};
        HRGN hRgn;
       static POINT ptStar[4]={
       {100,260},
        {220,220},
        {260,100},
       {100,0}
               };
       switch(message)
        {
       case WM_SHOWWINDOW:
       hRgn=CreatePolyPolygonRgn(ptStar,VERTEX,1,WINDING);
        SetWindowRgn(hwnd,hRgn,false);
        break;
        case WM_KEYDOWN:
        if(LOWORD(wParam)==VK_ESCAPE)
        DestroyWindow(hwnd);
        break;
       case WM_DESTROY:
        PostQuitMessage(0);
        break;
        default:
        return DefWindowProc(hwnd,message,wParam,lParam);
        }
       return 0;
       }
 
└─────────────────────────────┘
  さて、説明を記していきます.
───────────────────────────────
         int VERTEX[1]={4};
        HRGN hRgn;
       static POINT ptStar[4]={
       {100,260},
        {220,220},
        {260,100},
       {100,0}
               };


───────────────────────────────
     ここでは,ウィンドウの形を決める頂点の数.
    RGNのハンドル
   POINT構造体(X,Y)を宣言しています.
───────────────────────────────
       case WM_SHOWWINDOW:
       hRgn=CreatePolyPolygonRgn(ptStar,VERTEX,1,WINDING);
        SetWindowRgn(hwnd,hRgn,false);
        break;
───────────────────────────────
   ここでは,ウィンドウを表示するときに
   先ほど定義した定数をCreatePolyPlygonRgn関数に
   割り当て、SetWinmdowRgnによって指定したウィンドウの
   形を変えています.
───────────────────────────────
     hRgn=CreatePolyPolygonRgn(ptStar,VERTEX,1,WINDING);
───────────────────────────────
        BOOL CreatePolyPolygonRgn( LPPOINT lpPoints, LPINT lpPolyCounts, 
       int nCount, int nPolyFillMode );

       戻り値

       正常終了した場合は 0 以外を返します。それ以外の場合は 0 を返します。
       
       引数

       lpPoints

       多角形の頂点を定義した POINT 構造体の配列、または CPoint オブジェクトの配列
       へのポインタ。
       システムは各多角形を自動的には閉じないので、明示的に閉じる必要があります。
       多角形は連続的に指定されます。POINT 構造体は次の形式を持っています。

       typedef struct tagPOINT {
          int x;
          int y;
       } POINT;

       lpPolyCounts

       整数の配列へのポインタ。
       最初の整数値は、lpPoints 配列内の最初の多角形の頂点の数を、2 番目の整数値は 
       2 番目の多角形の頂点の数を、といったように指定していきます。

       nCount

       lpPolyCounts 配列内の整数値の総数を指定します。

       nPolyFillMode

       多角形塗りつぶしモードを指定します。
       この値は、ALTERNATE または WINDING のいずれかになります。

       ───────────────────────────────


       多角形塗りつぶしモードが ALTERNATE のとき、

       システムは各スキャン ライン上の多角形の奇数辺と偶数辺との間のリージョンを
       塗りつぶします。
       つまり、最初の辺と次の辺の間、3 番目と 4 番目の辺の間、というように塗りつぶし
       ていきます。


       ───────────────────────────────

       多角形塗りつぶしモードが WINDING のとき、

       システムはその領域を塗りつぶすかどうかを判断するために、図形を描画した方向を
       使います。
       多角形の各線分は時計回りか、または反時計回りに描画されます。閉じたリージョンから
       図形の外側へ向かって描画される仮想線が時計回りに描画された線分と交ったときは、
       カウントを増加します。
       仮想線が反時計回りに描画された線分と交ったときは、カウントを減少します。
       線が図形の外側へ到達したときのカウントが 0 以外ならば、その領域を塗りつぶします。


       ───────────────────────────────
        SetWindowRgn(hwnd,hRgn,false);
 

       ───────────────────────────────
        戻り値

       成功すると、0 以外を返します。失敗すると、0 を返します。

       引数

       HWND 

       指定するウィンドウ

       hRgn

       領域へのハンドル。

       bRedraw

       TRUE にすると、領域の設定後、オペレーティング システムによって
       ウィンドウが再描画されます。TRUE 以外にすると描画されません。
       通常、可視ウィンドウの場合は、bRedraw を TRUE に設定します。
       TRUE に設定すると、WM_WINDOWPOSCHANGING および
        WM_WINDOWPOSCHNGED メッセージがウィンドウに送られます


       今回は,かなり短いサンプルでした.
       また他にも

       CreatePolyRgn関数,
    CreateRoundRectRgn関数,
       CreateRectRgn関数,
       CreateEllipticRgn関数 

       などもありますので、そちらの方との違いも
       確かめてみてください.


   また、最近就職・転職活動などはネットを使ってする方が
   多いと思います.そこで以下のようなサイトがあります.
   一度覗いてみてはいかがでしょうか?

==== [ ▼PR ] ========================================================
◇◆転職の新しいスタイル「逆求人」《  登龍門  》で自分を売り込め!◆◇
登龍門では、転職をお考えの方に最新の求人情報をご提供しております。
今話題の【逆求人】は、数々のマスコミに登場、最近では6月6日の
読売新聞経済欄で大きく報道されました。   ▼あなたの天職がここに▼
ベンチャー専門求人「登 龍 門 http://216.71.100.246/a/a.cgi?k0840m0469 
======================================================== [ ▲PR ] ====
■マガジン発行者のうれしいクリックを!
■広告掲載マガジン募集中!< http://216.71.100.246/b/a.cgi?k0010m0469 >
======================================================== [ ▲PR ] ====

└─────────────────────────────┘  

なお、以上のプログラムは、私の動作環境VC++6.0 Win32 Application
で確認済みです.
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
 
 メールアドレス:<mailto:rain2000@geocities.co.jp>
 ホームページ :<http://www.geocities.co.jp/SiliconValley-Bay/3125>

 発行者:rain2000
 編集 :rain2000

 このメールマガジンは,以下の発行者さんを通して発行してます.

 ●まぐまぐ:
  アドレス : http://www.mag2.com/
 ID    : 0000024922

 ●クリックインカム:
 アドレス :http://clickincome.net/
 ID    : m00002885

 ●Pubzine 
 アドレス :Pubzine (http://www.pubzine.com/)
 ID    :004293

  ●ここでメール
 アドレス : http://mail.cocode.ne.jp/
 ID    : 0400100071

 ●メルマガ天国
 アドレス : http://melten.com/
 ID    : 300

 ●E-magazine 
 アドレス :http://www.emaga.com/
 ID    :cwindows

 ●Macky   
 アドレス : http://macky.nifty.ne.jp/
 ID    : 2329

  ●カプライト  
 アドレス : http://kapu.cplaza.ne.jp/ 
 ID    : 234
 また、登録解除などの手続きに関しましては,上記の  
  ホームにてお願いします.

┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━


ブラウザの閉じるボタンで閉じてください。