标题:帮我看看这段代码的错误
只看楼主
live41
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:67
帖 子:12442
专家分:0
注 册:2004-7-22
结帖率:66.67%
 问题点数:0 回复次数:7 
帮我看看这段代码的错误

功能是把标题栏的颜色改变,可是我在XP下运行,出来的不是整条标题栏变色,只是一部分,怎么回事?请指教! #include<afxwin.h> #include<afxext.h>

//派生自己的应用程序类 class CMyApp : public CWinApp { public: virtual BOOL InitInstance(); };

//应用程序主窗口类 class CMyWnd : public CFrameWnd { protected:

//声明主窗口的消息处理函数 afx_msg void OnNcPaint(); afx_msg BOOL OnNcActivate(BOOL bActive); DECLARE_MESSAGE_MAP(); public: void PaintTitleBar(BOOL bActive); };

//初始化应用程序的实例 BOOL CMyApp::InitInstance() { //创建应用程序主窗口 CMyWnd *pWnd = new CMyWnd; pWnd->Create(NULL,"具有五彩标题条的窗口");

//显示应用程序主窗口,并更新客户区 pWnd->ShowWindow(SW_SHOW); pWnd->UpdateWindow(); m_pMainWnd = pWnd; return TRUE; }

//声明应用程序对象 CMyApp MyApp;

//应用程序主窗口的消息映射 BEGIN_MESSAGE_MAP(CMyWnd, CWnd) ON_WM_NCPAINT() ON_WM_NCACTIVATE() END_MESSAGE_MAP()

//绘制窗口的标题条,参数bActive代表窗口的当前激活状态 void CMyWnd::PaintTitleBar(BOOL bActive) { //创建代表整个窗口的现实设备上下对象 CWindowDC dc(this); CRect rc;

//获得窗口矩形及宽度 GetWindowRect(rc); UINT nWidth = rc.Width();

//获得窗口边框的度量 UINT nXFrame = GetSystemMetrics(SM_CXSIZEFRAME); UINT nYFrame = GetSystemMetrics(SM_CYSIZEFRAME);

//获得窗口标题条的高度 UINT nYCaption = GetSystemMetrics(SM_CYCAPTION); COLORREF cr; if(bActive) { //获得当窗口处于激活状态时其标题条的颜色 cr = GetSysColor(COLOR_ACTIVECAPTION); //按从红到绿,再到蓝的渐变规律绘制标题条 for(UINT j=nYFrame; j<=nYFrame+nYCaption; j++) { for(UINT i=nXFrame; i<=nWidth/2; i++) { UINT nLen = nWidth/2 - nXFrame + 1; if(dc.GetPixel(i,j)==cr) { dc.SetPixelV(i,j, RGB(255-255*(i-nXFrame)/nLen,255*(i-nXFrame)/nLen,0)); } }

for(i=nWidth/2+1; i<=nWidth-nXFrame; i++) { UINT nLen = nWidth/2 - nXFrame - 1 + i; if(dc.GetPixel(i,j)==cr) { dc.SetPixelV(i,j, RGB(0,255-255*(i-nWidth/2-1)/nLen,255*(i-nWidth/2-1)/nLen)); } } } } else { //获得窗口处于非激活状态时的标题条颜色 cr = GetSysColor(COLOR_INACTIVECAPTION);

//按从黑到灰,再到黑的渐变规律绘制标题条 for(UINT j=nYFrame; j<=nYFrame+nYCaption-1; j++) { for(UINT i=nXFrame; i<=nWidth/2; i++) { UINT nLen = nWidth/2 - nXFrame; if(dc.GetPixel(i,j)==cr) { dc.SetPixelV(i,j,RGB(192*(i-nXFrame)/nLen, 192*(i-nXFrame)/nLen,192*(i-nXFrame)/nLen)); } } for(i=nWidth/2+1; i<=nWidth-nXFrame; i++) { UINT nLen = nWidth/2 - nXFrame - 1; if(dc.GetPixel(i,j)==cr) { dc.SetPixelV(i,j,RGB(192-192*(i-nWidth/2)/nLen, 192-192*(i-nWidth/2)/nLen,192-192*(i-nWidth/2)/nLen)); } } } } }

//消息WM_NCPAINT的处理成员函数 void CMyWnd::OnNcPaint() { CFrameWnd::OnNcPaint();

//检查当前窗口是否为激活窗口 if(::GetActiveWindow()==GetSafeHwnd()) PaintTitleBar(TRUE); else PaintTitleBar(FALSE); }

//消息WM_NCACTIVE的处理成员函数 BOOL CMyWnd::OnNcActivate(BOOL bActive) { CFrameWnd::OnNcActivate(bActive);

//根据不同的激活状态按不同的方式绘制窗口标题条 if(bActive) { PaintTitleBar(TRUE); return FALSE; } else { PaintTitleBar(FALSE); return FALSE; } }

搜索更多相关主题的帖子: BOOL public 代码 void msg 
2005-01-30 01:08
live41
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:67
帖 子:12442
专家分:0
注 册:2004-7-22
得分:0 
我怀疑问题出在染色的范围,但是那条式子我不知道怎么改。请帮忙的人运行看看你染色染到多少。是否我的范围设得有问题。
2005-01-30 01:13
kai
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:52
帖 子:3450
专家分:59
注 册:2004-4-25
得分:0 
void CMyWnd::PaintTitleBar(BOOL bActive)  // 我想 问题是出在这个方法上, 在这段代码里, 用的都是 nWidth/2  but why???

// 我最近没装 VC 6, 没法来具体看代码的运行,
// 明天装上后帮你看一看.

自由,民主,平等,博爱,进步.
中华民国,我的祖国,中华民国万岁!中华民国加油!
本人自愿加入中国国民党,为人的自由性,独立性和平等性而奋斗!
2005-02-02 03:32
live41
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:67
帖 子:12442
专家分:0
注 册:2004-7-22
得分:0 
for(i=nWidth/2+1; i<=nWidth-nXFrame; i++) { UINT nLen = nWidth/2 - nXFrame - 1 + i; //我觉得这句也有问题! if(dc.GetPixel(i,j)==cr) { dc.SetPixelV(i,j, RGB(0,255-255*(i-nWidth/2-1)/nLen,255*(i-nWidth/2-1)/nLen)); } } 其中, UINT nLen = nWidth/2 - nXFrame - 1 + i; 最后面的 i 是我改的,原书中是 1 ,一看就知道错了,都不知道出版者有没有把代码运行一下。
2005-02-02 10:44
kai
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:52
帖 子:3450
专家分:59
注 册:2004-4-25
得分:0 
光这么一段代码无法运行的,你把完整源代码给我,我来看看。(文件打包上传)

自由,民主,平等,博爱,进步.
中华民国,我的祖国,中华民国万岁!中华民国加油!
本人自愿加入中国国民党,为人的自由性,独立性和平等性而奋斗!
2005-02-03 12:07
live41
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:67
帖 子:12442
专家分:0
注 册:2004-7-22
得分:0 
1。1楼的代码可以运行,你建立一个工程Win32 Application,然后加入一个C++ scource,粘贴代码,然后在菜单中"Project -&gt; Settint -&gt; General -&gt; "在Microsoft Foundationg Class中选择"Use MFC in a Share Dll",然后编译就可以运行了。

2。论坛的上传功能暂时关闭,我传不了。
2005-02-04 15:55
live41
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:67
帖 子:12442
专家分:0
注 册:2004-7-22
得分:0 
编译之前要先链接,这个你应该知道吧。
2005-02-04 15:56
kai
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:52
帖 子:3450
专家分:59
注 册:2004-4-25
得分:0 
你的代码运行了,感觉很奇怪!
按照你的源代码, cr = 14898176
我另外设置了一个 COLORREF crPixel    用于和  cr  作比较, 发现他们相差很大,那个 if(crPixel == cr ) 始终为 FALSE
那样的话,设置颜色的代码就不会执行。
作为测试,我将 if  语句去掉,发现可以画那个标题框了,但是,那个 icon, 和标题都给掩盖掉了。

所以可以看出,代码作者的意图是想通过判断标题栏的颜色是否与当前 Pixel 的颜色一样,如果一样,则替换它,这样图标和标题文字的颜色就可以保留。但是那个 if 语句显然没有符合预计的要求,看来函数选择上有问题。

自由,民主,平等,博爱,进步.
中华民国,我的祖国,中华民国万岁!中华民国加油!
本人自愿加入中国国民党,为人的自由性,独立性和平等性而奋斗!
2005-02-04 23:05



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-11849-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.971236 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved