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 を返そうとしましたが、違いはわかりませんでした。

とから独自のクラスを派生さ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);
    }

これらのボタンの周りの境界線を削除する方法を教えてください。

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

ところで...ボタンのnullブラシを返すコードを追加する必要があります。ただし、描画コード内のボタンのさまざまな状態については説明しませんでした。それは練習問題としてあなたに任せました。

于 2014-11-21T19:54:16.713 に答える