Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > Убрать UPDOWN в CDateTimeCtrl


Автор: Acer 9.3.2011, 19:21
Привет. Есть класс наследник от CDateTimeCtrl
Вот код создания контрола:
Код

pEditTime->Create( WS_CHILD | WS_VISIBLE | DTS_TIMEFORMAT & ~DTS_UPDOWN, CRect( 0, 0, 0, 0 ), this, 0 );

в контроле справа кнопки up/down не убираются. Точнее, остается только down. Если вообще не упоминать о DTS_UPDOWN, то обе кнопки создаются.
Подскажите, как убрать UPDOWN из контрола?
Код с GetWindowLong и SetWindowLong, который нашел гугл не помог.

Автор: Acer 12.3.2011, 14:54
Проблему решил. Идея простая. Находим окно со спинбоксом и удаляем его:
Создал контрол с явным указанием стиля DTS_UPDOWN
Код

pEditTime->Create( WS_CHILD | WS_VISIBLE | DTS_TIMEFORMAT | DTS_UPDOWN, CRect( 0, 0, 0, 0 ), pBaseWnd, 0 );

В классе контрола определил реакцию на сообщение WM_SHOWWINDOW
Код

void EditTime::OnShowWindow(BOOL bShow, UINT nStatus)
{
    if ( bShow == TRUE )
    {
        ::EnumChildWindows( GetSafeHwnd(), EnumChildProc, NULL );
    }
    CDateTimeCtrl::OnShowWindow(bShow, nStatus);
}


где EnumChildProc
Код

BOOL CALLBACK EnumChildProc(HWND hWnd, LPARAM lParam)
{
    char clsNameUpDown[] = { "msctls_updown32\0" };
    char clsName[255];

    ::GetClassNameA( hWnd, clsName, 256 );
    if ( strcmp( clsName, clsNameUpDown ) == 0 )
    {
        ::ShowWindow( hWnd, SW_HIDE );
        return FALSE;
    }
    return TRUE;
}


Теперь спинбокс не отображается в CDateTimeCtrl(кнопка показа календаря тоже не отображается). 
Но отображается свободное место для этого спинбокса. 
Чтобы его убрать я ограничил область видимого окна (CWnd::SetWindowRgn)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)