VC++可謂神通廣大,如果學到家了,或者就掌握了那么一點MFC,你也會感到它的方便快捷,當然最重要的是功能強大。不是嗎,從最基本的應用程序.EXE到動態連接庫DLL,再由風靡網上的ActiveX控件到Internet Server API,當然,還有數據庫應用程序……瞧,我都用它來做屏幕保護程序了。一般的屏幕保護程序都是以SCR作為擴展名,并且要放在c:\windows 目錄或 c:\windows\system 目錄下,由Windows 98內部程序調用(Windows NT 是在 c:\windows\system32 目錄下)。怎么調用?不用說了,這誰不知道。
成都創新互聯公司服務緊隨時代發展步伐,進行技術革新和技術進步,經過10多年的發展和積累,已經匯集了一批資深網站策劃師、設計師、專業的網站實施團隊以及高素質售后服務人員,并且完全形成了一套成熟的業務流程,能夠完全依照客戶要求對網站進行成都網站設計、成都網站建設、外貿網站建設、建設、維護、更新和改版,實現客戶網站對外宣傳展示的首要目的,并為客戶企業品牌互聯網化提供全面的解決方案。
好了,我們來作一個簡單的。選擇MFC AppWizard(exe),Project Name 為MyScreensaver,[NEXT],對話框,再后面隨你了。打開菜單Project、Settings,在Debug頁、Executable for debug session項,以及Link頁中Output file name項改為c:\windows\MyScreensaver.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)));
//注冊類;IDC_NOCURSOR為新建光標的ID,這個光標沒有任何圖案
}
CRect rect(0, 0, ::GetSystemMetrics(SM_CXSCREEN),
::GetSystemMetrics(SM_CYSCREEN));
CreateEx(WS_EX_TOPMOST, lpszClassName, _T(“”), WS_VISIBLE WS_POPUP,
rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top,
GetSafeHwnd(), NULL, NULL); //創建一個全屏窗口
SetTimer(ID_TIMER, 500, NULL);//計時器,ID_TIMER別忘了定義
return TRUE;
}
為了防止同時運行兩個相同的程序,下面兩個函數是必需的:
void CMyWnd::OnActivate(UINT nState, CWnd* pWndOther, BOOL bMinimized)
{
CWnd::OnActivate(nState,pWndOther,bMinimized);
if (nState==WA_INACTIVE)
PostMessage(WM_CLOSE);
}
void CMyWnd::OnActivateApp(BOOL bActive, HTASK hTask)
{
CWnd::OnActivateApp(bActive, hTask);
if (!bActive) //is being deactivated
PostMessage(WM_CLOSE);
}
OnPaint()函數將全屏窗口置為黑色:
void CMyWnd::OnPaint()
{
CPaintDC dc(this);
CBrush brush(RGB(0,0,0));
CRect rect;
GetClientRect(rect);
dc.FillRect(&rect, &brush);
}
由計數器調用DrawBitmap()函數,切換圖片;注意,下面兩個函數中的IDB_BITMAP1, dc.BitBlt(0,0,800,600……以及if(nIndexBit=5)中的有關數據依據你的bmp圖片個數、尺寸、位置不同而不同,我是選擇了5張800x600的bmp圖片。注意,ID值是連續的,IDB_BITMAP1最小。
void CMyWnd::DrawBitmap(CDC &dc, int nIndexBit)
{
CDC dcmem;
dcmem.CreateCompatibleDC(&dc);
CBitmap m_Bitmap;
m_Bitmap.LoadBitmap(IDB_BITMAP1+nIndexBit);
dcmem.SelectObject(m_Bitmap);
dc.BitBlt(0,0,800,600,&dcmem,0,0,SRCCOPY);
}
void CMyWnd::OnTimer(UINT nIDEvent)
{
CClientDC dc(this);
static nIndexBit=0;
if(nIndexBit=5)
nIndexBit=0;
DrawBitmap(dc, nIndexBit++);
CWnd::OnTimer(nIDEvent);
}
響應鍵盤、鼠標是屏幕保護程序不可缺少的,在OnKeyDown()、 OnLButtonDown()、 OnMButtonDown()、OnRButtonDown()、OnSysKeyDown()函數中都加入:
PostMessage(WM_CLOSE);
OnMouseMove()函數比較特殊,它應加的代碼為:
if(m_prePoint == CPoint(-1,-1))
m_prePoint = point;
else if(m_prePoint!=point)
PostMessage(WM_CLOSE);
快要完工了。在OnDestroy()函數中刪掉計時器:KillTimer(ID_TIMER);
還有啦,在CMyWnd::PostNcDestroy() 中加入: delete this;
哎呀,腰酸背疼,眼球發澀,手背奇麻(不會吧)!不過,相信你一定會迫不及待地按下Ctrl+F5, 看著一幅幅圖片在你面前輪番展示,啊,自己的屏幕保護程序!趕快趕快,換上自制的屏保,感覺就是不一樣:圖片任你挑,時間間隔任你改,鼠標?鍵盤?我想響應誰就響應誰……哎呀,誰扔的紙團:(。
其實,上面的程序還有很多可以改進的地方,比如圖片總是單一地顯示;bmp 文件太大,導致生成的屏幕保護程序也很大,遠沒有jpg合算;沒有密碼,沒有可直接控制的界面。由于InitInstance()函數的簡單處理(直接調用CMyWnd類),你會發現當你在桌面上右擊,選擇“屬性”、“屏幕保護程序”頁、“屏幕保護程序”下拉菜單、選中MyScreensaver時,MyScreensaver就直接預覽了(或是直接運行了);假設你確定MyScreensaver作為你的屏幕保護程序,等你第二次進入“屏幕保護程序”頁時,就直接預覽。Why? 回頭看看InitInstance()函數就明白了。為了讓它更聽話地工作,可修改InitInstance()函數:
LPTSTR lpszArgv = __argv[1];
if (lpszArgv[0] ==‘/’)
lpszArgv++;
if (lstrcmpi(lpszArgv, _T(“s”))==0)
{
CMyWnd* pWnd=new CMyWnd;
pWnd-Create();
m_pMainWnd=pWnd;
return TRUE;
}
return FALSE;
不過現在你要是再在VC中運行這個程序,“該程序執行了非法操作,即將關閉。將會伴隨著一超重低音供你欣賞。(啊?)原因是我們加了一句return FALSE; 還有,別忘了還有一個CMyScreensaverDlg類沒有用上,用它來與你的屏保直接對話再好不過了。例如,為了方便地確定時間間隔,選取圖片,加上一個編輯框和幾個按鈕就可以了。重申一點,由于生成文件較大,占用的內存也多,如果不能運行,很可能是開的窗口太多了。這時你可以換較小的圖片。
系統就有這個屏保啊!~!
Option EXPlicit
Dim quitflag As Boolean '聲明終止程序標志變量
Dim lleft
'聲明隱藏或顯示鼠標的API函數
Private Declare Function ShowCursor Lib "user32"
(ByVal bShow As Long) As Long
'檢測鼠標單擊或移動
Private Sub Form_Click()
quitflag = True
End Sub
Private Sub Form_MouseMove(Button As Integer,Shift As Integer, X As Single, Y As Single)
Static xlast, ylast
Dim xnow As Single
Dim ynow As Single
xnow = X
ynow = Y
If xlast = 0 And ylast = 0 Then
xlast = xnow
ylast = ynow
Exit Sub
End If
If xnow xlast Or ynow ylast Then
quitflag = True
End If
End Sub
'檢測按鍵
Private Sub Form_KeyDown(KeyCode As Integer,Shift As Integer)
quitflag = True
End Sub
Private Sub Form_Load()
Dim X As Long
lleft = 0
'橫向滾動文字的起始X坐標
If App.PrevInstance = True Then
'用APP對象的PrevInstance屬性
Unload Me
'防止同時運行屏幕保護程序的兩個實例
Exit Sub
End If
Select Case Ucase$(Left$(Command$, 2))
'裝載命令行參數
Case "/S" '在顯示器屬性對話框中單擊了
預覽按鈕或屏幕保護程序被系統正常調用。
Show
'全屏顯示Form1窗體
Randomize
'初始化隨機數生成器
X = ShowCursor(False)
'隱藏鼠標
BackColor = VBBlack
Do
Timer2.Enabled = True
'啟動Timer2 ,顯示屏幕保護滾動文字
DoEvents
'轉讓控制權,以便檢測鼠標和按鍵行為
Loop Until quitflag = True
'運行屏幕保護滾動文字直至有鼠標和按鍵行為
Timer2.Enabled = False
'終止滾動文字
Timer1.Enabled = True
'啟動Timer1,退出屏幕保護程序
Case Else
Unload Me
Exit Sub
End Select
End Sub
Private Sub Form_Unload(Cancel As Integer)
Dim X
X = ShowCursor(True)
'顯示鼠標
End Sub
Private Sub Timer1_Timer()
Unload Me
'退出屏幕保護程序
End Sub
Private Sub Timer2_Timer()
顯示橫向滾動文字
lleft = lleft + 100
If lleft = 11810 Then
lleft = 0
Lab1.Top = Int(Rnd * 7000)
End If
Lab1.Left = lleft
Timer2.Enabled = False
End Sub
把啟動窗體先顯示出來,然后,過一段時間再把這個窗體隱藏起來就行了。在其他窗體中加一句form1.visible=false
然后啟動窗體把標題欄什么的設置一下,做個圖片背景什么的,就行了。
文章標題:vb點虐
如何打開屏保 vbnet tabpage
URL網址:http://vcdvsql.cn/article18/ddsiggp.html
成都網站建設公司_創新互聯,為您提供用戶體驗、靜態網站、網站設計、網站收錄、響應式網站、品牌網站建設
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯