有人可以帮我做一下屏保吗?

linuxway 2001-06-07 09:34:00
用vc做一个屏保,有动画效果的
谢谢了
...全文
139 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
boybaby 2001-06-09
  • 打赏
  • 举报
回复
屏保...???菜...,你有Delphi的帮助文件吗?里面什么都有,非常详细
realgoodniuniu 2001-06-09
  • 打赏
  • 举报
回复
自己写一个,楼上说得很对!!!你可以去读一下 screensave.h 的内容!读懂了,你就应该知道怎么写了!!!
seesi 2001-06-09
  • 打赏
  • 举报
回复
用MFC编制屏幕保护程序
作者:Ed Halley. 翻译:Yu Hail 1998

编写屏幕保护
现代显示器的很多优点,如长寿命的显示屏,液晶和能源之星能源保护模式, 已经让屏幕保护程序的作用大大地降低. 但是,依然有大量的屏幕保护程序出现,尤其是共享软件.
这也许是因为写屏幕保护程序是一件非常有趣的事. 因为有CRect和CGdiObject类,这些类的绘图功能比单纯的C API函数容易得多, 所以,用MFC写屏幕保护程序会是一件更有趣的事.
简单地和"Hello, world."应用程序比较,它不需要WinMain()函数,例如:
如果你发掘一下有哪些API函数支持产生一个屏幕保护程序,你会发现可利用的函数非常少. 例如:用C写屏幕保护程序,大多数情况下都不需要调用DefWindowProc函数,取而代之的是DefScreenSaverProc函数. 如果调用你自已的函数(一般也就是三个),你可以编出一个和标准的屏幕保护程序功能一样的屏保程序.
对所有的屏幕保护程序:
屏幕保护程序的名字和描述在字符串1中定义.
屏幕保护程序的图标为ID_APP, 在中定义为100.
WINAPI函数ScreenSaverProc必须定义和调用.
(CScreenSaverWnd模块为你填充这个API调用.)
程序必需以.SCR为扩展名.
对于可设置的屏幕保护程序:
设置屏幕保护程序的对话框为DLG_SCRNSAVECONFIGURE,在定义为2003.
WINAPI函数ScreenSaverConfigureDialog必须被定义和调用.
WINAPI函数RegisterDialogClasses必须被定义和调用.
(CScreenSaverDlg模块为你填充这个API调用.)
--------------------------------------------------------------------------------

某些MFC外部特性
所有这些简单的特性来源于MFC,以及它便利的应用程序框架. 一个屏幕保护程序并不真的是一个应用程序,它只不过是操作系统在你离开键盘后才调用的一段代码. 它甚至不需要WINMAIN函数,MFC程序似乎不可能完成这一点,因为它已经调用了WINMAIN函数. 如果你没有用过WINAPI来编写C程序,你可能不知道MFC已经在幕后调用了DefWindowProc过程.
你当然能用MFC来生成一个屏幕保护程序,对于上述的限制,你只要在MFC的基础上做一点点工作即可. 以下提供两个抽象类 CScreenSaverWnd和CScreenSaverDlg,它会考虑这种限制,并且让你很容易创建一个功能完全的屏幕保护程序.
建一个基于对话框的MFC应用程序.
使用VC4.2或5.0为屏幕保护程序产生一个新工程,你可以使用开发环境提供的AppWizard, 建立一个新"Win32 MFC Application"程序.如果你选择链接时MFC为共享(linked with MFC in a shared DLL), 屏幕保护程序会小很多.当然,基于对话框的应用程序将会避免产生不需要用DOC/VIEW构架.
删除所以关于CWinApp的引用和它本身.
删除所有CWinApp派生类的申明和定义,包括一个全局的instance.
产生一个CWnd的派生类.
我们已经创建了一个基于对话框的应用程序,但是屏幕保护程序只是需要一个简单的CWnd派生类. 你可以使用ClassWizard来产生一个继承于 generic CWnd class的派生类.
选择父类.
从下载的文件中拷贝CScreenSaverWnd和CScreenSaverDlg的相关文件,*.CPP和*.H (作者要求你能保留源代码中的版权信息). 在你的窗口类中查找CWnd,将其换成CScreenSaverWnd,将CDialog换为CScreenSaveDlg. 然后重新编译.
一个特定的对话框.
用ClassWizard产生的CDialog的派生类,没有处理命令行参数的构造函数. 因为屏幕保护程序的设置部分是一个窗口,需要命令行设置, 因此,在此提供了一个可以使用命令行的构造和析构函数.
全局考虑.
当删掉CWinApp的派生类对象时,也同时删掉了全局的instance, 因此,程序中CScreenSaverWnd的派生类需要有一个全局的instance. 同样,在CScreenSaverDlg的派生类中也要保留一个副本.
资源.
如前所述,屏幕保护程序包含以下资源: 字符串1中的描述,不要超过20个字符,当用户选择屏幕保护程序时,在下拉框中就会出现这个字符串.将图标资源的ID改为100.将对话框资源的ID改为2003.
泡沫,清洗,重复.
你已经做好一个框架,现在可以编译,调试和开发了. 你可以改变工程输出的文件扩展名为.SCR,从而能出现屏幕保护程序的设置对话框. 如果你想调试屏幕保护程序,在运行时你可以用命令行参数:"/save"
分析自带的示例.
示例使用VC5.0,但应该兼容于VC4.2,展示了 CScreenSaverWnd和CScreenSaverDlg的用法, 并且使用了CImageList来调用一个图标库,在屏幕上产生动画,请查看源程序的注解.


--------------------------------------------------------------------------------

代码
虽然CScreenSaverWnd不是CView的派生类,我觉得应该重载OnInitialUpdate和OnDraw.我也加入了三个特性,你可以使用,也可以不使用.
CScreenSaverWnd的默认状态是黑屏,这由函数OnEraseBkgnd()来完成,你可以在构造函数,OnCreate,OnInitalUpadte这三个地方的任一处调用SetAutoBlack(FALSE)来关掉该项.
成员变量m_pPalette指向CPalette,将被用于OnDraw调用之前的调色板设置, 重载OnQueryNewPalette()和OnPaletteChanged()来正确地处理调色板, 将m_pPalette设置为NULL,意味着所有的调色板操作代码都由你自已来完成. (注意:使用16色时(如示例),你不需要做任何调色板的工作).
虽然屏幕保护程序的设置对话框和屏幕保护程序不可能同时出现,但它们确实需要通讯. 重载SaveOptions和RestoreOptions将用来保存和恢复各项参数. 在什么地方保存这种参数取决于你,但保留在系统注册表中是个不错的选择.
以下是上述两个类的框架,源程序已经很好地做了注解.
// Implemented class CScreenSaverWnd
class CScreenSaverWnd : public CWnd
{
public:
CScreenSaverWnd();
// Attributes
public:
BOOL IsAutoBlack() const;
void SetAutoBlack(BOOL bAutoBlack = TRUE);
CPalette* GetPalette() const;
void SetPalette(CPalette* pPalette);
// Overridables
public:
virtual void OnDraw(CDC* pDC);
virtual void OnInitialUpdate();
virtual void SaveOptions();
virtual void RestoreOptions();
//Implementation
public:
virtual ~ScreenSaverWnd();
protected:
virtual LRESULT WindowProc(UINT uMsg, WPARAM wParam, LPARAM lParam);
virtual LRESULT DefWindowProc(UINT uMsg, WPARAM wParam, LPARAM lParam);
afx_msg BOOL OnEraseBkgnd(CDC* pDC);
afx_msg void OnPaint();
afx_msg BOOL OnQueryNewPalette();
afx_msg void OnPaletteChanged(CWnd* pFocusWnd);
};
// Implemented class CScreenSaverDlg
class CScreenSaverDlg : public CDialog
{
public:
CScreenSaverDlg();
// Overrides
public:
virtual BOOL OnInitDialog();
//Implementation
public:
virtual ~ScreenSaverDlg();
protected:
virtual LRESULT WindowProc(UINT uMsg, WPARAM wParam, LPARAM lParam);
virtual LRESULT DefWindowProc(UINT uMsg, WPARAM wParam, LPARAM lParam);
};
// Implemented APIs
LRESULT WINAPI ScreenSaverProc(HWND hWnd, UINT uMsg,
WPARAM wParam, LPARAM lParam);
BOOL WINAPI ScreenSaverConfigureDialog(HWND hDlg, UINT uMsg,
WPARAM wParam, LPARAM lParam);
BOOL WINAPI RegisterDialogClasses(HANDLE hInstance);
};

seesi 2001-06-09
  • 打赏
  • 举报
回复
VC知识库(五) www.vckbase.com

--------------------------------------------------------------------------------

利用MFC编写屏幕保护程序

闻怡洋

--------------------------------------------------------------------------------

在Windows95下的Screen Saver,可以依靠启动程序时的参数来确定当前运行的是什么功能,如:启动屏幕保护,或者是Config,或者是在屏幕属性页中运行。

在CWinApp派生类中插入以下代码可以检测不同的启动原因。

BOOL CYourApp::MatchOption(LPTSTR lpsz, LPTSTR lpszOption)
{
if (lpsz[0] == _T('-') || lpsz[0] == _T('/'))
lpsz++;
if (lstrcmpi(lpsz, lpszOption) == 0)
return TRUE;
return FALSE;
}

BOOL CYourApp::InitInstance()
{//根据不同的需要建立新窗口
if (__argc == 1 || MatchOption(__argv[1], _T("c")))
DoConfig();//弹出对话框,并返回FALSE。
else
if (MatchOption(__argv[1], _T("p")))
{
return DoSmall();//如果成功建立窗口返回TRUE,否则返回FALSE
}
else
if (MatchOption(__argv[1], _T("s")))
{
return DoFull();//如果成功建立窗口返回TRUE,否则返回FALSE
}
return FALSE;
}

当作为全屏幕运行,和Config时和普通程序一样处理,只要弹出相应的窗口便可以了。如果是在属性页中运行,则需要建立一个子窗口,而父窗口的句柄可以通过参数得到。

BOOL CYourApp::DoSmall(void)
{
CWnd* pParent = CWnd::FromHandle((HWND)atol(__argv[2]));
ASSERT(pParent != NULL);
CSmallWnd* pWnd = new CSmallWnd();//CSmallWnd有自己定义
if(pWnd->CreateAsShow(pParent))//通过父窗口句柄建立子窗口
{
m_pMainWnd = pWnd;
return TRUE;
}
return FALSE;
}

我提供了利用MFC实现的Screen Saver的基类,该基类中实现了,CSSApp作为应用基类,CSmallWnd,CFullWnd分别作为全屏幕运行和在属性页中运行的窗口基类。

www.vchelp.net上有




seesi 2001-06-09
  • 打赏
  • 举报
回复
嗯??
下载一个例子看看就行了。
soandor 2001-06-08
  • 打赏
  • 举报
回复
你告诉我你的e_mail,我给你做一个。。。你要什么样子的?
VH 2001-06-08
  • 打赏
  • 举报
回复
看看MSDN,有相关的技术支持
liuqiannan 2001-06-07
  • 打赏
  • 举报
回复
用什么做动画?VC,还是第三方工具

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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