封装win32控件在duilib中使用,我这里因为项目中用到了时间控件,duilib中没有,但是win32中有DateTimePicker控件。
思路:就是创建一个duilib控件来容纳win32控件。
1.和网上的资料一样,我们创建一个duilib控件
#pragma once
#include "resource.h"
#include "stdafx.h"
class CWndUI : public CControlUI
{
public:
CWndUI(void){ m_hWnd = NULL; };
~CWndUI(void){};
virtual void SetInternVisible(bool bVisible = true)
{
__super::SetInternVisible(bVisible);
::ShowWindow(m_hWnd, bVisible);
}
virtual void SetPos(RECT rc)
{
__super::SetPos(rc);
::SetWindowPos(m_hWnd, NULL, rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top, SWP_NOZORDER | SWP_NOACTIVATE);
}
BOOL Attach(HWND hWndNew)
{
if (!::IsWindow(hWndNew))
{
return FALSE;
}
m_hWnd = hWndNew;
return TRUE;
}
HWND Detach()
{
HWND hWnd = m_hWnd;
m_hWnd = NULL;
return hWnd;
}
protected:
HWND m_hWnd;
};
这里能得到控件的句柄。
2.像自定义控件一样,我们在窗口类中需要继承重写CreateControl(LPCTSTR pstrClass);函数
CControlUI* CClockDlg::CreateControl(LPCTSTR pstrClass)
{
if (_tcsicmp(pstrClass, _T("Wnd")) == 0)
{
CWndUI *pUI = new CWndUI();
m_TimeHwnd = CreateWindow(_T("SysDateTimePick32"), _T(""), WS_VISIBLE | WS_CHILD | DTS_TIMEFORMAT, 265, 90, 120, 28, m_pm.GetPaintWindow(), NULL, NULL, NULL);
pUI->Attach(m_TimeHwnd);
}
return NULL;
}
xml:
<Wnd />
m_TimeHwnd是我写的类中的变量,因为我要得到时间控件的句柄。win32中日期时间的控件类型是SysDateTimePick32,这个一定要弄清楚,不然无法显示控件。另外是这个控件默认是显示日期的,我们需要显示时间,这里我们CreateWindow的时候就要添加DTS_TIMEFORMAT属性。还有一个是网上使用MFC控件在xml中留下位置和大小信息,我发现在win32中没有用,所以设置位置和大小我就写在了CreateWindow里。(真坑爹)
经过上两步应该win32的时间控件就能显示了
3.就是要得到我们的时间了
SYSTEMTIME sysTime;
::SendMessage(m_TimeHwnd, MCM_GETCURSEL, NULL, (LPARAM)&sysTime);
CDuiString str;
str.Format(L"%d小时%d分钟%d秒", sysTime.wHour, sysTime.wMinute, sysTime.wSecond);
MessageBox(NULL, str, L"sss", NULL);
说明:需要说明一点是我这里窗口类是继承的public WindowImplBase,如果是继承public CWindowWnd, public INotifyUI,显示不出来,就需要在Create函数里添加上自身的this指针。
有什么问题给我留言或者联系我:809505138.