如何在改變鼠標(biāo)光標(biāo)時(shí)不閃爍
??? 微軟知識(shí)庫有一篇文章Q131991描述了三種方法來改變基于MFC應(yīng)用的鼠標(biāo)光標(biāo)。其中一種方法是重載CWnd::PreCreateWindow()函數(shù)注冊自己的要改變鼠標(biāo)指針的窗口類。這個(gè)方法對(duì)于要始終使用一個(gè)鼠標(biāo)光標(biāo)的應(yīng)用程序很適合。
??? 如果在應(yīng)用程序中要?jiǎng)討B(tài)改變鼠標(biāo)光標(biāo),微軟知識(shí)庫的這篇文章建議重載CWnd::OnSetCursor()來實(shí)現(xiàn)。但是這種方法有一個(gè)缺點(diǎn),就是當(dāng)設(shè)置鼠標(biāo)光標(biāo)及還原時(shí)都會(huì)出現(xiàn)令人討厭的光標(biāo)閃爍。
??? 如果應(yīng)用程序中要使用幾個(gè)不同的鼠標(biāo)光標(biāo),為了不發(fā)生任何光標(biāo)閃爍,本文介紹一種方法:首先按照微軟知識(shí)庫文章所說重載PreCreateWindow函數(shù),但是不要指定要使用的鼠標(biāo)光標(biāo),而是使用NULL。這樣就防止了Windows或MFC針對(duì)鼠標(biāo)指針做任何操作。
BOOL CMyView::PreCreateWindow(CREATESTRUCT& cs)
{
// 創(chuàng)建自己的窗口類,窗口不設(shè)置光標(biāo),以便根據(jù)需要進(jìn)行設(shè)置?
if (cs.lpszClass == NULL)
cs.lpszClass = AfxRegisterWndClass(CS_DBLCLKS);
return CScrollView::PreCreateWindow(cs);
}
??? 因?yàn)榇翱陬悰]有任何事先指定好的的鼠標(biāo)指針,所以以上代碼有效地派出了光標(biāo)的閃爍。(注意這段代碼創(chuàng)建的窗口類也沒有背景刷,所以窗口的背景色需要自己畫。為此要向函數(shù)AfxRegisterWndClass()傳遞第三個(gè)參數(shù)作為背景刷。)
??? 光標(biāo)的閃爍是消除了,但同時(shí)光標(biāo)也沒了!不用擔(dān)心。在處理鼠標(biāo)事件OnMouseMove時(shí)設(shè)置光標(biāo)是很容易的事情。實(shí)踐證明,如果要在應(yīng)用窗口中改變鼠標(biāo)指針,在OnMouseMove事件處理模塊中設(shè)置光標(biāo)是最方
便的。
void CMyView::OnMouseMove(UINT nFlags, CPoint point)
{
// 設(shè)置光標(biāo)表示當(dāng)前的操作
if (m_nOperation == OPERATION_1)
::SetCursor(AfxGetApp()->LoadStandardCursor(IDC_CROSS));
else if (m_nOperation == OPERATION_2)
::SetCursor(AfxGetApp()->LoadStandardCursor( ??? ));
else // 普通光標(biāo)指針
::SetCursor(AfxGetApp()->LoadStandardCursor(IDC_ARROW));
}
盡管要做一點(diǎn)額外的工作,但它實(shí)現(xiàn)了應(yīng)用中不同的鼠標(biāo)指針變化,同時(shí)消除了閃爍。
from: http://www.vckbase.com/vckbase/vckbase9/vc/nonctrls/system_30/0930003.htm
??? 如果在應(yīng)用程序中要?jiǎng)討B(tài)改變鼠標(biāo)光標(biāo),微軟知識(shí)庫的這篇文章建議重載CWnd::OnSetCursor()來實(shí)現(xiàn)。但是這種方法有一個(gè)缺點(diǎn),就是當(dāng)設(shè)置鼠標(biāo)光標(biāo)及還原時(shí)都會(huì)出現(xiàn)令人討厭的光標(biāo)閃爍。
??? 如果應(yīng)用程序中要使用幾個(gè)不同的鼠標(biāo)光標(biāo),為了不發(fā)生任何光標(biāo)閃爍,本文介紹一種方法:首先按照微軟知識(shí)庫文章所說重載PreCreateWindow函數(shù),但是不要指定要使用的鼠標(biāo)光標(biāo),而是使用NULL。這樣就防止了Windows或MFC針對(duì)鼠標(biāo)指針做任何操作。
BOOL CMyView::PreCreateWindow(CREATESTRUCT& cs)
{
// 創(chuàng)建自己的窗口類,窗口不設(shè)置光標(biāo),以便根據(jù)需要進(jìn)行設(shè)置?
if (cs.lpszClass == NULL)
cs.lpszClass = AfxRegisterWndClass(CS_DBLCLKS);
return CScrollView::PreCreateWindow(cs);
}
??? 因?yàn)榇翱陬悰]有任何事先指定好的的鼠標(biāo)指針,所以以上代碼有效地派出了光標(biāo)的閃爍。(注意這段代碼創(chuàng)建的窗口類也沒有背景刷,所以窗口的背景色需要自己畫。為此要向函數(shù)AfxRegisterWndClass()傳遞第三個(gè)參數(shù)作為背景刷。)
??? 光標(biāo)的閃爍是消除了,但同時(shí)光標(biāo)也沒了!不用擔(dān)心。在處理鼠標(biāo)事件OnMouseMove時(shí)設(shè)置光標(biāo)是很容易的事情。實(shí)踐證明,如果要在應(yīng)用窗口中改變鼠標(biāo)指針,在OnMouseMove事件處理模塊中設(shè)置光標(biāo)是最方
便的。
void CMyView::OnMouseMove(UINT nFlags, CPoint point)
{
// 設(shè)置光標(biāo)表示當(dāng)前的操作
if (m_nOperation == OPERATION_1)
::SetCursor(AfxGetApp()->LoadStandardCursor(IDC_CROSS));
else if (m_nOperation == OPERATION_2)
::SetCursor(AfxGetApp()->LoadStandardCursor( ??? ));
else // 普通光標(biāo)指針
::SetCursor(AfxGetApp()->LoadStandardCursor(IDC_ARROW));
}
盡管要做一點(diǎn)額外的工作,但它實(shí)現(xiàn)了應(yīng)用中不同的鼠標(biāo)指針變化,同時(shí)消除了閃爍。
from: http://www.vckbase.com/vckbase/vckbase9/vc/nonctrls/system_30/0930003.htm
posted on 2006-09-29 11:18 weidagang2046 閱讀(2585) 評(píng)論(0) 編輯 收藏 所屬分類: Windows