为什么修改group box和单选按钮的字体颜色不成功?

lyz_cs 2016-04-27 01:10:54
有背景图片。
if (nCtlColor == CTLCOLOR_STATIC&&pWnd->GetDlgCtrlID() == IDC_GROUP)    //文本编辑框颜色     
{
pDC->SetTextColor(RGB(255, 255, 255));
pDC->SetBkMode(TRANSPARENT);
hbr = (HBRUSH)::GetStockObject(NULL_BRUSH);
}
//单选按钮字体修改颜色问题???????????
if (pWnd->GetDlgCtrlID() == IDC_SINGLEMODE || pWnd->GetDlgCtrlID() == IDC_MANYMODE) //文本编辑框颜色
{
pDC->SetTextColor(RGB(255, 255, 255));
pDC->SetBkMode(TRANSPARENT);
CFont font;
font.CreatePointFont(120, L"微软雅黑");
CFont *pOldFont=pDC->SelectObject(&font);
CRect rc;
pWnd->GetWindowRect(&rc);
ScreenToClient(&rc);
CDC* dc = GetDC();
pDC->BitBlt(0, 0, rc.Width(), rc.Height(), dc, rc.left, rc.top, SRCCOPY); //把父窗口背景图片先画到按钮上
ReleaseDC(dc);
hbr = (HBRUSH) ::GetStockObject(NULL_BRUSH);

}

...全文
756 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
蓝之羽520 2017-05-29
  • 打赏
  • 举报
回复
如何解决的?有具体代码看看吗?
lyz_cs 2016-05-04
  • 打赏
  • 举报
回复
引用 14 楼 SXJIAKE 的回复:
[quote=引用 13 楼 qq_26399665 的回复:] [quote=引用 9 楼 SXJIAKE 的回复:]
void CXXXWndOrDlg::OnButton1CustomDraw(NMHDR *pNMHDR, LRESULT *pResult)
{
	LPNMCUSTOMDRAW pNMCD = reinterpret_cast<LPNMCUSTOMDRAW>(pNMHDR);
	if (pNMCD->dwDrawStage == CDDS_PREPAINT) {
		CString strText;
		CDC *pDC = CDC::FromHandle(pNMCD->hdc);
		CWnd *pCtrl = CWnd::FromHandle(pNMCD->hwndFrom);
		pDC->SetTextColor(0xFF00FF);
		pDC->SetBkMode(TRANSPARENT);
		pCtrl->GetWindowText(strText);
		pDC->DrawText(strText, &pNMCD->rc, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
		*pResult = CDRF_SKIPDEFAULT;
	}
}

void CNumberLeapDlg::OnCustomdrawGroup(NMHDR *pNMHDR, LRESULT *pResult)
{
	LPNMCUSTOMDRAW pNMCD = reinterpret_cast<LPNMCUSTOMDRAW>(pNMHDR);
	// TODO: 在此添加控件通知处理程序代码
	if (pNMCD->dwDrawStage == CDDS_PREPAINT) {
		CString strText;
		CDC *pDC = CDC::FromHandle(pNMCD->hdc);
		CWnd *pCtrl = CWnd::FromHandle(pNMCD->hdr.hwndFrom);
		pDC->SetTextColor(0xFFFFFF);
		pDC->SetBkMode(TRANSPARENT);
		pCtrl->GetWindowText(strText);
		pDC->DrawText(strText, &pNMCD->rc, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
		*pResult = CDRF_SKIPDEFAULT;
	}
}
为什么这样修改不了group box的文本颜色?[/quote] 虽然同为按钮类,不过系统在处理这些消息上还是有所不同的。如不使用主题,OnCtrlColor 这类的函数仅对勾选、单选、按钮,而分组框也就是 GroupBox 的文字颜色一直都不行的(也可能需要响应)。如果使用了主题,按钮类的控件都没法设置文字颜色,只能通过 Custom Draw 之类的方法给按钮来修改颜色,其他的都不行。[/quote] 我这个是用 Custom Draw做的,但是没有用。 我重写了OnPaint()解决了这个问题。
「已注销」 2016-05-03
  • 打赏
  • 举报
回复
引用 13 楼 qq_26399665 的回复:
[quote=引用 9 楼 SXJIAKE 的回复:]
void CXXXWndOrDlg::OnButton1CustomDraw(NMHDR *pNMHDR, LRESULT *pResult)
{
	LPNMCUSTOMDRAW pNMCD = reinterpret_cast<LPNMCUSTOMDRAW>(pNMHDR);
	if (pNMCD->dwDrawStage == CDDS_PREPAINT) {
		CString strText;
		CDC *pDC = CDC::FromHandle(pNMCD->hdc);
		CWnd *pCtrl = CWnd::FromHandle(pNMCD->hwndFrom);
		pDC->SetTextColor(0xFF00FF);
		pDC->SetBkMode(TRANSPARENT);
		pCtrl->GetWindowText(strText);
		pDC->DrawText(strText, &pNMCD->rc, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
		*pResult = CDRF_SKIPDEFAULT;
	}
}

void CNumberLeapDlg::OnCustomdrawGroup(NMHDR *pNMHDR, LRESULT *pResult)
{
	LPNMCUSTOMDRAW pNMCD = reinterpret_cast<LPNMCUSTOMDRAW>(pNMHDR);
	// TODO: 在此添加控件通知处理程序代码
	if (pNMCD->dwDrawStage == CDDS_PREPAINT) {
		CString strText;
		CDC *pDC = CDC::FromHandle(pNMCD->hdc);
		CWnd *pCtrl = CWnd::FromHandle(pNMCD->hdr.hwndFrom);
		pDC->SetTextColor(0xFFFFFF);
		pDC->SetBkMode(TRANSPARENT);
		pCtrl->GetWindowText(strText);
		pDC->DrawText(strText, &pNMCD->rc, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
		*pResult = CDRF_SKIPDEFAULT;
	}
}
为什么这样修改不了group box的文本颜色?[/quote] 虽然同为按钮类,不过系统在处理这些消息上还是有所不同的。如不使用主题,OnCtrlColor 这类的函数仅对勾选、单选、按钮,而分组框也就是 GroupBox 的文字颜色一直都不行的(也可能需要响应)。如果使用了主题,按钮类的控件都没法设置文字颜色,只能通过 Custom Draw 之类的方法给按钮来修改颜色,其他的都不行。
路杨 2016-04-28
  • 打赏
  • 举报
回复
if (nCtlColor == CTLCOLOR_STATIC&&pWnd->GetDlgCtrlID() == IDC_GROUP) 总会异常。 == 我的解决办法是直接先处理 (pWnd->GetDlgCtrlID() == IDC_GROUP)。但是文本LABLE颜色改不了,底色可以改。。
lyz_cs 2016-04-28
  • 打赏
  • 举报
回复
引用 10 楼 VisualEleven 的回复:
if (pWnd->GetDlgCtrlID() == IDC_SINGLEMODE || pWnd->GetDlgCtrlID() == IDC_MANYMODE)    //文本编辑框颜色     
    {
        pDC->SetTextColor(RGB(255, 255, 255));   
        pDC->SetBkMode(TRANSPARENT);
        /*CFont font;
        font.CreatePointFont(120, L"微软雅黑");
        CFont *pOldFont=pDC->SelectObject(&font);
        CRect rc;
        pWnd->GetWindowRect(&rc);
        ScreenToClient(&rc);
        CDC* dc = GetDC();
        pDC->BitBlt(0, 0, rc.Width(), rc.Height(), dc, rc.left, rc.top, SRCCOPY);    //把父窗口背景图片先画到按钮上
        ReleaseDC(dc);*/
        hbr = (HBRUSH) ::GetStockObject(NULL_BRUSH);
    }
这样就可以设置Radio button的文本颜色和背景透明~
你这样背景没透明并且颜色也没变
lyz_cs 2016-04-28
  • 打赏
  • 举报
回复
引用 9 楼 SXJIAKE 的回复:
void CXXXWndOrDlg::OnButton1CustomDraw(NMHDR *pNMHDR, LRESULT *pResult)
{
	LPNMCUSTOMDRAW pNMCD = reinterpret_cast<LPNMCUSTOMDRAW>(pNMHDR);
	if (pNMCD->dwDrawStage == CDDS_PREPAINT) {
		CString strText;
		CDC *pDC = CDC::FromHandle(pNMCD->hdc);
		CWnd *pCtrl = CWnd::FromHandle(pNMCD->hwndFrom);
		pDC->SetTextColor(0xFF00FF);
		pDC->SetBkMode(TRANSPARENT);
		pCtrl->GetWindowText(strText);
		pDC->DrawText(strText, &pNMCD->rc, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
		*pResult = CDRF_SKIPDEFAULT;
	}
}
多谢提示
Eleven 2016-04-28
  • 打赏
  • 举报
回复
if (pWnd->GetDlgCtrlID() == IDC_SINGLEMODE || pWnd->GetDlgCtrlID() == IDC_MANYMODE)    //文本编辑框颜色     
    {
        pDC->SetTextColor(RGB(255, 255, 255));   
        pDC->SetBkMode(TRANSPARENT);
        /*CFont font;
        font.CreatePointFont(120, L"微软雅黑");
        CFont *pOldFont=pDC->SelectObject(&font);
        CRect rc;
        pWnd->GetWindowRect(&rc);
        ScreenToClient(&rc);
        CDC* dc = GetDC();
        pDC->BitBlt(0, 0, rc.Width(), rc.Height(), dc, rc.left, rc.top, SRCCOPY);    //把父窗口背景图片先画到按钮上
        ReleaseDC(dc);*/
        hbr = (HBRUSH) ::GetStockObject(NULL_BRUSH);
    }
这样就可以设置Radio button的文本颜色和背景透明~
「已注销」 2016-04-28
  • 打赏
  • 举报
回复
void CXXXWndOrDlg::OnButton1CustomDraw(NMHDR *pNMHDR, LRESULT *pResult)
{
	LPNMCUSTOMDRAW pNMCD = reinterpret_cast<LPNMCUSTOMDRAW>(pNMHDR);
	if (pNMCD->dwDrawStage == CDDS_PREPAINT) {
		CString strText;
		CDC *pDC = CDC::FromHandle(pNMCD->hdc);
		CWnd *pCtrl = CWnd::FromHandle(pNMCD->hwndFrom);
		pDC->SetTextColor(0xFF00FF);
		pDC->SetBkMode(TRANSPARENT);
		pCtrl->GetWindowText(strText);
		pDC->DrawText(strText, &pNMCD->rc, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
		*pResult = CDRF_SKIPDEFAULT;
	}
}
lyz_cs 2016-04-28
  • 打赏
  • 举报
回复
引用 9 楼 SXJIAKE 的回复:
void CXXXWndOrDlg::OnButton1CustomDraw(NMHDR *pNMHDR, LRESULT *pResult)
{
	LPNMCUSTOMDRAW pNMCD = reinterpret_cast<LPNMCUSTOMDRAW>(pNMHDR);
	if (pNMCD->dwDrawStage == CDDS_PREPAINT) {
		CString strText;
		CDC *pDC = CDC::FromHandle(pNMCD->hdc);
		CWnd *pCtrl = CWnd::FromHandle(pNMCD->hwndFrom);
		pDC->SetTextColor(0xFF00FF);
		pDC->SetBkMode(TRANSPARENT);
		pCtrl->GetWindowText(strText);
		pDC->DrawText(strText, &pNMCD->rc, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
		*pResult = CDRF_SKIPDEFAULT;
	}
}

void CNumberLeapDlg::OnCustomdrawGroup(NMHDR *pNMHDR, LRESULT *pResult)
{
	LPNMCUSTOMDRAW pNMCD = reinterpret_cast<LPNMCUSTOMDRAW>(pNMHDR);
	// TODO: 在此添加控件通知处理程序代码
	if (pNMCD->dwDrawStage == CDDS_PREPAINT) {
		CString strText;
		CDC *pDC = CDC::FromHandle(pNMCD->hdc);
		CWnd *pCtrl = CWnd::FromHandle(pNMCD->hdr.hwndFrom);
		pDC->SetTextColor(0xFFFFFF);
		pDC->SetBkMode(TRANSPARENT);
		pCtrl->GetWindowText(strText);
		pDC->DrawText(strText, &pNMCD->rc, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
		*pResult = CDRF_SKIPDEFAULT;
	}
}
为什么这样修改不了group box的文本颜色?
lyz_cs 2016-04-27
  • 打赏
  • 举报
回复
void CNumberLeapDlg::OnCustomdrawSinglemode(NMHDR *pNMHDR, LRESULT *pResult)
{
	LPNMCUSTOMDRAW pNMCD = reinterpret_cast<LPNMCUSTOMDRAW>(pNMHDR);
	// TODO: 在此添加控件通知处理程序代码
	*pResult = CDRF_DODEFAULT;
	switch (pNMCD->dwDrawStage)
	{
	case CDDS_PREPAINT://让其发出项改变的消息.
	{
		*pResult = CDRF_NOTIFYITEMDRAW;//控制每行的信息.
	}
	break;
	case CDDS_ITEMPREPAINT://按行处理信息
	{
		CDC *pDC = NULL;
		pDC->Attach(pNMCD->hdc);
		pDC->SetTextColor(RGB(255, 255, 255));
		pDC->Detach();
		*pResult = CDRF_DODEFAULT;//只修改行, 则返回defaut.
		//*pResult = CDRF_NOTIFYSUBITEMDRAW; //控制每个单元格的信息.
	}
	break;
	case CDDS_SUBITEM | CDDS_ITEMPREPAINT://按项处理信息(单元格)
	{
		*pResult = CDRF_DODEFAULT;
	}
	break;
	}
}
这样为什么调试,没有进入case CDDS_ITEMPREPAINT:里面去
lyz_cs 2016-04-27
  • 打赏
  • 举报
回复
引用 5 楼 qq_26399665 的回复:
[quote=引用 4 楼 SXJIAKE 的回复:] [quote=引用 3 楼 qq_26399665 的回复:] [quote=引用 1 楼 SXJIAKE 的回复:] Windows 系统不支持带主题的按钮修改文字颜色。如果是常规按钮,则可以通过 Custom Draw 的方式来更改颜色,但勾选和单选依然不行。
是不是只有派生CButton,重绘修改颜色?[/quote]只要用了主题,都不行。只能添加一个函数来自己绘制文字,然后跳过默认的绘制文字操作了。 ON_NOTIFY(NM_CUSTOMDRAW, IDC_BUTTON1, OnButton1CustomDraw) afx_msg void OnButton1CustomDraw(NMHDR *pNMHDR, LRESULT *pResult); 具体的代码网上去搜索。[/quote] void CNumberLeapDlg::OnCustomdrawSinglemode(NMHDR *pNMHDR, LRESULT *pResult) { LPNMCUSTOMDRAW pNMCD = reinterpret_cast<LPNMCUSTOMDRAW>(pNMHDR); // TODO: 在此添加控件通知处理程序代码 CDC *pDC = NULL; pDC->Attach(pNMCD->hdc); pDC->SetTextColor(RGB(255, 255, 255)); pDC->Detach(); *pResult = 0; } 编译怎么报错?我是小白[/quote] 编译通过了,一执行就报错。
lyz_cs 2016-04-27
  • 打赏
  • 举报
回复
引用 4 楼 SXJIAKE 的回复:
[quote=引用 3 楼 qq_26399665 的回复:]
[quote=引用 1 楼 SXJIAKE 的回复:]
Windows 系统不支持带主题的按钮修改文字颜色。如果是常规按钮,则可以通过 Custom Draw 的方式来更改颜色,但勾选和单选依然不行。

是不是只有派生CButton,重绘修改颜色?[/quote]只要用了主题,都不行。只能添加一个函数来自己绘制文字,然后跳过默认的绘制文字操作了。
ON_NOTIFY(NM_CUSTOMDRAW, IDC_BUTTON1, OnButton1CustomDraw)
afx_msg void OnButton1CustomDraw(NMHDR *pNMHDR, LRESULT *pResult);
具体的代码网上去搜索。[/quote]
void CNumberLeapDlg::OnCustomdrawSinglemode(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMCUSTOMDRAW pNMCD = reinterpret_cast<LPNMCUSTOMDRAW>(pNMHDR);
// TODO: 在此添加控件通知处理程序代码
CDC *pDC = NULL;
pDC->Attach(pNMCD->hdc);
pDC->SetTextColor(RGB(255, 255, 255));
pDC->Detach();
*pResult = 0;
}

编译怎么报错?我是小白
「已注销」 2016-04-27
  • 打赏
  • 举报
回复
引用 3 楼 qq_26399665 的回复:
[quote=引用 1 楼 SXJIAKE 的回复:] Windows 系统不支持带主题的按钮修改文字颜色。如果是常规按钮,则可以通过 Custom Draw 的方式来更改颜色,但勾选和单选依然不行。
是不是只有派生CButton,重绘修改颜色?[/quote]只要用了主题,都不行。只能添加一个函数来自己绘制文字,然后跳过默认的绘制文字操作了。 ON_NOTIFY(NM_CUSTOMDRAW, IDC_BUTTON1, OnButton1CustomDraw) afx_msg void OnButton1CustomDraw(NMHDR *pNMHDR, LRESULT *pResult); 具体的代码网上去搜索。
lyz_cs 2016-04-27
  • 打赏
  • 举报
回复
引用 1 楼 SXJIAKE 的回复:
Windows 系统不支持带主题的按钮修改文字颜色。如果是常规按钮,则可以通过 Custom Draw 的方式来更改颜色,但勾选和单选依然不行。
是不是只有派生CButton,重绘修改颜色?
lyz_cs 2016-04-27
  • 打赏
  • 举报
回复
引用 1 楼 SXJIAKE 的回复:
Windows 系统不支持带主题的按钮修改文字颜色。如果是常规按钮,则可以通过 Custom Draw 的方式来更改颜色,但勾选和单选依然不行。
背景是纯色的时候是不是可以修改颜色,而背景是图片的时候是不是不能修改颜色?
「已注销」 2016-04-27
  • 打赏
  • 举报
回复
Windows 系统不支持带主题的按钮修改文字颜色。如果是常规按钮,则可以通过 Custom Draw 的方式来更改颜色,但勾选和单选依然不行。
内容概要:本文聚焦于高维多阶段随机规划问题,深入研究了正则化分解方法与马尔可夫过程在刻画不确定性动态演化中的应用,并提供了完整的Python代码实现。通过引入正则化技术有效降低了高维随机优化问题的计算复杂度,结合马尔可夫链建模多阶段决策过程中的不确定性传播机制,提升了模型在复杂动态环境下的求解效率与鲁棒性。研究涵盖了问题建模、算法设计、数值求解及结果分析全过程,具有较强的理论深度与工程实践价值; 适合人群:具备一定运筹学、优化理论基础及Python编程能力,从事智能决策、人工智能、能源系统优化、金融工程等相关领域的科研人员、高校研究生以及工业界研发工程师; 使用场景及目标:①应用于电力系统调度、供应链管理、金融资产配置等存在多阶段不确定性的复杂决策场景;②掌握高维随机规划的建模思路与高效求解技术,深入理解正则化方法与马尔可夫过程在实际优化算法中的融合机制与实现路径; 阅读建议:建议结合提供的Python代码进行动手实践,重点关注算法实现细节、参数敏感性分析与收敛性验证,鼓励在不同应用场景中迁移和改进该方法,进一步探索其在分布鲁棒优化、动态规划等前沿方向的扩展潜力。

15,976

社区成员

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

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