• <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>
            隨筆 - 505  文章 - 1034  trackbacks - 0
            <2009年3月>
            22232425262728
            1234567
            891011121314
            15161718192021
            22232425262728
            2930311234


            子曾經曰過:編程無他,唯手熟爾!

            常用鏈接

            留言簿(94)

            隨筆分類(649)

            隨筆檔案(505)

            相冊

            BCB

            Crytek

            • crymod
            • Crytek's Offical Modding Portal

            Game Industry

            OGRE

            other

            Programmers

            Qt

            WOW Stuff

            搜索

            •  

            積分與排名

            • 積分 - 911304
            • 排名 - 14

            最新隨筆

            最新評論

            閱讀排行榜

            評論排行榜

            效果:

            解說:

            畫橫著的segment


            畫cell,就是畫小方塊;還有每個segment的索引編號


            代碼:

            #include 
            <d3dx9.h>
            #pragma warning( disable : 4996 ) 
            // disable deprecated warning 
            #include <strsafe.h>
            #pragma warning( 
            default : 4996 ) 

            //-----------------------------------------------------------------------------
            // Global variables
            //-----------------------------------------------------------------------------
            LPDIRECT3D9             g_pD3D       = NULL; // Used to create the D3DDevice
            LPDIRECT3DDEVICE9       g_pd3dDevice = NULL; // Our rendering device
            LPDIRECT3DVERTEXBUFFER9 g_pVB        = NULL; // Buffer to hold vertices 頂點Buffer


            const static float c_fSharpH = 4.0f;      // 尖頭的高度(注意:尖頭是直角的,所以尖頭那個三角形的高和底邊的一半相等)
            const static float c_fMid = 30.0f;        // 中段的寬度
            const static float c_fOffsetSmall = 1.0f; // 微調

            const static float c_fHeight = 6.0f;      // 小方塊對角線/2

            const float c_fGap = 2.0f;                // 數字間或數字與冒號的距離

            float fNumberWidth = 4*c_fSharpH+2*c_fOffsetSmall+c_fMid; // 一個數字的寬度
            float fCellWidth = 2*c_fHeight;                           // 小方塊的寬度

            // A structure for our custom vertex type 
            // 自定義頂點類型
            struct CUSTOMVERTEX
            {
                D3DXVECTOR4 position; 
            // The transformed position for the vertex
                DWORD color;          // The vertex color
            };

            // Our custom FVF, which describes our custom vertex structure
            #define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZRHW|D3DFVF_DIFFUSE)

            //-----------------------------------------------------------------------------
            // Name: InitD3D()
            // Desc: Initializes Direct3D
            //-----------------------------------------------------------------------------
            HRESULT InitD3D( HWND hWnd )
            {
                
            // Create the D3D object.
                if( NULL == ( g_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) )
                    
            return E_FAIL;

                
            // Set up the structure used to create the D3DDevice
                D3DPRESENT_PARAMETERS d3dpp;
                ZeroMemory( &d3dpp, 
            sizeof(d3dpp) );
                d3dpp.Windowed = TRUE;
                d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
                d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;

                
            // Create the D3DDevice
                if( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
                    D3DCREATE_SOFTWARE_VERTEXPROCESSING,
                    &d3dpp, &g_pd3dDevice ) ) )
                {
                    
            return E_FAIL;
                }

                
            // Device state would normally be set here

                
            return S_OK;
            }

            //-----------------------------------------------------------------------------
            // Name: Cleanup()
            // Desc: Releases all previously initialized objects
            //-----------------------------------------------------------------------------
            VOID Cleanup()
            {
                
            if( g_pVB != NULL )        
                    g_pVB->Release();

                
            if( g_pd3dDevice != NULL ) 
                    g_pd3dDevice->Release();

                
            if( g_pD3D != NULL )       
                    g_pD3D->Release();
            }

            VOID DrawSegment(
            const CUSTOMVERTEX* pVerticesTemplate, size_t sizeTemplate, D3DXVECTOR4& vectorOffset)
            {
                
            if( g_pVB != NULL )        
                    g_pVB->Release();

                CUSTOMVERTEX tmpVitices[6];
                memcpy(tmpVitices, pVerticesTemplate, sizeTemplate);
                
            for (int i = 0; i < 6; ++i)
                {
                    tmpVitices[i].position += vectorOffset;
                }
                g_pd3dDevice->CreateVertexBuffer( 6*
            sizeof(CUSTOMVERTEX),
                    0, D3DFVF_CUSTOMVERTEX,
                    D3DPOOL_DEFAULT, &g_pVB, NULL );

                VOID* pVertices; 
            // 輸出參數
                g_pVB->Lock( 0, sizeof(tmpVitices), (void**)&pVertices, 0 );
                memcpy( pVertices, tmpVitices, 
            sizeof(tmpVitices) );
                g_pVB->Unlock();
                g_pd3dDevice->SetStreamSource( 0, g_pVB, 0, 
            sizeof(CUSTOMVERTEX) );
                g_pd3dDevice->SetFVF( D3DFVF_CUSTOMVERTEX );
                g_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, 0, 4 );
            }


            /// 畫一個數字
            VOID DrawDigit(int nNumber, float fStartXOffset = 0.0f, float fStartYOffset = 0.0f)
            {
                
            // 0x1代表有,0x3代表有并且橫著
                const static BYTE  SevenSegment [10][7] = {
                    3, 1,     1,     0,     1,     1,     3,             
            // 0
                    0, 0,     1,     0,     0,     1,     0,             // 1
                    3, 0,     1,     3,     1,     0,     3,             // 2
                    3, 0,     1,     3,     0,     1,     3,             // 3
                    0, 1,     1,     3,     0,     1,     0,             // 4
                    3, 1,     0,     3,     0,     1,     3,             // 5
                    3, 1,     0,     3,     1,     1,     3,             // 6
                    3, 0,     1,     0,     0,     1,     0,             // 7
                    3, 1,     1,     3,     1,     1,     3,             // 8
                    3, 1,     1,     3,     0,     1,     3 } ;        // 9
                //  0  1    2   3   4   5   6

                
            const static float c_fStartX = c_fOffsetSmall + c_fSharpH;
                
            const static float c_fStartY = 0.0f;

                
            // 橫著的segment
                static CUSTOMVERTEX verticesSegmentHori[] =
                {
                    
            /*0*/{ D3DXVECTOR4( c_fStartX,                      c_fStartY+c_fSharpH,    0.5f, 1.0f), 0xffff0000, }, 
                    
            /*1*/{ D3DXVECTOR4( c_fStartX+c_fSharpH,              c_fStartY,              0.5f, 1.0f), 0xffff0000, },
                    
            /*2*/{ D3DXVECTOR4( c_fStartX+c_fSharpH,              c_fStartY+2*c_fSharpH,  0.5f, 1.0f), 0xffff0000, },
                    
            /*3*/{ D3DXVECTOR4( c_fStartX+c_fSharpH+c_fMid,      c_fStartY,              0.5f, 1.0f), 0xffff0000, },
                    
            /*4*/{ D3DXVECTOR4( c_fStartX+c_fSharpH+c_fMid,      c_fStartY+2*c_fSharpH,  0.5f, 1.0f), 0xffff0000, },
                    
            /*5*/{ D3DXVECTOR4( c_fStartX+c_fSharpH*2+c_fMid,   c_fStartY+c_fSharpH,    0.5f, 1.0f), 0xffff0000, },
                };
                
            // 豎著的segment
                static CUSTOMVERTEX verticesSegmentVert[] =
                {
                    
            /*0*/{ D3DXVECTOR4( c_fStartX+c_fSharpH,     c_fStartY,                    0.5f, 1.0f), 0xffff0000, }, 
                    
            /*1*/{ D3DXVECTOR4( c_fStartX+2*c_fSharpH,   c_fStartY+c_fSharpH,          0.5f, 1.0f), 0xffff0000, },
                    
            /*2*/{ D3DXVECTOR4( c_fStartX,               c_fStartY+c_fSharpH,          0.5f, 1.0f), 0xffff0000, },
                    
            /*3*/{ D3DXVECTOR4( c_fStartX+2*c_fSharpH,   c_fStartY+c_fSharpH+c_fMid,   0.5f, 1.0f), 0xffff0000, },
                    
            /*4*/{ D3DXVECTOR4( c_fStartX,               c_fStartY+c_fSharpH+c_fMid,   0.5f, 1.0f), 0xffff0000, },
                    
            /*5*/{ D3DXVECTOR4( c_fStartX+c_fSharpH,     c_fStartY+2*c_fSharpH+c_fMid, 0.5f, 1.0f), 0xffff0000, },
                };
                
            // 每個segment的偏移向量
                D3DXVECTOR4 vector4Offset[] = 
                {
                    
            /*0*/D3DXVECTOR4(fStartXOffset
                        , fStartYOffset, 0.0f, 0.0f),
                    
            /*1*/D3DXVECTOR4(fStartXOffset-c_fSharpH-c_fOffsetSmall
                        , fStartYOffset+c_fSharpH+c_fOffsetSmall, 0.0f, 0.0f),
                    
            /*2*/D3DXVECTOR4(fStartXOffset-c_fSharpH-c_fOffsetSmall+c_fMid+2*c_fSharpH+2*c_fOffsetSmall
                        , fStartYOffset+c_fSharpH+c_fOffsetSmall, 0.0f, 0.0f),
                    
            /*3*/D3DXVECTOR4(fStartXOffset
                        , fStartYOffset+c_fMid+2*c_fSharpH+2*c_fOffsetSmall, 0.0f, 0.0f),
                    
            /*4*/D3DXVECTOR4(fStartXOffset-c_fSharpH-c_fOffsetSmall
                        , fStartYOffset+c_fSharpH+c_fOffsetSmall+(2*c_fSharpH+c_fMid+2*c_fOffsetSmall), 0.0f, 0.0f),
                    
            /*5*/D3DXVECTOR4(fStartXOffset-c_fSharpH-c_fOffsetSmall+c_fMid+2*c_fSharpH+2*c_fOffsetSmall
                        , fStartYOffset+c_fSharpH+c_fOffsetSmall+(2*c_fSharpH+c_fMid+2*c_fOffsetSmall), 0.0f, 0.0f),
                    
            /*6*/D3DXVECTOR4(fStartXOffset
                        , fStartYOffset+c_fMid*2+4*c_fSharpH+4*c_fOffsetSmall, 0.0f, 0.0f),
                };
                
                
            for (int nSeg = 0; nSeg < 7; ++nSeg)
                {
                    BYTE bySeg = SevenSegment[nNumber][nSeg];
                    
            if (bySeg & 0x1)
                    {
                        
            // 有此段 
                        if (bySeg & 0x2) 
                        {
                            
            // 橫著的
                            DrawSegment(verticesSegmentHori, sizeof(verticesSegmentHori), vector4Offset[nSeg]);
                        }
                        
            else
                        {
                            
            // 豎著的
                            DrawSegment(verticesSegmentVert, sizeof(verticesSegmentVert), vector4Offset[nSeg]);
                        }
                    }
                }
            }

            VOID DrawTwoDigits(
            int nNumber, float fStartXOffset = 0.0f, float fStartYOffset = 0.0f)
            {
                DrawDigit(nNumber/10, fStartXOffset, fStartYOffset);
                fStartXOffset += (fNumberWidth + c_fGap);
                DrawDigit(nNumber%10, fStartXOffset, fStartYOffset);
            }

            // 畫一個小方塊
            VOID DrawCell(D3DXVECTOR4& vectorOffset)
            {
                
            static DWORD dwColor = 0xff00ff00;

                
            static CUSTOMVERTEX vertices[] =
                {
                    
            /*0*/{ D3DXVECTOR4( 0.0f,        c_fHeight,    0.5f, 1.0f), dwColor, }, 
                    
            /*1*/{ D3DXVECTOR4( c_fHeight,   0.0f,         0.5f, 1.0f), dwColor, },
                    
            /*2*/{ D3DXVECTOR4( c_fHeight,   c_fHeight*2,  0.5f, 1.0f), dwColor, },
                    
            /*3*/{ D3DXVECTOR4( c_fHeight*2, c_fHeight,    0.5f, 1.0f), dwColor, },
                };
                
            if( g_pVB != NULL )        
                    g_pVB->Release();

                CUSTOMVERTEX tmpVitices[4];
                memcpy(tmpVitices, vertices, 
            sizeof(vertices));
                
            for (int i = 0; i < 4; ++i)
                {
                    tmpVitices[i].position += vectorOffset;
                }
                g_pd3dDevice->CreateVertexBuffer( 4*
            sizeof(CUSTOMVERTEX),
                    0, D3DFVF_CUSTOMVERTEX,
                    D3DPOOL_DEFAULT, &g_pVB, NULL );

                VOID* pVertices; 
            // 輸出參數
                g_pVB->Lock( 0, sizeof(tmpVitices), (void**)&pVertices, 0 );
                memcpy( pVertices, tmpVitices, 
            sizeof(tmpVitices) );
                g_pVB->Unlock();
                g_pd3dDevice->SetStreamSource( 0, g_pVB, 0, 
            sizeof(CUSTOMVERTEX) );
                g_pd3dDevice->SetFVF( D3DFVF_CUSTOMVERTEX );
                g_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, 0, 2 );
            }

            /// 畫冒號
            VOID DrawColon(float fStartXOffset = 0.0f, float fStartYOffset = 0.0f, float fGap = 50.0f)
            {
                DrawCell(D3DXVECTOR4(fStartXOffset, fStartYOffset, 0.0f, 0.0f));
                DrawCell(D3DXVECTOR4(fStartXOffset, fStartYOffset+fGap, 0.0f, 0.0f));
            }

            VOID DrawTime()
            {
                
            float fStartX = 30.0f;
                
            float fStartY = 30.0f;

                
            float fColonOffsetY = c_fMid/2+3*c_fSharpH-c_fHeight;

                SYSTEMTIME st ;
                GetLocalTime(&st);

                DrawTwoDigits(st.wHour, fStartX, fStartY);

                fStartX += 2*(fNumberWidth+c_fGap);
                DrawColon(fStartX, fStartY+fColonOffsetY, c_fMid+2*c_fOffsetSmall);

                fStartX += (fCellWidth+c_fGap);
                DrawTwoDigits(st.wMinute, fStartX, fStartY);

                fStartX += 2*(fNumberWidth+c_fGap);
                DrawColon(fStartX, fStartY+fColonOffsetY, c_fMid+2*c_fOffsetSmall);

                fStartX += (fCellWidth+c_fGap);
                DrawTwoDigits(st.wSecond, fStartX, fStartY);
            }

            //-----------------------------------------------------------------------------
            // Name: Render()
            // Desc: Draws the scene
            //-----------------------------------------------------------------------------
            VOID Render()
            {
                
            // Clear the backbuffer to a blue color
                g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_X#000000, 1.0f, 0 );

                
            // Begin the scene
                if( SUCCEEDED( g_pd3dDevice->BeginScene() ) )
                {
                    DrawTime();

                    g_pd3dDevice->EndScene();
                }

                
            // Present the backbuffer contents to the display
                g_pd3dDevice->Present( NULL, NULL, NULL, NULL );
            }

            //-----------------------------------------------------------------------------
            // Name: MsgProc()
            // Desc: The window's message handler
            //-----------------------------------------------------------------------------
            LRESULT WINAPI MsgProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam )
            {
                
            switch( msg )
                {
                
            case WM_DESTROY:
                    Cleanup();
                    PostQuitMessage( 0 );
                    
            return 0;
                }

                
            return DefWindowProc( hWnd, msg, wParam, lParam );
            }

            //-----------------------------------------------------------------------------
            // Name: WinMain()
            // Desc: The application's entry point
            //-----------------------------------------------------------------------------
            INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR, INT )
            {
                
            // Register the window class
                WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L,
                    GetModuleHandle(NULL), NULL, NULL, NULL, NULL,
                    "D3D Tutorial", NULL };
                RegisterClassEx( &wc );

                
            // Create the application's window
                HWND hWnd = CreateWindow( "D3D Tutorial", "DxDigitalClock",
                    WS_OVERLAPPEDWINDOW, 100, 100, 400, 200,
                    NULL, NULL, wc.hInstance, NULL );

                
            // Initialize Direct3D
                if( SUCCEEDED( InitD3D( hWnd ) ) )
                {
                    
            // Show the window
                    ShowWindow( hWnd, SW_SHOWDEFAULT );
                    UpdateWindow( hWnd );

                    
            // Enter the message loop
                    MSG msg;
                    ZeroMemory( &msg, 
            sizeof(msg) );
                    
            while( msg.message!=WM_QUIT )
                    {
                        
            if( PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE ) )
                        {
                            TranslateMessage( &msg );
                            DispatchMessage( &msg );
                        }
                        
            else
                            Render();
                    }
                }
                UnregisterClass( "D3D Tutorial", wc.hInstance );
                
            return 0;
            }



            posted on 2008-03-02 00:41 七星重劍 閱讀(1818) 評論(2)  編輯 收藏 引用 所屬分類: PL--c/c++ 、Game Graphics 、IDE -- visual c++

            FeedBack:
            # re: 數字時鐘DigitalClock嘗試--續(2)終于畫出時間了,挺漂漂的,吼吼 2008-03-15 12:48 wblong
            很不錯哦!
              回復  更多評論
              
            # re: 數字時鐘DigitalClock嘗試--續(2)終于畫出時間了,挺漂漂的,吼吼 2008-03-17 12:01 七星重劍
            @wblong
            實現方法很笨,呵呵  回復  更多評論
              
            久久se精品一区二区影院 | 欧洲国产伦久久久久久久| Xx性欧美肥妇精品久久久久久| 久久精品国产亚洲7777| 狠狠人妻久久久久久综合| 国产成人无码精品久久久性色| 午夜人妻久久久久久久久| 亚洲国产二区三区久久| 欧美亚洲日本久久精品| 久久久久久精品无码人妻| 亚洲色欲久久久综合网| 精品久久久久中文字幕日本| 国产高潮久久免费观看| 久久精品国产清自在天天线 | 国产91色综合久久免费| 色综合久久中文字幕综合网| 人妻少妇久久中文字幕| 久久AAAA片一区二区| 久久久久久久人妻无码中文字幕爆| 伊人热人久久中文字幕| 中文字幕久久波多野结衣av| 久久久久国产亚洲AV麻豆| 国产三级久久久精品麻豆三级 | 亚洲人成伊人成综合网久久久| 日本精品久久久久中文字幕| 久久精品成人欧美大片| 久久午夜福利电影| 国产一区二区三精品久久久无广告| 久久久久亚洲Av无码专| 久久久久久久波多野结衣高潮| 精品人妻伦一二三区久久| 国产精品久久久久…| 久久久亚洲欧洲日产国码aⅴ| 欧美精品福利视频一区二区三区久久久精品 | 久久受www免费人成_看片中文| 国产成人久久777777| 一本久久久久久久| 久久精品视频网| 91性高湖久久久久| 国产精品xxxx国产喷水亚洲国产精品无码久久一区 | 2021少妇久久久久久久久久|