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

阳光的花香 2015-02-01 06:01:49
各位大神帮帮忙,我在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);

哪里出问题了?
...全文
511 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
schlafenhamster 2015-02-05
  • 打赏
  • 举报
回复
// fit the property sheet into the place holder window, and show it 既然是 fit 那就是 一样大, 不就覆盖了, 那个 proppage 要小一点。
schlafenhamster 2015-02-04
  • 打赏
  • 举报
回复
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 覆盖 了。
信阳毛尖 2015-02-04
  • 打赏
  • 举报
回复

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默认的画刷),这个怎么解释?
阳光的花香 2015-02-04
  • 打赏
  • 举报
回复
引用 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控件去掉看整个界面和程序的功能如何先,谢谢大神!
阳光的花香 2015-02-04
  • 打赏
  • 举报
回复
引用 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控件的背景始终不变 ?
schlafenhamster 2015-02-03
  • 打赏
  • 举报
回复
"通过静态切分窗格的单文档结构的视图中创建这些“ 看看 你的创建代码
阳光的花香 2015-02-03
  • 打赏
  • 举报
回复
引用 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),无法改变其背景色,望大神,指点,
阳光的花香 2015-02-03
  • 打赏
  • 举报
回复
引用 13 楼 lsq19871207 的回复:
SetBkColor是不可以的,你安装我8楼说的试试先
试了,你的OnCtlColor最后return CView::OnCtlColor(pDC, pWnd, nCtlColor);不但Picture控件背景色不变,而整个视图的背景色也不会改变;如果按照基本的做法SetBkColor还是可以改变视图除了Picture控件之外的背景色的,,,
信阳毛尖 2015-02-03
  • 打赏
  • 举报
回复
引用 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; }[/quote] SetBkColor是不可以的,你安装我8楼说的试试先
信阳毛尖 2015-02-02
  • 打赏
  • 举报
回复
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;
信阳毛尖 2015-02-02
  • 打赏
  • 举报
回复
你的OnCtlColor怎么写的?
阳光的花香 2015-02-02
  • 打赏
  • 举报
回复
引用 10 楼 schlafenhamster 的回复:
"Picture控件上放置属性表单" 属性表单 初始化时: SetDialogBkColor(RGB(255,255,255),RGB(0,0,0));
我是通过静态切分窗格的单文档结构的视图中创建这些的,SetDialogBkColor不能用啊
schlafenhamster 2015-02-02
  • 打赏
  • 举报
回复
其实用不到Picture控件!
schlafenhamster 2015-02-02
  • 打赏
  • 举报
回复
"Picture控件上放置属性表单" 属性表单 初始化时: SetDialogBkColor(RGB(255,255,255),RGB(0,0,0));
阳光的花香 2015-02-02
  • 打赏
  • 举报
回复
引用 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;
}
阳光的花香 2015-02-01
  • 打赏
  • 举报
回复
引用 2 楼 email_one_by_one 的回复:
其实如果真的不行感觉可以换一个思路,直接贴一张背景图,用上相同的颜色。
这是最后的办法,还是想先试试怎么改变背景色,,,
阳光的花香 2015-02-01
  • 打赏
  • 举报
回复
引用 3 楼 worldy 的回复:
OnPaint事件中绘制
这个要怎么弄?指点一下
阳光的花香 2015-02-01
  • 打赏
  • 举报
回复
引用 1 楼 likfeng 的回复:
Picture控件的Type改为Rectangle试试
试过了,还是不行,背景色仍然不改变
worldy 2015-02-01
  • 打赏
  • 举报
回复
OnPaint事件中绘制
email_one_by_one 2015-02-01
  • 打赏
  • 举报
回复
其实如果真的不行感觉可以换一个思路,直接贴一张背景图,用上相同的颜色。
加载更多回复(1)

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧