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

            我住包子山

            this->blog.MoveTo("blog.baozishan.in")

            vc++技術內幕學習心得1

            這篇心得關于技術內幕第五章,比較的基礎..
            我是VC++的初學者
            vc++
            技術內幕這本書我是去年暑假開始看的,那時候剛學windows編程,雖然之前用過c#,vb,不過都沒怎么練習,這本書我大概看了前面的80%,不過都未曾動手,近日打算從頭練習一下,在這里記些筆記
            第五章第一個例子很簡單
            一個單文檔MFC應用程序,View類中一個CRect類型變量保存矩形的信息,一個int型保存矩形顏色的屬性
            WM_LBUTTONDOWN
            響應函數判斷單擊左鍵時鼠標位置是不是在之前那個矩形區域內,是的話變換矩形顏色的屬性,而且命令矩形區域重繪..
            OnDraw()
            中用dc選取矩形顏色,繪制矩形的內切橢圓

            應用的函數有:

            virtual CGdiObject* CDC::SelectStockObject(

            int nIndex

            );//選取顏色,這里只選畫刷大概有如下畫刷
            BLACK_BRUSH DKGRAY_BRUSH GRAY_BRUSH HOLLOW_BRUSH LTGRAY_BRUSH NULL_BRUSH WHITE_BRUSH
            BOOL CDC::Ellipse(LPCRECT lpRect);//
            畫矩形對應的內切橢圓
            BOOL CRECT::PtInRect(

            POINT point 

            ) const throw( );//判斷point是否在矩形中

            注意一點就是CView::OnLButtonDown(UINT nFlags, CPoint point)
            這里的Point坐標是Viewclient坐標,如果需要全局坐標需要轉換

             

            第二個例子關于映射模式

             

            不同的映射模式,對應的坐標是有區別的,而且他們的邏輯單位比例都不同

             

            固定比例的映射模式有

             

            Mapping Mode

            Logical Unit

            MM_LOENGLISH

            0.01 inch

            MM_HIENGLISH

            0.001 inch

            MM_LOMETRIC

            0.1 mm

            MM_HIMETRIC

            0.01 mm

            MM_TWIPS

            1/1440 inch

             

            可變比例的映射模式

            MM_ISOTROPIC and MM_ANISOTROPIC

            我自己寫了一個Demo看了一下,好像只有MM_ANISOTROPICMM_TEXTx軸左向右,y軸上到下,DC原點為0,0

            其他的映射模式x軸一樣,y軸變成了從下至上,DC原點還是0,0

            CDC的幾個函數這里有必要說說
            virtual int CDC::SetMapMode(
               int nMapMode
            );
            int CDC::GetMapMode() const;
            設置/讀取DC的映射模式

             

            virtual CSize CDC::SetWindowExt(
               int cx,
               int cy
            );//
            設置窗體范圍

            virtual CSize CDC::SetViewportExt(
               int cx,
               int cy
            );//
            設置視口范圍

            virtual CPoint CDC::SetViewportOrg(
               int x,
               int y
            );//
            設置(0,0)點的位置

            窗體范圍和視口范圍的設置會影響可變比例映射
            可變比例映射的x,y計算方法參看下面的公式

            x scale factor = x viewport extent / x window extent   

            y scale factor = y viewport extent / y window extent   

            device x = logical x* x scale factor + x origin offset   

            device y = logical y* y scale factor + y origin offset

            CDC成員函數的參數大都是用邏輯坐標,但是CWnd的成員卻以設備坐標為參數

            但是CDC成員中有函數

            LPtoDP,將邏輯坐標轉換為設備坐標

            void LPtoDP( LPPOINT lpPoints, int nCount = 1 ) const; void LPtoDP( LPRECT lpRect ) const; void LPtoDP( LPSIZE lpSize ) const;
            DPtoLP,剛好相反

            void DPtoLP( LPPOINT lpPoints, int nCount = 1 ) const; void DPtoLP( LPRECT lpRect ) const; void DPtoLP( LPSIZE lpSize ) const;

            第三個例子關于滾動條

            文檔視圖的工程建立向導中可以讓View繼承自CScrollView,使得View帶有滾動條

            OnInitialUpdate函數在視圖建立后,OnDraw執行之前執行,所以對于滾動條的初始化可以放在這個函數中

            void CScrollingViewWindowView::OnInitialUpdate()

            {

                CScrollView::OnInitialUpdate();

                CSize sizeTotal;

                // TODO: 計算此視圖的合計大小

                sizeTotal.cx = 20000; //20cm

                sizeTotal.cy = 30000; //30cm

                CSize sizePage(sizeTotal.cx/2,sizeTotal.cy/2);

                CSize sizeLine(sizeTotal.cx/50,sizeTotal.cy/50);

                SetScrollSizes(MM_TEXT, sizeTotal,sizePage,sizeLine);

            }

            雖然是初始化了滾動條,但是不能夠使用快捷鍵(上下左右,pagedown啥的),需要手動重載afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);

            需要用到CWnd::OnVScroll, CWnd::OnHScroll,分別控制縱向與橫向兩個滾動條

            nSBCode

            Specifies a scroll-bar code that indicates the user's scrolling request. This parameter can be one of the following:

            ·         SB_BOTTOM   Scroll to bottom.

            ·         SB_ENDSCROLL   End scroll.

            ·         SB_LINEDOWN   Scroll one line down.

            ·         SB_LINEUP   Scroll one line up.

            ·         SB_PAGEDOWN   Scroll one page down.

            ·         SB_PAGEUP   Scroll one page up.

            ·         SB_THUMBPOSITION   Scroll to the absolute position. The current position is provided in nPos.

            ·         SB_THUMBTRACK   Drag scroll box to specified position. The current position is provided in nPos.

            ·         SB_TOP   Scroll to top.

                                                                   by gohan 11.23

            posted on 2007-11-23 16:37 Gohan 閱讀(1319) 評論(0)  編輯 收藏 引用 所屬分類: MFC/SDK

            亚洲中文字幕无码一久久区| 久久国内免费视频| 精品多毛少妇人妻AV免费久久| 无码8090精品久久一区 | 99久久精品国产一区二区| 精品国产乱码久久久久软件| 亚洲欧美成人久久综合中文网 | 午夜精品久久久久9999高清| 人人狠狠综合久久亚洲| 久久久久亚洲AV无码麻豆| 久久美女网站免费| 亚洲日韩欧美一区久久久久我 | 亚洲国产日韩综合久久精品| 亚洲v国产v天堂a无码久久| 久久91精品国产91| 久久99这里只有精品国产| 久久天堂AV综合合色蜜桃网| 91麻豆精品国产91久久久久久| 久久久久综合国产欧美一区二区| 亚洲伊人久久成综合人影院 | 精品国际久久久久999波多野| 97精品伊人久久久大香线蕉| 久久久人妻精品无码一区 | 久久精品成人免费看| 伊人久久亚洲综合影院| AV色综合久久天堂AV色综合在 | 久久婷婷激情综合色综合俺也去| 91精品日韩人妻无码久久不卡| 久久亚洲AV无码精品色午夜| 久久美女人爽女人爽| 狠狠色婷婷久久综合频道日韩| 狠狠人妻久久久久久综合| 久久综合给合久久狠狠狠97色69| 久久精品中文字幕有码| www性久久久com| 欧美国产成人久久精品| 91精品国产高清久久久久久国产嫩草| 久久久久国色AV免费看图片| 国内精品久久久久影院优| 国产精品久久久久久久| 2021最新久久久视精品爱|