VC++可谓神通广大,如果学到家了,或者就掌握了那么一点MFC,你
也会感到它的方便快捷,当然最重要的是功能强大。不是吗,从最基本的应
用程序.EXE到动态连接库DLL,再由风靡网上的ActiveX控件到Internet
Server API,当然,还有数据库应用程序……瞧,我都用它来做屏幕保
护程序了。一般的屏幕保护程序都是以SCR作为扩展名,并且要放在
c:windows 目录或 c:windowssystem 目录下,由Windows 98内部程
序调用(Windows NT 是在 c:windowssystem32 目录下)。怎么调用?
不用说了,这谁不知道。
好了,我们来作一个简单的。选择MFC AppWizard(exe),Project Name
为MyScreensaver,[NEXT],对话框,再后面随你了。打开菜单Project、
Settings,在Debug页、Executable for debug session项,以及Link页中
Output file name项改为c:windowsMyScreensaver.scr,这样,你可以调
试完后,直接在VC中运行(Ctrl+F5),便可看到结果。当然,这样做的唯
一缺点是你必须手动清除Windows目录下的垃圾文件(当然是在看到满意结果
后;还有,你可借助SafeClean 这个小东东来帮你清除,除非你的硬盘大的
让你感到无所谓……快快快回来,看我跑到那里去了)。接下来用Class Wizard
生成CMyWnd类,其基类为CWnd(在Base Class 中为generic CWnd)。这个类
是我们所要重点研究的。创建满屏窗口、计时器,隐藏鼠标,展示图片,响
应键盘、鼠标等等,这家伙全包了。至于MyScreensaverDlg.h与
MyScreensaverDlg.cpp文件我们暂时不管。打开MyScreensaver.cpp,修改
InitInstance()函数:
BOOL CMyScreensaverApp::InitInstance()
{
AfxEnableControlContainer();
#ifdef _AFXDLL
Enable3dControls(); // Call this when using MFC in a shared DLL
#else
Enable3dControlsStatic(); // Call this when linking to MFC statically
#endif
CMyWnd* pWnd = new CMyWnd;
pWnd->Create();
m_pMainWnd = pWnd;
return TRUE;
}
当然,再这之前得先 #include “MyWnd.h" 。后面要做的都在MyWnd.h 与
MyWnd.cpp 两文件中了。
下面给出CMyWnd 的说明:
class CMyWnd : public CWnd
{
public:
CMyWnd();
static LPCSTR lpszClassName; //注册类名
public:
BOOL Create();
public:
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CMyWnd)
protected:
virtual void PostNcDestroy();
//}}AFX_VIRTUAL
public:
virtual ~CMyWnd();
protected:
Cpoint m_prePoint; //检测鼠标移动
void DrawBitmap(CDC& dc, int nIndexBit);
//{{AFX_MSG(CMyWnd)
afx_msg void OnPaint();
afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);
afx_msg void OnLButtonDown(UINT nFlags, Cpoint point);
afx_msg void OnMButtonDown(UINT nFlags, Cpoint point);
afx_msg void OnMouseMove(UINT nFlags, Cpoint point);
afx_msg void OnRButtonDown(UINT nFlags, Cpoint point);
afx_msg void OnSysKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);
afx_msg void OnDestroy();
afx_msg void OnTimer(UINT nIDEvent);
afx_msg void OnActivate(UINT nState, CWnd* pWndOther, BOOL bMinimized);
afx_msg void OnActivateApp(BOOL bActive, HTASK hTask);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
MyWnd.cpp 文件:
……
CMyWnd::CMyWnd()
{
m_prePoint=Cpoint(-1, -1);
}
LPCSTR CMyWnd::lpszClassName=NULL;
BOOL CMyWnd::Create()
{
if(lpszClassName==NULL)
{
lpszClassName=AfxRegisterWndClass(CS_HREDRAW|CS_VREDRAW,
::LoadCursor(AfxGetResourceHandle(),MAKEINTRESOURCE(IDC_NOCURSOR)));