为什么修改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);

}

...全文
671 16 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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 的方式来更改颜色,但勾选和单选依然不行。

15,980

社区成员

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

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