我的程序有很多动态生成的CStatic控件(如果用CreateEx()生成的控件叫做动态生成的话)。这些控件其实是从CStatic继承而来的,我把继承得到的这个类做了一个链表,像下面这样:class CItemStatic: public CStatic {
bool m_Flag;
CItemStatic *pNext;
}在对话框的OnInitDialog()中我生成这些控件:// TODO:
pItem = new CItemStatic;
pItem->CreateEx( /*参数省略*/ );
/*生成链表省略*/现在我能访问每一个结点的指针。在工作线程中,我不停遍历这个链表,如果遍历时发现当前结点的m_Flag属性为true时,我将启动下面这个线程改变CStatic控件的背景颜色和字体颜色。DWORD WINAPI ChangeColor(CItemStatic* pItem)
{
pItem->SetWindowTextW(_T("Hello!")); //可用
pItem->MessageBox(_T("Hello!")); //可用CDC *pDC = pItem->GetWindowDC(); //可用
pDC->SelectObject(&br); //可用 (其中br为:CBrush br; br.CreateSolidBrush(0x000000FF); )
pDC->Rectangle(0,0,100,30); //可用 //TODO: 永久改变该静态控件的字体颜色和背景颜色pDC->SetBkColor(RGB(0,0,255)); //编译连接通过,实际不显示,即不可用。
pDC->SetTextColor(RGB(0,0,0)); //编译连接通过,实际不显示。pItem->ReleaseDC(pDC);
pItem->UpdateWindow(); //可用
}请问,该怎么写才能达到我的目的,即从那一刻开始,永久改变该静态控件的字体颜色和背景颜色,直到程序结束?请直接附代码,谢谢!
bool m_Flag;
CItemStatic *pNext;
}在对话框的OnInitDialog()中我生成这些控件:// TODO:
pItem = new CItemStatic;
pItem->CreateEx( /*参数省略*/ );
/*生成链表省略*/现在我能访问每一个结点的指针。在工作线程中,我不停遍历这个链表,如果遍历时发现当前结点的m_Flag属性为true时,我将启动下面这个线程改变CStatic控件的背景颜色和字体颜色。DWORD WINAPI ChangeColor(CItemStatic* pItem)
{
pItem->SetWindowTextW(_T("Hello!")); //可用
pItem->MessageBox(_T("Hello!")); //可用CDC *pDC = pItem->GetWindowDC(); //可用
pDC->SelectObject(&br); //可用 (其中br为:CBrush br; br.CreateSolidBrush(0x000000FF); )
pDC->Rectangle(0,0,100,30); //可用 //TODO: 永久改变该静态控件的字体颜色和背景颜色pDC->SetBkColor(RGB(0,0,255)); //编译连接通过,实际不显示,即不可用。
pDC->SetTextColor(RGB(0,0,0)); //编译连接通过,实际不显示。pItem->ReleaseDC(pDC);
pItem->UpdateWindow(); //可用
}请问,该怎么写才能达到我的目的,即从那一刻开始,永久改变该静态控件的字体颜色和背景颜色,直到程序结束?请直接附代码,谢谢!
解决方案 »
- MFC 调用chm 打开至某一个文档怎么做,苦求!
- 请问,有DLL,有LIB,没有.H 怎么用这个DLL
- 每个扇区所包容的byte数是咋样决定的???
- *****Slider控件滑块定位问题*******
- 提问:CPaintDC和CClientDC
- 菜鸟问题:如何让组合框的下拉列表框显示多行??
- 征求tif转为bm的源代码
- 请问怎样在VC中调用在VB中生成的ACTIVE X DLL! (过节撒分,撒分!)
- 我在VC6.0中编译调试程序时,提示我打不开MFC42U.LIB文件,为什么啊,在线等待。
- 如何用VC在硬盘上建立一个共享目录?用什么函数?
- Office编程一问
- 平时总是问,写过多少行代码,这个行数怎么计算的啊?呵呵
WM_CTLCOLOR是一个由控件(Control)发送给它父窗口的通告消息(Notification message)。生成一个标准的单文档应用程序框架,假设应用程序的名称为Color。我将利用它的About对话框做示范。
在About dialog中添加两个Edit control,设定其ID为IDC_EDIT1与IDC_EDIT2;第一种方法(对应于IDC_EDIT1): 按照标准的Windows编程,由其父窗口的消息处理函数负责处理WM_CTLCOLOR消息。
1. 在CAboutDlg中添加一个数据成员:HBRUSH m_brMine;
2. 利用向导映射AboutDlg的WM_CTLCOLOR消息,产生函数:
HBRUSH CAboutDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);
pDC是AboutDlg的设备上下文,pWnd是AboutDlg中发送该消息的control指针,
nCtlColor是Control的类型编码。对其进行如下修改:
HBRUSH CAboutDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
if ((pWnd->GetDlgCtrlID() == IDC_EDIT1) && (nCtlColor == CTLCOLOR_EDIT))
{
COLORREF clr = RGB(255,0,0);
pDC->SetTextColor(clr); //设置红色的文本
clr = RGB(0,0,0);
pDC->SetBkColor(clr); //设置黑色的背景
m_brMine = ::CreateSolidBrush(clr);
return m_brMine; //作为约定,返回背景色对应的刷子句柄
}
else
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
return hbr;
}
}第二种方法(对应于IDC_EDIT2): 利用MFC 4.0的新特性: Message relection。
1.利用向导添加一个新的类:CColorEdit,基类为CEdit;
2.在CColorEdit中添加一个数据成员: HBRUSH m_bkBrush;
3.利用向导映射CColorEdit的"=WM_CTLCOLOR"消息,产生函数:HBRUSH CColorEdit::CtlColor(CDC* pDC, UINT nCtlColor); 对其进行如下修改:
HBRUSH CColorEdit::CtlColor(CDC* pDC, UINT nCtlColor)
{
COLORREF clr = RGB(0,0,0);
pDC->SetTextColor(clr); //设置黑色的文本
clr = RGB(255,0,0);
pDC->SetBkColor(clr); //设置红色的背景
m_bkBrush = ::CreateSolidBrush(clr);
return m_bkBrush; //作为约定,返回背景色对应的刷子句柄
}
4.利用向导为IDC_EDIT2生成一个数据成员CColorEdit m_coloredit;
5.在定义CAboutDlg的color.cpp文件中加入:#include "coloredit.h"CStatic 同样。。
{CDC* pDC = GetDC();
CBrush br;
br.CreateSolidBrush(RGB(0,0,255));
pDC->SelectObject(br);pDC->Rectangle(0,0,LowerRight_x,LowerRight_y); //背景将永久改变CFont font;
font.CreatePointFont(168,_T("Impact"));pDC->SelectObject(font);
pDC->SetTextAlign(TA_CENTER); //可居中
pDC->SetTextColor(RGB(255,255,255)); //可设字体颜色
pDC->TextOutW(_T("All right, it's done."));}