分享

CSDN 论坛

 行走在理想边缘 2017-01-06
hwzhang2012hwzhang201202-01 18:01
等级 T1 21次回复

MFC中怎么改变Picture控件的背景

各位大神帮帮忙,我在MFC的单文档中通过静态切分划分出两个View,在其中一个View中放了一个Picture控件,然后在Picture控件上放置属性表单,为什么其他控件(包括属性表单)的背景色都可以改变,而Picture控件的背景色始终不会改变,试了OnEraseBkgnd,OnCtlColor都不行啊?
有关Picture控件的基本代码如下,在所在View的OnInitialUpdate()函数中

//建立 Property Sheet
CWnd*  pwndpropsheetholder = GetDlgItem(IDC_PLACEHOLDER);  // IDC_PLACEHOLDER是Picture控件ID
m_pTLMPropsheet = new  CTLMPropertySheet(pwndpropsheetholder);   

CRect   rectpropsheet;   
pwndpropsheetholder->GetWindowRect(rectpropsheet);   
m_pTLMPropsheet->SetWindowPos(NULL, 0, 0,   
rectpropsheet.Width(),  rectpropsheet.Height(),   
SWP_NOZORDER|SWP_NOACTIVATE);
   
哪里出问题了?

likfenglikfeng02-01 19:48
等级 T1 1楼

Picture控件的Type改为Rectangle试试

email_one_by_oneemail_one_by_one02-01 19:50
等级 T1 2楼

其实如果真的不行感觉可以换一个思路,直接贴一张背景图,用上相同的颜色。

worldyworldy02-01 20:14
等级 T1 3楼

OnPaint事件中绘制

hwzhang2012hwzhang201202-01 21:35
等级 T1 4楼

引用 1 楼 likfeng 的回复:
Picture控件的Type改为Rectangle试试

试过了,还是不行,背景色仍然不改变

hwzhang2012hwzhang201202-01 21:53
等级 T1 5楼

引用 3 楼 worldy 的回复:
OnPaint事件中绘制

这个要怎么弄?指点一下

hwzhang2012hwzhang201202-01 21:57
等级 T1 6楼

引用 2 楼 email_one_by_one 的回复:
其实如果真的不行感觉可以换一个思路,直接贴一张背景图,用上相同的颜色。

这是最后的办法,还是想先试试怎么改变背景色,,,

lsq19871207lsq1987120702-02 10:31
等级 T1 7楼

你的OnCtlColor怎么写的?

lsq19871207lsq1987120702-02 11:02
等级 T1 8楼

1、首先把Picture控件的type属性改为Enhanced Metafile/Icon/Bitmap
2、声明定义一个HBRUSH   m_hrPicture为类成员变量,类初始化时创建出来:


m_hrPicture = ::CreateSolidBrush(RGB(255,0,0));

3、给View添加ON_WM_CTLCOLOR()消息(感觉给View添加这个消息好怪,一般的做法是在view上包一层窗口,所有的子窗口都在这个窗口上创建,最后把这个窗口create到view上)

HBRUSH CxxView::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
switch(pWnd->GetDlgCtrlID()) 

case IDC_PICTURE:
return m_hrPicture;
default: 
break; 

return CView::OnCtlColor(pDC, pWnd, nCtlColor);
}


4、析构的时候删除GDI对象

::DeleteObject(m_hrPicture);
m_hrPicture = NULL;

hwzhang2012hwzhang201202-02 18:33
等级 T1 9楼

引用 7 楼 lsq19871207 的回复:
你的OnCtlColor怎么写的?

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

// TODO: Change any attributes of the DC here
if ((pWnd->GetDlgCtrlID() == IDC_PLACEHOLDER) && (nCtlColor == CTLCOLOR_STATIC))  //IDC_PLACEHOLDER是Picture控件ID,后面一部分是看到网上的一种说法,去掉后也不行
{
pDC->SetBkColor(RGB(0,0,255));     
return m_brush;  //作为约定,返回背景色对应的刷子句柄
}

// TODO: Return a different brush if the default is not desired
return m_brush;
}

schlafenhamsterschlafenhamster02-02 19:14
等级 T1 10楼

'Picture控件上放置属性表单' 

属性表单 初始化时:
SetDialogBkColor(RGB(255,255,255),RGB(0,0,0));

schlafenhamsterschlafenhamster02-02 19:15
等级 T1 11楼

其实用不到Picture控件!

hwzhang2012hwzhang201202-02 20:34
等级 T1 12楼

引用 10 楼 schlafenhamster 的回复:
'Picture控件上放置属性表单' 

属性表单 初始化时:
SetDialogBkColor(RGB(255,255,255),RGB(0,0,0));

我是通过静态切分窗格的单文档结构的视图中创建这些的,SetDialogBkColor不能用啊

lsq19871207lsq1987120702-03 09:08
等级 T1 13楼

引用 9 楼 hwzhang2012 的回复:
Quote: 引用 7 楼 lsq19871207 的回复:

你的OnCtlColor怎么写的?

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

// TODO: Change any attributes of the DC here
if ((pWnd->GetDlgCtrlID() == IDC_PLACEHOLDER) && (nCtlColor == CTLCOLOR_STATIC))  //IDC_PLACEHOLDER是Picture控件ID,后面一部分是看到网上的一种说法,去掉后也不行
{
pDC->SetBkColor(RGB(0,0,255));     
return m_brush;  //作为约定,返回背景色对应的刷子句柄
}

// TODO: Return a different brush if the default is not desired
return m_brush;
}


SetBkColor是不可以的,你安装我8楼说的试试先

schlafenhamsterschlafenhamster02-03 09:35
等级 T1 14楼

'通过静态切分窗格的单文档结构的视图中创建这些“
看看 你的创建代码

hwzhang2012hwzhang201202-03 21:13
等级 T1 15楼

引用 13 楼 lsq19871207 的回复:
SetBkColor是不可以的,你安装我8楼说的试试先

试了,你的OnCtlColor最后return CView::OnCtlColor(pDC, pWnd, nCtlColor);不但Picture控件背景色不变,而整个视图的背景色也不会改变;如果按照基本的做法SetBkColor还是可以改变视图除了Picture控件之外的背景色的,,,

hwzhang2012hwzhang201202-03 21:25
等级 T1 16楼

引用 14 楼 schlafenhamster 的回复:
'通过静态切分窗格的单文档结构的视图中创建这些“
看看 你的创建代码

1,CMainFrame的OnCreateClient函数:
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs,
CCreateContext* pContext)
{
//设置界面的分栏布局
CRect rect;
GetClientRect(&rect);

int w  = int (rect.Width());
int h1 = int (rect.Height() * 0.90);
int h2 = int (rect.Height() * 0.10);

    //切分成2行1列
    if (NULL == m_wndSplitter.CreateStatic(this, 2, 1, WS_CHILD | WS_VISIBLE | WS_BORDER))
{
    return FALSE;
}

//将CDispView类连接到分栏对象的0行0列
m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CDispView), CSize(w, h1), pContext); 
//将CWarningView类连接到分栏对象的1行0列
m_wndSplitter.CreateView(1, 0, RUNTIME_CLASS(CWarningView), CSize(w, h2), pContext); 
        //这里的h1,h2的比例好像不起作用???也是一个问题       

//m_wndSplitter.SetRowInfo(0, rect.Height() * 0.90, 0);
m_wndSplitter.RecalcLayout();

m_wndSplitter.SetActivePane(0, 0);
m_wndSplitter.SetActivePane(1, 0);


//获取CDispView的指针,保存于m_pView
m_pView = (CDispView*) m_wndSplitter.GetPane(0,0);

return TRUE; 
}

2,CDispView的OnInitialUpdate函数
  void CDispView::OnInitialUpdate() 
{
CFormView::OnInitialUpdate();


// TODO: Add your specialized code here and/or call the base class
    //默认情况下CEdit是32K, RichEdit是64K
((CEdit*) GetDlgItem(IDC_EDIT_WARNING))->SetLimitText(-1);

    //建立 Property Sheet, IDC_PLACEHOLDER是Picture控件ID
CWnd*  pwndpropsheetholder = GetDlgItem(IDC_PLACEHOLDER); 
    m_pTLMPropsheet = new  CTLMPropertySheet(pwndpropsheetholder);  

    if   (!m_pTLMPropsheet->Create(pwndpropsheetholder,   
WS_VISIBLE | WS_CHILD | WS_TABSTOP, 0))   
    {   
delete   m_pTLMPropsheet;   
m_pTLMPropsheet = NULL;   
return;   
    }   
//   fit the property sheet into the place holder window, and show it   
    CRect   rectpropsheet;   
    pwndpropsheetholder->GetWindowRect(rectpropsheet);   
    m_pTLMPropsheet->SetWindowPos(NULL, 0, 0,   
rectpropsheet.Width(),  rectpropsheet.Height(),   
SWP_NOZORDER | SWP_NOACTIVATE);   
    ......省略其他部分代码
}

以上就是创建视图和属性表单的代码,用到了Picture控件(属性-Enhanced Metafile),无法改变其背景色,望大神,指点,

lsq19871207lsq1987120702-04 09:34
等级 T1 17楼


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

// TODO: Change any attributes of the DC here
if ((pWnd->GetDlgCtrlID() == IDC_PLACEHOLDER) && (nCtlColor == CTLCOLOR_STATIC))  //IDC_PLACEHOLDER是Picture控件ID,后面一部分是看到网上的一种说法,去掉后也不行
{
pDC->SetBkColor(RGB(0,0,255));     
return m_brush;  //作为约定,返回背景色对应的刷子句柄
}

// TODO: Return a different brush if the default is not desired
return m_brush;
}

以上是你的代码,请问if里面执行了吗?
另外,你的if里面返回的画刷和非if返回的画刷是同一个(view默认的画刷),这个怎么解释?

schlafenhamsterschlafenhamster02-04 09:37
等级 T1 18楼

m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CDispView), CSize(w, h1), pContext); 

CDispView  应该派生自 CFormView

1. 创建应该 对话框 资源 (PropertyPage  )
2. 关联到 CFormView

3. 在 CDispView EraseBkGround 中 画 背景, 

4. 不需要 picture, 因为 //   fit the property sheet into the place holder window, and show it  

把 picture 覆盖 了。

hwzhang2012hwzhang201202-04 18:29
等级 T1 19楼

引用 17 楼 lsq19871207 的回复:

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

// TODO: Change any attributes of the DC here
if ((pWnd->GetDlgCtrlID() == IDC_PLACEHOLDER) && (nCtlColor == CTLCOLOR_STATIC))  //IDC_PLACEHOLDER是Picture控件ID,后面一部分是看到网上的一种说法,去掉后也不行
{
pDC->SetBkColor(RGB(0,0,255));     
return m_brush;  //作为约定,返回背景色对应的刷子句柄
}

// TODO: Return a different brush if the default is not desired
return m_brush;
}

以上是你的代码,请问if里面执行了吗?
另外,你的if里面返回的画刷和非if返回的画刷是同一个(view默认的画刷),这个怎么解释?

问题就是if里面的没有执行,不知道原因何在?
if里面返回的画刷和非if返回的画刷是同一个(view默认的画刷)是在构造函数中初始化的m_brush.CreateSolidBrush(RGB(0, 0, 255));然后在析构函数中删除的;想法就是不管整个背景还是Picture控件的背景,都让其为蓝色,可Picture控件的背景始终不变 ?

hwzhang2012hwzhang201202-04 18:38
等级 T1 20楼

引用 18 楼 schlafenhamster 的回复:
m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CDispView), CSize(w, h1), pContext); 

CDispView  应该派生自 CFormView

1. 创建应该 对话框 资源 (PropertyPage  )
2. 关联到 CFormView

3. 在 CDispView EraseBkGround 中 画 背景, 

4. 不需要 picture, 因为 //   fit the property sheet into the place holder window, and show it  

把 picture 覆盖 了。

CDispView  的确是派生自 CFormView,我试过改变每个属性表单的背景色,可以改变;可就是属性表单和CDispView之间属于Picture控件的部分的背景不变,很难看;我先试着把Picture控件去掉看整个界面和程序的功能如何先,谢谢大神!

schlafenhamsterschlafenhamster02-05 08:51
等级 T1 21楼

 //   fit the property sheet into the place holder window, and show it  

既然是 fit 那就是 一样大, 不就覆盖了, 那个 proppage 要小一点。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多