使用Flash做界面美化是一種較為常見的方式,F(xiàn)LASH動畫制做簡單,美觀大方,而且將FLASH嵌入到應(yīng)用程序界面上也是非常容易的,只要放置一個Shockwave Flash控件即可。但這樣做出來的界面有兩個問題,一是在FLASH上點擊右鍵會有FLASH的菜單,二是在FLASH上點擊的鼠標消息從應(yīng)用程序里是獲取不到的,F(xiàn)LASH控件并不會向用應(yīng)程序發(fā)送WM_LBUTTONDOWN等鼠標消息。
解決的辦法應(yīng)該有很多,我使用了自定義窗口過程的方法,經(jīng)過試驗效果不錯。以下都基于Visual C++ 6.0和MFC環(huán)境:
首先需要為Flash控件生成變量,這一步借助ClassWizard可以輕松完成,略過。假如我們生成的Flash對象名為m_Flash1。下面就通過SetWindowLong函數(shù)為Flash控件自定義一個窗口過程:
LONG oldWndPRoc = NULL;
oldWndProc = ::SetWindowLong(m_Flash1.m_hWnd, GWL_WNDPROC, (LONG)MyProc);
其中m_Flash1.m_hWnd用來取得FLASH控件的窗口句柄,常數(shù)GWL_WNDPROC表示我們要修改的是窗口過程,MyProc是一個自定義的窗口過程,函數(shù)返回舊的窗口過程的地址。下面就是這個自定義的窗口過程:
LONG MyProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
...{
if(msg == WM_RBUTTONDOWN) // 屏蔽右鍵
return 0;
return CallWindowProc((WNDPROC)oldWndProc, hwnd, msg, wParam, lParam); //調(diào)用原來的窗口過程
}
這里通過判斷消息的類型是不是右鍵按下來屏蔽右鍵菜單,如果右鍵被按下,那么函數(shù)就直接返回,不去調(diào)用原來的窗口過程,因此右鍵菜單就不會出現(xiàn)了。如果要捕獲鼠標左鍵消息,也可以在這里來處理,例如,下面的代碼插在return語句之前則可以實現(xiàn)鼠標左鍵在FLASH上拖動時窗口可以隨之拖動的效果:
if(msg == WM_LBUTTONDOWN)
PostMessage(AfxGetApp()->m_pMainWnd->m_hWnd, WM_NCLBUTTONDOWN, HTCAPTION, 0);值得注意的是,這里我只是向消息隊列里又發(fā)送了一個WM_NCLBUTTONDOWN消息,而并沒有讓函數(shù)返回,因此后面的CallWindowProc仍然會被調(diào)用,因此并不會影響到FLASH本身對鼠標左鍵的處理,使用起來效果很好,幾乎看不出來這里是用FLASH制做的了。
http://blog.csdn.net/songthin/archive/2007/02/14/1510210.aspx
新聞熱點
疑難解答