duilib-封裝win32控制元件
阿新 • • 發佈:2019-01-05
封裝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.