0

我设计了一个属性表并将其页脚绘制为OnPaint()事件中的某个渐变。页脚如下所示。观察红色圈出的按钮区域。 在此处输入图像描述

在 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);

}

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

在此处输入图像描述

向导按钮的背景或页脚区域应如上图所示。但如果您可以查看第一张图片,因为“后退”按钮、“下一步”和“取消”按钮周围有一些白色。

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;
}

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

在此处输入图像描述

我尝试在 CtlColor 中返回 NULL,但我看不出有任何区别。

CPropertySheet从and派生出我自己的课程CButton

//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);
    }

谁能告诉我如何删除这些按钮周围的边框。

4

1 回答 1

0

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

在此处输入图像描述

我认为这就是你想要达到的目标。我能够通过执行以下操作来完成此任务:

  • 派生我自己的 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);
    }

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

于 2014-11-21T19:54:16.713 回答