打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
CSDN 论坛
hwzhang201202-01 18:01
等级
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);
   
哪里出问题了?

likfeng02-01 19:48
等级
1楼

Picture控件的Type改为Rectangle试试

email_one_by_one02-01 19:50
等级
2楼

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

worldy02-01 20:14
等级
3楼

OnPaint事件中绘制

hwzhang201202-01 21:35
等级
4楼

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

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

hwzhang201202-01 21:53
等级
5楼

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

这个要怎么弄?指点一下

hwzhang201202-01 21:57
等级
6楼

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

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

lsq1987120702-02 10:31
等级
7楼

你的OnCtlColor怎么写的?

lsq1987120702-02 11:02
等级
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;

hwzhang201202-02 18:33
等级
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;
}

schlafenhamster02-02 19:14
等级
10楼

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

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

schlafenhamster02-02 19:15
等级
11楼

其实用不到Picture控件!

hwzhang201202-02 20:34
等级
12楼

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

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

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

lsq1987120702-03 09:08
等级
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楼说的试试先

schlafenhamster02-03 09:35
等级
14楼

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

hwzhang201202-03 21:13
等级
15楼

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

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

hwzhang201202-03 21:25
等级
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),无法改变其背景色,望大神,指点,

lsq1987120702-04 09:34
等级
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默认的画刷),这个怎么解释?

schlafenhamster02-04 09:37
等级
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 覆盖 了。

hwzhang201202-04 18:29
等级
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控件的背景始终不变 ?

hwzhang201202-04 18:38
等级
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控件去掉看整个界面和程序的功能如何先,谢谢大神!

schlafenhamster02-05 08:51
等级
21楼

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

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

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
常用控件附录
VFP中的查询的应用及视图(view)
一步步学习微软InfoPath2010和SP2010
excel 向工作表中添加图像控件
在VFP中实现字符的淡出淡入
Excel ActiveX控件 属性含义
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服