Хочу плоский CEdit
От: kamui  
Дата: 08.04.05 03:42
Оценка:
Как добиться внешнего вида эдита, аналогичному тому, что
делает со стандартной кнопкой свойство BS_FLAT?
Причем, эдит размещен на форме, а не создается
динамически.
ModifyStyle заюзать?
Re: Хочу плоский CEdit
От: Шевченко Александр http://alexsoft.home.nov.ru
Дата: 08.04.05 04:18
Оценка:
Отключи border, включи static edge.
Re[2]: Хочу плоский CEdit
От: kamui  
Дата: 08.04.05 11:32
Оценка:
ША>Отключи border, включи static edge.

Не совсем то получается. Он должен быть окаймлен темной линией.
Вопрос, конечно, на фоне остальных несколько туповат, но просто
дизайн — дело такое, забывать тоже нельзя
Re[3]: Хочу плоский CEdit
От: SchweinDeBurg Россия https://zarezky.spb.ru/
Дата: 08.04.05 11:47
Оценка:
Здравствуйте, kamui, Вы писали:

K>Не совсем то получается. Он должен быть окаймлен темной линией.


Я так понимаю, что желаемый вид Вам должно дать наличие стиля WS_BORDER при отсутствии расширенного стиля WS_EX_CLIENTEDGE. Попробуйте создать такой EDIT при помощи CreateEx() и посмотрите, что получится.
[ posted via RSDN@Home 1.1.4 beta 4 r391, accompanied by silence ]
- Искренне ваш, Поросенок Пафнутий
Проверил...
От: SchweinDeBurg Россия https://zarezky.spb.ru/
Дата: 08.04.05 11:53
Оценка:
Код вида

// AfxBoxTestDlg.h

class CAfxBoxTestDlg : public CDialog
{
...
protected:
    CEdit m_edit;
...
};

// AfxBoxTestDlg.cpp

BOOL CAfxBoxTestDlg::OnInitDialog()
{
...
    // TODO: Add extra initialization here
    m_edit.CreateEx(0, _T("EDIT"), NULL, WS_CHILD | WS_VISIBLE | WS_BORDER, 10, 10, 100, 40,
        GetSafeHwnd(), reinterpret_cast<HMENU>(1010));
...
}

дает именно то, что Вы хотели — EDIT с тонкой черной рамкой. Правда придется ему руками нужный шрифт назначать...
[ posted via RSDN@Home 1.1.4 beta 4 r391, accompanied by silence ]
- Искренне ваш, Поросенок Пафнутий
То же самое для EDIT'а, созданного в редакторе ресурсов
От: SchweinDeBurg Россия https://zarezky.spb.ru/
Дата: 08.04.05 12:09
Оценка:
BOOL CAfxBoxTestDlg::OnInitDialog()
{
...
    m_edit2.ModifyStyleEx(WS_EX_CLIENTEDGE, 0, SWP_DRAWFRAME);
    m_edit2.ModifyStyle(0, WS_BORDER, SWP_DRAWFRAME);
...
}
[ posted via RSDN@Home 1.1.4 beta 4 r391, accompanied by silence ]
- Искренне ваш, Поросенок Пафнутий
Re: То же самое для EDIT'а, созданного в редакторе ресурсов
От: kamui  
Дата: 08.04.05 13:03
Оценка:
Да, оно. Большое спасибо.
Re[2]: CComboBox??
От: kamui  
Дата: 16.05.05 08:40
Оценка:
Не достиг я такого уровня шаманства, чтобы это еще и понять.
Как того же эффекта добиться для CComboBox?
Попробовал так же поиграть свойствами через ModifyStyle — не получается никак.
Re[3]: CComboBox??
От: avs.prg Украина  
Дата: 16.05.05 09:40
Оценка:
Здравствуйте, kamui, Вы писали:

K>Не достиг я такого уровня шаманства, чтобы это еще и понять.

K>Как того же эффекта добиться для CComboBox?
K>Попробовал так же поиграть свойствами через ModifyStyle — не получается никак.

А вот с элементом управления ComboBox есть проблема. ModifyStyle() не поможет. Выход — самостоятельно нарисовать необходимую рамку вокруг окна редактирования и кнопки активации выпадающего списка. Т.е. в методе OnPaint() выполнить процедуру рисования по умолчанию Default(), а потом нарисовать то, что вы хотите.
Re[4]: CComboBox??
От: kamui  
Дата: 16.05.05 12:12
Оценка:
AP>А вот с элементом управления ComboBox есть проблема. ModifyStyle() не поможет. Выход — самостоятельно нарисовать необходимую рамку вокруг окна редактирования и кнопки активации выпадающего списка. Т.е. в методе OnPaint() выполнить процедуру рисования по умолчанию Default(), а потом нарисовать то, что вы хотите.


А можно клочок кода? Хоть самый маленький... А то ну никак не силен я в рисовании
контролов...
Re[5]: CComboBox??
От: avs.prg Украина  
Дата: 16.05.05 14:28
Оценка:
Здравствуйте, kamui, Вы писали:

AP>>А вот с элементом управления ComboBox есть проблема. ModifyStyle() не поможет. Выход — самостоятельно нарисовать необходимую рамку вокруг окна редактирования и кнопки активации выпадающего списка. Т.е. в методе OnPaint() выполнить процедуру рисования по умолчанию Default(), а потом нарисовать то, что вы хотите.



K>А можно клочок кода? Хоть самый маленький... А то ну никак не силен я в рисовании

K>контролов...

У меня получилось примерно следующее:
есть класс CFlatArtist — рисует необходимые рамки и т.д. для нескольких элементов управления (ComboBox,Button,....и т.п.), а все остальные классы, реализующие элементы управления, используют последний для собственного отображения.

// Класс рисования

class CFlatArtist : public CObject
{
.
.
.
    COLORREF m_clrBtnHilite;
    COLORREF m_clrBtnShadow;
    COLORREF m_clrBtnFace;
    int m_nOffset; // Смещение кнопки в элементе ComboBox
.
.
.
public:
.
.
.
    enum CONTROL_TYPE {FA_IDC_BUTTON=1,FA_IDC_COMBOBOX=2};
    enum ELEMENT_STATE {FA_NORMAL=1,FA_RAISED=2,FA_PRESSED=3};
    void OnDraw(CDC* pDC,const RECT& itemRect,ELEMENT_STATE eState,BOOL bIsWindowEnabled=TRUE);
.
.
.
};

CFlatArtist::CFlatArtist(int eType /*Тип элемента управления*/)
{
    m_nCtrlType=eType;
    m_clrBtnHilite=::GetSysColor(COLOR_BTNHILIGHT);
    m_clrBtnShadow=::GetSysColor(COLOR_BTNSHADOW);
    m_clrBtnFace=::GetSysColor(COLOR_BTNFACE);
    m_nOffset=::GetSystemMetrics(SM_CXHTHUMB);
}

void CFlatArtist::OnDraw(CDC* pDC,const RECT& itemRect,ELEMENT_STATE eState,BOOL bIsWindowEnabled/*=TRUE*/)
{
    ASSERT(pDC!=NULL);

    COLORREF clrTopLeft,clrBottomRight;
    CRect rcItem=itemRect;

    switch(eState)
    {
    case FA_NORMAL:
        clrTopLeft=m_clrBtnFace;
        clrBottomRight=m_clrBtnFace;
        break;
    case FA_RAISED:
        clrTopLeft=m_clrBtnShadow;
        clrBottomRight=m_clrBtnHilite;
        break;
    case FA_PRESSED:
        clrTopLeft=m_clrBtnShadow;
        clrBottomRight=m_clrBtnHilite;
        break;
    }
    pDC->Draw3dRect(rcItem,clrTopLeft,clrBottomRight);
    rcItem.DeflateRect(1,1);

    if(bIsWindowEnabled) pDC->Draw3dRect(rcItem,m_clrBtnFace,m_clrBtnFace);
    else pDC->Draw3dRect(rcItem,m_clrBtnHilite,m_clrBtnHilite);

    rcItem.DeflateRect(1,1);
    if(m_nCtrlType==FA_IDC_COMBOBOX) rcItem.left=rcItem.right-m_nOffset;
    pDC->Draw3dRect(rcItem,m_clrBtnFace,m_clrBtnFace);

    rcItem.DeflateRect(1,1);
    pDC->Draw3dRect(rcItem,m_clrBtnFace,m_clrBtnFace);

    if(bIsWindowEnabled==false) return;
    switch (eState)
    {
    case FA_NORMAL:
        rcItem.top-=1;
        rcItem.bottom+=1;
        pDC->Draw3dRect(rcItem,m_clrBtnHilite,m_clrBtnHilite);
        if(m_nCtrlType==FA_IDC_COMBOBOX) rcItem.left-=1;
        pDC->Draw3dRect(rcItem,m_clrBtnHilite,m_clrBtnHilite);
        break;
    case FA_RAISED:
        rcItem.top-=1;
        rcItem.bottom+=1;
        pDC->Draw3dRect(rcItem,m_clrBtnHilite,m_clrBtnShadow);
        break;
    case FA_PRESSED:
        rcItem.top-=1;
        rcItem.bottom+=1;
        rcItem.OffsetRect(1,1);
        pDC->Draw3dRect(rcItem,m_clrBtnShadow,m_clrBtnHilite);
        break;
    }
}
/////////////////////////////////////////////////
// Элемент управления ComboBox
class CFlatComboBox : public CComboBox
{
.
.
.
    CFlatArtist* m_pArtist;
    BOOL m_bPainted;
    BOOL m_bLBtnDown;
    BOOL m_bHasFocus;
.
.
.
public:
.
.
.
    afx_msg void OnPaint();
.
.
.
};

CFlatComboBox::CFlatComboBox()
:.......
{
    m_pArtist=new CFlatArtist(CFlatArtist::FA_IDC_COMBOBOX);
}

BEGIN_MESSAGE_MAP(CFlatComboBox, CComboBox)
...
    ON_WM_PAINT()
...
END_MESSAGE_MAP()

// Рисуем
void CFlatComboBox::OnPaint()
{
    Default(); // Пусть сам нарисуется


    // Исправим то, что есть ......
        CDC* pDC=GetDC();
    CRect rcItemWnd,rcItem;
    GetWindowRect(rcItemWnd);
    GetClientRect(rcItem);
    
    CPoint pt;
    GetCursorPos(&pt);

    if(rcItemWnd.PtInRect(pt)||m_bHasFocus)
        m_pArtist->OnDraw(pDC,rcItem,CFlatArtist::FA_RAISED,IsWindowEnabled());
    else 
        m_pArtist->OnDraw(pDC,rcItem,CFlatArtist::FA_NORMAL,IsWindowEnabled());
    ReleaseDC(pDC);
}


P.S. Если не понятно спрашивайте. А вообще на эту тему была масса статей с разными реализациями.
За основу брал примерчик c codeproject, к сожалению ссылку не помню.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.