是否可以更改图片控制背景颜色而不是更改图像?

Is it possible to change Pictue Control background color istead of Changing image?

本文关键字:颜色 图像 控制 是否 背景      更新时间:2023-10-16

我正在尝试更改我添加到microsoftvisualc++环境中的对话框中的图片控制框的颜色。我做了如下操作:

  1. 在资源文件->对话框编辑器中,我添加了一个图片控制框(类型=矩形)
  2. 我看了看这个问题,并试图继续前进。
  3. 右键单击图片控制框,添加变量。

4。在MainDlg.Cpp文件和Onpainting()中;节中,添加了以下代码Has:

CPaintDC dc(this);
CRect rect;
GetClientRect(&rect);
dc.FillSolidRect(&rect, RGB(120,255,0));

然而,我把上面的命令添加到下面的命令中,我认为它属于对话框绘画(我不知道它是否会产生问题):

CRect rect;
    GetClientRect(&rect);
    int x = (rect.Width() - cxIcon + 1) / 2;
    int y = (rect.Height() - cyIcon + 1) / 2;
    // Draw the icon
    dc.DrawIcon(x, y, m_hIcon);
}
else
{
    CDialog::OnPaint();
  • 在main.Cpp文件和函数OnInitDialog()中;此代码添加:

    m_PictureControlVariable.SubclassDlgItem(IDC_STATIC_PictureControl, this);

  • (其中IDC_STATIC_PictureControl为对话框编辑器中的图片控件ID)

  • 当事件发生时,我要调用图片控件颜色被改变,我的意思是在一个回调函数中,它向对话框发送消息,我调用这个图片控件为:

    m_PictureControlVariable.EnableWindow();

  • 现在我收到一个调试错误!!

    更新:

    我添加了一个CStatic类型的MFC类(在菜单栏->项目->添加类):原项目包含以下。cpp和。h代码:

    #include "stdafx.h"
    #include "Main.h"
    #include "PICTURECTRL.h"
    
    // PICTURECTRL
    IMPLEMENT_DYNAMIC(PICTURECTRL, CStatic)
    PICTURECTRL::PICTURECTRL()
    {
    }
    PICTURECTRL::~PICTURECTRL()
    {
    }
    
    BEGIN_MESSAGE_MAP(PICTURECTRL, CStatic)
        ON_WM_PAINT()
    END_MESSAGE_MAP()
    
    // PICTURECTRL message handlers
    void PICTURECTRL::OnPaint()
    {
        CPaintDC dc(this); // device context for painting
        //@TG
    //#3073
            // TODO: Add your message handler code here
            // Do not call CStatic::OnPaint() for painting messages
    CRect rect;
    GetClientRect(&rect);
    dc.FillSolidRect(&rect, RGB(0,0,255));
    }
    

    和你可以看到我手动添加OnPaint()消息处理程序从资源视图->类视图->属性->消息。

    派生类的头文件是:

    #pragma once
    
    // PICTURECTRL  (Picture Control)
    class PICTURECTRL : public CStatic
    {
        DECLARE_DYNAMIC(PICTURECTRL)
    public:
        PICTURECTRL();
        virtual ~PICTURECTRL();
    protected:
        DECLARE_MESSAGE_MAP()
    public:
        afx_msg void OnPaint();
    };
    

    在原始代码中添加变量到图片控制之后,这些命令添加到maindgh . cpp maindgh . h中,依次为:

        void CMainDlg::DoDataExchange(CDataExchange* pDX)
    {
        CDialog::DoDataExchange(pDX);
        //{{AFX_DATA_MAP(CMainDlg)
        // NOTE: the ClassWizard will add DDX and DDV calls here
        //}}AFX_DATA_MAP
        DDX_Control(pDX, IDC_PROGRESS1, M_progressBar1);
        DDX_Control(pDX, IDC_PictureControl, m_PicCtrl);
    }
    

    和在原文件的头文件只是CStatic m_PicCtrl;添加到Main类的公共部分,我的意思是:

    class CMainDlg : public CDialog
    {
    public:
    protected:
    public:
        CStatic m_PicCtrl;
    }
    

    你应该在图片控件的OnPaint中绘制,而不是对话框的OnPaint。当你添加变量时它应该已经创建了

    CStatic m_PictureControlVariable;
    

    并将此变量添加到DoDataExchange中。DoDataExchange所做的事情与调用SubclassDlgItem相同,因此应该删除冗余调用。

    现在从CStatic中派生一个类,并用您的派生类替换上面的CStatic。这样,你就可以在WM_PAINT消息的派生类中添加一个消息处理程序,并在图片控件中绘制你喜欢的内容。

    更新:在对话框h文件中添加

    #include "PICTURECTRL.h" 
    

    和更改

    CStatic m_PicCtrl;
    

    PICTURECTRL m_PicCtrl;
    

    试试这样:

    BOOL YourCStaticDerived::OnEraseBkgnd( CDC* pDC )
    {
        CBrush  brush( RGB( 240, 240, 240 ) ); // whatever color you need
        CBrush* pVBrush;
        CRect   rett;
        pVBrush = pDC->SelectObject( &brush );
        pDC->GetClipBox( &rett );
        pDC->PatBlt( rett.left, rett.top, rett.Width(), rett.Height(), PATCOPY );
        pDC->SelectObject( pVBrush );
        return TRUE;
    }