急求wince6.0 MFC应用程序设置静态文本框背景色问题

时间:2022-01-21 14:49:42
OnCtlColor中pDC->SetBkMode设置静态文本背景色为透明时,背景直接透到桌面了,不是对话框的背景颜色。然后用pDC->SetBkColor设文本框和背景图片一样的颜色时,又只有文字的背景色改变了,静态文本框没有文字的地方的颜色还是没有改变,求大神指教啊,急!

7 个解决方案

#1


试试处理一下 WM_ERASEBACKGROUND 消息吧

在 WinCE 系统,使用系统提示的控件,想实现比较的显示效果还是比较困难的。所以,一般我们都用自己写的控件,其实就是贴图。

#2


CtlColor中return的HBRUSH时候正确?
必须用背景色创建一个HBRUSH返回。

我就是这样用的,没你说的问题。

#3


引用 2 楼 accessysq 的回复:
CtlColor中return的HBRUSH时候正确?
必须用背景色创建一个HBRUSH返回。

我就是这样用的,没你说的问题。


CBrush brush;
brush.CreateSolidBrush(RGB(0x43,0x6E,0xEE));

 if(pWnd->GetDlgCtrlID()==IDC_STATIC1)

{  
CFont m_font;
m_font.CreatePointFont((L"d%",300),_T("宋体"));
    pDC->SelectObject(&m_font);
pDC->SetBkColor(RGB(0x43,0x6E,0xEE)); 
 }  
  return brush;
返回了还是不行啊,还是只有文字下面的背景色改变了,我对话框是设置的全屏,字体设置的300,就把静态文本框调的能够完全显示里面的文字,然后静态文本框没有文字的地方背景色还是没有变。也有看到文章说SetBkColor就是设置静态文本框的中文字的背景颜色的,不是整个静态文本框的颜色。


然后用FillSolidRect还是不行,效果一样,都是只有文字下面的背景色改变了
CBrush brush;
brush.CreateSolidBrush(RGB(0x43,0x6E,0xEE));
    if(pWnd->GetDlgCtrlID()==IDC_STATIC1)  
    {  
    CRect rcCtrl;     
    pWnd->GetWindowRect( &rcCtrl ); //获取控件位置     
    ScreenToClient( &rcCtrl ); //转换到对话框     
      
    //获取ClientDC     
    CDC *pBkDC = GetDC();      
      
    //拷贝背景     
    pDC->BitBlt(0, 0, rcCtrl.Width(), rcCtrl.Height(),     
      pBkDC, rcCtrl.left, rcCtrl.top, SRCCOPY);      
      
    //清理工作     
    ReleaseDC( pBkDC ); //释放ClientDC     

pDC->FillSolidRect(&rcCtrl,RGB(0x43,0x6E,0xEE)); //背景透明模式     
    //hbr = (HBRUSH)GetStockObject(NULL_BRUSH); 
return brush;

你是在wince 6.0 下吗,看了不帖子其他人也有这个问题,但是都没有具体的解决方法,能不能贴一下你的代码?

#4


引用 1 楼 91program 的回复:
试试处理一下 WM_ERASEBACKGROUND 消息吧

在 WinCE 系统,使用系统提示的控件,想实现比较的显示效果还是比较困难的。所以,一般我们都用自己写的控件,其实就是贴图。


贴图?直接把静态文本框的背景设置成位图?还是直接贴个图片做控件,能不能给个具体的例子的代码看看你怎么实现的。

#5


用成员变量,不要用局部变量,你要返回给系统用你还用局部变量,肯定不行了。

#6


另外我是直接子类化了,不是修改dialog中的CtlColor,而是直接在子类中修改。

HBRUSH QColorEdit::CtlColor(CDC* pDC, UINT nCtlColor)
{
HBRUSH hbr = (HBRUSH)m_brBkgnd;  
pDC->SetBkColor(m_BkColor);  
pDC->SetTextColor(m_TextColor);  
pDC->SetBkMode(TRANSPARENT);
return hbr;
}

void QColorEdit::SetTextColor(COLORREF color)
{
m_TextColor = color;  
RedrawWindow();
}

void QColorEdit::SetBkColor(COLORREF color)
{
m_BkColor = color;  
m_brBkgnd.DeleteObject();  
m_brBkgnd.CreateSolidBrush(color);  
RedrawWindow();
}

QColorEdit::QColorEdit()
{
m_BorderColor = RGB(64,128,192);
m_BkColor     = RGB(255,255,255);  
m_TextColor   = RGB(0,0,0); 
m_brBkgnd.CreateSolidBrush(m_BkColor);  
}

QColorEdit::~QColorEdit()
{
m_brBkgnd.DeleteObject();
}

贴部分代码给你参考。

#7


 if(nCtlColor == CTLCOLOR_STATIC)

{  
HBRUSH brush;
brush=CreateSolidBrush(RGB(0x43,0x6E,0xEE));
pDC->SetBkMode(TRANSPARENT);
pDC->SetTextColor(RGB(255,255,255));
return brush; 
 } 
最后还是返回和背景色一样的画刷大道效果了

#1


试试处理一下 WM_ERASEBACKGROUND 消息吧

在 WinCE 系统,使用系统提示的控件,想实现比较的显示效果还是比较困难的。所以,一般我们都用自己写的控件,其实就是贴图。

#2


CtlColor中return的HBRUSH时候正确?
必须用背景色创建一个HBRUSH返回。

我就是这样用的,没你说的问题。

#3


引用 2 楼 accessysq 的回复:
CtlColor中return的HBRUSH时候正确?
必须用背景色创建一个HBRUSH返回。

我就是这样用的,没你说的问题。


CBrush brush;
brush.CreateSolidBrush(RGB(0x43,0x6E,0xEE));

 if(pWnd->GetDlgCtrlID()==IDC_STATIC1)

{  
CFont m_font;
m_font.CreatePointFont((L"d%",300),_T("宋体"));
    pDC->SelectObject(&m_font);
pDC->SetBkColor(RGB(0x43,0x6E,0xEE)); 
 }  
  return brush;
返回了还是不行啊,还是只有文字下面的背景色改变了,我对话框是设置的全屏,字体设置的300,就把静态文本框调的能够完全显示里面的文字,然后静态文本框没有文字的地方背景色还是没有变。也有看到文章说SetBkColor就是设置静态文本框的中文字的背景颜色的,不是整个静态文本框的颜色。


然后用FillSolidRect还是不行,效果一样,都是只有文字下面的背景色改变了
CBrush brush;
brush.CreateSolidBrush(RGB(0x43,0x6E,0xEE));
    if(pWnd->GetDlgCtrlID()==IDC_STATIC1)  
    {  
    CRect rcCtrl;     
    pWnd->GetWindowRect( &rcCtrl ); //获取控件位置     
    ScreenToClient( &rcCtrl ); //转换到对话框     
      
    //获取ClientDC     
    CDC *pBkDC = GetDC();      
      
    //拷贝背景     
    pDC->BitBlt(0, 0, rcCtrl.Width(), rcCtrl.Height(),     
      pBkDC, rcCtrl.left, rcCtrl.top, SRCCOPY);      
      
    //清理工作     
    ReleaseDC( pBkDC ); //释放ClientDC     

pDC->FillSolidRect(&rcCtrl,RGB(0x43,0x6E,0xEE)); //背景透明模式     
    //hbr = (HBRUSH)GetStockObject(NULL_BRUSH); 
return brush;

你是在wince 6.0 下吗,看了不帖子其他人也有这个问题,但是都没有具体的解决方法,能不能贴一下你的代码?

#4


引用 1 楼 91program 的回复:
试试处理一下 WM_ERASEBACKGROUND 消息吧

在 WinCE 系统,使用系统提示的控件,想实现比较的显示效果还是比较困难的。所以,一般我们都用自己写的控件,其实就是贴图。


贴图?直接把静态文本框的背景设置成位图?还是直接贴个图片做控件,能不能给个具体的例子的代码看看你怎么实现的。

#5


用成员变量,不要用局部变量,你要返回给系统用你还用局部变量,肯定不行了。

#6


另外我是直接子类化了,不是修改dialog中的CtlColor,而是直接在子类中修改。

HBRUSH QColorEdit::CtlColor(CDC* pDC, UINT nCtlColor)
{
HBRUSH hbr = (HBRUSH)m_brBkgnd;  
pDC->SetBkColor(m_BkColor);  
pDC->SetTextColor(m_TextColor);  
pDC->SetBkMode(TRANSPARENT);
return hbr;
}

void QColorEdit::SetTextColor(COLORREF color)
{
m_TextColor = color;  
RedrawWindow();
}

void QColorEdit::SetBkColor(COLORREF color)
{
m_BkColor = color;  
m_brBkgnd.DeleteObject();  
m_brBkgnd.CreateSolidBrush(color);  
RedrawWindow();
}

QColorEdit::QColorEdit()
{
m_BorderColor = RGB(64,128,192);
m_BkColor     = RGB(255,255,255);  
m_TextColor   = RGB(0,0,0); 
m_brBkgnd.CreateSolidBrush(m_BkColor);  
}

QColorEdit::~QColorEdit()
{
m_brBkgnd.DeleteObject();
}

贴部分代码给你参考。

#7


 if(nCtlColor == CTLCOLOR_STATIC)

{  
HBRUSH brush;
brush=CreateSolidBrush(RGB(0x43,0x6E,0xEE));
pDC->SetBkMode(TRANSPARENT);
pDC->SetTextColor(RGB(255,255,255));
return brush; 
 } 
最后还是返回和背景色一样的画刷大道效果了