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

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| 国产精品免费视频xxxx| 国产精品久久二区| 国产伦精品一区二区三区在线观看 | 欧美高清一区| 欧美日韩国产123| 欧美午夜视频在线| 国产综合久久久久久鬼色| 亚洲大胆av| 亚洲影音一区| 麻豆久久婷婷| 一本色道久久综合精品竹菊| 亚洲欧美精品在线| 久久久精品一区二区三区| 欧美高清在线一区| 国产乱码精品一区二区三区av| 在线电影欧美日韩一区二区私密| 亚洲精品免费一二三区| 欧美影院一区| 亚洲欧洲日本一区二区三区| 日韩亚洲精品在线| 久久人91精品久久久久久不卡| 欧美日韩一区在线观看| 亚洲成人在线观看视频| 亚洲女性裸体视频| 欧美大片在线观看一区二区| 亚洲一区二区在线| 欧美电影在线| 一区精品在线播放| 欧美一区亚洲| aⅴ色国产欧美| 亚洲靠逼com| 欧美一区二区精品| 最新69国产成人精品视频免费| 亚洲欧美日韩国产综合精品二区| 欧美二区视频| 激情久久久久| 久久国产精品久久久久久久久久| 亚洲免费观看高清在线观看 | 国产日韩欧美夫妻视频在线观看| 国产婷婷97碰碰久久人人蜜臀| 妖精成人www高清在线观看| 久久久人成影片一区二区三区| 午夜精品久久久久久久久久久久久 | 久久久五月天| 亚洲午夜在线视频| 欧美精品久久久久久久免费观看 | 亚洲欧美中日韩| 99热免费精品在线观看| 噜噜噜91成人网| 好看不卡的中文字幕| 久久riav二区三区| 亚洲男人天堂2024| 欧美一区二区免费| 亚洲精品美女在线观看| 另类亚洲自拍| 1204国产成人精品视频| 久久五月天婷婷| 久久久一本精品99久久精品66| 国产一区二区三区久久悠悠色av| 久久久av水蜜桃| 欧美在线免费观看| 伊人久久亚洲美女图片| 美女图片一区二区| 另类天堂视频在线观看| 亚洲伦理在线免费看| 亚洲精品视频啊美女在线直播| 欧美日韩国产另类不卡| 亚洲一区二区久久| 亚洲网站在线观看| 国产日韩一区| 久久免费偷拍视频| 久热国产精品视频| 日韩写真视频在线观看| 一区二区三区国产盗摄| 国产欧美日韩一区二区三区| 久久精品欧洲| 麻豆国产精品va在线观看不卡| 亚洲激情第一页| 一本久道久久综合婷婷鲸鱼| 国产日韩欧美精品在线| 久久亚洲风情| 你懂的国产精品| 亚洲欧美卡通另类91av| 亚洲尤物影院| 亚洲高清精品中出| 一区二区三区高清视频在线观看| 国产视频一区二区在线观看 | 夜夜躁日日躁狠狠久久88av| 亚洲视频你懂的| 1024国产精品| 欧美日韩视频在线观看一区二区三区 | 久久精品国产亚洲精品| 91久久在线| 亚洲一区二区影院| 亚洲第一网站| 亚洲深夜福利| 亚洲欧洲视频| 午夜宅男欧美| 在线亚洲欧美| 老司机免费视频久久| 亚洲女人天堂av| 欧美99在线视频观看| 香蕉久久夜色| 欧美精品一区二区高清在线观看| 欧美专区日韩视频| 欧美日韩伦理在线| 欧美aⅴ一区二区三区视频| 国产精品二区二区三区| 欧美黄在线观看| 国产资源精品在线观看| 一区二区三区久久网| 亚洲精品韩国| 久久一区中文字幕| 久久精品国产91精品亚洲| 欧美日韩免费高清| 亚洲大片在线观看| 狠狠色狠狠色综合人人| 午夜伦理片一区| 亚洲欧美经典视频| 欧美日韩一区二区在线观看视频 | 亚洲国产成人高清精品| 久久成人久久爱| 欧美在线视频一区二区三区| 国产精品theporn88| 日韩一级精品| 一区二区不卡在线视频 午夜欧美不卡'| 久久久久国产免费免费| 久久久久成人精品| 国产亚洲欧美日韩一区二区| 亚洲永久字幕| 欧美专区亚洲专区| 国产片一区二区| 亚洲一区二区三区中文字幕在线| 亚洲一区二区网站| 国产精品对白刺激久久久| 日韩一区二区电影网| 亚洲视频精品| 国产精品毛片大码女人| 午夜精品网站| 久久在线播放| 亚洲欧洲三级电影| 欧美日韩蜜桃| 午夜欧美理论片| 美女主播视频一区| 亚洲日本无吗高清不卡| 欧美日韩1区2区| 一区二区欧美精品| 欧美在线亚洲一区| 国内精品写真在线观看| 久热国产精品| 日韩一级精品视频在线观看| 欧美一区二区精美| 一本色道精品久久一区二区三区| 欧美日本一区二区三区| 国产精品99久久99久久久二8| 亚洲欧美日韩综合一区| 国产主播在线一区| 欧美顶级艳妇交换群宴| 亚洲天堂成人| 久久亚洲不卡| 在线一区二区三区四区| 国产精品免费一区豆花| 久久午夜国产精品| 亚洲免费激情| 久久亚洲电影| 亚洲午夜女主播在线直播| 国产亚洲第一区| 免费一级欧美片在线播放| a91a精品视频在线观看| 乱码第一页成人| 亚洲影院免费观看| 在线观看av不卡| 国产精品麻豆va在线播放| 久久久久久午夜| 在线综合亚洲欧美在线视频| 欧美成人精品一区| 欧美一级精品大片| 亚洲人永久免费| 国产婷婷色综合av蜜臀av| 欧美激情中文字幕一区二区| 午夜日韩视频| 99国产精品一区| 欧美国产精品劲爆| 久久不射电影网| 亚洲图片欧美日产| 亚洲福利视频网| 国产一区二区激情| 欧美亚州在线观看| 欧美激情久久久久| 久久亚洲视频| 久久激情综合网| 午夜在线不卡| 亚洲主播在线观看| 一区二区欧美激情| 99精品视频免费| 日韩视频一区二区三区在线播放|