在propertysheet页脚上绘制颜色的问题?

时间:2014-11-10 14:41:23

标签: mfc cpropertysheet

我设计了一个属性表,并在OnPaint()事件中将其页脚绘制为某个渐变。 页脚如下图所示。观察以红色圈出的按钮区域。 enter image description here

在OnPaint中我的表现如下,

//CMySheet is derived from CPropertySheet.
void CMySheet::OnPaint()
{

if(IsIconic())
    {
        CPaintDC dc(this); // device context for painting
        SendMessage(WM_ICONERASEBKGND,reinterpret_cast<WPARAM>(dc.GetSafeHdc()),0);

        int cxIcon = GetSystemMetrics(SM_CXICON);
        int cyIcon = GetSystemMetrics(SM_CYICON);

        CRect rect;
        GetClientRect(&rect);
        int x = (rect.Width() - cxIcon + 1)/2;
        int y = (rect.Height() - cyIcon + 1)/2;

    }
    else
    {
        CPaintDC dc(this);

        UpdateData(false);

        CRect Clientrect;
        GetClientRect(&Clientrect);

        LONG RectDifference = ((Clientrect.bottom - m_PageRectBottom)-2);//m_pageRectBottom is of page bottom rect

        CRect rectFooter(Clientrect.top,(Clientrect.bottom - RectDifference),Clientrect.right,Clientrect.bottom);//638//520
        //CRect rectFooter(0,390,640,445);
        FillGradation(&dc,rectFooter,RGB(150,150,150),RGB(0,0,0),true);

    }

}
}

void CMySheet::OnPaint(CDC* pDC, CRect rc, COLORREF colBegin, COLORREF colEnd, bool bV)
{
    TRIVERTEX av[2] = {rc.left,rc.top,GetRValue(colBegin) << 8,GetGValue(colBegin) << 8,GetBValue(colBegin) << 8 ,0xff00,
        rc.right,rc.bottom,GetRValue(colEnd) << 8 ,GetGValue(colEnd) << 8,GetBValue(colEnd) << 8,0xff00,};

    GRADIENT_RECT gr = {0,1};
    ULONG ulMode;
    if(bV){
        ulMode = GRADIENT_FILL_RECT_V;
    }
    else{
        ulMode = GRADIENT_FILL_RECT_H;       
    }
    GradientFill(pDC->GetSafeHdc(),av,2,&gr,1,ulMode);

}

上图中的按钮不透明,但实际上按钮的背景应如下图所示。

enter image description here

向导按钮背景或页脚区域应如上图所示。但是,如果您可以查看第一张图像,则“返回”按钮周围会出现一些白色,“下一步”和“取消”按钮。

HBRUSH CMySheet::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
    HBRUSH hbr = CPropertySheet::OnCtlColor(pDC, pWnd, nCtlColor);

    if((pWnd->GetDlgCtrlID() == ID_WIZBACK) || (pWnd->GetDlgCtrlID() == ID_WIZNEXT) ||
        (pWnd->GetDlgCtrlID() == ID_WIZFINISH) || (pWnd->GetDlgCtrlID() == IDCANCEL))
    {
        return CreateSolidBrush(RGB(130,130,130));
    }

  return hbr;
}

如果我这样做,图像如下灰色。但是该颜色应该是渐变的,我无法创建渐变画笔。

enter image description here

我尝试在CtlColor中返回NULL,但我看不出任何差异。

CPropertySheetCButton

派生自己的课程
//Overrided the DrawItem and PreSubclassWindow
    void CPropSheetButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) 
    {

        CDC* pDC   = CDC::FromHandle(lpDrawItemStruct->hDC);
        CRect rect = lpDrawItemStruct->rcItem;
        UINT state = lpDrawItemStruct->itemState;


        if (state & ODS_SELECTED)
            pDC->DrawFrameControl(rect, DFC_BUTTON, DFCS_BUTTONPUSH | DFCS_PUSHED);
           else
               pDC->DrawFrameControl(rect, DFC_BUTTON, DFCS_BUTTONPUSH);

        UINT uStyle = DFCS_BUTTONPUSH;
        HTHEME hTheme = OpenThemeData(m_hWnd, L"BUTTON");
        HRESULT hr = DrawThemeBackground(hTheme, lpDrawItemStruct->hDC, BP_PUSHBUTTON, PBS_DEFAULTED, &lpDrawItemStruct->rcItem, NULL);

        // Get the button's text.
        CString strText;
        GetWindowText(strText);


        CloseThemeData(hTheme);
        ::DrawText(lpDrawItemStruct->hDC, strText, strText.GetLength(),
            &lpDrawItemStruct->rcItem, DT_SINGLELINE | DT_VCENTER | DT_CENTER);


            int nMode = pDC->SetBkMode(TRANSPARENT);
            pDC->SetBkMode(nMode);

    }

    void CPropSheetButton::PreSubclassWindow() 
    {
        CButton::PreSubclassWindow();

        ModifyStyle(0, BS_OWNERDRAW);   // make the button owner drawn
    }
    //In the Sheet derived class OnInitDialog ,
    BOOL CMySheetWizard::OnInitDialog()
    {

        CPropertySheet::OnInitDialog();
        CMyButton backbutton;
        BOOL bRet = backbutton.SubclassDlgItem(ID_WIZBACK,this);
    }

任何人都可以告诉我如何删除这些按钮周围的边框。

1 个答案:

答案 0 :(得分:0)

使用你的绘画代码渲染背景和一些额外的类,我能够实现这个......

enter image description here

我认为这是你想要实现的目标。我能够通过以下方式实现这一目标:

  • 导出我自己的CPropertySheet和CButton类。
  • 对属性表按钮进行子类化并使其成为所有者。

这里是从按钮类中绘制按钮的代码。

void SheetButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
    {
    UINT uStyle = DFCS_BUTTONPUSH;
    HTHEME hTheme = OpenThemeData(m_hWnd, L"BUTTON");
    DrawThemeBackground(hTheme, lpDrawItemStruct->hDC, BP_PUSHBUTTON, PBS_DEFAULTED, &lpDrawItemStruct->rcItem, NULL);

    // Get the button's text.
    CString strText;
    GetWindowText(strText);

    // Draw the button text using the text color red.
    COLORREF crOldColor = ::SetTextColor(lpDrawItemStruct->hDC, RGB(255, 0, 0));
    ::DrawText(lpDrawItemStruct->hDC, strText, strText.GetLength(),
        &lpDrawItemStruct->rcItem, DT_SINGLELINE | DT_VCENTER | DT_CENTER);
    ::SetTextColor(lpDrawItemStruct->hDC, crOldColor);

    CloseThemeData(hTheme);
    }

顺便说一句......你仍然需要添加代码来返回按钮的空刷。但是,我没有考虑绘图代码中按钮的不同状态。我把它留给你做练习。

相关问题