日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

簡(jiǎn)介鉤子技術(shù)在AutoCAD中的應(yīng)用 - ObjectARX(C++)編程 - Objec...

 viki 2009-05-24
本帖最后由 highflybird 于 2009-5-5 01:19 AM 編輯

很久沒(méi)摸arx,不久看到了一篇介紹鉤子技術(shù)在 AutoCAD中應(yīng)用的文章,不敢獨(dú)享,特此奉獻(xiàn)給大家。

鉤子技術(shù)是很有用的一種技術(shù),它如同給函數(shù)掛上一個(gè)鉤子(我們自己的函數(shù)),讓它在執(zhí)行前先執(zhí)行我們掛的鉤子(我們掛接的函數(shù)),從而達(dá)到攔截事件和函數(shù)調(diào)用等的目的。在autocad中,利用鉤子技術(shù)可以為我們做很多事情:如建立快捷鍵(不希望更改已有菜單),等待或者觸發(fā)特定消息(如鼠標(biāo),鍵盤(pán)),可以獲得比反應(yīng)器更強(qiáng)大的功能,等等。

objectARX提供了幾種向autocad注冊(cè)鉤子函數(shù)的ARX API函數(shù),見(jiàn)下面:

acedRegisterFilterWinMsg,注冊(cè)一個(gè)鉤子函數(shù)
acedRemoveFilterWinMsg,注銷(xiāo)一個(gè)鉤子函數(shù)
acedRegisterWatchWinMsg, 監(jiān)測(cè)鉤子函數(shù)
acedRemoveWatchWinMsg, 移除監(jiān)測(cè)函數(shù)

其具體用法各位不妨參考幫助文件

下面函數(shù)提供一個(gè)例程,該例程定義了一個(gè)快捷命令 Ctrl+I,當(dāng)用戶(hù)按下快捷鍵時(shí)候,autocad 將執(zhí)行appload命令。


我這里采用了向?qū)?/span>方式創(chuàng)建了一個(gè)新工程Hook

采不采用MFC對(duì)這個(gè)程序沒(méi)有影響.



在acrxEntryPoint.cpp 中開(kāi)頭添加如下代碼:
  1. #include <aced.h>               //僅因?yàn)榘姹据^低,所以加了這兩個(gè)
  2. #include <rxmfcapi.h>           //對(duì)于高版本無(wú)須此兩個(gè)
復(fù)制代碼
并申明函數(shù):

  1. //------------------------------------------------------------------------------------------------
  2. //函數(shù)原型及其全局變量申明
  3. void sendCommandToAutoCAD(HWND hWndAcad,CString cmd);   //向AutoCAD窗口發(fā)送字符串命令(cmd)
  4. void watchCtrlI(const MSG * pMsg);        //鉤子監(jiān)測(cè)函數(shù)
  5. void Accelerator(void);              //快捷鍵注冊(cè)函數(shù)
  6. static BOOL filterCtrlKeyDone = FALSE;                 
  7. //------------------------------------------------------------------------------------------------
復(fù)制代碼



函數(shù)定義
  1. void  Accelerator(void)
  2. {
  3. if(filterCtrlKeyDone == TRUE)
  4. {
  5.   acutPrintf(_T("Hook has already been registered!\n")); //如果鉤子已經(jīng)注冊(cè),則返回
  6.   return;
  7. }
  8. if(acedRegisterWatchWinMsg(watchCtrlI) == FALSE)
  9.   acedPrompt(_T("Hook can't be registered!\n"));          //無(wú)法注冊(cè)鉤子
  10. else
  11. {
  12.   acedPrompt(_T("Shortcut Ctrl+I has been defined!\n"));  //快捷命令Ctrl + I 已經(jīng)定義
  13.   filterCtrlKeyDone = TRUE;
  14. }
  15. return;
  16. }
  17. //鉤子監(jiān)測(cè)函數(shù),監(jiān)測(cè)Ctrl+I鍵盤(pán)消息
  18. void watchCtrlI(const MSG *pMsg)
  19. {
  20. if (pMsg->message == WM_CHAR && pMsg->wParam == 9)   //發(fā)生鍵盤(pán)Ctrl + I消息
  21. {
  22.   sendCommandToAutoCAD(adsw_acadMainWnd(), _T("appload\n"));
  23.                 //這里可以是你自己定義的任何函數(shù)
  24. }
  25. return;
  26. }
  27. //向AutoCAD窗口發(fā)送字符串命令(cmd)
  28. void sendCommandToAutoCAD(HWND hWndAcad,CString cmd)
  29. {
  30. if(! hWndAcad)
  31.   return;
  32. COPYDATASTRUCT cmdMsg;
  33. cmdMsg.dwData = (DWORD)1;
  34. cmdMsg.cbData = (DWORD)_tcslen(cmd) + 1;
  35. cmdMsg.lpData = cmd.GetBuffer(cmd.GetLength() + 1);
  36. SendMessage(hWndAcad,WM_COPYDATA,(WPARAM)hWndAcad, (LPARAM)& cmdMsg);
  37. return;
  38. }
復(fù)制代碼


修改一下初始化入口On_kInitAppMsg和卸載函數(shù)On_kUnloadAppMsg

  1. virtual AcRx::AppRetCode On_kInitAppMsg (void *pkt) {
  2.   // TODO: Load dependencies here
  3.   // You *must* call On_kInitAppMsg here
  4.   AcRx::AppRetCode retCode =AcRxArxApp::On_kInitAppMsg (pkt) ;
  5.   
  6.   // TODO: Add your initialization code here
  7.   //我在這里添加到了初始化,如果你感覺(jué)不好的話,可以定義到命令組里
  8.   Accelerator();

  9.   return (retCode) ;
  10. }
  11. virtual AcRx::AppRetCode On_kUnloadAppMsg (void *pkt) {
  12.   // TODO: Add your code here
  13.   // You *must* call On_kUnloadAppMsg here
  14.   AcRx::AppRetCode retCode =AcRxArxApp::On_kUnloadAppMsg (pkt) ;
  15.   // TODO: Unload dependencies here

  16.   //卸載arx程序前卸載鉤子函數(shù)
  17.   if(filterCtrlKeyDone == TRUE)
  18.   {
  19.    acedRemoveWatchWinMsg(watchCtrlI);
  20.    acutPrintf(_T("\nHook has been removed!\n"));
  21.   }

  22.   return (retCode) ;
  23. }
復(fù)制代碼
編譯后,形成arx,加載hook.arx,然后當(dāng)你用快捷鍵的時(shí)候,你就會(huì)發(fā)現(xiàn)彈出appload對(duì)話框了。
最終效果如下圖:
如果你感覺(jué)到代碼不好讀或者有出入,見(jiàn)我下面的附件:
在vs2002 + arx2006 + autocad2006 編譯成功并運(yùn)行正確。

我這個(gè)例子僅僅很簡(jiǎn)單,希望大家討論。
這個(gè)利用鉤子技術(shù)在autocad 中定義快捷命令的思路,具有較大的啟發(fā)意義。因?yàn)?,?duì)于在autocad 平臺(tái)上開(kāi)發(fā)cad系統(tǒng)來(lái)說(shuō),如果直接與autocad建立底層聯(lián)系(如等待或者觸發(fā)特定的消息),利用鉤子技術(shù)是很必要的。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶(hù)發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多