美文网首页片言絮语
GUI库开发启动

GUI库开发启动

作者: 三生石上绛珠草 | 来源:发表于2016-07-15 00:54 被阅读103次

关于开发的片言絮语,无与人诉,只好诉之于丹青。

贤云:文以载道;怕是不堪载道,只图一笑。

只因稿子屡被别人的专题所拒,蓦然发现专题可以自定义,如此甚好。

我向来不喜别人的专制,另开山头,自说自话本是极好的,我是方外之人,本不必因无人赏识而自弃。

7月13日正式启动GUI库开发。

用上了之前不敢碰的Direct2D,发现出乎意料的简单,这两年的开发水平还是提高了一大截的,英文阅读水平也有了不小的提升,全靠当年苦读程序语言理论和Haskell相关书籍了。

充分认识到了自己在Windows GUI开发上的幼稚。

本来以为重绘就是一切,不小心发现了自己对于windows的消息机制知之甚少。仅有的关于GUI的知识还是在iOS里突击学习到的。iOS的各种机制我知其然而不知其所以然,windows上的东西虽然我很久以前就玩过,然而谈起了解,竟比iOS还少!可叹!当年只顾着玩个数据库,网络,动态链接库,以为就是得到了一切,殊不知窗口才是精髓,消息机制乃是根本,不充分了解消息机制真是大错特错!

我之前苦思冥想想不明白的富文本编辑器就是消息机制的不了解,之前考虑问题方向都错了,重要的不是绘制,而是消息发送!也是惨,这么浅显明白的道理,我竟反应如此之迟钝!可见想问题方向错了,而且无人指导是多么的可怕!

说到底还是研究方法不科学,心志不坚定,查阅资料的能力也比较弱。所以所得甚少,怪不得别人,其实很多东西某些书里隐晦的提到了,只是我疏忽大意,不曾思考其中意味。这次暴露出来的问题一方面表现出来自己的懒惰,另一方面表明研究水平幼稚低下。如此下去,若说能成才,我自己是不信的。在成为架构师的路上,还有很长的一段路要走,只是虚度了无数光阴,令我十分惭愧。

废话说了一堆,尽是自省。

然而还是有些心得。最后我还是成功自绘了控件,原来窗口注册过程总是不能省的,HWND是不能没有的,我之前天真就在于此,以为画出图形就该做事件响应了,结果出了很多问题,闹了很多笑话,hwnd和renderTarget总是NULL,后来虽然强行得到了hwnd,然而因为是父窗口的,总是有点不爽。最后解决了,还是要注册WNDCLASS和CreateWindow一下。向来也是幼稚可笑。太天真啊!甚至连消息循环也要重新定义,不知道会出怎样的问题,经验太少,预测不到。

贴一段代码上来(因为用了父类代码,所以当然是单独跑不起来的)。

HRESULT Initialize()
{
    HRESULT hr;
    hr = CreateDeviceIndependentResources();

    if (SUCCEEDED(hr))
    {
        WNDCLASSEX wcex = { sizeof(WNDCLASSEX) };
        wcex.style = CS_HREDRAW | CS_VREDRAW;
        wcex.lpfnWndProc = View::WndProc;
        wcex.cbClsExtra = 0;
        wcex.cbWndExtra = sizeof(LONG_PTR);
        wcex.hInstance = HINST_THISCOMPONENT;
        wcex.hbrBackground = NULL;
        wcex.lpszMenuName = NULL;
        wcex.hCursor = LoadCursor(NULL, IDI_APPLICATION);
        wcex.lpszClassName = L"D2DButton";

        RegisterClassEx(&wcex);

        FLOAT dpiX, dpiY;
        m_pDirect2dFactory->GetDesktopDpi(&dpiX, &dpiY);

        m_hwnd = CreateWindow(
                L"D2DButton",
                L"UIButton",
                WS_CHILD | WS_BORDER | WS_CLIPSIBLINGS | WS_VISIBLE,
                this->x,
                this->y,
                static_cast<UINT>(ceil(this->width * dpiX / 96.f)),
                static_cast<UINT>(ceil(this->height * dpiY / 96.f)),
                this->m_parentHWND,
                NULL,
                HINST_THISCOMPONENT,
                this
                );
        hr = m_hwnd ? S_OK : E_FAIL;
        if (SUCCEEDED(hr))
        {
            ShowWindow(m_hwnd, SW_SHOWNORMAL);
                        UpdateWindow(m_hwnd);
        }
    }

    return hr;
}
void SetRect()
{
      this->rect = { 0, 0, width, height };
}
virtual HRESULT OnRender()
{
    m_pRenderTarget = GetContext();

    ID2D1SolidColorBrush *pSilverBrush;
    HRESULT hr = m_pRenderTarget->CreateSolidColorBrush(
                    D2D1::ColorF(D2D1::ColorF::Silver),
                    &pSilverBrush
                    );
    if (SUCCEEDED(hr))
    {
        D2D1_RECT_F rect = D2D1::RectF(0, 0, width, height);
        m_pRenderTarget->FillRectangle(&rect, pSilverBrush);
        if (hr == D2DERR_RECREATE_TARGET)
        {
            hr = S_OK;
            DiscardDeviceResources();
        }
        SafeRelease(&pSilverBrush);
    }
    ReleaseContext();
    return hr;
}

相关文章

网友评论

    本文标题:GUI库开发启动

    本文链接:https://www.haomeiwen.com/subject/rxhyjttx.html