• <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>

            天行健 君子當自強而不息

            D3D中的字體繪制(1)

            9.1 ID3DXFont

            在D3DX庫中提供了一個ID3DXFont接口,它能被用于在Direct3D應用程序中繪制文字。

            9.1.1創建一個ID3DXFont

            我們能夠使用D3DXCreateFontIndirect函數來創建一個ID3DXFont接口。

            Creates a font object indirectly for both a device and a font.

            HRESULT D3DXCreateFontIndirect(
            LPDIRECT3DDEVICE9 pDevice,
            CONST D3DXFONT_DESC * pDesc,
            LPD3DXFONT * ppFont
            );

            Parameters

            pDevice
            [in] Pointer to an IDirect3DDevice9 interface, the device to be associated with the font object.
            pDesc
            [in] Pointer to a D3DXFONT_DESC structure, describing the attributes of the font object to create. If the compiler settings require Unicode, the data type D3DXFONT_DESC resolves to D3DXFONT_DESCW; otherwise, the data type resolves to D3DXFONT_DESCA. See Remarks.
            ppFont
            [out] Returns a pointer to an ID3DXFont interface, representing the created font object.

            Return Values

            If the function succeeds, the return value is D3D_OK. If the function fails, the return value can be one of the following: D3DERR_INVALIDCALL, E_OUTOFMEMORY.

            Remarks

            The compiler setting also determines the function version. If Unicode is defined, the function call resolves to D3DXCreateFontIndirectW. Otherwise, the function call resolves to D3DXCreateFontIndirectA because ANSI strings are being used.

            Defines the attributes of a font.

            typedef struct D3DXFONT_DESC {
            INT Height;
            UINT Width;
            UINT Weight;
            UINT MipLevels;
            BOOL Italic;
            BYTE CharSet;
            BYTE OutputPrecision;
            BYTE Quality;
            BYTE PitchAndFamily;
            TCHAR FaceName[LF_FACESIZE];
            } D3DXFONT_DESC, *LPD3DXFONT_DESC;

            Members

            Height
            Height, in logical units, of the font's character cell or character.
            Width
            Width, in logical units, of characters in the font.
            Weight
            Weight of the font in the range from 0 through 1000.
            MipLevels
            Number of mip levels requested. If this value is zero or D3DX_DEFAULT, a complete mipmap chain is created. If the value is 1, the texture space is mapped identically to the screen space.
            Italic
            Set to TRUE for an Italic font.
            CharSet
            Character set.
            OutputPrecision
            Output precision. The output precision defines how closely the output must match the requested font height, width, character orientation, escapement, pitch, and font type.
            Quality
            Output quality.
            PitchAndFamily
            Pitch and family of the font.
            FaceName
            A null-terminated string or characters that specifies the typeface name of the font. The length of the string must not exceed 32 characters, including the terminating null character. If FaceName is an empty string, the first font that matches the other specified attributes will be used. If the compiler settings require Unicode, the data type TCHAR resolves to WCHAR; otherwise, the data type resolves to CHAR. See Remarks.

            Remarks

            The compiler setting also determines the structure type. If Unicode is defined, the D3DXFONT_DESC structure type resolves to a D3DXFONT_DESCW; otherwise the structure type resolves to a D3DXFONT_DESCA.

            Possible values of the above members are given in the GDI LOGFONT structure.

            下面的代碼片段顯示了怎樣使用這個函數:

                D3DXFONT_DESC font_desc;
                ZeroMemory(
            &font_desc, sizeof(font_desc));

                font_desc.Height            
            = 25;        // in logical units
                font_desc.Width                = 12;        // in logical units
                font_desc.Weight            = 500;        // boldness, range 0(light) - 1000(bold)
                font_desc.Italic            = FALSE;
                font_desc.CharSet            
            = DEFAULT_CHARSET;
                font_desc.OutputPrecision    
            = 0;
                font_desc.Quality            
            = 0;
                font_desc.PitchAndFamily    
            = 0;

                strcpy(font_desc.FaceName, 
            "Times New Roman");

                
            if(FAILED(D3DXCreateFontIndirect(g_d3d_device, &font_desc, &g_d3d_font)))
                {
                    MessageBox(NULL, 
            "D3DXCreateFontIndirect() - FAILED", NULL, MB_OK);
                    PostQuitMessage(
            0);
                }

             

            注意:你也能夠使用D3DXCreateFont函數來獲得一個ID3DXFont接口指針。

            9.1.2繪制文本

            一旦我們獲得了ID3DXFont接口指針,繪制文本就是很簡單的事情了,我們只要調用ID3DXFont::DrawText方法就可以實現了。

            Draws formatted text. This method supports ANSI and Unicode strings.

            INT DrawText(
            LPD3DXSPRITE pSprite,
            LPCTSTR pString,
            INT Count,
            LPRECT pRect,
            DWORD Format,
            D3DCOLOR Color
            );

            Parameters

            pSprite
            [in] Pointer to an ID3DXSprite object that contains the string. Can be NULL, in which case Direct3D will render the string with its own sprite object. To improve efficiency, a sprite object should be specified if ID3DXFont::DrawText is to be called more than once in a row.
            pString
            [in] Pointer to a string to draw.If the Count parameter is -1, the string must be null-terminated.
            Count
            [in] Specifies the number of characters in the string. If Count is -1, then the pString parameter is assumed to be a pointer to a null-terminated string and ID3DXFont::DrawText computes the character count automatically.
            pRect
            [in] Pointer to a RECT structure that contains the rectangle, in logical coordinates, in which the text is to be formatted. As with any RECT object, the coordinate value of the rectangle's right side must be greater than that of its left side. Likewise, the coordinate value of the bottom must be greater than that of the top.
            Format
            [in] Specifies the method of formatting the text. It can be any combination of the following values:
            DT_BOTTOM
            Justifies the text to the bottom of the rectangle. This value must be combined with DT_SINGLELINE.
            DT_CALCRECT
            Determines the width and height of the rectangle. If there are multiple lines of text, ID3DXFont::DrawText uses the width of the rectangle pointed to by the pRect parameter and extends the base of the rectangle to bound the last line of text. If there is only one line of text, ID3DXFont::DrawText modifies the right side of the rectangle so that it bounds the last character in the line. In either case, ID3DXFont::DrawText returns the height of the formatted text but does not draw the text.
            DT_CENTER
            Centers text horizontally in the rectangle.
            DT_EXPANDTABS
            Expands tab characters. The default number of characters per tab is eight.
            DT_LEFT
            Aligns text to the left.
            DT_NOCLIP
            Draws without clipping. ID3DXFont::DrawText is somewhat faster when DT_NOCLIP is used.
            DT_RIGHT
            Aligns text to the right.
            DT_RTLREADING
            Displays text in right-to-left reading order for bidirectional text when a Hebrew or Arabic font is selected. The default reading order for all text is left-to-right.
            DT_SINGLELINE
            Displays text on a single line only. Carriage returns and line feeds do not break the line.
            DT_TOP
            Top-justifies text.
            DT_VCENTER
            Centers text vertically (single line only).
            DT_WORDBREAK
            Breaks words. Lines are automatically broken between words if a word would extend past the edge of the rectangle specified by the pRect parameter. A carriage return/line feed sequence also breaks the line.
            Color
            [in] Color of the text. For more information, see D3DCOLOR.

            Return Values

            If the function succeeds, the return value is the height of the text in logical units. If DT_VCENTER or DT_BOTTOM is specified, the return value is the offset from pRect (top to the bottom) of the drawn text. If the function fails, the return value is zero.

            Remarks

            The parameters of this method are very similar to those of the GDI DrawText function.

            This method supports both ANSI and Unicode strings.

            This method must be called inside a IDirect3DDevice9::BeginScene ... IDirect3DDevice9::EndScene block. The only exception is when an application calls ID3DXFont::DrawText with DT_CALCRECT to calculate the size of a given block of text.

            Unless the DT_NOCLIP format is used, this method clips the text so that it does not appear outside the specified rectangle. All formatting is assumed to have multiple lines unless the DT_SINGLELINE format is specified.

            If the selected font is too large for the rectangle, this method does not attempt to substitute a smaller font.

            This method supports only fonts whose escapement and orientation are both zero.

            運行截圖:

            主程序:

            /**************************************************************************************
              Shows how to calculate the number of frames rendered per second and demonstrates 
              how to render text with the ID3DXFont interface.  
             *************************************************************************************
            */

            #include 
            <stdio.h>
            #include 
            "d3dUtility.h"

            #pragma warning(disable : 
            4100 4996)

            const int WIDTH  = 640;
            const int HEIGHT = 480;

            IDirect3DDevice9
            *        g_d3d_device;
            ID3DXFont
            *                g_d3d_font;

            DWORD    g_frame_count;
            float    g_time_elapsed;
            float    g_fps;
            char    g_fps_string[9];

            ////////////////////////////////////////////////////////////////////////////////////////////////////

            bool setup()
            {    
                D3DXFONT_DESC font_desc;
                ZeroMemory(
            &font_desc, sizeof(font_desc));

                font_desc.Height            
            = 25;        // in logical units
                font_desc.Width                = 12;        // in logical units
                font_desc.Weight            = 500;        // boldness, range 0(light) - 1000(bold)
                font_desc.Italic            = FALSE;
                font_desc.CharSet            
            = DEFAULT_CHARSET;
                font_desc.OutputPrecision    
            = 0;
                font_desc.Quality            
            = 0;
                font_desc.PitchAndFamily    
            = 0;

                strcpy(font_desc.FaceName, 
            "Times New Roman");

                
            if(FAILED(D3DXCreateFontIndirect(g_d3d_device, &font_desc, &g_d3d_font)))
                {
                    MessageBox(NULL, 
            "D3DXCreateFontIndirect() - FAILED", NULL, MB_OK);
                    PostQuitMessage(
            0);
                }
                
                
            return true;
            }

            ///////////////////////////////////////////////////////////////////////////////////////////////////////

            void cleanup()
            {    
                safe_release
            <ID3DXFont*>(g_d3d_font);    
            }

            ///////////////////////////////////////////////////////////////////////////////////////////////////////

            bool display(float time_delta)
            {
                
            // update: compute the frames per second.

                g_frame_count
            ++;
                g_time_elapsed 
            += time_delta;

                
            if(g_time_elapsed >= 1.0f)
                {
                    g_fps 
            = g_frame_count / g_time_elapsed;

                    sprintf(g_fps_string, 
            "%f", g_fps);
                    g_fps_string[
            8= '\0';    // mark end of string

                    g_time_elapsed 
            = 0.0f;
                    g_frame_count  
            = 0;
                }

                
            // render

                g_d3d_device
            ->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, 0xffffffff1.0f0);

                g_d3d_device
            ->BeginScene();

                RECT rect 
            = {00, WIDTH, HEIGHT};
                g_d3d_font
            ->DrawText(NULL, g_fps_string, -1&rect, DT_TOP | DT_LEFT, 0xff000000);

                g_d3d_device
            ->EndScene();

                g_d3d_device
            ->Present(NULL, NULL, NULL, NULL);

                
            return true;
            }

            ///////////////////////////////////////////////////////////////////////////////////////////////////////

            LRESULT CALLBACK wnd_proc(HWND hwnd, UINT msg, WPARAM word_param, LPARAM long_param)
            {
                
            switch(msg)
                {
                
            case WM_DESTROY:
                    PostQuitMessage(
            0);
                    
            break;

                
            case WM_KEYDOWN:
                    
            if(word_param == VK_ESCAPE)
                        DestroyWindow(hwnd);
                    
            break;
                }

                
            return DefWindowProc(hwnd, msg, word_param, long_param);
            }

            ///////////////////////////////////////////////////////////////////////////////////////////////////////

            int WINAPI WinMain(HINSTANCE inst, HINSTANCE, PSTR cmd_line, int cmd_show)
            {
                
            if(! init_d3d(inst, WIDTH, HEIGHT, true, D3DDEVTYPE_HAL, &g_d3d_device))
                {
                    MessageBox(NULL, 
            "init_d3d() - failed."0, MB_OK);
                    
            return 0;
                }

                
            if(! setup())
                {
                    MessageBox(NULL, 
            "Steup() - failed."0, MB_OK);
                    
            return 0;
                }

                enter_msg_loop(display);

                cleanup();
                g_d3d_device
            ->Release();

                
            return 0;
            }

             

            下載源程序

            posted on 2008-03-26 16:50 lovedday 閱讀(3260) 評論(0)  編輯 收藏 引用

            公告

            導航

            統計

            常用鏈接

            隨筆分類(178)

            3D游戲編程相關鏈接

            搜索

            最新評論

            久久99精品久久只有精品| 中文成人久久久久影院免费观看| 精品国产乱码久久久久软件| 亚洲另类欧美综合久久图片区| 久久中文字幕精品| 成人国内精品久久久久影院| 亚洲成人精品久久| 99久久做夜夜爱天天做精品| 99久久免费国产精精品| 国产午夜精品久久久久九九电影 | 久久噜噜电影你懂的| 国产精品伊人久久伊人电影| 久久精品无码一区二区WWW| 1000部精品久久久久久久久| 欧美精品国产综合久久| 欧美亚洲国产精品久久蜜芽| 久久99精品久久久大学生| 久久精品国产99久久丝袜| 97久久超碰国产精品旧版| 少妇无套内谢久久久久| 久久无码精品一区二区三区| 久久99精品国产麻豆宅宅| 成人久久免费网站| 久久久无码精品午夜| 97久久精品人人做人人爽| 国产精品天天影视久久综合网| 久久久久亚洲AV无码专区首JN | 国产一级持黄大片99久久| 久久AV无码精品人妻糸列| 午夜精品久久影院蜜桃| 久久伊人精品青青草原高清| 欧美熟妇另类久久久久久不卡 | 久久久免费观成人影院| 国产呻吟久久久久久久92| 久久精品嫩草影院| 18岁日韩内射颜射午夜久久成人| 色婷婷久久综合中文久久蜜桃av| 久久精品亚洲AV久久久无码| 亚洲精品tv久久久久| 国内精品久久国产| 一本色道久久综合狠狠躁|