• <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>

            zyzx的小窩

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

             

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

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

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

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

            ??????? 這里由于跟窗口(GDI對象)有關,從簡來說:無非是左鍵按下啊,拖動啊,再到釋放左鍵執行操作,或是右鍵的啥啊啥的。。他們的共通之處:(由于與DC相關,參數可酌情考慮)
            ?????? Class CUIToolsBase : public XXX(?)
            ?????? {
            ?????? public:
            ????????????? virtual void OnMouseDown( UINT nFlags, CPoint point ) = 0; ????? //鼠標點下,參數按MFC格式
            ?????? ?????? virtual void OnMouseUp( UINT nFlags, CPoint point ) = 0;??????????? //鼠標彈起
            ?????? ?????? virtual void OnMouseMove( UINT nFlags, CPoint point ) = 0;?????? //鼠標移動
            ????????????? virtual void OnMouseDraging( UINT nFlags, CPoint point ) = 0;?????? //鼠標拖動
            ????? ????? …………
            ??????? public:
            ????????????? CUIToolsBase ();
            ????????????? virtual ~CUIToolsBase();
            ?????? protected:
            ????????????? virtual void Execute() = 0;??????????????????????????????????????????????????????????? //執行本Tool的操作
            ?????? };
            而其他的Tool都從本類繼承而來。
            ???
            比如選擇框的Tool
            ???? CUIToolsSelect : public CUIToolsBase
            ???? {
            ???? public:
            ????????? virtual void OnMouseDown( UINT nFlags, CPoint point )????????????????????? //實現代碼最好寫在cpp文件中,懶下
            ????????? {
            ???????????????? if( 左鍵 == nFlags /*&& 要判斷鍵盤(Ctrl,Shift,Alt )狀態嗎 */){
            ??????????????????????? m_StartPt = point ;
            ??????????????????????? m_EndPt = point;
            ???????????????? }
            ????????? }?????
            ????????? virtual void OnMouseDraging( UINT nFlags, CPoint point )
            ????????? {
            ??????????????? if( 左鍵 == nFlags /*&& 要判斷鍵盤(Ctrl,Shift,Alt )狀態嗎 */){
            ??????????????????????? if( !m_DrawRect ){
            ????????????????????????????? XXX( m_StartPt, point );???????????????? //異或方式在CDC上繪制矩形框,第一次繪制
            ??????????????????????? }else{
            ????????????????????????????? XXX( m_StartPt, m_EndPt );????????? //異或方式在CDC上清除上一次繪制的矩形框
            ????????????????????????????? XXX( m_StartPt, point );??????????????? //異或方式在CDC上繪制當前矩形框
            ??????????????????????? }
            ??????????????????????? m_EndPt = point;
            ???????????????? }
            ??????????? }
            ?????????? virtual void OnMouseUp( UINT nFlags, CPoint point )
            ?????????? {
            ??????????????? if( 左鍵 == nFlags /*&& 要判斷鍵盤(Ctrl,Shift,Alt )狀態嗎 */){
            ??????????????????????? 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 );???????????? //執行選擇操作
            ?????????????????? //這里也可以按Command模式只發出命令
            ??????????? }
            ?????
            ????? private:
            ??????????????? CPoint m_StartPt;??????????? //啟始點
            ??????????????? CPoint m_EndPt;???????????? //結束點
            ??????????? bool???? m_DrawRect;?????? //是否已經繪制矩形框標志,初始化為false!
            ????? };
            ?????
            如下圖:
            Tools方法08-05-23.png

            在要設置Tools的窗口內作如下處理:
            ??????? CWorkWnd : public XXXX
            ??????? {
            ??????? public:
            ????????????? 構造,析構......
            ????????????? enum{
            ?????????????????? UITOOLS_UNKNOW = 0,
            ?????????????????? UITOOLS_SELECT,
            ?????????????????? UITOOLS_ERASE,
            ?????????????????? UITOOLS_LINE,
            ?????????????????? ......
            ?????????????????? UITOOLS_COUNT = ?
            ????????????? }
            ??????? public:
            ????????????? void SetCurrentTool( int tool ){?????????????????????????????????????? ?? // 外部調用此方法設置Tool
            ???????????????????? XXXXX???????????????????????????????????????????????????????????????????????? // 相關前處理
            ???????????????????? 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;????????????????????? // 只關聯到接口,運行時指定對象
            ?????? }

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

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

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

            導航

            統計

            常用鏈接

            留言簿(1)

            隨筆分類

            隨筆檔案

            常用鏈接

            搜索

            最新評論

            閱讀排行榜

            評論排行榜

            www亚洲欲色成人久久精品| 久久人人超碰精品CAOPOREN| 久久天天躁狠狠躁夜夜2020| 国产精品对白刺激久久久| 久久99久国产麻精品66| 久久亚洲AV无码精品色午夜麻豆| 久久国产精品国语对白| 久久伊人五月天论坛| 亚洲精品午夜国产va久久| 亚洲国产精品嫩草影院久久| 少妇被又大又粗又爽毛片久久黑人 | 中文字幕亚洲综合久久2| 久久精品国产亚洲AV无码麻豆| 久久久一本精品99久久精品88| 精品国际久久久久999波多野| 国产午夜精品久久久久免费视| 狠狠干狠狠久久| 久久www免费人成看国产片| 亚洲欧洲中文日韩久久AV乱码| 伊人热热久久原色播放www| 人妻少妇久久中文字幕一区二区| 久久精品欧美日韩精品| 国产免费久久精品99久久| 亚洲午夜精品久久久久久app| 少妇内射兰兰久久| 99久久精品这里只有精品| 欧美国产成人久久精品| 亚洲精品乱码久久久久久自慰| 久久精品国产半推半就| 四虎影视久久久免费| 国内精品人妻无码久久久影院 | 久久亚洲天堂| 久久天堂AV综合合色蜜桃网| 91秦先生久久久久久久| 日韩乱码人妻无码中文字幕久久| 久久综合综合久久狠狠狠97色88| 亚洲伊人久久综合影院| 欧美伊香蕉久久综合类网站| 欧美熟妇另类久久久久久不卡| 久久精品国产亚洲5555| 久久精品国产清高在天天线|