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

            天行健 君子當自強而不息

            Direct3D中的字體與文本顯示(1)

            圖形系統(tǒng)中為了獲得當前運行程序的相關信息,往往需要在屏幕上顯示文本,Direct3D的功能擴展接口ID3DXFont對此提供了方便的解決方法。

             

            創(chuàng)建ID3DXFont對象

            使用接口ID3DXFont繪制文本,首先需要通過函數(shù)D3DXCreateFont()創(chuàng)建ID3DXFont字體對象。ID3DXFont接口封裝了Windows字體和Direct3D設備指針,D3DXCreateFont()函數(shù)通過Windows字體和Direct3D設備指針創(chuàng)建ID3DXFont對象,該函數(shù)的聲明如下:

            Creates a font object for a device and font.

            HRESULT D3DXCreateFont(
            LPDIRECT3DDEVICE9 pDevice,
            INT Height,
            UINT Width,
            UINT Weight,
            UINT MipLevels,
            BOOL Italic,
            DWORD CharSet,
            DWORD OutputPrecision,
            DWORD Quality,
            DWORD PitchAndFamily,
            LPCTSTR pFacename,
            LPD3DXFONT * ppFont
            );

            Parameters

            pDevice
            [in] Pointer to an IDirect3DDevice9 interface, the device to be associated with the font object.
            Height
            [in] The height of the characters in logical units.
            Width
            [in] The width of the characters in logical units.
            Weight
            [in] Typeface weight. One example is bold.
            MipLevels
            [in] The number of mipmap levels.
            Italic
            [in] True for italic font, false otherwise.
            CharSet
            [in] The character set of the font.
            OutputPrecision
            [in] Specifies how Windows should attempt to match the desired font sizes and characteristics with actual fonts. Use OUT_TT_ONLY_PRECIS for instance, to ensure that you always get a TrueType font.
            Quality
            [in] Specifies how Windows should match the desired font with a real font. It applies to raster fonts only and should not affect TrueType fonts.
            PitchAndFamily
            [in] Pitch and family index.
            pFacename
            [in] String containing the typeface name. If the compiler settings require Unicode, the data type LPCTSTR resolves to LPCWSTR. Otherwise, the string data type resolves to LPCSTR. 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 S_OK. If the function fails, the return value can be one of the following: D3DERR_INVALIDCALL, D3DXERR_INVALIDDATA, E_OUTOFMEMORY.

            Remarks

            The creation of an ID3DXFont object requires that the device supports 32-bit color.

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

            If you want more information about font parameters, see The Logical Font.

            示例代碼如下:

            D3DXCreateFont(g_device, 50, 20, 20, 0, FALSE, DEFAULT_CHARSET, 0, 0, 0, "Arial", &g_font);

             

            使用ID3DXFont對象繪制二維文本

            創(chuàng)建了ID3DXFont對象后,就可以使用其接口函數(shù)ID3DXFont::DrawText()在指定位置繪制二維文本,該函數(shù)支持ANSI和雙字節(jié)字符串,聲明如下:

            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.

            示例代碼如下:

            g_device->BeginScene();

            DWORD format = DT_SINGLELINE | DT_NOCLIP | DT_CENTER | DT_VCENTER;
            g_font->DrawText(NULL, g_text, (INT) strlen(g_text), &g_client_rect, format, 0xFFFFFF00);

            g_device->EndScene();

             

            ID3DXFont其他相關接口函數(shù)

            函數(shù)ID3DXFont::GetDevice()能夠獲得與ID3DXFont相關聯(lián)的Direct3D設備指針,該函數(shù)聲明如下:

            Retrieves the Direct3D device associated with the font object.

            HRESULT GetDevice(
            LPDIRECT3DDEVICE9 * ppDevice
            );

            Parameters

            ppDevice
            [out] Address of a pointer to an IDirect3DDevice9 interface, representing the Direct3D device object associated with the font object.

            Return Values

            If the method succeeds, the return value is S_OK. If the method fails, the return value can be one of the following: D3DERR_INVALIDCALL, D3DXERR_INVALIDDATA.

            Remarks

            Note    Calling this method will increase the internal reference count on the IDirect3DDevice9 interface. Be sure to call IUnknown when you are done using this IDirect3DDevice9 interface or you will have a memory leak.

             

            示例截圖:

             

            源程序:

            #include <D3D9.h>
            #include 
            <D3DX9Core.h>

            #pragma warning(disable : 
            4127)

            #define CLASS_NAME    "GameApp"

            #define release_com(p)    do { if(p) { (p)->Release(); (p) = NULL; } } while(0)

            IDirect3D9
            *                g_d3d;
            IDirect3DDevice9
            *        g_device;
            ID3DXFont
            *                g_font;

            RECT                    g_client_rect;
            const char*                g_text = "Welcome to Direct3D!";

            bool init_d3d(HWND hwnd)
            {
                g_d3d 
            = Direct3DCreate9(D3D_SDK_VERSION);

                
            if(g_d3d == NULL)
                    
            return false;

                D3DPRESENT_PARAMETERS d3dpp;
                ZeroMemory(
            &d3dpp, sizeof(d3dpp));

                d3dpp.Windowed            
            = TRUE;
                d3dpp.SwapEffect        
            = D3DSWAPEFFECT_DISCARD;
                d3dpp.BackBufferFormat    
            = D3DFMT_UNKNOWN;

                
            if(FAILED(g_d3d->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hwnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING,
                                              
            &d3dpp, &g_device)))
                {
                    
            return false;
                }

                
            /*
                D3DXCreateFontA(
                    LPDIRECT3DDEVICE9       pDevice,  
                    INT                     Height,
                    UINT                    Width,
                    UINT                    Weight,
                    UINT                    MipLevels,
                    BOOL                    Italic,
                    DWORD                   CharSet,
                    DWORD                   OutputPrecision,
                    DWORD                   Quality,
                    DWORD                   PitchAndFamily,
                    LPCSTR                  pFaceName,
                    LPD3DXFONT*             ppFont);
                
            */

                D3DXCreateFont(g_device, 
            5020200, FALSE, DEFAULT_CHARSET, 000"Arial"&g_font);
                    
                GetClientRect(hwnd, 
            &g_client_rect);

                
            return true;
            }

            void cleanup()
            {
                release_com(g_font);
                release_com(g_device);
                release_com(g_d3d);
            }

            void render()
            {
                g_device
            ->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(555), 1.0f0);

                g_device
            ->BeginScene();

                DWORD format 
            = DT_SINGLELINE | DT_NOCLIP | DT_CENTER | DT_VCENTER;
                g_font
            ->DrawText(NULL, g_text, (INT) strlen(g_text), &g_client_rect, format, 0xFFFFFF00);

                g_device
            ->EndScene();

                g_device
            ->Present(NULL, NULL, NULL, NULL);
            }

            LRESULT WINAPI WinProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
            {
                
            switch(msg)
                {
                
            case WM_KEYDOWN:
                    
            if(wParam == VK_ESCAPE)
                        DestroyWindow(hwnd);
                    
            break;

                
            case WM_DESTROY:        
                    PostQuitMessage(
            0);
                    
            return 0;
                }

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

            int WINAPI WinMain(HINSTANCE inst, HINSTANCE, LPSTR, INT)
            {
                WNDCLASSEX wc;

                wc.cbSize            
            = sizeof(WNDCLASSEX);
                wc.style            
            = CS_CLASSDC;
                wc.lpfnWndProc        
            = WinProc;
                wc.cbClsExtra        
            = 0;
                wc.cbWndExtra        
            = 0;
                wc.hInstance        
            = inst;
                wc.hIcon            
            = NULL;
                wc.hCursor            
            = NULL;
                wc.hbrBackground    
            = NULL;
                wc.lpszMenuName        
            = NULL;
                wc.lpszClassName    
            = CLASS_NAME;
                wc.hIconSm            
            = NULL;

                
            if(! RegisterClassEx(&wc))
                    
            return -1;

                HWND hwnd 
            = CreateWindow(CLASS_NAME, "Direct3D App", WS_OVERLAPPEDWINDOW, 200100600500,
                                         NULL, NULL, wc.hInstance, NULL);

                
            if(hwnd == NULL)
                    
            return -1;

                
            if(init_d3d(hwnd))
                {
                    ShowWindow(hwnd, SW_SHOWDEFAULT);
                    UpdateWindow(hwnd);

                    MSG msg;
                    ZeroMemory(
            &msg, sizeof(msg));

                    
            while(msg.message != WM_QUIT)
                    {
                        
            if(PeekMessage(&msg, NULL, 00, PM_REMOVE))
                        {
                            TranslateMessage(
            &msg);
                            DispatchMessage(
            &msg);
                        }
                            
                        render();
                        Sleep(
            10);
                    }
                }

                cleanup();

                UnregisterClass(CLASS_NAME, wc.hInstance);    

                
            return 0;
            }

             

            posted on 2008-05-11 19:26 lovedday 閱讀(4545) 評論(0)  編輯 收藏 引用

            公告

            導航

            統(tǒng)計

            常用鏈接

            隨筆分類(178)

            3D游戲編程相關鏈接

            搜索

            最新評論

            精品一区二区久久| 久久免费看黄a级毛片| 91久久九九无码成人网站| 日韩一区二区三区视频久久 | 久久久久久九九99精品| 国产精品久久久久国产A级| 狠狠色伊人久久精品综合网| 国产精品一区二区久久精品涩爱 | 日韩精品国产自在久久现线拍| 久久亚洲电影| 日本久久久久久中文字幕| 久久这里的只有是精品23| 91久久精品视频| 久久A级毛片免费观看| 四虎影视久久久免费观看| 精品久久久久久久久中文字幕| 久久妇女高潮几次MBA| 久久久久综合国产欧美一区二区| 久久66热人妻偷产精品9| 日韩欧美亚洲综合久久影院Ds | 久久久久久伊人高潮影院| 国产激情久久久久影院老熟女免费 | 国内精品久久久久影院薰衣草| 国产精品伦理久久久久久| 欧美熟妇另类久久久久久不卡| 亚洲精品国产第一综合99久久| 国产精品久久久99| 精品亚洲综合久久中文字幕| 人妻精品久久无码区| 中文字幕久久久久人妻| 无码人妻少妇久久中文字幕| 久久乐国产精品亚洲综合| a级毛片无码兔费真人久久| 夜夜亚洲天天久久| 久久精品国产精品亚洲精品 | 国产精品久久婷婷六月丁香| 人妻系列无码专区久久五月天| 日韩AV毛片精品久久久| 久久天天躁狠狠躁夜夜2020 | 91精品国产91久久久久久蜜臀| 日本免费久久久久久久网站|