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

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 閱讀(605) 評論(0)  編輯 收藏 引用 所屬分類: C/C++體會

導航

統計

常用鏈接

留言簿(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>
            午夜久久美女| 亚洲精选国产| 久久精品欧洲| 久久丁香综合五月国产三级网站| 国产精品视频yy9299一区| 午夜精品久久久久久久男人的天堂| 一区二区三区国产盗摄| 国产精品网站视频| 久久婷婷蜜乳一本欲蜜臀| 老司机精品视频网站| 亚洲乱码国产乱码精品精| 亚洲乱码国产乱码精品精| 欧美特黄一级大片| 久久激情综合| 美女在线一区二区| 亚洲视频一区在线| 亚洲免费视频成人| 亚洲欧洲一级| 亚洲一区日韩| 亚洲国产婷婷综合在线精品| 一本色道久久综合狠狠躁篇怎么玩| 国产精品乱码一区二区三区| 久久青青草综合| 欧美激情一区二区| 久久国内精品自在自线400部| 久久综合九色综合久99| 宅男噜噜噜66一区二区| 久久久xxx| 亚洲午夜精品视频| 久久久噜噜噜| 欧美一区=区| 欧美久久久久| 美女久久一区| 国产色视频一区| 亚洲人体偷拍| 国产视频精品免费播放| 亚洲激情在线播放| 国产综合网站| 亚洲国产欧美另类丝袜| 亚洲欧美日韩中文在线制服| 久久综合国产精品台湾中文娱乐网| 一区二区三区色| 久久久久久久久蜜桃| 亚洲在线免费视频| 欧美精品自拍偷拍动漫精品| 老司机免费视频一区二区| 国产精品毛片va一区二区三区| 欧美成人免费在线| 国产综合精品| 亚洲女人天堂av| 亚洲欧美国产不卡| 欧美日韩一区二区免费视频| 欧美不卡视频一区| 激情六月婷婷综合| 欧美亚洲综合在线| 欧美中文在线免费| 国产伦精品一区二区三区| 99热这里只有精品8| 一本色道久久综合精品竹菊| 免费观看在线综合| 欧美不卡高清| 最新国产拍偷乱拍精品| 久久综合亚洲社区| 免费欧美日韩| 亚洲国产精品黑人久久久 | 最新亚洲视频| 欧美成人三级在线| 亚洲国产成人久久| 日韩视频永久免费观看| 欧美大片在线看免费观看| 欧美成人激情在线| 亚洲欧洲一区二区三区在线观看| 免费成人av资源网| 亚洲区一区二区三区| 99国产精品99久久久久久| 欧美美女日韩| 一区二区免费在线观看| 亚洲女同性videos| 国产喷白浆一区二区三区| 午夜国产精品视频免费体验区| 午夜精品久久久久久久男人的天堂 | 午夜一区二区三区不卡视频| 久久国产综合精品| 亚洲国产99精品国自产| 欧美精品激情在线观看| 中文欧美日韩| 久久久噜噜噜久噜久久| 亚洲欧洲免费视频| 国产精品h在线观看| 性欧美18~19sex高清播放| 美日韩丰满少妇在线观看| 亚洲国产日韩精品| 国产精品久久久久77777| 欧美一区二区三区四区高清| 免费看的黄色欧美网站| 亚洲一区二区在线| 国产一区二区三区久久久久久久久 | 欧美成人一区二区三区片免费| 亚洲美女视频在线观看| 国产日韩欧美一区在线| 亚洲一区二区三区三| 在线视频观看日韩| 欧美日本一道本| 香蕉成人伊视频在线观看| 久久最新视频| 亚洲一区二区三区免费观看 | 欧美成人中文字幕| 亚洲午夜精品视频| 欧美激情女人20p| 午夜一区二区三区不卡视频| 亚洲国产精品一区二区www| 国产精品久久久久免费a∨| 久久在线精品| 亚洲一区视频| 亚洲毛片播放| 牛牛影视久久网| 欧美一级理论性理论a| 亚洲精品免费一二三区| 国产日韩欧美不卡| 国产精品第一页第二页第三页| 久久久www成人免费毛片麻豆| 中国成人黄色视屏| 亚洲人成网站777色婷婷| 久久欧美中文字幕| 欧美一区二区在线观看| 亚洲视频在线观看免费| 亚洲精品国产精品国自产观看| 国内精品嫩模av私拍在线观看| 欧美午夜一区二区三区免费大片| 你懂的亚洲视频| 久久精品亚洲| 欧美在线你懂的| 午夜精品成人在线| 一区二区国产精品| 99国产精品自拍| 亚洲人成在线影院| 亚洲精品国产精品久久清纯直播 | 一区二区三区 在线观看视| 欧美韩国一区| 欧美福利视频一区| 免费观看一区| 欧美大片专区| 亚洲国产精品久久久久婷婷884| 猫咪成人在线观看| 欧美大片在线看| 亚洲第一页在线| 亚洲电影免费| 亚洲精品一级| 一本色道久久综合亚洲精品小说 | 久久精品一区| 久久精品亚洲乱码伦伦中文| 久久精品视频亚洲| 久久久国产一区二区三区| 欧美在线一区二区三区| 久久黄金**| 欧美激情按摩在线| 亚洲欧洲在线观看| 一个色综合导航| 亚洲欧美清纯在线制服| 欧美在线视频全部完| 久久久久九九九九| 欧美电影美腿模特1979在线看| 欧美黄色一级视频| 欧美午夜一区| 狠狠色狠狠色综合人人| 在线欧美日韩精品| 亚洲色诱最新| 久久精品中文| 亚洲国产精品久久久久秋霞蜜臀| 99xxxx成人网| 久久久精品欧美丰满| 欧美人与禽猛交乱配视频| 国产精品一二三四区| 午夜精品一区二区三区电影天堂| 日韩午夜激情| 欧美一区二区三区在线免费观看 | 亚洲自拍电影| 久久免费精品视频| 欧美日韩免费一区二区三区视频| 国产日韩欧美在线播放| 亚洲日本理论电影| 欧美在线999| 亚洲国产精品成人综合色在线婷婷| 夜夜夜精品看看| 久久精品一区二区| 欧美视频网站| 亚洲国产精品va在看黑人| 亚洲小说欧美另类社区| 久久亚洲综合网| 一区二区欧美在线| 欧美jizzhd精品欧美巨大免费| 国产精品激情| 亚洲精品一区二区三区在线观看| 欧美一区二区成人| 亚洲免费av观看| 美国十次了思思久久精品导航| 国产精品久久777777毛茸茸| 亚洲国产精品va在看黑人| 欧美在线观看网址综合| 亚洲精品一区在线|