??xml version="1.0" encoding="utf-8" standalone="yes"?>欧洲国产伦久久久久久久,国产成人精品久久,婷婷综合久久狠狠色99hhttp://www.shnenglu.com/vczh/category/7351.html【QQQ?43056143Q?04254078】【MSNQvczh@hotmail.com】【EmailQvczh@163.com】【新微博:http://weibo.com/vczh?/description>zh-cnTue, 06 Nov 2012 02:02:09 GMTTue, 06 Nov 2012 02:02:09 GMT60一个在GacUI上直接用GDI或者Direct2Dq行l图操作的小demohttp://www.shnenglu.com/vczh/archive/2012/11/05/194696.html陈梓?vczh)陈梓?vczh)Mon, 05 Nov 2012 15:14:00 GMThttp://www.shnenglu.com/vczh/archive/2012/11/05/194696.htmlhttp://www.shnenglu.com/vczh/comments/194696.htmlhttp://www.shnenglu.com/vczh/archive/2012/11/05/194696.html#Feedback1http://www.shnenglu.com/vczh/comments/commentRss/194696.htmlhttp://www.shnenglu.com/vczh/services/trackbacks/194696.html׃接下去要?/span>uniscribeQ这是一个可以告诉我们在渲染一个超长unicode字符串的时候,什么地方可以换行,什么地方要换顺序,什么字W要用一U神奇的Ҏ来渲染之cȝ库)做可以插入图片和其它׃八糟东西的rich text boxQؓ了更方便做实验,而且也考虑到很多Y件也需要直接绘囄功能Q所以我写了q么两个DemoQ?/span>

1、Rendering.RawAPI.GDIQ?/span>http://www.gaclib.net/Demos/Rendering.RawAPI.GDI/Demo.htmlQ?/span>
2、Rendering.RawAPI.Direct2DQ?/span>
http://www.gaclib.net/Demos/Rendering.RawAPI.Direct2D/Demo.htmlQ?/span>

׃q两个Demo很像Q而且Direct2D的比较复杂,所以我在这里介l一下这个Direct2D的demo?/span>

在Demo里面可以看到Q我们可以用GuiGDIElement或者GuiDirect2DElement来进行手工的l图操作。这两个Element的用有限制。当GacUI使用GDIl图QSetupWindowsGDIRendererQ的时候才可以使用GuiGDIElementQ对于Direct2D也是一L。在使用它们q行l图的时候,坐标用的是窗口的坐标。但是GacUI会在l制的时候先加入一个clipQ这h们在l制的时候就绘制出了边界,也不会有M不好的媄响。而且q个clip的矩形范围会在渲染事件触发的时候给出。在q里我们先来看一下Direct2D的demo?/span>

首先Q整个程序的框架是这样子的:

#include "..\..\Public\Source\GacUI.h"
#include <math.h>
#include <Windows.h>

int CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int CmdShow)
{
    // SetupWindowsDirect2DRenderer() is required for GuiDirect2DElement
    return SetupWindowsDirect2DRenderer();
}

class Direct2DWindow : public GuiWindow
{
protected:

    // arguments.rt is ID2D1RenderTarget.
    void element_Rendering(GuiGraphicsComposition* sender, GuiDirect2DElementEventArgs& arguments)
    {
    }

    // The render target is going to be destroyed, any binded resources should be released.
    void element_BeforeRenderTargetChanged(GuiGraphicsComposition* sender, GuiDirect2DElementEventArgs& arguments)
    {
    }

    // The new render target is prepared, any binded resources are allowed to recreate now.
    void element_AfterRenderTargetChanged(GuiGraphicsComposition* sender, GuiDirect2DElementEventArgs& arguments)
    {
    }
public:
    Direct2DWindow()
        :GuiWindow(GetCurrentTheme()->CreateWindowStyle())
    {
        SetText(L"Rendering.RawAPI.Direct2D");
        SetClientSize(Size(640, 480));
        GetBoundsComposition()->SetPreferredMinSize(Size(640, 480));
        MoveToScreenCenter();
        {
            GuiDirect2DElement* element=GuiDirect2DElement::Create();
           
element->Rendering.AttachMethod(this, &Direct2DWindow::element_Rendering);
           
element->BeforeRenderTargetChanged.AttachMethod(this, &Direct2DWindow::element_BeforeRenderTargetChanged);
            element->AfterRenderTargetChanged.AttachMethod(this, &Direct2DWindow::element_AfterRenderTargetChanged);

            GuiBoundsComposition* composition=new GuiBoundsComposition;
            composition->SetAlignmentToParent(Margin(0, 0, 0, 0));
            composition->SetOwnedElement(element);
            GetContainerComposition()->AddChild(composition);
        }
    }
};

void GuiMain()
{
    Direct2DWindow window;
    GetApplication()->Run(&window);
}

在构造函数里面,我们创徏了一个GuiDirect2DElementQ然后把它放q一个会自动充满整个H口的composition里面。然后我们需要监听三个事ӞGDI只有一个,是RenderingQ:
1、Rendering。这个事件在H口被绘制的时候调用。GacUI才用了一个低功耗的Ҏ让程序不断的l制自己Q所以我们ƈ不需要担?#8220;如何hH口”的这个问题?br />2、BeforeRenderTargetChanged。在q个时候我们要清理掉我们创建出来的资源Q譬如说d{等?br />3、AfterRenderTargetChanged。在q个时候我们要建立一些绘图资源,譬如说画L{?/font>

Z么下面两个函数那么蛋疼呢Q因为Direct2D的类似画刯L东西Q是必须跟一个ID2D1RenderTargetl定在一LQ不同的render target之间的画刷不能共享。而且那个可怜的render targetq有可能会失效,q个时候GacUIp重新创徏他们。所以无论如何,都必ȝ听这三个对象Q除非我们只用GuiDirect2DElement来渲染文字(因ؓ文字相关的资源是IDWriteFactory控制的,跟render target无关Q?/font>

在这个Demo里面Q我们要ȝ是一个会动的钟。在q个钟里面我们要l制4U线形:Ҏ、时针、分针、秒针。因此我们需?个不同的ID2D1SolidColorBrush。由于操作COM对象的时候总要去记得操作那个引用计敎ͼ特别的麻烦,而且q容易忘掉。所以我特地为大家提供了一个叫做ComPtr的东ѝ所以我们就可以q么声明、创建和释放他们Q?/font>

ComPtr<ID2D1SolidColorBrush>            borderBrush;
ComPtr<ID2D1SolidColorBrush>            secondBrush;
ComPtr<ID2D1SolidColorBrush>            minuteBrush;
ComPtr<ID2D1SolidColorBrush>            hourBrush;

// The render target is going to be destroyed, any binded resources should be released.
void element_BeforeRenderTargetChanged(GuiGraphicsComposition* sender, GuiDirect2DElementEventArgs& arguments)
{
    borderBrush=0;
    secondBrush=0;
    minuteBrush=0;
    hourBrush=0;
}

// The new render target is prepared, any binded resources are allowed to recreate now.
void element_AfterRenderTargetChanged(GuiGraphicsComposition* sender, GuiDirect2DElementEventArgs& arguments)
{
    ID2D1SolidColorBrush* brush;
    {
        brush=0;
        arguments.rt->CreateSolidColorBrush(D2D1::ColorF(0.0f, 0.0f, 0.0f), D2D1::BrushProperties(), &brush);
        borderBrush=brush;
    }
    {
        brush=0;
        arguments.rt->CreateSolidColorBrush(D2D1::ColorF(0.0f, 0.0f, 1.0f), D2D1::BrushProperties(), &brush);
        secondBrush=brush;
    }
    {
        brush=0;
        arguments.rt->CreateSolidColorBrush(D2D1::ColorF(0.0f, 1.0f, 0.0f), D2D1::BrushProperties(), &brush);
        minuteBrush=brush;
    }
    {
        brush=0;
        arguments.rt->CreateSolidColorBrush(D2D1::ColorF(1.0f, 0.0f, 0.0f), D2D1::BrushProperties(), &brush);
        hourBrush=brush;
    }
}

惛_大家都应该看清楚了。Before和After事g里面QGacUI都会提供用来l图的ID2D1RenderTargetQ这个时候必L的创徏和释放资源。只要这些资源都建立了v来,那么剩下的就只有把一个时钟画出来了。画一个时钟还是很Ҏ的,只需要那么几行代码就行了Q?/font>

static const int                        Radius=200;
static const int                        LongScale=10;
static const int                        ShortScale=5;
static const int                        SecondLength=180;
static const int                        MinuteLength=150;
static const int                        HourLength=120;

float GetAngle(float second)
{
    return (second-15.0f)*3.1416f/30.0f;
}

void DrawLine(ID2D1RenderTarget* rt, ComPtr<ID2D1SolidColorBrush> brush, float angle, int width, int startLength, int endLength, int x, int y)
{
    float s=sin(angle);
    float c=cos(angle);
    float x1=(c*startLength)+(float)(x+Radius);
    float y1=(s*startLength)+(float)(y+Radius);
    float x2=(c*endLength)+(float)(x+Radius);
    float y2=(s*endLength)+(float)(y+Radius);
    rt->DrawLine(D2D1::Point2F(x1, y1), D2D1::Point2F(x2, y2), brush.Obj(), (float)width);
}

// arguments.rt is ID2D1RenderTarget.
void element_Rendering(GuiGraphicsComposition* sender, GuiDirect2DElementEventArgs& arguments)
{
    int w=arguments.bounds.Width();
    int h=arguments.bounds.Height();
    int x=arguments.bounds.Left()+(w-Radius*2)/2;
    int y=arguments.bounds.Left()+(h-Radius*2)/2;

    arguments.rt->DrawEllipse(D2D1::Ellipse(D2D1::Point2F((float)(x+Radius), (float)(y+Radius)), (float)Radius, (float)Radius), borderBrush.Obj());
    for(int i=0;i<60;i++)
    {
        int scale=i%5==0?LongScale:ShortScale;
        float angle=GetAngle((float)i);
        DrawLine(arguments.rt, borderBrush, angle, 1, Radius-scale, Radius, x, y);
    }

    DateTime dt=DateTime::LocalTime();
    {
        float angle=GetAngle(dt.hour*5+dt.minute/12.0f+dt.second/720.0f);
        DrawLine(arguments.rt, hourBrush, angle, 5, 0, HourLength, x, y);
    }
    {
        float angle=GetAngle(dt.minute+dt.second/60.0f);
        DrawLine(arguments.rt, minuteBrush, angle, 3, 0, MinuteLength, x, y);
    }
    {
        float angle=GetAngle((float)dt.second);
        DrawLine(arguments.rt, secondBrush, angle, 1, 0, SecondLength, x, y);
    }
}

然后我们p得了下图Q(LiveWrite真是太好了,cppblog的傻逼编辑器每次插入囄都会插入C个诡异的位置中去Q?/font>

DXGUI_58

q样我们完成了一个时钟的制作了,而且也学会了如何在GacUI里面直接使用GDI和Direct2Dl图了?/font>



陈梓?vczh) 2012-11-05 23:14 发表评论
]]>
偶尔发布一下弱智知识——如何用Direct2D量文字大小http://www.shnenglu.com/vczh/archive/2011/10/11/158090.html陈梓?vczh)陈梓?vczh)Tue, 11 Oct 2011 15:42:00 GMThttp://www.shnenglu.com/vczh/archive/2011/10/11/158090.htmlhttp://www.shnenglu.com/vczh/comments/158090.htmlhttp://www.shnenglu.com/vczh/archive/2011/10/11/158090.html#Feedback9http://www.shnenglu.com/vczh/comments/commentRss/158090.htmlhttp://www.shnenglu.com/vczh/services/trackbacks/158090.html    之前一边做脚本引擎Q一边山寨一个自l的native C++的GUI框架q且可以切换GDI或者Direct2D渲染模式。因为抄了WPF的那U高U自动布局功能Q所以必焉要知道如何测量文字大。Direct2D量文字大小比较ȝQ不像GDI有直接函敎ͼq且用中英文搜好像都没h直接l出l果Q还有h在博客上?#8220;q种事情好像办不?#8221;q样的文字。不q经q我遍历MSDNQ还是找C一个曲U救国的Ҏ的,直接上代码:

    首先是创建IDWriteTextFormat:

 1                     IDWriteFactory* dwriteFactory=GetDirectWriteFactory();
 2                     IDWriteTextFormat* format=0;
 3                     HRESULT hr=dwriteFactory->CreateTextFormat(
 4                         fontProperties.fontFamily.Buffer(),
 5                         NULL,
 6                         (fontProperties.bold?DWRITE_FONT_WEIGHT_BOLD:DWRITE_FONT_WEIGHT_NORMAL),
 7                         (fontProperties.italic?DWRITE_FONT_STYLE_ITALIC:DWRITE_FONT_STYLE_NORMAL),
 8                         DWRITE_FONT_STRETCH_NORMAL,
 9                         (FLOAT)fontProperties.size,
10                         L"",
11                         &format);
12                     if(!FAILED(hr))
13                     {
14                         format->SetWordWrapping(DWRITE_WORD_WRAPPING_NO_WRAP);
15                         return format;
16                     }
17                     else
18                     {
19                         return 0;
20                     }

    fontProperties是我自定义的一个结构就不用ȝ它了Q参考MSDNq道CreateTextFormat如何使用了。其中fontProperties.fontFamily是字体的名字。然后IDWriteTextFormat扮演着GDI?#8220;字体对象”的角Ԍ可以用ID2D1RenderTargetq行l制。ID2D1RenderTarget除了用IDWriteTextFormat当字体以外,q可以用IDWriteTextLayout?#8220;d多余信息的更复杂的字?#8221;。测量文字的关键正是在这里?br />
    接下来我们借助IDWriteTextFormat来创建IDWriteTextLayoutQ?/p>

 1                     IDWriteTextLayout* textLayout=0;
 2                     HRESULT hr=GetDirectWriteFactory()->CreateTextLayout(
 3                         oldText.Buffer(),
 4                         oldText.Length(),
 5                         textFormat,
 6                         0,
 7                         0,
 8                         &textLayout);
 9                     if(!FAILED(hr))
10                     {
11                         DWRITE_TEXT_METRICS metrics;
12                         hr=textLayout->GetMetrics(&metrics);
13                         if(!FAILED(hr))
14                         {
15                             minSize=Size((int)ceil(metrics.widthIncludingTrailingWhitespace), (int)ceil(metrics.height));
16                         }
17                         textLayout->Release();
18                         return;
19                     }

    q里看minSizeq道如何测量文字的字体了?br />
    在这里放一张暂时的囄。我抄了WPF的那U方法,从布局和绘囑օ素直接开始可以构造GUIQ因此演CZ如何使用q些东西来创造一个Win7的按钮(带动ȝ哦)打开Vczh Library++3.0Q下载代码ƈ打开Candidate\GUI\GuiDemo\GuiDemo.slnQ按F5可以看C效果了:



    q一个是Direct2D渲染的结果(我在工程文g指定了DXSDK的绝对\径,如果你们安装的地方不同改掉它既可~译了)。按钮基本上跟win7的效果一怸P但是q里使用Direct2Dq行渲染。当按钮寸变化的时候,那个复杂的边框和里面的两个渐变和文字都可以自动对?#8212;—但是qƈ不是hard code的,而是GUI?#8220;布局功能”可以配置成这个样子。像q两个按钮一直处于右下角也是“布局功能”可以提供的功能。大家可以理解ؓq东西类gC#的TableLayoutPanel?br />
    现在刚刚做好了按?#8212;—跟WPF一样可以更换templateQ不q因为反正没人需要动态更换template所以我把template写在了构造函数里面,因此换肤q种事情变得相当简单了——只要用布局功能跟图元拼凑成一个复杂的囑ŞQ然后实现各个控件所规定?#8220;template接口”响应外观控制的消息就行了Q内|动L持(q个要运行的时候才能观察到Q?br />
    Z方便Q我在工E里面除了Debug和Release以外q加入了DebugDirect2D和ReleaseDirect2D两个配置Q可以自由切换观看demo?br />



陈梓?vczh) 2011-10-11 23:42 发表评论
]]>
GUI真TAMA隑ց?/title><link>http://www.shnenglu.com/vczh/archive/2011/04/30/145380.html</link><dc:creator>陈梓?vczh)</dc:creator><author>陈梓?vczh)</author><pubDate>Sat, 30 Apr 2011 03:50:00 GMT</pubDate><guid>http://www.shnenglu.com/vczh/archive/2011/04/30/145380.html</guid><wfw:comment>http://www.shnenglu.com/vczh/comments/145380.html</wfw:comment><comments>http://www.shnenglu.com/vczh/archive/2011/04/30/145380.html#Feedback</comments><slash:comments>13</slash:comments><wfw:commentRss>http://www.shnenglu.com/vczh/comments/commentRss/145380.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/vczh/services/trackbacks/145380.html</trackback:ping><description><![CDATA[    从某U意义上来说Q做囑Ş也好Q做GUI也好Q做~译器也好,大概都是一U情l。其实只要稍微想一惛_知道Q能把它们三者有机统一h的,只有游戏。我很久以前的确是ؓ了想开发游戏才对编E生兴的Q而学习游戏开发占据了我前六年的时间。虽然现在不做了Q不q偶L会觉得手痒。但是做游戏没美工做不好怎么办呢Q就只好写游戏代码了。但是没有资源写出来的游戏又不好玩,于是只好写库。那写什么库呢,自然只有渲染器、界面引擎和脚本引擎了。我的博客的大部分文章也是围l着q三件事情徏立v来,而且在中间不断切换的?br><br>    撒,所以今天就轮到GUI了。我一直很惛_Z个自l的GUI出来Q无奈一直设计不Z个好的架构。后来尝试用原生APIQ但是却又很不喜ƢMFC的设计,尝试自q着.NET Framework和Delphi那套VCL的样?a style="TEXT-DECORATION: underline" href="http://www.shnenglu.com/vczh/archive/2008/08/25/59954.html" target=_blank>装了一个控件库</a>出来。无奈原生APIl节无敌多,后来没做把所有的功能都全部做完。因此后来一D|间凡是需要界面我都直接用C#做。然后CEGUIZQWPF和Silverlight也出了,我发现如今要做一个漂亮的GUI非自l已l做不到了,所以我又做了一ơ尝试?br><br>    d在美帝的时候曾l试囑ֆ设计一ơ,得到了一些结果。后来我发现其实Ҏ没办法ؓGDI、DirectX、OpenGL和其它绘图设备抽象一个公用的接口Q否则就会遭遇大量性能问题。因为在很多l节上,譬如说渲染文字,Z辑ֈ较高的性能QOpenGL和DirectX需要用几乎相反的{略来做。因此这ơ我又换了一个方法,而且?a style="TEXT-DECORATION: underline" target=_blank>Vczh Library++ 3.0</a>的Candidate目录下已lcheckin了一个试验品?br><br>    我把一个自l的GUI分成了下面若q个层次?br>    1、NativeWindow。NativeWindow表示的是一个顶层窗口的实现。譬如说我们想用Windows的窗口作l窗口的层H口Q游戏里面的很多层H口是绘制在游戏H口里面的,所以顶层窗口ƈ不一定是Windows的窗口)?br>    2、控件库。控件库包含了这个自lGUI库的所有预定义控g。控件本w包含对用户输入的相应逻辑Q但是每一个控件的l制以及鼠标点中试不在此范围内?br>    3、控件皮肤接口。每一个最l控仉会拥有一个控件皮肤接口。每当控件的状态发生了变化Q控件会调用皮肤接口更新控g的当前状态。每当控仉要知道某一个点是否位于一个控仉面的时候,他也会去调用该控件的皮肤获得l果。因此控件皮肤接口包含了一切关于绘Ӟ因此理所当然也就包含了点中测试)的逻辑?br><br>    Z辑ֈ最高的性能Q一套皮肤的实现只能l定在某U绘图设备上Q也是说缺省状态下一套ؓGDI讑֤设计出来的皮肤是不能直接使用在DirectX讑֤上面的。当然我q个框架的设计也是够开攄Q如果你非得用同一套代码来实现不同l图讑֤上的皮肤Q那么你是可以自己动手丰衣食,做到lGDI和DirectX设计一个公共接口ƈ插入我的GUI框架的(只不q这U做法一般情况下都会惨死Q?br><br>    那么如何dl图讑֤呢?目前NativeWindow有一个基于WindowsH口的实玎ͼq且NativeWindow的接口要求该实现在创建、销毁、接收到很多H口事g的时候都调用某一个回调对象。我们可以通过注册一个全局回调对象或者具体窗口的回调对象来获得NativeWindow状态的变更。基于WindowsH口的NativeWindow实现q提供了一个额外函敎ͼ可以让你获得一个NativeWindow的HWNDQ但q个函数q不被控件库依赖Q。现在我q实C一个基于HWND+HDC的绘图设备,主要Ҏ是先注册全局回调对象Q每当知道一个NativeWindow被创ZQ我׃注册一个NativeWindow的回调对象,用来l护一个窗口里面的一?2位DIBSections位图~冲区。窗口的大小如果变化了,我也会在适当的时候重新创Z块合适的~冲区。不qؓ了避免每一ơ大变化都会创建新的缓冲区Q我创徏的缓冲区的大M比窗口大一炏V然后这个GDIl图讑֤暴露了一个函敎ͼ可以获得一个NativeWindow的HDC和WinGDIElementEnvironment?br><br>    WinGDIElementEnvironment是基于HWND+HDC的这一套实C专有的、ؓ了GDI皮肤设计出来的一个公q资源库(譬如用来保存各种面向业务逻辑的pen啊brush什么的Q比如说disable的时候什么颜Ԍ选中的时候什么颜色等{)。如果你惌计一个基于HWND+DirectX的皮肤,那么cMWinGDIElementEnvironment的这套东西要重新做一ơ——因Zؓ了达到相同的性能。具体细节相差太大。当然HWND+HDC上面可以有多套皮肤,WinGDIElementEnvironment是公用的。WinGDIElementEnvironment要求l制是通过一个具体的WinGDIElement对象辑ֈ的,而一套皮肤可以有自己的一套WinGDIElement的实现。WinGDIElement被设计成面向业务的、一套皮肤的基本元素l成部分Q譬如说按钮Ҏ啦、焦炚w方Ş啦、文字啦Q而不是带有pen和brush的长方Ş啊,文字啊,各种׃八糟的最低等U的l图元素。D一个例子,按钮Ҏ跟菜单边框很像,都可以用Rectangle来组成。但是Element里面q接是按钮Ҏ和菜单边框,而不是一个可以让你自׃攚w色的Rectangle。因Z同的控g要共享配色方案,而配色方案是׃务逻辑+I间状态的集合实现的,因此WinGDIElementq是一个比较高层次的概c当一个WinGDIElement被渲染的时候,他会l你一个HDCQ然后你Ҏ被设|的状态来调用GDI函数l制到HDC指向?2位DIBSections位图~冲Z面?br><br>    那么Q当我们使用HWND+HDC的实玎ͼ创徏了一个布满了控g的窗口,那实际上是发生了什么事情呢Q首先控件自׃l成一|。其ơ,控g的皮肤也会组成一|。现在就有控件树跟皮肤树两颗树了。控件树负责所有用戯入变更状态的逻辑部分Q而皮肤树负责l图和点中测试。而一个HWND+HDC实现的皮肤树Q会在皮肤组合成树的时候,在底下又l合Z一颗WinGDIElement树。因此大局上就是:<br>    控g树(负责相应输入变更状态)--> 皮肤树(负责储存控g状态的可视部分q决定什么时候需要刷斎ͼ-->WinGDIElement树(负责l图整个H口Q?br><br>    q个时候,如果我们仅仅需要简单的重新l制H口的话Q那么控件树跟皮肤树都不需要被讉K刎ͼ底层仅需要让WinGDIElement树重新绘制一遍即可。而WinGDIElement的粒度实际上也不,因此不会每一个图元都有一个WinGDIElement从而得创建出了一大堆对象的?br><br>    最后一个设计就是在什么时候才重绘H口的问题。假设说我们现在收到了一个WM_KEYDOWN消息Q最l传播到了控件树里面去,然后修改?0个控件上面的文字。每当你修改文字的时候实际上都需要重l,那如何将无数ơ不可控的重l合q成一ơ呢QSendMessage(WM_PAINT)是立L行的Q所以Windows自带的合qWM_PAINT的方法在q个时候是无效的。我所采取的解x法就是:反正控g树的所有消息来源都是从NativeWindow里面来的Q那实际上控件树发出一个重l请求的时候,我就会把NativeWindow的HWND实现里面的一个bool变量设成trueQ然后当NativeWindow每一个传播到控g树的消息l束传播之后Q才Mơ那个变量,如果是trueQ那么就调用WinGDIElementq行重绘q把变量设计成false。坏处是每一个传播到控g树的消息在处理完之后都必L查是否需要重l,好处是这个东西被装在了NativeWindow的HWND实现里面里面Q无论是控g树、皮肤树q是WinGDIElement树也好,都在也不需要关心绘图时机的事情了?br><br>    因ؓGUI被分割成了很多层Q而且每一层的都关心业务逻辑的不同部分,所以他们都是可以被替换的。譬如说我们可以做成Q?br>    HWND+HDC实现Q最普通的Ҏ<br>    HWND+DirectXQWPF和Silverlight地方?br>    单一HWND+多个虚拟H口+DirectXQ可以在游戏里面?br><br>    无论下面的绘图设备和H口实现如何发生变化QGUI控g的逻辑部分都跟q些实现严格分离Q因此不会受到媄响。而且大部分情况下Q我们是不需要拥有一个跨l图讑֤的皮肤库的,譬如说游戏和应用E序Q外表M能做成一L。对于那些需要同时在DirectX和OpenGL上面q行的程序(譬如?dsmaxQ,它已l有DirectX和OpenGL的公共接口了Q因此这些Y件可以利用它们的公共接口来实现GUI的绘图设备部分,从而在上面构造v来的皮肤自然是可以跨DirectX和OpenGL的?br><br>    q比起一q前作的GUI实现又进了一大步。上一ơ的GUI试Z同的l图讑֤抽象一套公共接口,后来惨死。不知道q次实际上做出来的效果如何,拭目以待吧? <img src ="http://www.shnenglu.com/vczh/aggbug/145380.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/vczh/" target="_blank">陈梓?vczh)</a> 2011-04-30 11:50 <a href="http://www.shnenglu.com/vczh/archive/2011/04/30/145380.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++界面库:使用Graphic Element Template制作按钮模板http://www.shnenglu.com/vczh/archive/2009/08/20/93951.html陈梓?vczh)陈梓?vczh)Thu, 20 Aug 2009 13:38:00 GMThttp://www.shnenglu.com/vczh/archive/2009/08/20/93951.htmlhttp://www.shnenglu.com/vczh/comments/93951.htmlhttp://www.shnenglu.com/vczh/archive/2009/08/20/93951.html#Feedback7http://www.shnenglu.com/vczh/comments/commentRss/93951.htmlhttp://www.shnenglu.com/vczh/services/trackbacks/93951.html阅读全文

陈梓?vczh) 2009-08-20 21:38 发表评论
]]>
C++界面库:Graphic Element Template实现http://www.shnenglu.com/vczh/archive/2009/08/19/93848.html陈梓?vczh)陈梓?vczh)Wed, 19 Aug 2009 11:29:00 GMThttp://www.shnenglu.com/vczh/archive/2009/08/19/93848.htmlhttp://www.shnenglu.com/vczh/comments/93848.htmlhttp://www.shnenglu.com/vczh/archive/2009/08/19/93848.html#Feedback5http://www.shnenglu.com/vczh/comments/commentRss/93848.htmlhttp://www.shnenglu.com/vczh/services/trackbacks/93848.html阅读全文

陈梓?vczh) 2009-08-19 19:29 发表评论
]]>
C++界面库:为Graphic Element Template做了一个XML Schemahttp://www.shnenglu.com/vczh/archive/2009/08/07/92575.html陈梓?vczh)陈梓?vczh)Fri, 07 Aug 2009 15:29:00 GMThttp://www.shnenglu.com/vczh/archive/2009/08/07/92575.htmlhttp://www.shnenglu.com/vczh/comments/92575.htmlhttp://www.shnenglu.com/vczh/archive/2009/08/07/92575.html#Feedback1http://www.shnenglu.com/vczh/comments/commentRss/92575.htmlhttp://www.shnenglu.com/vczh/services/trackbacks/92575.html  阅读全文

陈梓?vczh) 2009-08-07 23:29 发表评论
]]>
C++界面库:在GDI上添加完全的alpha混合支持http://www.shnenglu.com/vczh/archive/2009/08/02/91972.html陈梓?vczh)陈梓?vczh)Sun, 02 Aug 2009 10:41:00 GMThttp://www.shnenglu.com/vczh/archive/2009/08/02/91972.htmlhttp://www.shnenglu.com/vczh/comments/91972.htmlhttp://www.shnenglu.com/vczh/archive/2009/08/02/91972.html#Feedback3http://www.shnenglu.com/vczh/comments/commentRss/91972.htmlhttp://www.shnenglu.com/vczh/services/trackbacks/91972.html
l图的设备当然是需要可切换的,于是用bridge模式定义了大量的接口Q这些接口用来创建画W、画列字体和囑ŞQ然后图形用树的形式l织hQ最后放C块跟H口链接的画板上面,有需要的时候自动绘制。ؓ了最快速地开始工作,我实C一个GDI的绘图设备,以后有空再做DirectX的。但是我们知道GDI对alpha的支持是很弱的,只有一个叫alphablend的API用来贴bitmapQ因此ؓ了让d和画W都能够支持alpha渐变、alpha位图和alpha颜色Q做了很多的工作?nbsp; 阅读全文

陈梓?vczh) 2009-08-02 18:41 发表评论
]]>
树型数据结构{换ؓ囄q自动排?/title><link>http://www.shnenglu.com/vczh/archive/2008/09/07/61244.html</link><dc:creator>陈梓?vczh)</dc:creator><author>陈梓?vczh)</author><pubDate>Sun, 07 Sep 2008 12:18:00 GMT</pubDate><guid>http://www.shnenglu.com/vczh/archive/2008/09/07/61244.html</guid><wfw:comment>http://www.shnenglu.com/vczh/comments/61244.html</wfw:comment><comments>http://www.shnenglu.com/vczh/archive/2008/09/07/61244.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.shnenglu.com/vczh/comments/commentRss/61244.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/vczh/services/trackbacks/61244.html</trackback:ping><description><![CDATA[     摘要: 『啊Q葱爆羊肉真是香啊。』一边回忆着q个令h感动的美食,一边心不在焉地写了个程序。这个小E序实现了一个很单的功能Q将一|转换成bmp囄q自动排版?nbsp; <a href='http://www.shnenglu.com/vczh/archive/2008/09/07/61244.html'>阅读全文</a><img src ="http://www.shnenglu.com/vczh/aggbug/61244.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/vczh/" target="_blank">陈梓?vczh)</a> 2008-09-07 20:18 <a href="http://www.shnenglu.com/vczh/archive/2008/09/07/61244.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用拓扑q行几何囑Ş布尔q算http://www.shnenglu.com/vczh/archive/2008/06/17/53675.html陈梓?vczh)陈梓?vczh)Tue, 17 Jun 2008 03:20:00 GMThttp://www.shnenglu.com/vczh/archive/2008/06/17/53675.htmlhttp://www.shnenglu.com/vczh/comments/53675.htmlhttp://www.shnenglu.com/vczh/archive/2008/06/17/53675.html#Feedback7http://www.shnenglu.com/vczh/comments/commentRss/53675.htmlhttp://www.shnenglu.com/vczh/services/trackbacks/53675.html
q个Ҏ是在考完试回宿舍的\上想到的Q适用?D?D。主要想法是q样的。给定两个几何图形A、BQ把A和B都分成『内『、『外』两部分。A的『内』就是处于B内部的部分。于是A和B变成了A内、A外、B内、B外。然后就有如下公式:
·A and B=A?B?
·A sub B=A?B?
·A or B=A?B?
·A xor B=A?B?A?B?
q种数据l构是ؓ了满_下算法:一个A点在囑Ş?==>q这个点的直U交囑Ş与点集PQ其中|{Pi|Pi<=A}|和|{Pi|Pi>=A}|都是奇数。注意我们用的?=?=Q这L话两个集合的数量的奇偶性都是一致的。这个算法无?D?D多边形还?D多面体都能适用Q就是q个囑Ş有孔Q镶嵌)也可以,而且跟凹怽无关。这个算法只有一U情冉|不能用的Q就是自p自己有交叉,譬如我们习惯?条直U构成五角星的画法。这  阅读全文

陈梓?vczh) 2008-06-17 11:20 发表评论
]]>
接下ȝ事情http://www.shnenglu.com/vczh/archive/2008/06/13/53081.html陈梓?vczh)陈梓?vczh)Thu, 12 Jun 2008 17:40:00 GMThttp://www.shnenglu.com/vczh/archive/2008/06/13/53081.htmlhttp://www.shnenglu.com/vczh/comments/53081.htmlhttp://www.shnenglu.com/vczh/archive/2008/06/13/53081.html#Feedback2http://www.shnenglu.com/vczh/comments/commentRss/53081.htmlhttp://www.shnenglu.com/vczh/services/trackbacks/53081.html
    2Q解军_边Ş的布运,有ƈ集、交集和余集{?br>
    3Q?开发画W?br>
    4Q开发画刷基Q实现Color Matrix、Vertex Transformation及多边Ş渲染

    5Q图像工?

陈梓?vczh) 2008-06-13 01:40 发表评论
]]>
椭圆D|描完?/title><link>http://www.shnenglu.com/vczh/archive/2008/06/12/53057.html</link><dc:creator>陈梓?vczh)</dc:creator><author>陈梓?vczh)</author><pubDate>Thu, 12 Jun 2008 14:02:00 GMT</pubDate><guid>http://www.shnenglu.com/vczh/archive/2008/06/12/53057.html</guid><wfw:comment>http://www.shnenglu.com/vczh/comments/53057.html</wfw:comment><comments>http://www.shnenglu.com/vczh/archive/2008/06/12/53057.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.shnenglu.com/vczh/comments/commentRss/53057.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/vczh/services/trackbacks/53057.html</trackback:ping><description><![CDATA[     摘要: l于完成了相当于GDI中Arc函数的功能了。这ơ仍然跟API有点误差Q不多这里的误差是GDI的问题。这里脓出截囑֒代码。观看图2和图3Q我们知道椭圆是对称的,但是GDIq没有做到这一炏V我的算法也不能_对称Q但是左右两边仅相差1个像素。Arc是椭圆的子集Q所以Arc在这个局部(椭圆的最上方Q中也应该左叛_U。图1中我先用GDIl制黑色ArcQ然后用我的算法绘制红色Arc。这里的自适应步长法跟上一的Bezier曲线的算法是一L?nbsp; <a href='http://www.shnenglu.com/vczh/archive/2008/06/12/53057.html'>阅读全文</a><img src ="http://www.shnenglu.com/vczh/aggbug/53057.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/vczh/" target="_blank">陈梓?vczh)</a> 2008-06-12 22:02 <a href="http://www.shnenglu.com/vczh/archive/2008/06/12/53057.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>自适应步长Bezier曲线扫描http://www.shnenglu.com/vczh/archive/2008/06/12/53000.html陈梓?vczh)陈梓?vczh)Thu, 12 Jun 2008 05:20:00 GMThttp://www.shnenglu.com/vczh/archive/2008/06/12/53000.htmlhttp://www.shnenglu.com/vczh/comments/53000.htmlhttp://www.shnenglu.com/vczh/archive/2008/06/12/53000.html#Feedback1http://www.shnenglu.com/vczh/comments/commentRss/53000.htmlhttp://www.shnenglu.com/vczh/services/trackbacks/53000.html
有了q个法之后我就可以把贝塞尔曲线转换成密度刚好的折线了。这才是最l目的?nbsp; 阅读全文

陈梓?vczh) 2008-06-12 13:20 发表评论
]]>
l于提取CTrueType字体的轮廓了http://www.shnenglu.com/vczh/archive/2008/06/11/52949.html陈梓?vczh)陈梓?vczh)Wed, 11 Jun 2008 15:48:00 GMThttp://www.shnenglu.com/vczh/archive/2008/06/11/52949.htmlhttp://www.shnenglu.com/vczh/comments/52949.htmlhttp://www.shnenglu.com/vczh/archive/2008/06/11/52949.html#Feedback11http://www.shnenglu.com/vczh/comments/commentRss/52949.htmlhttp://www.shnenglu.com/vczh/services/trackbacks/52949.html
在此贴出代码和效果图Q不作过多解释。熟悉Win32API中的GDI部分的朋友们可以很容易看懂?

效果图:
提取的轮廓:U色和黑色ؓ直线Q蓝色ؓ四次贝塞曲Uѝ其中上面是先TextOut后自qQ下面是先自q后TextOut。四ơ贝塞尔曲线转换成三ơ贝塞尔曲线之后使用PolyBezierl制?

代码Q?
代码使用的框架是我自己寒假无聊的时候封装API的结果,暂时有窗口、菜单、组合键以及菜单Q附带GDI。事件自己弄了一个跟C#差不多的可以同时Bind很多不同U类函数的东ѝ不q这个不是重炏V需要重炚wȝ是如何用GetGlyphOutline?

dtofdouble转换成FIXEDQftod相反?
GetPointq行点的变换Q主要是因ؓdW的时候需要偏UR?
DrawCurvel制Ҏ?nbsp; 阅读全文

陈梓?vczh) 2008-06-11 23:48 发表评论
]]>
þþƷһ| þúݺݸ߳޾Ʒ| 99ھƷþþþþþ| aaaƷþþùƬ| ޹˾Ʒ91þþ| ޹˾þһWWW| AVþþƷݺݰ˳| þsmȤ | þպƬ| ھƷ˾þþþվ| Ʒþþþþ | Ʒþһ| 91龫Ʒ91þþþ| ?VþþƷ| þ㽶߿ۿ| ҹþþþþ| һۺϾþù| þñۺϾþ| ۺϾþü| þþ99ƷƬĻ| þþƷ99þþ| Ӱ7777þþƷ| ŷսþþþþþþ| ƷëٸAVѾþ| ľƷ99þù | þ޹Ʒ| ҹþþþС˵| ľƷ99þù| ھƷþþþþþӰ鶹| ޾ƷþþӰԺӰƬ | ŷձþþƷ| aѹۿþav| þþƷh| þĻƵ| Ƶþ| þþþѾƷ| þۺĻ| þþSS鶹ŷպ| ƷѾþ| 99ȳ˾ƷȾþ| ޹˾þþƷ|