Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.RU > C/C++: Системное программирование и WinAPI > Наложение текста в static


Автор: Игорь98 19.02.19, 20:42
Доброго времени суток! На окне имеется static, в котором, посредством таймера, каждую секунду обновляется время. Не пойму в чем причина, но при при использовании функции SetWindowText(), текст нового времени, в прямом смысле этого слова, накладывается на старый текст (почему то старый текст не удаляется). В чем может быть проблема?
static.jpg (, : 818)

Таймер
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    case WM_TIMER:
            {
                switch(wParam)
                {
                    case TEST_WIN_TIMER:
                    {
                        if(!SetAsptTimer(hWnd, &aspt_controls))
                        {
                            SendPostStop(hWnd, &aspt_controls);
                        }
     
                        break;
                    }
                }
     
                break;
            }


Обработка таймера
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    BOOL WINAPI SetAsptTimer(HWND hWnd, lpAspt_Test_Controls lpaspt_test_controls)
    {
        BOOL result = TRUE;
        std::wstringstream stream;
        
        if(lpaspt_test_controls->Aspt_Timer.iMinutes > 0x00)
        {
            if(lpaspt_test_controls->Aspt_Timer.iSeconds == 0x00)
            {
                lpaspt_test_controls->Aspt_Timer.iSeconds = 0x3B;
                lpaspt_test_controls->Aspt_Timer.iMinutes--;
            }
            else
            {
                lpaspt_test_controls->Aspt_Timer.iSeconds--;
            }
     
            stream << TEST_WIN_TIME << lpaspt_test_controls->Aspt_Timer.iMinutes << _T(":");
     
            if(lpaspt_test_controls->Aspt_Timer.iSeconds < 0x0A)
            {
                stream << _T("0") << lpaspt_test_controls->Aspt_Timer.iSeconds;
            }
            else
            {
                stream << lpaspt_test_controls->Aspt_Timer.iSeconds;
            }
        }
        else
        {
            stream << TEST_WIN_TIME << _T("0:00");
            result = FALSE;
            KillTimer(hWnd, TEST_WIN_TIMER);
        }
     
        SetWindowText(lpaspt_test_controls->hTime, stream.str().c_str());
     
        return result;
    }

Автор: B.V. 20.02.19, 19:28
Ты неправильно обрабатываешь фон статика. https://social.msdn.microsoft.com/Forums/vs...forum=vcgeneral

Автор: Игорь98 22.02.19, 12:36
Цитата
Ты неправильно обрабатываешь фон статика. https://social.msdn.microsoft.com/Forums/vs...forum=vcgeneral

Спасибо, вы оказались правы.
Вот, обрабатываю фон статика, таким образом:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    case WM_CTLCOLORSTATIC:
            {
                SetBkMode((HDC)wParam, OPAQUE);
                SetTextColor((HDC)wParam, RGB(0x00, 0x00, 0x00));
                SetBkColor((HDC)wParam, GetSysColor(COLOR_MENU));
                return (INT_PTR)GetStockObject(NULL_BRUSH);        
            }


Все статики стали нормальными, но почему то теперь появились проблемы с неактивными едитами и чек-баттонами...

win.JPG (, : 454)

На скрине, если стоит флажок, то верхние два едита неактивные (функция EnableWindow(), в них есть текст, просто я его тут замазал), если флажок убрать, то нижние два едита становятся неактивными, а верхние - активные... Как можно поправить отображение данных контролов?

Автор: ЫукпШ 22.02.19, 19:38
Цитата B.V. @
Ты неправильно обрабатываешь фон статика. https://social.msdn.microsoft.com/Forums/vs...forum=vcgeneral

Афигеть:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    // You just need to handle WM_CTLCOLOR for the dialog
     
    HBRUSH CDialogDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
    {
        HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
        if ( CTLCOLOR_STATIC == nCtlColor )
     
        {
            pDC->SetBkMode( TRANSPARENT );
            HBRUSH RedBrush =  CreateSolidBrush( RGB( 255,0,255));
            return RedBrush;
        }
     
        return hbr;
    }

user posted image

Можно тут посмотреть.
Это получше, но тоже не очень хорошо.

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