等级 21次回复 MFC中怎么改变Picture控件的背景各位大神帮帮忙,我在MFC的单文档中通过静态切分划分出两个View,在其中一个View中放了一个Picture控件,然后在Picture控件上放置属性表单,为什么其他控件(包括属性表单)的背景色都可以改变,而Picture控件的背景色始终不会改变,试了OnEraseBkgnd,OnCtlColor都不行啊? //建立 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); 哪里出问题了?
等级 8楼 1、首先把Picture控件的type属性改为Enhanced Metafile/Icon/Bitmap 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;
等级 9楼
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; }
等级 10楼 'Picture控件上放置属性表单' 等级 15楼
SetBkColor是不可以的,你安装我8楼说的试试先 试了,你的OnCtlColor最后return CView::OnCtlColor(pDC, pWnd, nCtlColor);不但Picture控件背景色不变,而整个视图的背景色也不会改变;如果按照基本的做法SetBkColor还是可以改变视图除了Picture控件之外的背景色的,,,
等级 16楼
'通过静态切分窗格的单文档结构的视图中创建这些“ 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),无法改变其背景色,望大神,指点,
等级 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默认的画刷),这个怎么解释?
等级 18楼 m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CDispView), CSize(w, h1), pContext); 等级 19楼
问题就是if里面的没有执行,不知道原因何在? if里面返回的画刷和非if返回的画刷是同一个(view默认的画刷)是在构造函数中初始化的m_brush.CreateSolidBrush(RGB(0, 0, 255));然后在析构函数中删除的;想法就是不管整个背景还是Picture控件的背景,都让其为蓝色,可Picture控件的背景始终不变 ?
等级 20楼
m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CDispView), CSize(w, h1), pContext); CDispView 的确是派生自 CFormView,我试过改变每个属性表单的背景色,可以改变;可就是属性表单和CDispView之间属于Picture控件的部分的背景不变,很难看;我先试着把Picture控件去掉看整个界面和程序的功能如何先,谢谢大神!
等级 21楼 // fit the property sheet into the place holder window, and show it |
|