返回首页

下载演示项目 - 29 KB
简介
我不知道如何改变状态栏上的文本窗格的颜色作为什么相同Visual SourceSafe的文件差异窗口。在这篇文章中,我将展示如何使状态栏窗格显示其文本不同的颜色。一个常规的状态barnbsp;可以有许多窗格。这可能是在某些情况下,可取的,每个窗格中的文本可以显示在不同的颜色。
如果您打开演示项目文件,在Visual C你会看到两个新的文件,即ColoredStatusBarCtrl.cpp ColoredStatusBarCtrl.h。 CColoredStatusBarCtrl包装所有者绘制CStatusBar MFC类的能力。
除了上面的东西,你可以看到一些变化在MainFrm.cpp为MainFrm.h。 在为MainFrm.h,下面的行前插入类定义

#include "ColoredStatusBarCtrl.h"
现在,寻找下面的行{C}
它的类的类型是改变tonbsp;
CColoredStatusBarCtrl m_wndStatusBar;
在MainFrm.cpp,看看以下的数组declarationnbsp;
static UINT indicators[] =

{

    ID_1,

    ID_2,

    ID_3,

    ID_4,

};

我在字符串表中创建空项以上的ID。他们只是呆在那里无所作为。 现在,我在CMainFrame::OnCreate中()之前插入以下代码 返回声明:
for (int i=0; i<4; i++)

{

    // Change Status Bar style to make it Owner-drawn

    m_wndStatusBar.GetStatusBarCtrl().SetText("", i, SBT_OWNERDRAW); 



    // Make each pane's of same size

    m_wndStatusBar.SetPaneInfo( i, 

        m_wndStatusBar.GetItemID(i), SBPS_STRETCH, NULL );

}

限制
CColoredStatusBarCtrl是不是通用的。您可能需要调整它为您的可行。它只是使这一点。我想我可以写一个它的控制。

回答

评论会员:游客 时间:2011/11/29
需要显著增加,才可以作为现实生活中的项目的通用控制
打码机
评论会员:游客 时间:2011/11/29
这是"限制"一节中已经承认。。不管怎样,谢谢
teth
评论会员:游客 时间:2011/11/29
你能告诉我如何在VB.net中创建状态栏?预先感谢。
NYTSX
评论会员:游客 时间:2011/11/29
首先,这是一个伟大的文章!我有一点点从这里发布的是什么不同的情况。我想设置的基础上,如果我有一个错误或不窗格中的字体颜色。所以,如果我尝试写我的串行端口,并得到一个错误,我想显示红色的错误,如果它是成功的的,我想一个成功的消息显示绿色。我将如何去这样做,因为它们是在相同的窗格中,这似乎只是改变颜色的基础上的窗格。预先感谢。
打码机
评论会员:游客 时间:2011/11/29
退房的DrawItem()函数CColoredStatusBarCtrl类。它使用SetTextColor来改变文字的颜色。修改您的需求的功能。感谢。"守则"至死不渝
奥尔顿威廉姆斯
评论会员:游客 时间:2011/11/29
只要我需要的东西。感谢
shrinivasbk
评论会员:游客 时间:2011/11/29
您好Onkar,我在我的项目中使用这个类,但是我面对WIN98系统上的一个问题。一旦应用程序连续运行,系统正在失去它的资源。如果我变回正常状态栏(默认色-黑使用SetPaneText()),资源问题是没有观察到。请提出宝贵的意见。最早在欣赏UR响应。预先感谢Shrinivasshrinivas
mistroseth
评论会员:游客 时间:2011/11/29
你怎么能这种类型的状态栏添加一个对话框感谢mistroseth
cadinfo
评论会员:游客 时间:2011/11/29
嗨,我读了你的代码并修改它,所以任何人都可以使用你的代码更舒适,我尝试在这里粘贴源文件,因为我不知道如何上传任何人关心这可以给我发电子邮件imgsrc=http://www.orcode.com/upimg/2011_11_29_00_39_41_0.gif最好的问候
维卡斯阿明
评论会员:游客 时间:2011/11/29
叶,如果üCNN发送给我的代码modiifedsatus栏文字。imgsrc=http://www.orcode.com/upimg/2011_11_29_00_39_41_1.gif关于更新的代码使用Fromatting:仅3个标签,从这个文本框Thankin你维卡斯阿明Embin技术孟买vikas.amin@embin.com
spentaro
评论会员:游客 时间:2011/11/29
伟大的颜色!但它似乎不工作时SetPaneText()被调用。我有一个定时器触发一次,第二次更新状态栏上的时间:的CTimeTheTime=的CTime::GetCurrentTime()CString的szMsg;szMsg.Format("??D:D:D",TheTime.GetHour(),TheTime.GetMinute(),TheTime.GetSecond())m_wndStatusBar.SetPaneText(3,szMsg)但它不经过的DrawItem()在所有(除非我完全毫无章法,这是很可能)。还是我写我自己的处理程序某种呢?更糟糕的是,当我打开一个MDIclild,SetPaneText()停止工作,以及任何想法?感谢和问候,斯彭斯
Onkar辛格
评论会员:游客 时间:2011/11/29
我想这样做:无效的CMainFrame::的OnTimer(UINTnIDEvent){//TODO:在此处添加消息处理程序代码和/或调用默认的CTimeTheTime=的CTime::GetCurrentTime()CString的szMsg;szMsg.Format("??D:D:D",TheTime.GetHour(),TheTime.GetMinute(),TheTime.GetSecond())m_wndStatusBar.m_szStatusString=szMsg;m_wndStatusBar.RedrawWindow()CFrameWnd中的OnTimer(nIDEvent)}不要使用SetPaneText()。CColoredStatusBarCtrl类直接修改相关的文字。每个窗格中的文本添加CColorStatusBar类CString的成员。替换,而不是"红",绿色"或"蓝"的DrawItem()。上面的代码修改在CColorStatusBar以下功能供您使用,如改变只有黑色文本。无效CColoredStatusBarCtrl:的DrawItem(LPDRAWITEMSTRUCTlpDrawItemStruct){.........开关(lpDrawItemStruct-ITEMID){情况下,0:dc.SetTextColor(RGB(0,0,255));dc.TextOut(rect.left2,rect.top,"蓝");打破;....{BR}....{BR}}无效CColoredStatusBarCtrl:的DrawItem(LPDRAWITEMSTRUCTlpDrawItemStruct){情况下,0:dc.SetTextColor(RGB(0,0,255));dc.TextOut(rect.top,m_szStatusStringrect.left2)打破;}这将在第一个窗格显示红色文字的时间。让我知道是否有帮助。-Onkar
!Onkar辛格
评论会员:游客 时间:2011/11/29
快速反应我把你的意见,并添加一个CString数组和一个SetColoredPaneText()函数,也需要一个前景色和背景色,然后调用RedrawWindow()它的伟大工程,直到我打开一个MDI子窗口窗格会自动复位到什么字符串表中的(我有空白,因为我想动态更新)。在这一点上似乎没有任何更新。事实上RedrawWindow()从不调用的DrawItem()好歹从重置状态栏和控制它的消息(或不管它做的挫折感)的儿童?我没有找到它周围的另一种方式,但它的丑恶:无效的CMainFrame::UpdateStatusBar(常量的CStringszMsg,UINT的nItem,COLORREFCOLORREF){CWindowDCDC(m_wndStatusBar);RECTRECT;m_wndStatusBar.GetItemRect(nItem,RECT); CFont类比照;cf.CreatePointFont(100,"宋体");dc.SelectObject(CF);rect.top;rect.bottom-rect.bottom;rect.right-dc.FillSolidRect(RECT,COLORREF)dc.SetBkMode(不透明);dc.SetTextColor(RGB(225255254))dc.TextOut(rect.top,szMsgrect.left1)}这使得它每次重绘(甚至创建后,孩子),但有很多丑陋的闪烁(再加上我敢肯定,我已经打破某些Windows规则)。而且,当窗口移动或调整大小,它的重绘空白,则此例程踢和再次重绘。我应该怎么办?imgsrc=http://www.orcode.com/upimg/2011_11_29_00_39_41_2.gif再次感谢!斯彭斯
mclxly
评论会员:游客 时间:2011/11/29
我觉得做具体做的CMainFrameCChildView再次应解决的问题-Onkar
xu_qing
评论会员:游客 时间:2011/11/29
我做这样的事情:添加成员变量来保存statuspane文本:CString的StatusText[4];添加成员函数CHAGEstatustext:无效SetTextTo(INT指数,CString的味精){ASSERT(指数4)StatusText[指数]=味精;ReDrawWindow()}上面你需要改变的DrawItem()函数像波纹管的东西:======================================================================={BR}开关(lpDrawItemStruct-ITEMID){..................//像以前那样中华网DC;dc.Attach(lpDrawItemStruct-HDC);dc.SetBkMode(透明);开关(lpDrawItemStruct-ITEMID){情况下,0:dc.SetTextColor(RGB(0,0,255));dc.TextOut(rect.left2rect.top2,StatusText[(INT)lpDrawItemStruct-ITEMID])打破;例1:dc.SetTextColor(RGB(255,0,0))dc.TextOut(rect.left2rect.top2,StatusText[(INT)lpDrawItemStruct-ITEMID])打破;案例2:dc.SetTextColor(RGB(204,0,204))dc.TextOut(rect.left2rect.top2,StatusText[(INT)lpDrawItemStruct-ITEMID])打破;案例3:dc.SetTextColor(RGB(192,192,0));dc.TextOut(rect.left2rect.top2,StatusText[(INT)lpDrawItemStruct-ITEMID])打破;......................}{BR}//前在您的CMainFrame你只是做这样的事情:(INTI=0;我4;我){m_wndStatusBar.GetStatusBarCtrl()的setText("",我SBT_OWNERDRAW)m_wndStatusBar.SetPaneInfo(我m_wndStatusBar.GetItemID(I),SBPS_STRETCH,空);}m_wndStatusBar.SetTextTo(0,"一些提示文字");....//等 //问候大家!
打码机
评论会员:游客 时间:2011/11/29
无效CColoredStatusBarCtrl:SetTextTo(INT指数,CString的味精){ASSERT(指数4)m_szStatusText[指数]=味精;CRECTRCGetItemRect(指数,RC)rc.left=2;rc.top=2;rc.bottom-=2;rc.right-=2;GetStatusBarCtrl()InvalidateRect(RC,TRUE);}imgsrc=http://www.orcode.com/upimg/2011_11_29_00_39_41_3.gif
bkshrinivas
评论会员:游客 时间:2011/11/29
您好:lilyflower当我设置窗格的状态栏显示这个代码的光标或当前时间坐标,状态栏有时会闪烁。我该如何解决呢?感谢
Dbltrimmer
评论会员:游客 时间:2011/11/29
尝试使用LockWindowUpdate功能。你可以看到它的文档在MSDN,但在短期持有绘图锁定的窗口,直到你调用UnlockWindowUpdate()。左右负责绘图的代码调用这些API。