我是新手上路,有个简单问题求助!

goodwill312 2003-12-17 11:42:29
在使用API编程时要实现一个功能:在一对话框里显示一可闪烁的灯。灯的暗、亮两张位图已画出,并且window窗口中可以正常实现并闪烁。但放在Dialog窗口里不显示,后来在Dialog中放置一picture静态框,将其Type设为"bitmap"并在"image"中选择“暗”的位图,编译后能显示,但没有办法使“亮”位图覆盖“暗”位图,实现闪烁功能。
不知在API中有没有能使位图在静态框中显示的函数,或是有一系列操作能实现在对话框中显示可变的位图?
...全文
22 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
ALong_Yue 2003-12-17
  • 打赏
  • 举报
回复
计时器
wanglh 2003-12-17
  • 打赏
  • 举报
回复
你要设置一个计时器,在CDialog的OnTimer中根据时间来交替显示两张图片。
goodwill312 2003-12-17
  • 打赏
  • 举报
回复
大虾,谢了!能告诉我这是哪本书上的吗?看来我得好好研究它了!再次谢过!
wltsui 2003-12-17
  • 打赏
  • 举报
回复
在对话框中显示位图分为静态和动态两种方法。静态法就是用VC6.0的资源编辑器,首先在资源视图中引入一张所要显示的位图,然后在对话框中放置一个Picture控件,在其属性对话框的Type下拉框中选择Bitmap,在Image框中输入所引入位图的ID,编译后对话框中就会显示所引入的位图。这种方法有一个明显的缺点,就是位图必须先画好并且程序运行时此位图禁止改变。基于此,下文以建立一个适时显示当前时间的程序为例,来介绍如何在对话框中动态显示位图。

首先建立一个基于对话框的程序,名为MyDialog。

清除掉对话框中的TODO:字样,把“确定”和“取消”两个按钮移到对话框的下边,调整对话框为到合适大小。

打开类视图,右键单击CMyDialogDlg,添加如下成员变量:
protected:
CRect m_bitmapRect; //位图在对话框中位置

添加画图成员函数:

protected:
BOOL DrawBitmap(CString strTime,CRect* bitmapRect);    //strTime为表示时间的字符串,bitmapRect指明在窗口的什么区域画图。

使用ClassWizard为CMyDialogDlg加入WM_TIMER的消息响应函数OnTimer(), 和WM_DESTROY的消息响应函数OnDestroy()。

在CMyDialogDlg::OnInitDialog()种添加如下代码:
SetTimer(1,100,NULL);//设置定时器
CRect rect;
GetClientRect(&rect);//获得客户区大小
ScreenToClient(&rect);//将屏幕坐标转化为客户坐标
int width=180,height=45;//要创建的位图的宽度和高度
m_bitmapRect.left=rect.right-25-width;//位图右边界距对话框的右边界25像素 m_bitmapRect.top=rect.top+35;//位图上边界距对话框的上边界35像素 m_bitmapRect.right=m_bitmapRect.left+width;
m_bitmapRect.bottom=m_bitmapRect.top+height;

编写画图代码。
BOOL CMyDialogDlg::DrawBitmap(CString str,CRect* bitmapRect)
{
CBitmap bitmap, *pOldBitmap;
CFont font, *pOldFont;
CDC SourceDC,*pDC;
BOOL result;
pDC=GetDC();//获得当前窗口的设备描述表
if(pDC==NULL)
{
KillTimer(1);
MessageBox("系统资源不足,请关闭程序");
return FALSE;
}
SourceDC.CreateCompatibleDC(pDC); //建立与显示设备兼容的位图
bitmap.CreateCompatibleBitmap(pDC,bitmapRect->Width(),bitmapRect->Height());
font.CreatePointFont(200,"Arial",pDC);//创建点阵字体 pOldBitmap=SourceDC.SelectObject(&bitmap);//将位图选入内存场境
pOldFont=SourceDC.SelectObject(&font); //将字体选入内存场境
SourceDC.SetBkMode(OPAQUE);//设置位图背景模式为不透明
SourceDC.SetBkColor(RGB(0,0,0));//设置位图背景颜色为黑色
SourceDC.FillSolidRect(0,0,bitmapRect->Width(),bitmapRect->Height(),RGB(0,0,0));//填充位图
SourceDC.SetTextColor(RGB(255,0,0));//设置文字显示颜色
//在位图中显示文字
RECT rect;
rect.left=0,rect.top=0,rect.right=bitmapRect->Width(),rect.bottom=bitmapRect->Height();
SourceDC.DrawText(str,&rect,DT_CENTER|DT_VCENTER|DT_SINGLELINE); //在距位图四周2像素处画一3D矩形框,使其具有3D视觉效果.
rect.left=bitmapRect->left-2,rect.top=bitmapRect->top-2;
rect.right=bitmapRect->right+2,rect.bottom=bitmapRect->bottom+2;
pDC->Draw3dRect(&rect,RGB(0,0,0),RGB(255,255,255)); //在对话框上显示位图
result=pDC->BitBlt(bitmapRect->left,bitmapRect->top,bitmapRect->Width(),bitmapRect->Height(),&SourceDC,0,0,SRCCOPY); //撤销资源
SourceDC.SelectObject(pOldBitmap);
SourceDC.SelectObject(pOldFont);
bitmap.DeleteObject();
font.DeleteObject();
SourceDC.DeleteDC();
pDC->DeleteDC(); //返回操作结果
return result;
}


处理OnTimer()消息函数:
void CMyDialogDlg::OnTimer(UINT nIDEvent)
{ // TODO: Add your message handler code here and/or call default
CTime time;
time=CTime::GetCurrentTime();//获得当前时间
CString strTime=time.Format("%H:%M:%S");//将时间转化为字符串
BOOL res=DrawBitmap(strTime,&m_bitmapRect);//画图显示时间
if(res!=TRUE)
{
MessageBox(“Error”);
}
CDialog::OnTimer(nIDEvent);
}


处理OnDestroy()消息函数:
void CMyDlg::OnDestroy()
{
CDialog::OnDestroy();
// TODO: Add your message handler code here
KillTimer(1);
}
goodwill312 2003-12-17
  • 打赏
  • 举报
回复
抱歉,可能我没说清楚!我碰到的问题是在Dialog中没法显示位图!我所能做到的只是用picture中先包含一张位图来编译显示,但想在操作中用其他位图来换掉它就没法了!
AJAX——新手快车道 前言 AJAX是什么? 首先、AJAX是一种很酷的技术,一旦采用了AJAX,就能让你的Web页面, 你的网站,甚至连同你们公司,都变得很酷。在Web2.0的时代里,不使用一点 AJAX技术的网站,就会显得很老土,很落伍。 但是,这样的理解,其实是很肤浅的。仅仅是从一个外行,从一个使用者的 角度出发,来理解AJAX,就像我在本书的第一章AJAX我也行中那样,开发 出很愚蠢,甚至都没有资格被称之为AJAX应用的纯IE、XMLHTTP应用。 AJAX更酷的一点在于,对于传统的Web开发人员来说,AJAX所运用的, 是更加先进的,更加标准化的,更加和谐高效的,完整的Web开发技术体系。 遵循这样的体系开发Web应用,能让你的开发过程变得更加轻松,也能使你们 的开发团队,显得很酷。在Web2.0 的时代里,还在采用过时的技术来开发 Web,会显得很老土,很落伍。 AJAX的相关组成技术,每一个都已经出现了N年以上了,对这些技术的 组合运用,也远远早于AJAX这个名词出现之前。所以,我真正敬佩的,并非提 出 AJAX这个缩写的Jesse James Garrett。而是那些早在N年以前,就已经在探索、 实践的先行者,他们始终在追求的:是更好的用户体验,以及更好的开发体验。 这样的精神,才是最可宝贵的,也是最值得我们学习的。许多年过去以后,当我 们再回头来看当年的这些热门技术,也许早已经变得老土,变得落伍了。在这样 的历程中,哪些人会成长为高手?会成长为大师呢?就是那些永不满足,永远 在追求更好的用户体验,永远在追求更好的开发体验的人! 新手如何上路 软件开发这个领域,永远都在飞速发展,大家都必须不断的学习新的知识、 技能、框架、IDE、甚至新的语言。传说中的骨灰级高手们,就像传说中的大侠, 任何武器、哪怕是一块木头到了他们手里,也能发挥惊人的威力,人家练了几十 年的看家本领,他们随手使来,也竟然像是打娘胎里就开始练了一样。为什么? 就算不吹那么玄的,平常我们能够碰到的那些老手,在学新东西的时候, 也比那些新手学得更快,理解得更深,运用得更熟练。而新手们呢?往往就会漫 无头绪,焦头烂额,以一副张着茫然的大眼睛的经典表情,出现在各大论坛的 新手求助区里。他们欠缺的,究竟是什么呢?为什么老手学新东西,就没遇到那 么多困难呢? 泛泛地说,自然是经验上的欠缺。仔细地说来,又可以分为三个方面: 一、本质,一种技术与另一种技术之间,往往会有本质上的相通之处,当你 对一种技术的理解与思考越来越深入时,学习一种新技术也会更加容易。触类旁 通,举一反三的能力,就是来自于对于技术本质的追寻。 二、地图,本质上或多或少的相通,也提示着我们技术之间的相互关联,当 你了解的技术越多,了解得越是深入,在你的内心,就能建立起越发清晰的技 术地图。各种知识都有一个自然、合理的位置。那么当一个老手要学习一门新技术 的时候,他其实并非在探索一个全新的、未知的领域,而是有很多脉络可寻,也 很多已知可以帮助他们快速了解未知。 三、技巧,面对同样的未知,面对同样的难题,新手们一筹莫展,而老手们 却掌握着更多的技巧和手段,帮助他们试探可能性、缩小问题的范围、迅速定位 问题、不犯明显愚蠢的错误、甚至能够列举出更具命中力的搜索关键词,而这些 技巧,都帮助老手在前进的道路上,更少跌倒,即使跌倒,也能更快的爬起来。 作为一本写给新手的入门书籍,我们希望展现给读者的,是一个老手如何 学习新技术的过程。我们相信,这样的一个学习过程,对于新手来说,是更具有 价值的。 何谓快车道 必须老老实实的承认,我吹牛了!老手虽然会比新手学习得更快一些,但 是也同样会碰到麻烦,遇到障碍,感觉头痛。如果没有真正的专家的指导,我不 可能如此迅速地将AJAX掌握到目前这样的程度,要真是让我自学三个月,然 后就写出书来的话,那真是在骗钱了。 老手能够快速学习的另一个重要的诀窍是:认识很多牛人朋友 如果没有李锟与赵泽欣的专家级指导与帮助,如果没有与李锟AJAX结对 编程的体验,如果没有三个人在MSN上无数次的长聊,我想要在短期内建立起: 对于AJAX本质的理解; 对于整个AJAX以及相关技术地图的理解; 对于AJAX编程开发所需要的很多技巧、手段的掌握; 几乎是不可能的。 如果没有(N多需要感谢的人)的(N多方面的帮助),我们这本书,也 不可能以现在这样的深度,以(N个月)内完成的速度,送到读者的面前。 希望这本书,能够对大家快速学习AJAX,有所帮助。

15,979

社区成员

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

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