游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2011|回复: 4

DDraw剪裁器剪裁::DrawTextW的问题 急啊

[复制链接]

1

主题

5

帖子

5

积分

新手上路

Rank: 1

积分
5
发表于 2012-5-3 23:56:00 | 显示全部楼层 |阅读模式
要实现一个TextBox附有滚动条支持多行文字的控件
void CGUITextBox ::OnDrawBackground()
{
        BYTE alpha = BYTE(m_Color >> 24);

        //渲染文本
        if(alpha>0)
        {
                RECT wndRect={0};
                RECT oldRect={0};
                GetRect(&wndRect);
                // 设置裁减区域
                if (CGUISystem::GetSingleton()->GetGUIRender() != NULL)
                        CGUISystem::GetSingleton()->GetGUIRender()->SetScissorRect(&wndRect);
                RECT dstRect;
                dstRect.left = m_Pos.x + m_TextOffset.x;
                dstRect.top = m_Pos.y + m_TextOffset.y;
                dstRect.right = wndRect.right;
                dstRect.bottom = wndRect.bottom;
                UINT color = GUI_ARGB_ALPHARATE(m_Color, m_AlphaRate);
                m_pFont->Render(m_wstrText.c_str(), dstRect, color);
               
                // 恢复裁减区域
                if (CGUISystem::GetSingleton()->GetGUIRender() != NULL)
                        CGUISystem::GetSingleton()->GetGUIRender()->SetScissorRect(NULL);



        }
}
没有任何效果
注释掉:
// 恢复裁减区域
                if (CGUISystem::GetSingleton()->GetGUIRender() != NULL)
                        CGUISystem::GetSingleton()->GetGUIRender()->SetScissorRect(NULL);
的时候却有剪裁wndRect效果

1

主题

5

帖子

5

积分

新手上路

Rank: 1

积分
5
 楼主| 发表于 2012-5-3 23:59:00 | 显示全部楼层

Re:DDraw剪裁器剪裁::DrawTextW的问题 急啊

大神来来一发吧

1

主题

5

帖子

5

积分

新手上路

Rank: 1

积分
5
 楼主| 发表于 2012-5-4 00:03:00 | 显示全部楼层

Re:DDraw剪裁器剪裁::DrawTextW的问题 急啊

- -
// 设置裁减区域
if (CGUISystem::GetSingleton()->GetGUIRender() != NULL)
CGUISystem::GetSingleton()->GetGUIRender()->SetScissorRect(&wndRect);
这个是有效的 可是后面的m_pFont->Render(m_wstrText.c_str(), dstRect, color);
没效果

1

主题

5

帖子

5

积分

新手上路

Rank: 1

积分
5
 楼主| 发表于 2012-5-4 00:06:00 | 显示全部楼层

Re:DDraw剪裁器剪裁::DrawTextW的问题 急啊

Text Render源码
void CDDrawFont ::RenderW(const wchar_t *wszText, const RECT &dstRect, DWORD color, DWORD brushColor/* = 0*/, UINT format/* = 0*/)
{
        if (m_pDDrawSystem == NULL)        return;
        if (m_hFont == NULL)                return;
        if (color == 0)                                return;
        HDC hDC = GetDC();
        if (hDC == NULL)        return;
        SetTextColor(hDC, DDRAW_RGB_TO_BGR(color));
        if (brushColor > 0)
        {
                SetBkColor(hDC, DDRAW_RGB_TO_BGR(brushColor));
                SetBkMode(hDC, OPAQUE);
        }
        else
        {
                SetBkMode(hDC, TRANSPARENT);
        }

        // 因为不能删除当前选中的对象,所以这里要保存旧对象,以使最后能够把当前对象替换下来,完成删除
        HFONT hOldFont = (HFONT)SelectObject(hDC, m_hFont);

        :rawTextW(hDC, wszText, int(wcslen(wszText)), (LPRECT)&dstRect, format);
        // 恢复旧对象,以使得最后可以顺利删除m_hFont对象
        if (hOldFont != NULL)
        {
                ::SelectObject(hDC, hOldFont);
                hOldFont = NULL;
        }
        ReleaseDC(hDC);

}
求分析

1

主题

5

帖子

5

积分

新手上路

Rank: 1

积分
5
 楼主| 发表于 2012-5-5 00:41:00 | 显示全部楼层

Re:DDraw剪裁器剪裁::DrawTextW的问题 急啊

HDC hDstDC = m_hMemoryDC;
        if (hDstDC == NULL)        return;

        // 设置裁减区域
        if (pChipRect != NULL)
        {
                HRGN hRgn = ::CreateRectRgn(pChipRect->left, pChipRect->top, pChipRect->right, pChipRect->bottom);

                if (hRgn != NULL)
                {
                        ::SelectClipRgn(hDstDC, hRgn);
                        :eleteObject(hRgn);
                }
        }
        // 恢复裁减区域
        else
        {
                ::SelectClipRgn(hDstDC, NULL);
        }
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-2-28 12:12

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表