VC++可謂神通廣大,如果學(xué)到家了,或者就掌握了那么一點(diǎn)MFC,你也會感到它的方便快捷,當(dāng)然最重要的是功能強(qiáng)大。不是嗎,從最基本的應(yīng)用程序.EXE到動態(tài)連接庫DLL,再由風(fēng)靡網(wǎng)上的ActiveX控件到Internet Server API,當(dāng)然,還有數(shù)據(jù)庫應(yīng)用程序……瞧,我都用它來做屏幕保護(hù)程序了。一般的屏幕保護(hù)程序都是以SCR作為擴(kuò)展名,并且要放在c:\windows 目錄或 c:\windows\system 目錄下,由Windows 98內(nèi)部程序調(diào)用(Windows NT 是在 c:\windows\system32 目錄下)。怎么調(diào)用?不用說了,這誰不知道。
成都創(chuàng)新互聯(lián)公司服務(wù)緊隨時代發(fā)展步伐,進(jìn)行技術(shù)革新和技術(shù)進(jìn)步,經(jīng)過10多年的發(fā)展和積累,已經(jīng)匯集了一批資深網(wǎng)站策劃師、設(shè)計師、專業(yè)的網(wǎng)站實(shí)施團(tuán)隊以及高素質(zhì)售后服務(wù)人員,并且完全形成了一套成熟的業(yè)務(wù)流程,能夠完全依照客戶要求對網(wǎng)站進(jìn)行成都網(wǎng)站設(shè)計、成都網(wǎng)站建設(shè)、外貿(mào)網(wǎng)站建設(shè)、建設(shè)、維護(hù)、更新和改版,實(shí)現(xiàn)客戶網(wǎng)站對外宣傳展示的首要目的,并為客戶企業(yè)品牌互聯(lián)網(wǎng)化提供全面的解決方案。
好了,我們來作一個簡單的。選擇MFC AppWizard(exe),Project Name 為MyScreensaver,[NEXT],對話框,再后面隨你了。打開菜單Project、Settings,在Debug頁、Executable for debug session項,以及Link頁中Output file name項改為c:\windows\MyScreensaver.scr,這樣,你可以調(diào)試完后,直接在VC中運(yùn)行(Ctrl+F5),便可看到結(jié)果。當(dāng)然,這樣做的唯一缺點(diǎn)是你必須手動清除Windows 目錄下的垃圾文件(當(dāng)然是在看到滿意結(jié)果后;還有,你可借助SafeClean 這個小東東來幫你清除,除非你的硬盤大的讓你感到無所謂……快快快回來,看我跑到那里去了)。接下來用Class Wizard生成CMyWnd類,其基類為CWnd(在Base Class 中為generic CWnd)。這個類是我們所要重點(diǎn)研究的。創(chuàng)建滿屏窗口、計時器,隱藏鼠標(biāo),展示圖片,響應(yīng)鍵盤、鼠標(biāo)等等,這家伙全包了。至于MyScreensaverDlg.h與MyScreensaverDlg.cpp文件我們暫時不管。打開MyScreensaver.cpp,修改InitInstance()函數(shù):
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;
}
當(dāng)然,再這之前得先 #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; //檢測鼠標(biāo)移動
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為新建光標(biāo)的ID,這個光標(biāo)沒有任何圖案
}
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); //創(chuàng)建一個全屏窗口
SetTimer(ID_TIMER, 500, NULL);//計時器,ID_TIMER別忘了定義
return TRUE;
}
為了防止同時運(yùn)行兩個相同的程序,下面兩個函數(shù)是必需的:
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()函數(shù)將全屏窗口置為黑色:
void CMyWnd::OnPaint()
{
CPaintDC dc(this);
CBrush brush(RGB(0,0,0));
CRect rect;
GetClientRect(rect);
dc.FillRect(&rect, &brush);
}
由計數(shù)器調(diào)用DrawBitmap()函數(shù),切換圖片;注意,下面兩個函數(shù)中的IDB_BITMAP1, dc.BitBlt(0,0,800,600……以及if(nIndexBit=5)中的有關(guān)數(shù)據(jù)依據(jù)你的bmp圖片個數(shù)、尺寸、位置不同而不同,我是選擇了5張800x600的bmp圖片。注意,ID值是連續(xù)的,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);
}
響應(yīng)鍵盤、鼠標(biāo)是屏幕保護(hù)程序不可缺少的,在OnKeyDown()、 OnLButtonDown()、 OnMButtonDown()、OnRButtonDown()、OnSysKeyDown()函數(shù)中都加入:
PostMessage(WM_CLOSE);
OnMouseMove()函數(shù)比較特殊,它應(yīng)加的代碼為:
if(m_prePoint == CPoint(-1,-1))
m_prePoint = point;
else if(m_prePoint!=point)
PostMessage(WM_CLOSE);
快要完工了。在OnDestroy()函數(shù)中刪掉計時器:KillTimer(ID_TIMER);
還有啦,在CMyWnd::PostNcDestroy() 中加入: delete this;
哎呀,腰酸背疼,眼球發(fā)澀,手背奇麻(不會吧)!不過,相信你一定會迫不及待地按下Ctrl+F5, 看著一幅幅圖片在你面前輪番展示,啊,自己的屏幕保護(hù)程序!趕快趕快,換上自制的屏保,感覺就是不一樣:圖片任你挑,時間間隔任你改,鼠標(biāo)?鍵盤?我想響應(yīng)誰就響應(yīng)誰……哎呀,誰扔的紙團(tuán):(。
其實(shí),上面的程序還有很多可以改進(jìn)的地方,比如圖片總是單一地顯示;bmp 文件太大,導(dǎo)致生成的屏幕保護(hù)程序也很大,遠(yuǎn)沒有jpg合算;沒有密碼,沒有可直接控制的界面。由于InitInstance()函數(shù)的簡單處理(直接調(diào)用CMyWnd類),你會發(fā)現(xiàn)當(dāng)你在桌面上右擊,選擇“屬性”、“屏幕保護(hù)程序”頁、“屏幕保護(hù)程序”下拉菜單、選中MyScreensaver時,MyScreensaver就直接預(yù)覽了(或是直接運(yùn)行了);假設(shè)你確定MyScreensaver作為你的屏幕保護(hù)程序,等你第二次進(jìn)入“屏幕保護(hù)程序”頁時,就直接預(yù)覽。Why? 回頭看看InitInstance()函數(shù)就明白了。為了讓它更聽話地工作,可修改InitInstance()函數(shù):
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;
不過現(xiàn)在你要是再在VC中運(yùn)行這個程序,“該程序執(zhí)行了非法操作,即將關(guān)閉。將會伴隨著一超重低音供你欣賞。(啊?)原因是我們加了一句return FALSE; 還有,別忘了還有一個CMyScreensaverDlg類沒有用上,用它來與你的屏保直接對話再好不過了。例如,為了方便地確定時間間隔,選取圖片,加上一個編輯框和幾個按鈕就可以了。重申一點(diǎn),由于生成文件較大,占用的內(nèi)存也多,如果不能運(yùn)行,很可能是開的窗口太多了。這時你可以換較小的圖片。
系統(tǒng)就有這個屏保啊!~!
Option EXPlicit
Dim quitflag As Boolean '聲明終止程序標(biāo)志變量
Dim lleft
'聲明隱藏或顯示鼠標(biāo)的API函數(shù)
Private Declare Function ShowCursor Lib "user32"
(ByVal bShow As Long) As Long
'檢測鼠標(biāo)單擊或移動
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坐標(biāo)
If App.PrevInstance = True Then
'用APP對象的PrevInstance屬性
Unload Me
'防止同時運(yùn)行屏幕保護(hù)程序的兩個實(shí)例
Exit Sub
End If
Select Case Ucase$(Left$(Command$, 2))
'裝載命令行參數(shù)
Case "/S" '在顯示器屬性對話框中單擊了
預(yù)覽按鈕或屏幕保護(hù)程序被系統(tǒng)正常調(diào)用。
Show
'全屏顯示Form1窗體
Randomize
'初始化隨機(jī)數(shù)生成器
X = ShowCursor(False)
'隱藏鼠標(biāo)
BackColor = VBBlack
Do
Timer2.Enabled = True
'啟動Timer2 ,顯示屏幕保護(hù)滾動文字
DoEvents
'轉(zhuǎn)讓控制權(quán),以便檢測鼠標(biāo)和按鍵行為
Loop Until quitflag = True
'運(yùn)行屏幕保護(hù)滾動文字直至有鼠標(biāo)和按鍵行為
Timer2.Enabled = False
'終止?jié)L動文字
Timer1.Enabled = True
'啟動Timer1,退出屏幕保護(hù)程序
Case Else
Unload Me
Exit Sub
End Select
End Sub
Private Sub Form_Unload(Cancel As Integer)
Dim X
X = ShowCursor(True)
'顯示鼠標(biāo)
End Sub
Private Sub Timer1_Timer()
Unload Me
'退出屏幕保護(hù)程序
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
然后啟動窗體把標(biāo)題欄什么的設(shè)置一下,做個圖片背景什么的,就行了。
文章標(biāo)題:vb點(diǎn)虐
如何打開屏保 vbnet tabpage
URL網(wǎng)址:http://sd-ha.com/article18/ddsiggp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供用戶體驗(yàn)、靜態(tài)網(wǎng)站、網(wǎng)站設(shè)計、網(wǎng)站收錄、響應(yīng)式網(wǎng)站、品牌網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)