游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2031|回复: 2

封装仅仅是UI用的Surface类库·d3dsurface9没有blt方法?

[复制链接]

362

主题

3023

帖子

3553

积分

论坛元老

Rank: 8Rank: 8

积分
3553
发表于 2007-12-11 19:48:00 | 显示全部楼层 |阅读模式
请问,我想封装一个仅仅是 UI 用的Surface类库,
带单一的alpha值,带透明色

看了文档,d3dsurface9没有blt方法吗?难道就只能用getdc和gdi?
难道,我需要用3d的多边形来实现吗?

362

主题

3023

帖子

3553

积分

论坛元老

Rank: 8Rank: 8

积分
3553
 楼主| 发表于 2007-12-11 19:56:00 | 显示全部楼层

Re: 封装仅仅是UI用的Surface类库·d3dsurface9没有blt方法

本代码中删除了与本文无关的东西。
用户只要实现ISurf,IFont接口,就可以在任何平台上使用本UI。
因为UI的编程关键是算法,而不是怎样绘图,所以,
我希望我的劳动有价值,因而做成了平台无关的。

//instUI.h
#ifndef INST_UI_H
#define INST_UI_H

#include <instTypes.h> //基本数据类型的typedef
#include <instDefines.h>
#include <instStr.h> //字符串头文件是平台无关的,但是他的cpp文件是平台相关的#include <instList.h>
#include <instEvent.h>

namespace inst
{
namespace ui
{
class ISurf; //由于不知道2D/3D,绘图引擎等,所以让用户去实现它!
class IFont; //由于不知道,绘图引擎,字体处理等,所以让用户去实现它!
                         //只有让用户去实现,才可保证用户能将其和其他字体对象相互转换,如微软的Font
/**
* 这是为UI而设计的2D绘图接口,所以,功能有限,比如不支持Alpha通道,只支持单一的Alpha值
* 没有显存/系统内存属性!因为Alpha操作封装在方法内部
* 由于接口类没有构造函数,用户应当自己创建绘图表面对象,
* 或在窗体编辑器中输入自己的构造函数格式,然后利用窗体编辑器自动生成加载图片的代码
*/
class ISurf
{
public:
        virtual ~ISurf();

        virtual COORD getw() const=0;
        virtual COORD geth() const=0;

        virtual ALPHA GetAlpha() const=0;
        virtual void SetAlpha(ALPHA alpha)=0;

        virtual COLOR GetColorKey() const=0;
        virtual void SetColorKey(COLOR key)=0;

        virtual RET Blt()=0;
        virtual RET StretchBlt()=0;
        virtual Bool IsLost() const=0;
        virtual RET Restore()=0;

        virtual COLOR GetColor() const=0;
        virtual void SetColor(COLOR color)=0;
        virtual LINESTYLE GetLineStyle() const=0;
        virtual void SetLineStyle(LINESTYLE style)=0;

        virtual void SetPixel(COORD x,COORD y,COLOR color)=0;
        virtual COLOR GetPixel(COORD x,COORD y) const=0;

        virtual RET DrawLine(COORD x1,COORD y1,COORD x2,COORD y2)=0;
        virtual RET DrawRect(COORD x1,COORD y1,COORD x2,COORD y2)=0;
        virtual RET DrawRoundRect(COORD x1,COORD y1,COORD x2,COORD y2,COORD x3,COORD y3)=0;
        virtual RET DrawEllipse(COORD x1,COORD y1,COORD x2,COORD y2)=0;

        virtual RET FillRect(COORD x1,COORD y1,COORD x2,COORD y2)=0;
        virtual RET FillRoundRect(COORD x1,COORD y1,COORD x2,COORD y2,COORD x3,COORD y3)=0;
        virtual RET FillEllipse(COORD x1,COORD y1,COORD x2,COORD y2)=0;

        virtual IFont *GetFont() const=0;
        virtual void SetFont(const IFont *font)=0;
        virtual RET DrawText()=0;
};

class IFont
{
        virtual CStr GetName()=0;
        virtual void SetName(CStr name)=0;
        virtual UByte GetGdiCharSet()=0;
        virtual UInt16 GetCharWidth()=0;
        virtual UInt16 GetCharHeight()=0;
};
/////////////////////////////////////////////////////////////////////////////
#include "instUIContainerBase.h"
#include "instUIForm.h"
#include "instUIPicBox.h"
#include "instUIBtn.h"
#include "instUIEdit.h"

#endif//INST_UI_H

362

主题

3023

帖子

3553

积分

论坛元老

Rank: 8Rank: 8

积分
3553
 楼主| 发表于 2007-12-11 20:01:00 | 显示全部楼层

Re:封装仅仅是UI用的Surface类库·d3dsurface9没有blt方法?

然后,我在inst::win32命名空间中,提供2个标准实现,instUISurfWithD3D,instUISurfWithDDraw.
ddraw就不用说了,D3D中的surface,怎么办呢?我只需要上面的功能就足够了,
ISurf中的 typedef COLOR 的色彩格式使用r8g8b8,就行了。(内部用什么格式我不管)
总之实现一个UI用的surface类。需要alpha值。

我是用d3dsurface9(怎么用?)
还是多边形?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-24 04:09

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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