1. 程式人生 > >duilib-封裝win32控制元件

duilib-封裝win32控制元件

封裝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.