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

            woaidongmao

            文章均收錄自他人博客,但不喜標(biāo)題前加-[轉(zhuǎn)貼],因其丑陋,見諒!~
            隨筆 - 1469, 文章 - 0, 評論 - 661, 引用 - 0
            數(shù)據(jù)加載中……

            關(guān)于WS_CLIPCHILDREN和WS_CLIPSIBLINGS的理解

            我是個(gè)喜歡瞎琢磨的人。尤其是這幾天心情非常郁悶。于是開始琢磨了…….琢磨的問題就是WS_CLIPCHILDRENWS_CLIPSIBLINGS兩種窗口樣式的理解。

            1.求助MSDN

            我的第一步當(dāng)然是求助MSDN。在MSDN里面有詳細(xì)的解釋。

            1.1 WS_CLIPCHILDREN

            WS_CLIPCHILDREN樣式從字面上可以理解成ClipChildren,裁減子窗口。

            MSDN里的E文解釋:Excludes the area occupied by child windows when drawing occurs within the parent window. This style is used when creating the parent window.

            E文是一件困難的事,為了不讓大家再重復(fù)我的痛苦,我就越俎代庖翻譯一下:WS_CLIPCHILDREN樣式主要是用于父窗口,也就是說當(dāng)在父窗口繪制的時(shí)候,父窗口上還有一個(gè)子窗口,那么設(shè)置了這個(gè)樣式的話,子窗口區(qū)域父窗口就不負(fù)責(zé)繪制。

            那么按照MSDN的理解,可以用下面這幅圖來表示:

            clip_image002

            1?1 WS_CLIPCHILDREN樣式的初理解

            1.1 WS_CLIPSIBLINGS

            WS_CLIPSIBLINGS樣式從字面上可以理解成ClipSiblings,裁減兄弟窗口。

            MSDN里的E文解釋:Clips child windows relative to each other; that is, when a particular child window receives a WM_PAINT message, the WS_CLIPSIBLINGS style clips all other overlapping child windows out of the region of the child window to be updated. If WS_CLIPSIBLINGS is not specified and child windows overlap, it is possible, when drawing within the client area of a child window, to draw within the client area of a neighboring child window.

            中文意思是:子窗口間相互裁減。也就是說當(dāng)兩個(gè)窗口相互重疊時(shí),設(shè)置了WS_CLIPSIBLINGS樣式的子窗口重繪時(shí)不能繪制被重疊的部分。反之沒有設(shè)置WS_CLIPSIBLINGS樣式的子窗口重繪時(shí)是不考慮重疊不重疊,統(tǒng)統(tǒng)重繪。

            clip_image004

            1?2 WS_CLIPSIBLINGS樣式的初理解

            2.求助Google

            最初看完MSDN,說實(shí)話,沒有像現(xiàn)在這么清晰畫出上面兩幅圖。而是一片茫然。Google上我所搜索到的中文的還算是比較好的一篇,應(yīng)該是這篇:http://blog.163.com/sandylin_wind/blog/static/935500552008105104617806/

            大家可以看看,但是確實(shí)我覺得還不夠詳細(xì),因此才會(huì)寫篇博文,討論一下這個(gè)問題。

            當(dāng)然E文的專注于WS_CLIPCHILDRENWS_CLIPSIBLINGS討論的也比較少??赡芾贤庥捎诙?span lang="EN-US">E文,所以不像我們這樣費(fèi)事。

            經(jīng)過一番搜索,仍然有一些比較重要的結(jié)論,列舉如下:

            1           所有的overlappedpopup風(fēng)格的窗口,都有WS_CLIPSIBLINGS 屬性。也就是說這類風(fēng)格的窗口,你是去不掉WS_CLIPSIBLINGS 屬性的,不會(huì)在它重疊的兄弟窗口繪圖;

            2           更進(jìn)一步說明,WS_CLIPSIBLINGS只是用于子窗口(For use with the WS_CHILD style only.

            當(dāng)然在Google上搜索,通常會(huì)有意外發(fā)現(xiàn),一般和這個(gè)主題相關(guān)的往往是控件如何透明的問題。這里也給大家?guī)讉€(gè)關(guān)于控件透明的討論。

            1      http://www.pocketpcjunkies.com/Uwe/Forum.aspx/wince-vc/4744/Transparent-bitmap-button。這個(gè)是關(guān)于控件上繪制位圖,然后透明的討論。在桌面系統(tǒng)和WinCECreateWindoowsEx還有一些細(xì)微的差別,在WinCE上隱含地指定了窗口具備WS_CLIPCHILDRENWS_CLIPSIBLINGS風(fēng)格;

            2      http://www.pocketpcdn.com/articles/transparent_static.html這個(gè)是關(guān)于控件上面文本透明的例子。

            3.做幾個(gè)實(shí)驗(yàn)

            3.1 驗(yàn)證 WS_CLIPCHILDREN

            簡單到什么程度呢?只需要在對話框的屬性打個(gè)勾而已。

            clip_image005

            3?1 如何設(shè)置對話框Clip Children屬性

            我們先做做第一個(gè)程序,這個(gè)程序唯一有點(diǎn)難的地方就在于需要繼承一下CStatic類,然后重載一下OnPaint函數(shù)。

            void MYStatic::OnPaint()

            {

            CPaintDC dc(this); // device context for painting

            // TODO: Add your message handler code here

            // 獲得控件客戶區(qū)矩形大小

            CRect rect;

            GetClientRect(rect);

            // 繪制控件邊框

            dc.MoveTo(0,0);

            dc.LineTo(rect.Width(),0);

            dc.LineTo(rect.Width(),rect.Height());

            dc.LineTo(0,rect.Height());

            dc.LineTo(0,0);

            // 繪制文本

                dc.TextOut(rect.Width()/2 - 5,rect.Height()/2 - 5,"Hello");

            // Do not call CStatic::OnPaint() for painting messages

            }

            當(dāng)我們不設(shè)置對話框的Clip children屬性的時(shí)候,效果如下圖所示:

            clip_image006

            3?2 效果圖

               當(dāng)設(shè)置了Clip children屬性的時(shí)候,接下來是見證奇跡的時(shí)刻。^_^

            clip_image008

                   3?4 預(yù)想的效果圖

            3?6控件的Tab順序

            發(fā)現(xiàn)結(jié)果很混亂,每回都得不到我想要的,具有隨機(jī)性。甚至有的時(shí)候按照我的預(yù)想,有的時(shí)候則完全不管我的心情。哪怕我氣的吹胡子瞪眼睛,也是枉然。

            最常見的是這樣一種情況,就是無論我設(shè)置不設(shè)置WS_CLIPSIBLINGS屬性,當(dāng)點(diǎn)擊重繪圖片控件的時(shí)候(m_pic.Invalidate(),效果都一如既往,先開始圖片控件(pic)被自定義控件(custom)壓蓋,然后重繪之后,圖片控件(pic)壓蓋自定義控件(custom)。

            clip_image009

            3?5 一種錯(cuò)誤圖

            經(jīng)過一段時(shí)間的郁悶,我最終找到了問題之所在,是這樣的一個(gè)結(jié)論:WS_CLIPSIBLINGS還和控件的疊加順序有關(guān)。疊加順序如果不對,你無法查看WS_CLIPSIBLINGS的效果。就上面的問題,我們可以在VC編輯器里查看到控件的疊加順序。

            clip_image010

            Pic控件是在custom控件的下方。(Tab OrderZ Order順序是一致的)。這樣設(shè)置不設(shè)置WS_CLIPSIBLINGS都無法看出效果。

            但是改變控件的壓蓋順序,令pic控件壓蓋在custom控件之上(實(shí)際上是改變Tab order順序)

            clip_image011

            3?7 控件的Tab順序

            這樣就會(huì)出現(xiàn)預(yù)期的效果。當(dāng)不設(shè)置WS_CLIPSIBLINGS,pic控件會(huì)壓蓋custom控件,而當(dāng)設(shè)置了該屬性,則pic控件不會(huì)壓蓋custom控件,重疊的區(qū)域由custom控件自己繪制。

            clip_image012

            3?8 預(yù)期的效果

            4.結(jié)論

            好,到此為止,應(yīng)該說點(diǎn)有結(jié)論的話了。

            1           WS_CLIPCHILDREN樣式主要是用于父窗口,也就是說當(dāng)在父窗口繪制的時(shí)候,父窗口上還有一個(gè)子窗口,那么設(shè)置了這個(gè)樣式的話,子窗口區(qū)域父窗口就不負(fù)責(zé)繪制。

            2           所有的overlappedpopup風(fēng)格的窗口,都有WS_CLIPSIBLINGS 屬性。也就是說這類風(fēng)格的窗口,你是去不掉WS_CLIPSIBLINGS 屬性的,不會(huì)在它重疊的兄弟窗口繪圖;

            3           更進(jìn)一步說明,WS_CLIPSIBLINGS只是用于子窗口(For use with the WS_CHILD style only.

                   4 WS_CLIPSIBLINGS實(shí)際上還需要和控件的疊放順序(z order)配合使用,才能看出明顯的效果。

            clip_image013

            3?3 效果圖

            很明顯父窗口沒有管子窗口的背景色如何繪制。子窗口的背景只是當(dāng)時(shí)桌面上現(xiàn)有的窗口內(nèi)容。

            3.2 驗(yàn)證WS_CLIPSIBLINGS

            當(dāng)?shù)谝粋€(gè)實(shí)驗(yàn)成功之后,我原以為WS_CLIPSIBLINGS也會(huì)相當(dāng)?shù)睾唵巍=Y(jié)果我花費(fèi)了大量的時(shí)間糾纏在這個(gè)問題上。首先遇到的第一個(gè)問題,當(dāng)然是動(dòng)態(tài)地改樣式,這個(gè)并不是太復(fù)雜的問題。如何動(dòng)態(tài)改樣式,見下面的代碼:

            LONG style = GetWindowLong(m_pic.GetSafeHwnd(),GWL_STYLE);

            style = style | WS_CLIPSIBLINGS ;

            SetWindowLong(m_pic.GetSafeHwnd(),GWL_STYLE,style);

            然后,我在對話框上添加了一個(gè)圖片控件和一個(gè)自繪制的控件(和上例類似,為了效果明顯,我對自繪的控件進(jìn)行了填充)

            按照我預(yù)先設(shè)想的效果,理想的情況應(yīng)該如下:

             

            posted on 2009-10-09 18:00 肥仔 閱讀(1007) 評論(0)  編輯 收藏 引用 所屬分類: MFC存檔

            亚洲精品99久久久久中文字幕| 久久乐国产精品亚洲综合| 国产毛片久久久久久国产毛片 | 一级做a爰片久久毛片16| 亚洲中文久久精品无码| 精品久久久久成人码免费动漫| 久久国产免费| 精品熟女少妇aⅴ免费久久| 久久精品国产亚洲麻豆| 久久久久久免费一区二区三区| 亚洲午夜久久久影院| 亚洲精品国产美女久久久| 久久久久久国产精品无码下载| 日本WV一本一道久久香蕉| 国产精品乱码久久久久久软件| 伊人久久大香线蕉精品不卡| 亚洲精品无码专区久久同性男| 无码精品久久一区二区三区 | 久久久噜噜噜久久中文字幕色伊伊| 久久婷婷五月综合色99啪ak| 欧美成a人片免费看久久| 色婷婷综合久久久久中文字幕 | 久久久久无码精品国产不卡| 久久久久久久97| 色综合久久综合网观看| 一级做a爰片久久毛片人呢| 久久国产视屏| 久久久久久国产精品无码下载| 国产亚洲精品久久久久秋霞| 久久久久亚洲精品无码蜜桃| 国产V亚洲V天堂无码久久久| 久久综合狠狠综合久久激情 | 精品久久久久国产免费| 久久人做人爽一区二区三区| A狠狠久久蜜臀婷色中文网| 国产成人无码精品久久久免费| 一级女性全黄久久生活片免费| 一本久久a久久精品亚洲| 亚洲国产精品久久| 亚洲伊人久久综合中文成人网| 日本欧美久久久久免费播放网|