| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1390 人关注过本帖
标题:帮我看看这段代码的错误
取消只看楼主 加入收藏
live41
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:67
帖 子:12442
专家分:0
注 册:2004-7-22
结帖率:66.67%
收藏
 问题点数:0 回复次数:4 
帮我看看这段代码的错误

功能是把标题栏的颜色改变,可是我在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
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
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
快速回复:帮我看看这段代码的错误
数据加载中...
 
   



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

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