修改Dlg标题栏颜色,大侠帮帮忙吧

时间:2022-09-05 21:04:47
VC++:

我Create了一个Dlg,但我现在想要修改Dlg的标题栏颜色,要如何做才可以呢,帮帮忙吧各位csdn上的朋友...先谢谢了

13 个解决方案

#1


从CDialog派生自己的子类,然后进行自绘


如下是示例代码

void CDD2Dlg::OnNcPaint() 
{
//使用默认的操作先刷新
CDialog::OnNcPaint();

//计算TitleBar的坐标区域
CRect titleRect;
GetWindowRect(&titleRect);
DWORD DialogBaseUnits = GetDialogBaseUnits();
WORD DialogBaseUnits_X = LOWORD(DialogBaseUnits)/4;
WORD DialogBaseUnits_Y = HIWORD(DialogBaseUnits)/8;
titleRect.top += GetSystemMetrics(SM_CYBORDER) * DialogBaseUnits_Y;
titleRect.left += GetSystemMetrics(SM_CXBORDER) * DialogBaseUnits_X;
titleRect.right -= GetSystemMetrics(SM_CXBORDER) * DialogBaseUnits_X;
titleRect.bottom = titleRect.top + GetSystemMetrics(SM_CYCAPTION);

//创建DC设备
CDC pDC;
pDC.CreateDC("DISPLAY", NULL, NULL,NULL);
int saveDC = pDC.SaveDC(); //保存设备

//使用自定义颜色填充
CBrush brush(RGB(255,0,0));
pDC.FillRect(&titleRect,&brush);

//正中位置显示字符串
pDC.SetBkMode(TRANSPARENT);
pDC.SetTextColor(RGB(0,128,128));
pDC.DrawText("ABCD",titleRect,DT_CENTER|DT_VCENTER|DT_SINGLELINE);

pDC.RestoreDC(saveDC); //恢复设备
pDC.DeleteDC(); //删除设备
}

#2


1 楼方法可行

#3


void CDD2Dlg::OnNcPaint() 
{
    //使用默认的操作先刷新
    CDialog::OnNcPaint();

    //计算TitleBar的坐标区域
    CRect titleRect;
    GetWindowRect(&titleRect);
    DWORD DialogBaseUnits = GetDialogBaseUnits();
    WORD DialogBaseUnits_X = LOWORD(DialogBaseUnits)/4;
    WORD DialogBaseUnits_Y = HIWORD(DialogBaseUnits)/8;
    titleRect.top += GetSystemMetrics(SM_CYBORDER) * DialogBaseUnits_Y;
    titleRect.left += GetSystemMetrics(SM_CXBORDER) * DialogBaseUnits_X;
    titleRect.right -= GetSystemMetrics(SM_CXBORDER) * DialogBaseUnits_X;
    titleRect.bottom = titleRect.top + GetSystemMetrics(SM_CYCAPTION);

    //创建DC设备
    CDC pDC;
    pDC.CreateDC("DISPLAY", NULL, NULL,NULL);
    int saveDC = pDC.SaveDC(); //保存设备

    //使用自定义颜色填充
    CBrush brush(RGB(255,0,0));
    pDC.FillRect(&titleRect,&brush);

    //正中位置显示字符串
    pDC.SetBkMode(TRANSPARENT);
    pDC.SetTextColor(RGB(0,128,128));
    pDC.DrawText("ABCD",titleRect,DT_CENTER|DT_VCENTER|DT_SINGLELINE);

    pDC.RestoreDC(saveDC); //恢复设备
    pDC.DeleteDC(); //删除设备    
}

#4


引用 1 楼 tr0j4n 的回复:
从CDialog派生自己的子类,然后进行自绘


如下是示例代码
C/C++ codevoid CDD2Dlg::OnNcPaint() 
{//使用默认的操作先刷新    CDialog::OnNcPaint();//计算TitleBar的坐标区域    CRect titleRect;
    GetWindowRect(&titleRect);
    DWORD DialogBaseUnits= GetDialogBaseUnits();
    WORD DialogBaseUnits_X= LOWORD(DialogBaseUnits)/4;
    WORD DialogBaseUnits_Y= HIWORD(DialogBaseUnits)/8;
    titleRect.top+= GetSystemMetrics(SM_CYBORDER)* DialogBaseUnits_Y;
    titleRect.left+= GetSystemMetrics(SM_CXBORDER)* DialogBaseUnits_X;
    titleRect.right-= GetSystemMetrics(SM_CXBORDER)* DialogBaseUnits_X;
    titleRect.bottom= titleRect.top+ GetSystemMetrics(SM_CYCAPTION);//创建DC设备    CDC pDC;
    pDC.CreateDC("DISPLAY", NULL, NULL,NULL);int saveDC= pDC.SaveDC();//保存设备//使用自定义颜色填充    CBrush brush(RGB(255,0,0));
    pDC.FillRect(&titleRect,&brush);//正中位置显示字符串    pDC.SetBkMode(TRANSPARENT);
    pDC.SetTextColor(RGB(0,128,128));
    pDC.DrawText("ABCD",titleRect,DT_CENTER|DT_VCENTER|DT_SINGLELINE);

    pDC.RestoreDC(saveDC);//恢复设备    pDC.DeleteDC();//删除设备}


谢谢你的帮助,可能是我没说清楚(我想改变标题栏的背景颜色)
画倒是画出来了,但这样做好像不太好呀,感觉是一块矩形直接贴在标题栏上了,按钮也别盖住了...怎么样做才是改变背景色呀

#5


1 楼方法可行

--------------------------------
界面与逻辑彻底分离的利器:DirectUI
界面开发网站:www.uipower.com

#6


学习了……

#7


关注这个问题

#8


参考这里的源码
http://vcer.net/1250419423718.html

#9


自己另外做个标题吧

#10


自己重绘都要自己设计标题栏了吧,呵呵.
还有一种是提取系统变量设置,然后修改之,不过不建议这样做,因为这样做了,所有windows窗口的标题栏都给改了,用户会讨厌这种软件....

#11


引用 1 楼 tr0j4n 的回复:
从CDialog派生自己的子类,然后进行自绘


 如下是示例代码
C/C++ codevoid CDD2Dlg::OnNcPaint() 
{//使用默认的操作先刷新    CDialog::OnNcPaint();//计算TitleBar的坐标区域    CRect titleRect;
    GetWindowRect(&titleRect);
    DWORD DialogBaseUnits= GetDialogBaseUnits();
    WORD DialogBaseUnits_X= LOWORD(DialogBaseUnits)/4;
    WORD DialogBaseUnits_Y= HIWORD(DialogBaseUnits)/8;
    titleRect.top+= GetSystemMetrics(SM_CYBORDER)* DialogBaseUnits_Y;
    titleRect.left+= GetSystemMetrics(SM_CXBORDER)* DialogBaseUnits_X;
    titleRect.right-= GetSystemMetrics(SM_CXBORDER)* DialogBaseUnits_X;
    titleRect.bottom= titleRect.top+ GetSystemMetrics(SM_CYCAPTION);//创建DC设备    CDC pDC;
    pDC.CreateDC("DISPLAY", NULL, NULL,NULL);int saveDC= pDC.SaveDC();//保存设备//使用自定义颜色填充    CBrush brush(RGB(255,0,0));
    pDC.FillRect(&titleRect,&brush);//正中位置显示字符串    pDC.SetBkMode(TRANSPARENT);
    pDC.SetTextColor(RGB(0,128,128));
    pDC.DrawText("ABCD",titleRect,DT_CENTER|DT_VCENTER|DT_SINGLELINE);

    pDC.RestoreDC(saveDC);//恢复设备    pDC.DeleteDC();//删除设备}
方法可行恩。。。

#12


用一个for循环,一行一行的画,但行的长度你自己控制

#13


引用 8 楼 fishion 的回复:
参考这里的源码
http://vcer.net/1250419423718.html


多谢你...

#1


从CDialog派生自己的子类,然后进行自绘


如下是示例代码

void CDD2Dlg::OnNcPaint() 
{
//使用默认的操作先刷新
CDialog::OnNcPaint();

//计算TitleBar的坐标区域
CRect titleRect;
GetWindowRect(&titleRect);
DWORD DialogBaseUnits = GetDialogBaseUnits();
WORD DialogBaseUnits_X = LOWORD(DialogBaseUnits)/4;
WORD DialogBaseUnits_Y = HIWORD(DialogBaseUnits)/8;
titleRect.top += GetSystemMetrics(SM_CYBORDER) * DialogBaseUnits_Y;
titleRect.left += GetSystemMetrics(SM_CXBORDER) * DialogBaseUnits_X;
titleRect.right -= GetSystemMetrics(SM_CXBORDER) * DialogBaseUnits_X;
titleRect.bottom = titleRect.top + GetSystemMetrics(SM_CYCAPTION);

//创建DC设备
CDC pDC;
pDC.CreateDC("DISPLAY", NULL, NULL,NULL);
int saveDC = pDC.SaveDC(); //保存设备

//使用自定义颜色填充
CBrush brush(RGB(255,0,0));
pDC.FillRect(&titleRect,&brush);

//正中位置显示字符串
pDC.SetBkMode(TRANSPARENT);
pDC.SetTextColor(RGB(0,128,128));
pDC.DrawText("ABCD",titleRect,DT_CENTER|DT_VCENTER|DT_SINGLELINE);

pDC.RestoreDC(saveDC); //恢复设备
pDC.DeleteDC(); //删除设备
}

#2


1 楼方法可行

#3


void CDD2Dlg::OnNcPaint() 
{
    //使用默认的操作先刷新
    CDialog::OnNcPaint();

    //计算TitleBar的坐标区域
    CRect titleRect;
    GetWindowRect(&titleRect);
    DWORD DialogBaseUnits = GetDialogBaseUnits();
    WORD DialogBaseUnits_X = LOWORD(DialogBaseUnits)/4;
    WORD DialogBaseUnits_Y = HIWORD(DialogBaseUnits)/8;
    titleRect.top += GetSystemMetrics(SM_CYBORDER) * DialogBaseUnits_Y;
    titleRect.left += GetSystemMetrics(SM_CXBORDER) * DialogBaseUnits_X;
    titleRect.right -= GetSystemMetrics(SM_CXBORDER) * DialogBaseUnits_X;
    titleRect.bottom = titleRect.top + GetSystemMetrics(SM_CYCAPTION);

    //创建DC设备
    CDC pDC;
    pDC.CreateDC("DISPLAY", NULL, NULL,NULL);
    int saveDC = pDC.SaveDC(); //保存设备

    //使用自定义颜色填充
    CBrush brush(RGB(255,0,0));
    pDC.FillRect(&titleRect,&brush);

    //正中位置显示字符串
    pDC.SetBkMode(TRANSPARENT);
    pDC.SetTextColor(RGB(0,128,128));
    pDC.DrawText("ABCD",titleRect,DT_CENTER|DT_VCENTER|DT_SINGLELINE);

    pDC.RestoreDC(saveDC); //恢复设备
    pDC.DeleteDC(); //删除设备    
}

#4


引用 1 楼 tr0j4n 的回复:
从CDialog派生自己的子类,然后进行自绘


如下是示例代码
C/C++ codevoid CDD2Dlg::OnNcPaint() 
{//使用默认的操作先刷新    CDialog::OnNcPaint();//计算TitleBar的坐标区域    CRect titleRect;
    GetWindowRect(&titleRect);
    DWORD DialogBaseUnits= GetDialogBaseUnits();
    WORD DialogBaseUnits_X= LOWORD(DialogBaseUnits)/4;
    WORD DialogBaseUnits_Y= HIWORD(DialogBaseUnits)/8;
    titleRect.top+= GetSystemMetrics(SM_CYBORDER)* DialogBaseUnits_Y;
    titleRect.left+= GetSystemMetrics(SM_CXBORDER)* DialogBaseUnits_X;
    titleRect.right-= GetSystemMetrics(SM_CXBORDER)* DialogBaseUnits_X;
    titleRect.bottom= titleRect.top+ GetSystemMetrics(SM_CYCAPTION);//创建DC设备    CDC pDC;
    pDC.CreateDC("DISPLAY", NULL, NULL,NULL);int saveDC= pDC.SaveDC();//保存设备//使用自定义颜色填充    CBrush brush(RGB(255,0,0));
    pDC.FillRect(&titleRect,&brush);//正中位置显示字符串    pDC.SetBkMode(TRANSPARENT);
    pDC.SetTextColor(RGB(0,128,128));
    pDC.DrawText("ABCD",titleRect,DT_CENTER|DT_VCENTER|DT_SINGLELINE);

    pDC.RestoreDC(saveDC);//恢复设备    pDC.DeleteDC();//删除设备}


谢谢你的帮助,可能是我没说清楚(我想改变标题栏的背景颜色)
画倒是画出来了,但这样做好像不太好呀,感觉是一块矩形直接贴在标题栏上了,按钮也别盖住了...怎么样做才是改变背景色呀

#5


1 楼方法可行

--------------------------------
界面与逻辑彻底分离的利器:DirectUI
界面开发网站:www.uipower.com

#6


学习了……

#7


关注这个问题

#8


参考这里的源码
http://vcer.net/1250419423718.html

#9


自己另外做个标题吧

#10


自己重绘都要自己设计标题栏了吧,呵呵.
还有一种是提取系统变量设置,然后修改之,不过不建议这样做,因为这样做了,所有windows窗口的标题栏都给改了,用户会讨厌这种软件....

#11


引用 1 楼 tr0j4n 的回复:
从CDialog派生自己的子类,然后进行自绘


 如下是示例代码
C/C++ codevoid CDD2Dlg::OnNcPaint() 
{//使用默认的操作先刷新    CDialog::OnNcPaint();//计算TitleBar的坐标区域    CRect titleRect;
    GetWindowRect(&titleRect);
    DWORD DialogBaseUnits= GetDialogBaseUnits();
    WORD DialogBaseUnits_X= LOWORD(DialogBaseUnits)/4;
    WORD DialogBaseUnits_Y= HIWORD(DialogBaseUnits)/8;
    titleRect.top+= GetSystemMetrics(SM_CYBORDER)* DialogBaseUnits_Y;
    titleRect.left+= GetSystemMetrics(SM_CXBORDER)* DialogBaseUnits_X;
    titleRect.right-= GetSystemMetrics(SM_CXBORDER)* DialogBaseUnits_X;
    titleRect.bottom= titleRect.top+ GetSystemMetrics(SM_CYCAPTION);//创建DC设备    CDC pDC;
    pDC.CreateDC("DISPLAY", NULL, NULL,NULL);int saveDC= pDC.SaveDC();//保存设备//使用自定义颜色填充    CBrush brush(RGB(255,0,0));
    pDC.FillRect(&titleRect,&brush);//正中位置显示字符串    pDC.SetBkMode(TRANSPARENT);
    pDC.SetTextColor(RGB(0,128,128));
    pDC.DrawText("ABCD",titleRect,DT_CENTER|DT_VCENTER|DT_SINGLELINE);

    pDC.RestoreDC(saveDC);//恢复设备    pDC.DeleteDC();//删除设备}
方法可行恩。。。

#12


用一个for循环,一行一行的画,但行的长度你自己控制

#13


引用 8 楼 fishion 的回复:
参考这里的源码
http://vcer.net/1250419423718.html


多谢你...