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

c++初學(xué)者

專注技術(shù)開發(fā)

自繪按鈕補(bǔ)遺【轉(zhuǎn)】

《自繪按鈕的實(shí)現(xiàn)》一文中所示范的CXPButton按鈕從形狀上看可以說是一個(gè)不規(guī)則按鈕。我們把MFC中提供的控件成為標(biāo)準(zhǔn)控件,而其中的按鈕控件則可稱為規(guī)則按鈕,因?yàn)樗堑男螤钍且粋€(gè)規(guī)則的矩形。但是隨著流線型設(shè)計(jì)在界面設(shè)計(jì)中被廣泛采用,越來越多的程序設(shè)計(jì)者都樂意在自己的作品中加入一些非規(guī)則形狀的控件。以按鈕為例,最簡(jiǎn)單的就到有圓形按鈕,三角按鈕等。下圖是一組定義好的圓形按鈕:



但是這些在我們眼中似乎呈現(xiàn)出不規(guī)則形狀的按鈕,有時(shí)候的表現(xiàn)卻不近乎人意。以之前設(shè)計(jì)的CXPButton為例,下面我們就來找找它的缺陷。我們把對(duì)話框的背景色改為其它顏色,看看會(huì)有什么效果。修改背景色的方法如下:為對(duì)話框類添加WM_ERASEBKGND消息,如果你在類向?qū)е姓也坏皆撓ⅲ?qǐng)參考《自繪按鈕的實(shí)現(xiàn)》中介紹的方法,注意在添加對(duì)話框中要把Filter for messages available to設(shè)為Child Window才能在列表中看到WM_ERASEBKGND消息。我們?cè)诤瘮?shù)中添加繪制背景色的代碼:
BOOL CXPButtonDemoDlg::OnEraseBkgnd(CDC* pDC)
{
BOOL retValue= CDialog::OnEraseBkgnd(pDC);
CRect rc;
GetClientRect(&rc);
pDC->FillSolidRect(&rc,RGB(0,0,255));
return retValue;
}
編譯后運(yùn)行程序,可以看到下面的效果,在按鈕的四個(gè)角上出現(xiàn)了難看的邊角,這就是我所說的缺陷了:



既然發(fā)現(xiàn)了問題,下面當(dāng)然就是動(dòng)手來解決問題的時(shí)間了。在《自繪按鈕的實(shí)現(xiàn)》一文中曾經(jīng)講過,按鈕的繪制主要在DrawItem()函數(shù)中完成。這里要補(bǔ)充一點(diǎn)就是DrawItem()是MFC所提供的系統(tǒng)函數(shù),所以可以通過下圖的方法添加。選擇Add Virtual Function…之后在彈出對(duì)話框左邊的列表中找到DrawItem,選擇Add and Edit即可。



好了,我們接著上面的話題。要解決按鈕顯示的“殘角”問題,在這里需要使用一個(gè)叫做CRgn的類,這個(gè)類在創(chuàng)建不規(guī)則控件的時(shí)候經(jīng)常要用到,我們可以通過CRgn類來設(shè)置控件的有效區(qū)域。那么什么是有效區(qū)域呢?以圓形按鈕為例,MFC默認(rèn)的按鈕形狀是矩形的,為了實(shí)現(xiàn)圓形按鈕的效果,我們希望能夠把原來矩形的四角裁剪掉,只保留中間的圓形區(qū)域。這種關(guān)系可以用下圖來表示:



圖中的A是原來的矩形區(qū)域,B是需要裁剪的區(qū)域,而C是有效區(qū)域。我們希望程序不要把B看作按鈕的一部分,當(dāng)鼠標(biāo)在B上面點(diǎn)擊的時(shí)候不要產(chǎn)生任何效果。設(shè)置按鈕的有效區(qū)域一般是在PreSubclassWindow()函數(shù)里面實(shí)現(xiàn)的:
void CXPButton::PreSubclassWindow()
{
CButton::PreSubclassWindow();
ModifyStyle(0, BS_OWNERDRAW);
//設(shè)置按鈕的有效區(qū)域
CRgn rgn;
CRect rc;
GetClientRect(&rc);
//有效區(qū)域?yàn)橐粋€(gè)角半徑為5的圓角矩形
rgn.CreateRoundRectRgn(rc.left,rc.top,rc.right,rc.bottom,5,5);
SetWindowRgn(rgn,TRUE);
rgn.DeleteObject();
}
編譯后運(yùn)行程序,我們發(fā)現(xiàn)盡管已經(jīng)設(shè)置了按鈕的有效區(qū)域,但是問題還是沒有解決,這是為什么呢?前面我們?cè)?jīng)通過對(duì)話框的WM_ERASEBKGND消息函數(shù)來改變對(duì)話框的底色,其實(shí)按鈕也有它的WM_ERASEBKGND消息函數(shù),它會(huì)使用系統(tǒng)顏色根據(jù)控件的默認(rèn)形狀來繪制控件的底色。所以我們要重載按鈕的WM_ERASEBKGND消息函數(shù),讓它什么都不做:
BOOL CXPButton::OnEraseBkgnd(CDC* pDC)
{
//禁止繪制底色
return TRUE;
}
再編譯一次,運(yùn)行后發(fā)現(xiàn),難看的"殘角"不見了:

 



《自繪按鈕的實(shí)現(xiàn)》一文中還講過在DrawItem()函數(shù)中應(yīng)該先畫底色,其實(shí)這是有前提的,前提就是你已經(jīng)知道了按鈕所在對(duì)話框所使用的背景色,你可以使用這個(gè)顏色作為按鈕的底色來進(jìn)行填充。這樣即使程序會(huì)在WM_ERASEBKGND消息函數(shù)中使用系統(tǒng)顏色來繪制控件的底色,但是等到它執(zhí)行DrawItem()的時(shí)候,馬上又會(huì)把之前的矩形底色覆蓋,從而不留痕跡地把“殘角”掩蓋掉。
在本篇開頭列舉的圓形按鈕中也有類似的問題,大家不防把它作為練習(xí),看看是否能夠解決圓形按鈕中的“殘角”問題。我在本篇提供的練習(xí)程序中需要修改的地方會(huì)表明“提示”的字眼,大家可以先把源程序中有“提示”字眼的地方找出來,再根據(jù)提示的內(nèi)容進(jìn)行修改。



最后還要補(bǔ)充的是各位對(duì)CRgn類的關(guān)注。在VC中,要?jiǎng)?chuàng)建出各種復(fù)雜形狀的控件、窗口經(jīng)常要依靠CRgn類的強(qiáng)大功能來實(shí)現(xiàn)。如果你想在界面設(shè)計(jì)這個(gè)環(huán)節(jié)更進(jìn)一步的話,建議你抽點(diǎn)時(shí)間仔細(xì)研究一下Msdn中關(guān)于CRgn類的使用說明。如果你有什么好的使用經(jīng)驗(yàn)和心得,不防把相關(guān)資料發(fā)到我的郵箱。以后有機(jī)會(huì)的話我會(huì)專門寫一篇文章探討一下CRgn類的使用技巧的。

posted on 2008-09-25 20:19 大海 閱讀(571) 評(píng)論(0)  編輯 收藏 引用 所屬分類: VC++圖像

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美亚洲一区| 亚洲另类自拍| 亚洲自拍偷拍福利| 国产精品视频免费观看www| 欧美一区二区视频在线| 欧美在线首页| 亚洲精品日产精品乱码不卡| 亚洲三级电影全部在线观看高清| 久久久水蜜桃| 国产精品99久久久久久久vr| 中文一区在线| 伊人激情综合| 日韩一级不卡| 国产一区导航| 亚洲精品免费在线| 国产亚洲一区在线播放| 欧美激情片在线观看| 国产精品爱啪在线线免费观看| 久久成人综合视频| 欧美激情按摩在线| 亚洲视频电影图片偷拍一区| 在线综合+亚洲+欧美中文字幕| 国产欧美视频一区二区| 欧美成人综合一区| 国产精品久久久久久久第一福利 | 欧美亚洲免费电影| 91久久综合| 午夜欧美精品久久久久久久| 亚洲精品女人| 久久久久成人精品免费播放动漫| 一二三区精品福利视频| 久久久国产精彩视频美女艺术照福利| 亚洲日本视频| 久久九九国产精品怡红院| 亚洲天堂av图片| 久久资源在线| 久久福利影视| 国产精品无码专区在线观看| 亚洲欧洲精品一区二区三区| 狠狠色丁香婷婷综合| 亚洲一区二区三区中文字幕在线| 亚洲日本免费电影| 久久青草欧美一区二区三区| 久久se精品一区精品二区| 欧美日韩在线观看一区二区三区| 欧美国产视频在线观看| 国语精品中文字幕| 欧美亚洲一区| 久久精品国产免费看久久精品 | 亚洲欧美影音先锋| 亚洲视频网站在线观看| 欧美精品乱码久久久久久按摩| 久久婷婷人人澡人人喊人人爽| 国产精品一区二区久久精品 | 久久精品国产一区二区三区免费看 | 亚洲欧美日韩国产另类专区| 亚洲少妇最新在线视频| 欧美日韩国产经典色站一区二区三区| 免费观看成人鲁鲁鲁鲁鲁视频| 国产在线精品一区二区夜色| 午夜电影亚洲| 久久久精品视频成人| 国产亚洲欧美日韩美女| 欧美在线视屏| 欧美大片在线观看一区二区| 亚洲国产精品va在线看黑人动漫| 久久久久欧美精品| 亚洲福利视频在线| 99精品国产热久久91蜜凸| 欧美日韩亚洲不卡| 一区二区三区成人| 久久国产直播| 亚洲高清二区| 欧美精品少妇一区二区三区| 亚洲精品一区二区网址| 亚洲制服av| 国产深夜精品福利| 久久免费的精品国产v∧| 亚洲高清123| 久久精品网址| 99国内精品| 欧美视频在线观看一区| 亚洲欧美福利一区二区| 久久夜色撩人精品| 亚洲美女毛片| 国产精品久久久亚洲一区| 欧美一区二区在线观看| 欧美激情精品久久久久久黑人 | 亚洲欧美日本国产有色| 国产尤物精品| 欧美黄色大片网站| 这里是久久伊人| 久久综合精品一区| 在线视频你懂得一区二区三区| 国产欧美激情| 欧美精品久久久久久久| 午夜欧美视频| 最新国产成人在线观看| 性久久久久久久久| 亚洲啪啪91| 国产美女在线精品免费观看| 欧美插天视频在线播放| 性欧美精品高清| 亚洲精品欧美一区二区三区| 久久久青草青青国产亚洲免观| 日韩亚洲在线观看| 一色屋精品视频免费看| 国产精品高潮呻吟| 欧美激情一区二区三区| 久久精彩免费视频| 亚洲少妇一区| 亚洲精品乱码久久久久| 女女同性精品视频| 欧美一区二区在线| 亚洲一区二区三区四区五区午夜| 在线观看日产精品| 国产欧美日韩不卡| 欧美性色aⅴ视频一区日韩精品| 久久综合免费视频影院| 性久久久久久久久久久久| 一区二区电影免费观看| 亚洲人午夜精品免费| 欧美国产专区| 久久在线免费观看视频| 久久精品国产2020观看福利| 午夜日本精品| 亚洲免费在线视频| 国产精品99久久久久久久女警| 亚洲成色777777在线观看影院| 国产亚洲毛片在线| 国产一区二区三区四区五区美女 | 一区二区免费在线观看| 日韩视频三区| 亚洲免费成人av| 亚洲免费av观看| 亚洲人成艺术| 亚洲美女在线看| 亚洲麻豆国产自偷在线| 亚洲欧洲精品一区| 日韩视频一区| 一区二区高清视频| 99视频一区二区| 亚洲午夜精品国产| 亚洲免费在线电影| 欧美一区二区私人影院日本 | 亚洲毛片av| 亚洲黄网站黄| 亚洲激情视频网站| 亚洲精品影院| 在线亚洲欧美视频| 亚洲欧美在线网| 久久精品综合| 久久久久久夜| 欧美精品1区2区| 欧美午夜电影在线观看| 国产日韩视频| 91久久精品网| 亚洲午夜精品福利| 久久精品国产亚洲高清剧情介绍| 久久手机免费观看| 亚洲国产人成综合网站| 99re6这里只有精品| 亚洲欧美日韩一区在线| 久久久.com| 欧美区一区二区三区| 国产精品毛片a∨一区二区三区|国 | 欧美成年网站| 国产精品电影网站| 国产在线观看91精品一区| 亚洲精品影视在线观看| 亚洲欧美国产精品桃花| 嫩草国产精品入口| 亚洲特级片在线| 久久亚洲综合色| 欧美午夜久久| 18成人免费观看视频| 亚洲视屏在线播放| 老鸭窝亚洲一区二区三区| 亚洲美女精品一区| 欧美在线视频免费| 欧美日韩国产麻豆| 黄网站色欧美视频| 亚洲一区在线直播| 亚洲大胆美女视频| 亚洲欧美日韩天堂| 欧美日韩激情小视频| 激情欧美一区二区三区在线观看| 在线视频你懂得一区| 欧美/亚洲一区| 亚洲欧美日韩区| 欧美日韩久久| 尤物精品在线| 久久精品国产亚洲精品 | 欧美大片在线观看一区二区| 亚洲欧美日韩国产一区二区三区| 欧美激情精品久久久久久免费印度 | 国产午夜一区二区三区| 亚洲深夜福利视频| 亚洲人成人一区二区三区| 久久伊人精品天天|