关于开发的片言絮语,无与人诉,只好诉之于丹青。
贤云:文以载道;怕是不堪载道,只图一笑。
只因稿子屡被别人的专题所拒,蓦然发现专题可以自定义,如此甚好。
我向来不喜别人的专制,另开山头,自说自话本是极好的,我是方外之人,本不必因无人赏识而自弃。
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;
}
网友评论