Coder Social home page Coder Social logo

duilib's Introduction

Duilib

Duilib是一个Windows下免费开源的DirectUI界面库,由于简约易扩展的设计以及稳定高效的实现被各大互联网公司普遍接受,广泛应用于包括IM、视频客户端、股票行情软件、导航软件、手机辅助软件、安全软件等多个行业的众多pc客户端软件。Duilib还在不断的发展中,在文档、例子、动画、渲染引擎等多个方面将持续改进。

欢迎为Duilib提供功能改进、代码修补、bug反馈、使用文档和献计献策,让我们一起把Duilib做的更好!

快速安装

您可以使用vcpkg库管理器下载并安装duilib:

git clone https://github.com/Microsoft/vcpkg.git
cd vcpkg
./bootstrap-vcpkg.sh
./vcpkg integrate install
./vcpkg install duilib

vcpkg中的duilib库由Microsoft团队成员和社区贡献者保持最新状态。如果版本过时,请在vcpkg存储库上创建问题或请求请求

基于Duilib的软件不完全列表

Duilib自2010年8月21日发布以来,获得了众多开发者和大公司的信赖,在各行各业的软件中得到了广泛应用,以下是一个作者知道不完全列表,欢迎大家补充指正 https://github.com/duilib/duilib/wiki/%E5%9F%BA%E4%BA%8EDuilib%E7%9A%84%E8%BD%AF%E4%BB%B6%E4%B8%8D%E5%AE%8C%E5%85%A8%E5%88%97%E8%A1%A8

下面两个修改版本大家可以参考一下

腾讯使用的的duilib修改版

https://github.com/TencentCloud/TIMSDK/tree/master/Windows/Demo/Basic/duilib

网易使用的duilib修改版

https://github.com/netease-im/NIM_Duilib_Framework/tree/master/duilib

duilib's People

Contributors

atypiape avatar congpp avatar convexbytes avatar daviyang35 avatar fcten avatar gxke avatar hiroyukki avatar huanhappy avatar jiangdon2007 avatar lihaitao8233 avatar lilywangl avatar lion117 avatar maskonface avatar nmgwddj avatar redrains avatar rustever avatar t6zksor avatar umu618 avatar wangchyz avatar wgy0323 avatar willson-chen avatar zoand avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

duilib's Issues

duilib in win32 dll doesn't work normally

I am working on a dll included dialogs implimented by duilib. But when I call my dll function to pop up a dialog, the first time it pop up normally but the second time it just crashed in wincore.cpp (_AfxActivationWndProc crashed, but I am not using mfc at all)!

Plus, I am using ZIPRES in dll and I already set CPaintManagerUI::SetInstance to my dll module handle to make sure I load the right resource.

Combo,BUG

在Combo中使用ListTextElement 会出现bug

字体设置无效

以下代码字体设置没有效果了

default.xml 片段

<DefaultConfig>
<Font name="微软雅黑" size="12"/>
    <Font name="微软雅黑" size="12" bold="true"/>
    <Font name="微软雅黑" size="13" bold="true" />
    <Font name="微软雅黑" size="16"/>
    <Font name="微软雅黑" size="22"/>
</DefaultConfig>

mainwnd.xml 片段

<Label text="项目设置" textcolor="#FF136DEC" font="1"/>

RichEdit 字体粗细和倾斜属性设置无效

问题一

在使用duilib 最新版的库中, 使用RichEdit 控件设置字体的时候, 字体大小和字体类型能够工作正常. 但是
字体粗细字体倾斜 两个属性就存在以下问题:

  • 首次设置倾斜和粗细有效
  • 取消粗细或倾斜, 无效

RichEdit 设置完粗细和倾斜之后, 就无法清除了.

问题二

另外颜色设置接口也存在颜色错乱的问题

Unicode下的一个BUG

Unicode下
UILabel.cpp 66 行 与 432 行
m_pWideText = m_sText.GetData(); 常量指针没转义就直接复制给LPWSTR了

opacity与layeredopacity代码重合

layeredopacity属性似乎是多余,在配置文件中设置对窗口没有起什么作用
,还有希望提供一个关于 LayeredImage 的 demo出来

容器滚动条的问题

因为不知道是不是刻意为之所以这里只说是问题,而不是BUG。
现象:
HorizontalLayout 开启垂直滚动条无用,不显示
VerticalLayout 开启水平滚动条有显示,但范围不对
Container 开启滚动条无效,SetPos中没有执行ProcessScrollBar

个人意见,不同容器应该只是布局方式不同,而与滚动条无关。所有容器的双向滚动条都应该正确支持,由用户开关。这样更方便灵活。

CDelegateBase::equal问题

template <class O, class T>
class CDelegate : public CDelegateBase的实现写的有问题

实际equal的时候,比较的是CDelegateBase的m_pFn,而 CDelegateBase的m_pFn则是一个形参的栈地址,传入的时候之前是这么写的CDelegate(O* pObj, Fn pFn) : CDelegateBase(pObj, &pFn)

我猜之前写这块的人不知道怎么转换指针类型,所以写的这么别扭
我自己修改的实现
template <class O, class T>
class CDelegate : public CDelegateBase
{
typedef bool (T::* Fn)(void_);
public:
CDelegate(O_ pObj, Fn pFn) : CDelegateBase(pObj, (void_)&pFn) { }
CDelegate(const CDelegate& rhs) : CDelegateBase(rhs) { }
virtual CDelegateBase_ Copy() const { return new CDelegate(*this); }

protected:
virtual bool Invoke(void* param)
{
O* pObject = (O_) GetObject();
union
{
void_ ptr;
Fn fn;
}func = { GetFn() };
return (pObject->*func.fn)(param);
}

};

padding属性和List控件

1、padding属性在某些大多数情况下有问题,一般是右、下有问题,padding变得非常大,是很严重的BUG。

2、List控件的SelectItem在某些情况下无效,即选中不了。比如在切换tab后用代码就选中不了了。

3、此外,友好性建议,建议支持VS2008编译平台,因为做VC开发的大部分使用08平台。

@wangchyz

去年的老版本没有这样的问题。

分割窗口,鼠标bug,sep

当layout设置 sepwidth,和sepimm属性后,layout里放置其他控件后,sepilt的鼠标cursor不能正常显示

   <?xml version="1.0" encoding="UTF-8"?>
   <Window size="800, 600">
       <HorizontalLayout bkcolor="#FF0099CC">
           <HorizontalLayout minwidth="200" bkcolor ="#FFCCCCCC" sepwidth="5" sepimm="true">
               <Control />
           </HorizontalLayout>
           <HorizontalLayout>
           </HorizontalLayout>
       </HorizontalLayout>
   </Window>

控件背景黑色问题

edit控件在透明下背景为黑色,其他控件在不贴图纯色带alpha的情况下背景黑色

如何使duilib这种优秀的框架加入到自动化界面测试行列

目前duilib的框架绘制的界面大部分没有句柄,这在一定程度上面限制了采用自动化测试框架测试界面功能的可能性。何不再每个Control中加入pagemodel,建立起界面库元素的管理,然后全局上能够访问pagemodel的元素,方便测试人员编写脚本来控制界面的元素查找,功能按钮的点击事件调用呢?
如果能有善莫大焉

建议将工程拆分下

DuiDesigner放到组织下独立的工程,Examples也做一个独立工程,这样如果只是更新这些工程的内容,就不需要把核心库整个pull。

关于带有阴影的PNG作为背景时不会有透明效果了

之前使用的版本中可以使用SetBackgroundTransparent,现在用您的新版本后发现没有这个方法了
然后PNG带有阴影的就会成为黑边。新的代码中看到Layout相关的,还没有怎么明白怎么使用,
SetLayout为True后貌似就什么都不显示了。

不知道这个算BUG还是作者您有其它意义

无法响应DUI的menu消息了,仔细看了下代码发现UIManager.cpp的WM_CONTEXTMENU中增加了一句if( IsCaptured() ) break;
在WM_RBUTTONDOWN中看到有SetCapture(),此时鼠标抬起首先收到WM_CONTEXTMENU消息,这时IsCaptured等于true, 就没有响应了。

DuiLib中异步Notify的实现bug

异步Notify的消息响应现有实现是在CPaintManagerUI::MessageHandler入口和结尾添加,
任何Windows消息的响应都会触发消息检索
当响应异步Notify的代码调用了DoModal时, 会触发异常

可简单修改, 在添加异步Notify时, 通过
TNotifyUI *pMsg = new TNotifyUI;
pMsg->pSender = Msg.pSender;
pMsg->sType = Msg.sType;
pMsg->wParam = Msg.wParam;
pMsg->lParam = Msg.lParam;
pMsg->ptMouse = Msg.ptMouse;
pMsg->dwTimestamp = Msg.dwTimestamp;
m_aAsyncNotify.Add(pMsg);
::PostMessage(m_hWndPaint, WM_USER_DUILIB_ASYNC_NOTIFY, NULL, NULL);
并在MessageHandle中响应对应的消息

TRelativePosUI不存在

DuiDesigner 无法编译,
error C2039: “TRelativePosUI”: 不是“DuiLib”的成员。

一个小bug

MapKeyState函数里的LBUTTON和RBUTTON写倒了

SetFloat之后,SetFixedXY,SetFixedWidth之类的函数调用都没有用。

SetFixedXY的代码:
void CControlUI::SetFixedXY(SIZE szXY)
{
m_cXY.cx = szXY.cx;
m_cXY.cy = szXY.cy;
if( !m_bFloat ) NeedParentUpdate();
else NeedUpdate();
}
如果m_bFloat被设置父控件没有更新。NeedUpdate只会导致控件自己的SetPos被调用。
bool CPaintManagerUI::MessageHandler(UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT& lRes)
{
...
pControl->SetPos(pControl->GetRelativePos(), true);
...
}
然后控件SetPos代码导致SetFixedXY调用无效,m_cXY被还原:
void CControlUI::SetPos(RECT rc, bool bNeedInvalidate)
{
...
if( m_bFloat ) {
CControlUI* pParent = GetParent();
if( pParent != NULL ) {
...
m_cXY.cx = rc.left - rcPercent.left;
m_cXY.cy = rc.top - rcPercent.top;
...
}
}
...
}

最后SetFixedXY调用什么都不会发生。

UIDesigner设置隐藏Bug

master线上版本,在保存时,会把我的一些控件批量设置visible="false",导致控件被隐藏

Slider 控件绘制渲染上的小瑕疵

seeing is believing
q -20151203103716

Slider 控件的边缘处, 由于直接使用矩形绘制, 当圆型滑块滑至边缘处, 将导致两尖角突出. 如上图所示

当然采用方形滑块, 不存在这样的问题. 但方形滑块用的真的很少. 圆形才是主流啊, 这导致在后期需要美工用P图欺骗的方式来处理这类型的瑕疵.

控件布局bug

        <VerticalLayout bkcolor="#FFFFFFFF">
            <Control />
            <InputControl visible="false" height="25" name="input_control" font="0" />
            <NewsScrollBar height="25" name="news_scroll_bar" bkcolor="#FFFF0000"/>
            <Control />
        </VerticalLayout>

控件一个显示另外一个隐藏bug,第二个控件的位置不能正确显示

CButtonUI/COptionUI鼠标按下并移动过程大量重绘.

见代码.

        if( event.Type == UIEVENT_MOUSEMOVE ){
            if( (m_uButtonState & UISTATE_CAPTURED) != 0 ) {
                if( ::PtInRect(&m_rcItem, event.ptMouse) ) 
                    m_uButtonState |= UISTATE_PUSHED;
                else 
                    m_uButtonState &= ~UISTATE_PUSHED;
                Invalidate();
            }
            return;
        }

这里有个问题.假如我鼠标按下,保持按下同时移动鼠标..这里无论鼠标状态是啥都会进行Invalidate从而进行重绘.鼠标移动的消息很多从而造成大量重绘..

修改如下:

        if( event.Type == UIEVENT_MOUSEMOVE ){
            if( (m_uButtonState & UISTATE_CAPTURED) != 0 ) {
                UINT State = m_uButtonState;
                if( ::PtInRect(&m_rcItem, event.ptMouse) ) 
                    m_uButtonState |= UISTATE_PUSHED;
                else 
                    m_uButtonState &= ~UISTATE_PUSHED;
                if (State != m_uButtonState){
                    Invalidate();
                }

            }
            return;
        }

同时COptionUI也有同样的问题..

    void COptionUI::PaintStatusImage(HDC hDC)
    {
        m_uButtonState &= ~UISTATE_PUSHED;
        ...
    }

这里修改了m_uButtonState的状态,我估计是为了不让接下来的printText绘制push状态的文字吧,这样做造成了在CButtonUI中即使向上面那样修改也会造成大量重绘.
这个修改重载下PrintText或者怎么的?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.