| 導購 | 订阅 | 在线投稿
分享
 
 
 

應用程序上屏蔽FLASH控件的右鍵菜單並獲得左鍵消息

來源:互聯網網民  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
󰈣󰈤
王朝萬家燈火計劃
期待原創作者加盟
 
 
 
>>返回首頁<<
 
 
 
 
 
 熱帖排行
 
 
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有