青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

zyzx的小窩

C/C++,GUI,個人移動存儲,zyzx_lsl@163.com

 

N(1)Tools方法:用戶工具條功能實現(xiàn)

tag:C++、接口編程、設(shè)計方法 、工具條

/* Create by? zyzx
* Created 2008-05-18
* Modified 2008-05-25
*/
???????
???????? 呵呵,原本想取題為Tools模式的,但想想只是一個慣用法還談不上一種設(shè)計模式。。
???????? 好了,言歸正傳,做用戶界面的時候通常會碰到這個問題:比如,我們?yōu)榻缑孀隽艘幌盗械墓ぞ邫诎粹o,當(dāng)用戶點選按鈕后會設(shè)置程序進入某個狀態(tài),在這種狀態(tài)下,軟件做出相應(yīng)反饋。 如果只做一個或幾個工具,按過程式的方法,還勉強可以接受,但不利于擴展。如果做成軟件,一般可不只幾個工具供用戶選擇了哦。。。
???????? Tools模式,有前人發(fā)表過的思想,但偶楞是沒找著,還是楞楞看開源代碼才明白啥回事的。。。

???????? 舉個簡單的例子:就拿我們常用的Windows自帶的畫圖工具來說,選中左邊的工具欄框選項,在繪圖區(qū)域按下左鍵拖動鼠標(biāo),是在屏幕上繪制虛線框,執(zhí)行選框操作;選中直線,在繪圖區(qū)域按下左鍵拖動鼠標(biāo),是繪制直線,執(zhí)行繪直線操作;選中橡皮,在繪圖區(qū)域按下左鍵拖動鼠標(biāo),執(zhí)行擦除操作………

??????? 這里由于跟窗口(GDI對象)有關(guān),從簡來說:無非是左鍵按下啊,拖動啊,再到釋放左鍵執(zhí)行操作,或是右鍵的啥啊啥的。。他們的共通之處:(由于與DC相關(guān),參數(shù)可酌情考慮)
?????? Class CUIToolsBase : public XXX(?)
?????? {
?????? public:
????????????? virtual void OnMouseDown( UINT nFlags, CPoint point ) = 0; ????? //鼠標(biāo)點下,參數(shù)按MFC格式
?????? ?????? virtual void OnMouseUp( UINT nFlags, CPoint point ) = 0;??????????? //鼠標(biāo)彈起
?????? ?????? virtual void OnMouseMove( UINT nFlags, CPoint point ) = 0;?????? //鼠標(biāo)移動
????????????? virtual void OnMouseDraging( UINT nFlags, CPoint point ) = 0;?????? //鼠標(biāo)拖動
????? ????? …………
??????? public:
????????????? CUIToolsBase ();
????????????? virtual ~CUIToolsBase();
?????? protected:
????????????? virtual void Execute() = 0;??????????????????????????????????????????????????????????? //執(zhí)行本Tool的操作
?????? };
而其他的Tool都從本類繼承而來。
???
比如選擇框的Tool
???? CUIToolsSelect : public CUIToolsBase
???? {
???? public:
????????? virtual void OnMouseDown( UINT nFlags, CPoint point )????????????????????? //實現(xiàn)代碼最好寫在cpp文件中,懶下
????????? {
???????????????? if( 左鍵 == nFlags /*&& 要判斷鍵盤(Ctrl,Shift,Alt )狀態(tài)嗎 */){
??????????????????????? m_StartPt = point ;
??????????????????????? m_EndPt = point;
???????????????? }
????????? }?????
????????? virtual void OnMouseDraging( UINT nFlags, CPoint point )
????????? {
??????????????? if( 左鍵 == nFlags /*&& 要判斷鍵盤(Ctrl,Shift,Alt )狀態(tài)嗎 */){
??????????????????????? if( !m_DrawRect ){
????????????????????????????? XXX( m_StartPt, point );???????????????? //異或方式在CDC上繪制矩形框,第一次繪制
??????????????????????? }else{
????????????????????????????? XXX( m_StartPt, m_EndPt );????????? //異或方式在CDC上清除上一次繪制的矩形框
????????????????????????????? XXX( m_StartPt, point );??????????????? //異或方式在CDC上繪制當(dāng)前矩形框
??????????????????????? }
??????????????????????? m_EndPt = point;
???????????????? }
??????????? }
?????????? virtual void OnMouseUp( UINT nFlags, CPoint point )
?????????? {
??????????????? if( 左鍵 == nFlags /*&& 要判斷鍵盤(Ctrl,Shift,Alt )狀態(tài)嗎 */){
??????????????????????? if ( m_DrawRect ){
???????????????????????????????? XXX( m_StartPt, m_EndPt );????? //異或方式在CDC上清除上一次繪制的矩形框
???????????????????????????????? m_EndPt = point
???????????????????????????????? m_DrawRect = false;
???????????????????????????????? Execute();
???????????????????????? }
????????????????? }
??????????? }
??????????????
????? public:
??????????? CUIToolsSelect () { Init(); }
???????? ?? virtual ~CUIToolsSelect (){ }

????? protected:
??????????? void Init() { m_StarPt = ??; m_EndPt = ??; m_DrawRect = false; }
??????????? virtual void Execute()
??????????? {
?????????????????? XXXX( m_StartPt, m_EndPt );???????????? //執(zhí)行選擇操作
?????????????????? //這里也可以按Command模式只發(fā)出命令
??????????? }
?????
????? private:
??????????????? CPoint m_StartPt;??????????? //啟始點
??????????????? CPoint m_EndPt;???????????? //結(jié)束點
??????????? bool???? m_DrawRect;?????? //是否已經(jīng)繪制矩形框標(biāo)志,初始化為false!
????? };
?????
如下圖:
Tools方法08-05-23.png

在要設(shè)置Tools的窗口內(nèi)作如下處理:
??????? CWorkWnd : public XXXX
??????? {
??????? public:
????????????? 構(gòu)造,析構(gòu)......
????????????? enum{
?????????????????? UITOOLS_UNKNOW = 0,
?????????????????? UITOOLS_SELECT,
?????????????????? UITOOLS_ERASE,
?????????????????? UITOOLS_LINE,
?????????????????? ......
?????????????????? UITOOLS_COUNT = ?
????????????? }
??????? public:
????????????? void SetCurrentTool( int tool ){?????????????????????????????????????? ?? // 外部調(diào)用此方法設(shè)置Tool
???????????????????? XXXXX???????????????????????????????????????????????????????????????????????? // 相關(guān)前處理
???????????????????? switch( tool ) {
???????????????????? case UITOOLS_SELECT:
?????????????????????????? DoSetCurrentTool( new CUIToolsSelect() );
?????????????????????????? break;
???????????????????? case UITOOLS_ERASE:
?????????????????????????? DoSetCurrentTool( new CUIToolsErase() );
?????????????????????????? break;
???????????????????? case UITOOLS_LINE:
?????????????????????????? DoSetCurrentTool( new CUIToolsLine() );
?????????????????????????? break;
???????????????????? default:
?????????????????????????? break;
???????????????????? }
??? ??? ??? }
?????? protected:
????????????? void OnMouseDown( UINT nFlags, CPoint point ){
???????????????????? if ( m_CurrentTool ) {
???????????????????????????? m_CurrentTool->OnMouseDown( nFlags, point );
???????????????????? }
????????????? }
????????????? void OnMouseUp( UINT nFlags, CPoint point ) {
???????????????????? if ( m_CurrentTool ) {
????????????????????????????? m_CurrentTool->OnMouseUp( nFlags, point );
???????????????????? }
????????????? }
????????????? void OnMouseMove( UINT nFlags, CPoint point ) {
????????????????????? if ( m_CurrentTool ) {
????????????????????????????? m_CurrentTool->OnMouseMove( nFlags, point );
????????????????????? }
????????????? }
????????????? void OnMouseDraging( UINT nFlags, CPoint point ){
????????????????????? if( m_CurrentTool ) {
????????????????????????????? m_CurrentTool->OnMouseDraging( nFlags, point );
????????????????????? }
????????????? }
?????? protected:
????????????? void DoSetCurrentTool( CUIToolsBase* tool ){
????????????????????? if ( m_CurrentTool ) delete m_CurrentTool;
????????????????????? m_CurrentTool = tool;
?????????????? }
?????? ......
?????? private:
?????????????? CUIToolsBase*?????????????? m_CurrentTool;????????????????????? // 只關(guān)聯(lián)到接口,運行時指定對象
?????? }

總結(jié):
??????? 此方法思路比較簡單:無非是先定義一系列接口,在某個模塊( 小到類,函數(shù))中使用接口,執(zhí)行動作由運行時的實際對象決定。關(guān)于這種方式在實際中會碰到很多類似的問題。

擴展:
??????? 為軟件建立統(tǒng)一的Tools管理類,支持多個工具條。。。

posted on 2009-04-27 17:00 zyzx 閱讀(612) 評論(0)  編輯 收藏 引用 所屬分類: C/C++體會

導(dǎo)航

統(tǒng)計

常用鏈接

留言簿(1)

隨筆分類

隨筆檔案

常用鏈接

搜索

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            影院欧美亚洲| 欧美在线视频一区二区三区| 99精品欧美| 欧美日韩一区二区三区免费看| 亚洲精品男同| 亚洲欧美日韩成人| 韩日视频一区| 欧美成人一区二区在线| 亚洲精品欧美专区| 性色av香蕉一区二区| 国产亚洲欧美日韩精品| 美女脱光内衣内裤视频久久影院 | 亚洲国产精品黑人久久久| 你懂的国产精品永久在线| 亚洲九九爱视频| 欧美一级在线播放| 亚洲福利一区| 国产精品国产三级国产aⅴ入口| 午夜精彩国产免费不卡不顿大片| 牛牛国产精品| 一区二区三区鲁丝不卡| 国产一区二区三区精品欧美日韩一区二区三区 | 欧美wwwwww| 亚洲素人一区二区| 国产一区二区三区免费在线观看 | 亚洲乱码国产乱码精品精| 欧美午夜精品久久久久久孕妇| 午夜精品久久久久| 亚洲激情国产| 久久精品国产成人| 一区二区三区国产盗摄| 国内自拍视频一区二区三区 | 亚洲视频一二区| 国产综合欧美在线看| 欧美日韩在线观看视频| 久久中文在线| 亚洲欧美一区二区精品久久久 | 日韩午夜精品视频| 久久在线免费观看视频| 午夜日韩福利| 99国产精品久久久久老师| 国产综合久久久久久| 国产精品swag| 欧美日韩国产在线播放网站| 久久久久欧美精品| 亚洲伊人伊色伊影伊综合网| 亚洲国产小视频| 久久综合九色综合欧美就去吻| 亚洲欧美精品在线| 日韩一区二区精品视频| 在线观看视频免费一区二区三区 | 美女脱光内衣内裤视频久久网站| 亚洲欧美日韩视频一区| 99国产精品视频免费观看| 亚洲国产电影| 黄色成人av在线| 国产欧美日韩一区二区三区在线| 欧美日韩亚洲高清一区二区| 欧美mv日韩mv国产网站app| 久久久久久亚洲综合影院红桃 | 香蕉av777xxx色综合一区| 一区二区高清视频| 最新日韩中文字幕| 亚洲第一精品福利| 亚洲国产精品精华液2区45| 激情成人av| 尤物99国产成人精品视频| 黑人一区二区| 伊人伊人伊人久久| 一区二区三区中文在线观看| 国内精品久久久久久久影视麻豆 | 一本久久知道综合久久| 亚洲三级影片| 99视频精品免费观看| 99视频一区二区三区| 在线亚洲一区二区| 亚洲夜间福利| 香蕉乱码成人久久天堂爱免费| 亚洲图片欧美午夜| 欧美一区二区| 久久久999成人| 久久夜色精品国产欧美乱极品| 久久天天狠狠| 欧美国产欧美亚州国产日韩mv天天看完整| 女同一区二区| 欧美日韩激情小视频| 国产精品爱啪在线线免费观看| 国产精品久久久久久久久免费桃花| 国产精品你懂的在线| 国产一级一区二区| 亚洲高清在线精品| 一本色道久久综合亚洲精品高清 | 免费在线国产精品| 欧美精品在线一区二区| 欧美视频福利| 国产日韩欧美另类| 亚洲国产欧美日韩精品| 一区二区三区日韩在线观看| 亚洲欧美另类综合偷拍| 久久久视频精品| 亚洲盗摄视频| 中文av一区特黄| 久久精品99国产精品酒店日本| 欧美成人免费在线视频| 国产精品久久久久久久浪潮网站| 国产在线不卡| 亚洲免费激情| 欧美影片第一页| 亚洲观看高清完整版在线观看| av成人激情| 久久久成人网| 国产精品久99| 亚洲国产精品va在线观看黑人| 亚洲无线观看| 牛牛精品成人免费视频| 日韩亚洲精品视频| 久久亚洲精品视频| 国产美女扒开尿口久久久| 在线精品视频免费观看| 亚洲永久免费视频| 欧美国产激情二区三区| 亚洲欧美日韩精品一区二区| 欧美成年人网站| 国产欧美日韩三级| 一区二区精品| 欧美成人亚洲| 亚洲欧美日韩另类| 欧美日韩一区在线观看视频| 在线精品国精品国产尤物884a| 午夜在线观看欧美| 亚洲美女av黄| 欧美成人久久| 韩日欧美一区二区| 欧美一区视频| 这里只有精品电影| 欧美人与性动交cc0o| 在线免费高清一区二区三区| 久久激情婷婷| 在线中文字幕一区| 欧美—级高清免费播放| 亚洲福利视频网| 狼人社综合社区| 先锋影音国产一区| 国产精品女人久久久久久| 中文无字幕一区二区三区| 亚洲高清视频在线| 久热国产精品视频| 精品成人国产| 久久久久国产精品一区三寸| 亚洲伊人观看| 国产精品一区二区三区乱码| 国产精品99久久不卡二区| 亚洲黑丝一区二区| 欧美黑人多人双交| 日韩视频一区二区三区在线播放免费观看 | 国产毛片一区| 欧美一区成人| 一本一本a久久| 欧美日韩三级| 亚洲一区二区三区激情| av成人免费观看| 欧美体内she精视频在线观看| 一区二区三区日韩欧美| 一本色道久久99精品综合| 欧美日韩中文在线| 亚洲中字在线| 亚洲免费综合| 国产一区二区黄| 久久麻豆一区二区| 久久一综合视频| 亚洲人成网站精品片在线观看| 欧美高清视频一区二区| 欧美成人中文| 亚洲视频在线一区观看| 中文久久乱码一区二区| 国产精品婷婷| 卡一卡二国产精品| 欧美成人中文字幕| 亚洲无限av看| 欧美亚洲一级片| 亚洲国产精品尤物yw在线观看| 欧美激情一区二区三区高清视频| 欧美国产成人精品| 亚洲中字黄色| 久久成人在线| 亚洲精品一区二区在线| 夜夜嗨av一区二区三区免费区| 国产精品久久久久久久久久三级| 久久精品国内一区二区三区| 久久综合999| 亚洲午夜精品网| 久久成人精品一区二区三区| 亚洲国产精品成人久久综合一区| 亚洲精品综合精品自拍| 国产麻豆精品久久一二三| 美女精品视频一区| 欧美无砖砖区免费| 美女视频一区免费观看| 欧美日韩一二三区| 久久夜精品va视频免费观看|