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

huaxiazhihuo

 

類設(shè)計(jì)一則,GDI對(duì)象選入器

        雖然很痛恨MFC,但還是要經(jīng)常使用MFC開發(fā)界面,雖然MFC怎么怎么的不好,但還是可以應(yīng)付一般的界面要求,而且其運(yùn)行效率也可以接受,關(guān)于這一點(diǎn),它在WINDOWS3.1之時(shí),就已經(jīng)能勝任了,并且在下現(xiàn)在使用MFC,基本上也能隨心所欲了,想怎么整就怎么整。為了減少以后浪費(fèi)在MFC上的時(shí)間,我決定重構(gòu)一套著名的MFC上的界面庫。界面庫這個(gè)東西,大家都知道,其各種美觀的界面,基本上都是一筆一筆畫出來的,代碼中大量地使用了DC的各種操作,不可避免,就一再出現(xiàn)了好比以下類似的代碼:

    HPEN pen = CreatePen(……);
    HPEN oldPen 
= (HPEN)SelectObject(hDC, oldPen);
    SelectObject(hDC, pen);
      ........
    DeleteObject(pen);

 

 

        這些代碼,既無味,寫起來又容易出錯(cuò),它存在3個(gè)很明顯的問題:1SelectObject使用了類型轉(zhuǎn)換,一不小心,自然就轉(zhuǎn)換錯(cuò)了,MFC中通過對(duì)象指針,內(nèi)部做了轉(zhuǎn)換,避免了這個(gè)問題;2、要將舊有的GDI對(duì)象選回DC中,很容易就遺忘了這一步代碼,并且如果要同時(shí)操作幾個(gè)DC的時(shí)候(這種情況較少見),在選回舊GDI對(duì)象時(shí),那就更容易出錯(cuò)了;3、還要?jiǎng)h除對(duì)象,這個(gè),MFC中通過GDI對(duì)象的構(gòu)造函數(shù)來消除這個(gè)問題。這樣也罷了,但還有一個(gè)問題最讓人不能忍受的,就是,代碼中要定義一個(gè)舊的GDI對(duì)象變量,以最后選回設(shè)備環(huán)境之中,因?yàn)槲易钣憛挾x新變量,新函數(shù)了,每次都要變量名和函數(shù)名琢磨半天,當(dāng)然,最討厭的還是編寫重復(fù)的代碼了。于是,我決定編寫一個(gè)類,以免總是要寫這些毫無新意的重復(fù)代碼,希望這個(gè)類是這樣使用的:

CXGdiObjectSelector selector(hDC);
selector.CreatePen(……);
selector.SelectBrush(brush);
  ........

        不需要定義舊的GDI對(duì)象變量,畫圖完成之后,也不需要選回設(shè)備環(huán)境之中了,也不需要手工刪除之前創(chuàng)建的GDI對(duì)象,一切,這個(gè)類都幫你代勞了,咦,這么神奇,它是如何做到的,自然是析構(gòu)函數(shù),再次向偉大的析構(gòu)函數(shù)致以最高敬意。這個(gè)類,比之于剛開始的手工打造,它需要執(zhí)行構(gòu)造函數(shù),以保存hDC到內(nèi)部成員變量,很明顯,多了一步賦值操作,此外,可以預(yù)料,這個(gè)類里面應(yīng)該還有其他的初始化操作,這又是不可避免的多余代碼。當(dāng)然,這里的多余,都是我能接受的,我也深知,既要馬兒,又要馬兒不吃草,那是不可能的神話。但是,在實(shí)現(xiàn)這個(gè)類的時(shí)候,我想了種種辦法,包括模板元編程也祭上了,始終還是存在其他多余的操作,再次審視剛剛開始的一段代碼,不得不承認(rèn),它丑是丑了點(diǎn),但執(zhí)行的效率確實(shí)真他媽的高,而且所占的空間也很少,全部沒有一丁點(diǎn)多余之處。好了,進(jìn)入我們的類的實(shí)現(xiàn)。

class CXGdiObjectSelector
{
public:
    CXGdiObjectSelector(HDC hDC)
    
{
        ASSERT(hDC 
!= NULL);
        m_hDC 
= hDC;
        m_nSelectedFlags 
= 0;
        m_nCreatedFlags 
= 0;
    }


    
~CXGdiObjectSelector();

    
void SelectPen(HPEN pen)
    
{
        replaceObject(pen, XFLAG_PEN);
    }


    
void SelectBrush(HPEN brush);
      ........

    
bool CreatePen()
    
{
        HPEN hPen 
= CreatePen();
        
if (hPen == NULL)
            
return false;
        replaceObject(hPen, XFLAG_PEN);
        m_nCreatedFlags 
|= XFLAG_PEN;
        
return true;
    }

      ........

private:
    CXGdiObjectSelector(
const CXGdiObjectSelector&);
    
void operator = CXGdiObjectSelector(const CXGdiObjectSelector&);
    
enum {__nGDI_SIZE = 5};
    
enum {XFLAG_PEN=1, XFLAG_BRUSH=2, XFLAG_FONT=4, XFLAG_BITMAP=8, XFLAG_REGION=16};
    HDC  m_hDC;     
    HGDIOBJ m_hOldGdis[__nGDI_SIZE];
    WORD m_nSelectedFlags;
    WORD m_nCreatedFlags;
}
;

        整個(gè)類的定義的還是很直觀。只是那一組創(chuàng)建GDI對(duì)象的成員函數(shù),顯得有點(diǎn)格格不入,根據(jù)單一職責(zé)原則,實(shí)在不應(yīng)該加入這些東西,但是,加入這些操作,確實(shí)會(huì)給使用的時(shí)候帶來極大的方便。至于禁用了拷貝和賦值函數(shù),感覺有點(diǎn)多此一舉,但是為了滿足某些C++潔癖者的強(qiáng)迫癥,我還是做了妥協(xié)。這個(gè)類其他代碼的實(shí)現(xiàn),相當(dāng)簡單,我就不贅述了。

        公道自在人心,這個(gè)類在選入選出GDI對(duì)象,毫無疑問,確實(shí)方便安全,但是它以犧牲執(zhí)行效率和空間為代價(jià)。代碼編寫,不外乎是在做各種各樣的權(quán)衡,有時(shí)付出類型安全,以換取更大的靈活性;有時(shí)又以付出靈活性,以換取類型的安全;有時(shí)以通用性換取效率;有時(shí)又要以效率換取通用。不能簡單地說這種權(quán)衡好不好,只能說更加合適而已,在某一處上,比較強(qiáng)調(diào)什么,就以犧牲其他的特性來得到,謹(jǐn)記80%20%的原則。C++的深入人心,在于它不剝奪程序員選擇的權(quán)利,同時(shí)它又提供了豐富的特性,以供你做各種各樣的交換。通用、靈活、效率、安全,這四者總是不可協(xié)調(diào)的矛盾。MFC框架的最大錯(cuò)誤就在于:犧牲了很大很大的靈活、效率、通用,最后只獲得了一點(diǎn)點(diǎn)類型安全,這無疑是失敗的交換。

posted on 2012-06-01 10:56 華夏之火 閱讀(1245) 評(píng)論(5)  編輯 收藏 引用

評(píng)論

# re: 類設(shè)計(jì)一則,GDI對(duì)象選入器[未登錄] 2012-06-01 18:35 春秋十二月

GDI對(duì)象有對(duì)應(yīng)的MFC類,選擇器選擇新的對(duì)象,增加一個(gè)方法reset,功能是選回老對(duì)象,以在任何時(shí)機(jī)可以調(diào)用,而在析構(gòu)函數(shù)實(shí)現(xiàn)中調(diào)用reset即可。  回復(fù)  更多評(píng)論   

# re: 類設(shè)計(jì)一則,GDI對(duì)象選入器 2012-06-01 18:42 華夏之火

不希望代碼只限于MFC中。關(guān)于reset的方法,之前也考慮過,但覺得沒有太多的必要,現(xiàn)在類中多增加一個(gè)可有可無的方法,都覺得很難受。@春秋十二月
  回復(fù)  更多評(píng)論   

# re: 類設(shè)計(jì)一則,GDI對(duì)象選入器 2012-06-01 21:06 春秋十二月

呵呵,你的類接口是句柄就行,在win32中一樣可用,反正我覺得你的選擇類創(chuàng)建GDI對(duì)象,那是不明智的做法。  回復(fù)  更多評(píng)論   

# re: 類設(shè)計(jì)一則,GDI對(duì)象選入器 2012-06-01 21:08 春秋十二月

不用某個(gè)方法,不等于不存在這個(gè)需求和必要性。隨著時(shí)間推移,當(dāng)改進(jìn)完善你的類時(shí),就會(huì)作出變化的。  回復(fù)  更多評(píng)論   

# re: 類設(shè)計(jì)一則,GDI對(duì)象選入器 2012-06-01 23:05 華夏之火

確實(shí)創(chuàng)建GDI對(duì)象,是有點(diǎn)不明智,但使用起來,確實(shí)很方便,它是創(chuàng)建了GDI對(duì)象之后,就選入DC中,最后析構(gòu)函數(shù)中或者再選入新的對(duì)象,會(huì)被選出來,然后給予刪除。至于那個(gè)reset,你說的也有道理,但是原本的職責(zé)中,本來就不想給用戶提供reset的機(jī)會(huì)@春秋十二月
  回復(fù)  更多評(píng)論   


只有注冊用戶登錄后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


導(dǎo)航

統(tǒng)計(jì)

常用鏈接

留言簿(6)

隨筆分類

隨筆檔案

搜索

積分與排名

最新評(píng)論

閱讀排行榜

評(píng)論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲国产精品电影在线观看| 亚洲免费婷婷| 裸体一区二区三区| 久热国产精品视频| 亚洲三级色网| 一区二区三区色| 国产日产亚洲精品| 农村妇女精品| 欧美日韩国产综合一区二区| 亚洲天堂免费观看| 亚洲欧美另类国产| 亚洲电影免费| 在线亚洲成人| 国产一区二区| 最新日韩av| 国产视频观看一区| 欧美黑人国产人伦爽爽爽| 欧美日韩国产一中文字不卡| 99国产精品国产精品毛片| 亚洲欧美中文另类| 激情视频一区二区| 日韩视频免费观看| 国内揄拍国内精品久久| 亚洲青色在线| 国产午夜一区二区三区| 91久久亚洲| 黄页网站一区| 一区二区三区四区五区视频 | 欧美激情欧美激情在线五月| 欧美日韩国内| 欧美国产视频一区二区| 国产精品视频福利| 亚洲第一精品福利| 国产亚洲精品久久久久动| 亚洲免费av观看| 伊人久久大香线蕉av超碰演员| 亚洲日韩欧美视频| 伊人久久亚洲热| 亚洲综合导航| 亚洲无线一线二线三线区别av| 久久久av毛片精品| 新67194成人永久网站| 欧美激情在线免费观看| 麻豆精品精华液| 国产精品中文字幕欧美| 亚洲精品乱码久久久久久按摩观| 国内揄拍国内精品久久| 亚洲综合欧美日韩| 亚洲一区一卡| 欧美日韩国产综合一区二区| 欧美大片va欧美在线播放| 国产在线乱码一区二区三区| 一区二区三区偷拍| 在线视频亚洲欧美| 欧美精品久久一区| 亚洲国产日韩一区| 亚洲美女免费精品视频在线观看| 久久精品国产清高在天天线| 欧美一区亚洲| 国产日韩精品一区| 欧美亚洲色图校园春色| 欧美与黑人午夜性猛交久久久| 欧美视频四区| 亚洲视频中文| 性欧美办公室18xxxxhd| 国产精品乱码人人做人人爱| 亚洲一级黄色| 欧美在线视频一区二区| 国产女主播一区二区三区| 亚洲欧美春色| 久久久青草婷婷精品综合日韩| 国产一区二区三区黄| 欧美在线你懂的| 另类春色校园亚洲| 久久综合九色综合久99| 欧美性大战久久久久久久蜜臀| 亚洲精品午夜| 亚洲网站啪啪| 国产精品v日韩精品| 中文精品在线| 亚洲桃色在线一区| 国产精品一卡二| 久久大逼视频| 免费亚洲电影| 一区二区三区蜜桃网| 国产精品久久久久9999吃药| 亚洲免费中文字幕| 免费不卡欧美自拍视频| 亚洲欧洲偷拍精品| 国产精品丝袜xxxxxxx| 久久国产欧美| 一区二区三区免费网站| 亚洲第一页在线| 亚洲精品乱码久久久久久久久| 欧美国产欧美亚洲国产日韩mv天天看完整 | 欧美乱妇高清无乱码| 亚洲一区二区三区777| 久久夜色精品国产欧美乱| 最近中文字幕日韩精品 | 国产欧美韩国高清| 久久亚洲综合| 亚洲一区精彩视频| 欧美成人激情在线| 午夜亚洲一区| 亚洲人成免费| 国内视频精品| 国产精品久久久久久av下载红粉 | 欧美日韩亚洲一区三区| 久久精品国产视频| 亚洲午夜精品一区二区三区他趣| 麻豆精品91| 午夜久久福利| av成人天堂| …久久精品99久久香蕉国产| 国产精品第一区| 欧美激情第8页| 久久久欧美精品sm网站| 亚洲综合精品自拍| 一本到高清视频免费精品| 欧美风情在线观看| 久久亚洲一区二区三区四区| 午夜精品视频在线观看| 99精品99| 亚洲免费观看在线观看| 在线观看一区二区视频| 国产欧美日韩亚洲精品| 欧美午夜一区| 欧美午夜精品| 欧美日韩黄色大片| 欧美激情二区三区| 你懂的视频一区二区| 久久国产黑丝| 久久不射电影网| 久久精品导航| 久久伊伊香蕉| 亚洲欧美国产不卡| 在线视频中文亚洲| 99热免费精品| 日韩一级欧洲| 亚洲九九爱视频| 日韩亚洲精品在线| 亚洲乱码一区二区| 亚洲激情图片小说视频| 伊甸园精品99久久久久久| 国产婷婷色一区二区三区在线| 欧美日韩视频第一区| 欧美日韩一区二区欧美激情| 欧美精品综合| 欧美午夜在线观看| 国产精品丝袜xxxxxxx| 国产精品自在在线| 国产在线观看一区| 亚洲高清自拍| 99热在线精品观看| 午夜视频一区二区| 久久久久女教师免费一区| 久久人人97超碰国产公开结果| 久久午夜电影网| 免费在线亚洲| 久久久综合精品| 免费在线观看精品| 欧美另类高清视频在线| 欧美日韩另类在线| 国产欧美日韩精品在线| 国模私拍一区二区三区| 在线成人亚洲| 一区二区三区国产在线观看| 亚洲欧美精品suv| 久久网站免费| 亚洲精品乱码久久久久久黑人| 在线一区二区三区四区五区| 欧美亚洲专区| 欧美国产精品中文字幕| 国产精品一区二区三区四区 | 国产九九精品视频| 亚洲三级观看| 欧美一区二区在线播放| 欧美高清视频一区二区| 一区二区三区免费看| 久久看片网站| 在线免费观看日韩欧美| 亚洲第一在线视频| 一区二区精品在线观看| 久久精品91久久久久久再现| 免费亚洲网站| 亚洲愉拍自拍另类高清精品| 久久久久女教师免费一区| 欧美午夜大胆人体| 亚洲黄色一区| 久久av老司机精品网站导航| 亚洲国产欧美日韩| 午夜一区二区三区在线观看| 欧美经典一区二区三区| 激情综合五月天| 午夜视频在线观看一区| 亚洲精品久久久久久久久久久久| 久久久久成人精品免费播放动漫| 国产精品福利在线观看网址| 亚洲日本电影在线| 免费欧美在线|