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