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

            C++ Programmer's Cookbook

            {C++ 基礎} {C++ 高級} {C#界面,C++核心算法} {設計模式} {C#基礎}

            vc技巧3

            1. 窗口最大化、最小化的實現

            當我們不能用標題欄的最大化、最小化及恢復按鈕而又需在其他的地方實現這些功能,可以在指定的消息處理函數里添加:

            WINDOWPLACEMENT wndpl;

            WINDOWPLACEMENT *pwndpl;

            pwndpl = &wndpl;

            GetWindowPlacement(pwndpl);

            pwndpl->showCmd = SW_SHOWMINMIZED; //實現窗口最小化

            SetWindowPlacement(pwndpl);

            其中GetWindowPlacement()函數獲取當前窗口布局的結構WINDOWPLACEMENT的結構變量指針,結構WINDOWPLACEMENT定義為:

            typedef struct tagWINDOWPLACEMENT{

                UINT length;

                UINT flags;

                UINT showCmd;

                POINT ptMinPosition;

                POINT ptMaxPosition;

                RECT rcNormalPosition;

            }WINDOWPLACEMENT;

            其中的成員變量showCmd確定當前窗口的狀態,取值一般為:

            ·SW_HIDE:隱藏窗口

            ·SW_MINIMIZE:最小化指定的窗口

            ·SW_RESTORE:恢復原來的大小

            ·SW_SHOW:以原來的大小激活并顯示

            ·SW_SHOWMAXIMIZED:激活并最大化窗口

            SetWindowPlacement()函數就是按WINDOWPLACEMENT的設置來顯示窗口

            2. 為什么要使用GetSafeHwnd()函數

            當我們想得到一個窗口對象(CWnd的派生對象)指針的句柄(HWND)時,最安全的方法是使用GetSafeHwnd()函數,通過下面的例子來看其理由:

            CWnd *pwnd = FindWindow(“ExploreWClass”,NULL); //希望找到資源管理器

            HWND hwnd = pwnd->m_hwnd;  //得到它的HWND

            這樣的代碼當開始得到的pwnd為空的時候就會出現一個“General protection error”,并關閉應用程序,因為一般不能對一個NULL指針訪問其成員,如果用下面的代碼:

            CWnd *pwnd = FindWindow(“ExploreWClass”,NULL); //希望找到資源管理器

            HWND hwnd = pwnd->GetSafeHwnd();  //得到它的HWND

            就不會出現問題,因為盡管當pwnd是NULL時,GetSafeHwnd仍然可以用,只是返回NULL,通過GetSafeHwnd()的實現代碼就更清楚了:

            _AFXWIN_INLINE HWND CWnd::GetSafeHwnd() const

            {

               return this == NULL?NULL:m_hWnd;

            }

            3. 如何使程序處于極小狀態

            如果我們不想讓程序的窗口被別人看見,就可以讓它保持在極小狀態:在恢復程序窗口的時候,Window會發送WM_QUERYOPEN消息,只要在其消息處理函數里返回false就可以了。

            BOOL CmainFrame::OnQueryOpen()

            {

              return false;

            }

            4. 如何禁止和能用關閉按鈕

              Cmenu *pmenu = AfxGetMainWnd()->GetSystemMenu(FALSE);

              if(pmenu)

              {

            pmenu->EnableMenuItem(SC_CLOSE,MF_BYCOMMAND|MF_GRAYED);

              }

            恢復時只需將MF_GRAYED改為MF_ENABLED

            5. 如何在程序中延時

            方法一:

              使用sleep函數,如延時2秒,用sleep(2000);

            方法二:

              使用sleep函數的不利在于延時期間不能處理其他的消息,如果時間太長,就好象死機一樣,利用ColeDateTime類和ColeDateTimeSpan類實現延時就不會出現那樣的問題:

            ColeDateTime start_time = ColeDateTime::GetCurrentTime();

            ColeDateTimeSpan end_time = ColeDateTime::GetCurrentTime()-start_time;

            While(end_time.GetTotalSeconds() <= 2)

            {

              MSG msg;

              GetMessage(&msg,NULL,0,0);

              PreTranslateMessage(&msg);

              End_time = ColeDateTime::GetCurrentTime-start_time;

            }

            這樣在延時的時候我們也能夠處理其他的消息。
            6. 如何創建可伸縮的對話框

                在進行對話框的設計時,有時候我們需要設計可伸縮的對話框,當用戶按下某個按鈕時彈出或隱藏對話框的下半部分。

            (1)、首先在對話框中建立一個圖片控件把ID設為IDC_DIVIDER,Type設置為矩形,Color設置為黑色,并將其設定為一線狀,拖放在適當的位置做為伸縮對話框的分割線,屬性設為不可見。

            (2)、實現的原理:先獲取對話框的尺寸大小,然后根據的位置來確定縮減后的對話框大小,其實對話框伸縮的變化就是的值,在縮減對話框后,我們要使不可見的部分控件被禁止,以禁止加速鍵和TAB鍵對其的操作,在擴展對話框后,原來被禁止的控件又要使能。

            先在對話框上的伸縮按鈕添加單擊消息處理函數:

            void C***Dlg::OnButtonExpand()

            {

              
            static int bexpand = FALSE; //設初始時為已擴展的

              ExpandDialog(IDC_DIVIDER,bexpand);
            //調用擴展或縮減處理函數

              Bexpand 
            = !bexpand;//狀態取反,為下次的單擊處理準備

            }


            //在對話框中添加一個成員函數ExpandDialog,用于擴展或縮減

            void C***Dlg::ExpandDialog(int nResourceID,BOOL bexpand)

            {

            //參數nResourceID表示分割線的ID

            //參數bexpand為TRUE時表示要擴展對話框,否則縮減對話框

            static CRect rcLarge;

            static CRect rcSmall;

            if(rcLarge.IsRectNULL())  //首次使用時記下對話框的最大、最小尺寸

            {

               CRect rcLandmark;

               CWnd 
            *pwndLand = GetDlgItem(nResourceID);

               ASSERT(pwndLand);

               GetWindowRect(rcLarge);

               pwndLand
            ->GetWindowRect(rcLandmark);

               rcSmall 
            = rcLarge;

               rcSmall.bottom 
            = rcLandmark.bottom;

            }


            if(bexpand)

            {

               SetWindowPos(NULL,
            0,0,rcLarge.Width(),rcLarge.Height(),

            SWP_NOMOVE
            |SWP_NOZORDER);

            EnableVisible();

            }


            else

            {

               SetWindowPos(NULL,
            0,0,rcSmall.Width(),rcSmall.Height(),

            SWP_NOMOVE
            |SWP_NOZORDER);

            EnableVisible();

            }


            }


             

            //在對話框中添加一個成員函數EnableVisible,用于能用和禁止部分控件

            void C***Dlg:: EnableVisible()

            {

              CWnd 
            *pwnd = GetDlgItem(GW_CHILD);

              CRect retest;

              CRect rcControl;

              CRect rcShow;

              GetWindowRect(rcShow);

              While(pwnd 
            != NULL)

              
            {

            pwnd
            ->GetWindowRect(rcControl);

            if(rcTest.IntersectRect(rcShow,rcControl))

               pwnd
            ->EnableWindow(TRUE);

            else

               pwnd
            ->EnableWindow(FALSE);

            pwnd 
            = pwnd->GetWindow(GW_HWNDNEXT);

               }


            }



            7. 為什么有RichEdit控件的對話框無法顯示

                如果在對話框上放一個RichEdit控件,往往發現對話框卻無法正常顯示,這是因為應用程序還沒有為RichEdit控件的編輯功能做好準備,解決辦法就是在應用程序的InitInstance()函數調用AfxInitRichEdit()函數初始化RichEdit控件

            8. 如何指定對話框的默認按鈕

                當建立一個對話框的時候,在默認條件下,確定按鈕(IDOK)是默認按鈕,如果需要改變默認的按鈕有兩種方法:

            其一: 直接在確定按鈕(IDOK)的屬性里去掉Default button風格的選項

            其二: 在運行的時候用代碼實現,如:

              //去掉確定按鈕(IDOK)的默認按鈕

            CButton *pokbutton = (CButton *)GetDlgItem(IDOK);

            Pokbutton->ModifyStyle(BS_DEFPUSHBUTTON,0);

              //添加IDCANCEL的默認按鈕風格

            CButton *pcancelbutton = (CButton *)GetDlgItem(IDCANCEL);

            pcancelbutton->SetButtonStyle(BS_DEFPUSHBUTTON);

            posted on 2006-01-13 10:34 夢在天涯 閱讀(530) 評論(0)  編輯 收藏 引用

            公告

            EMail:itech001#126.com

            導航

            統計

            • 隨筆 - 461
            • 文章 - 4
            • 評論 - 746
            • 引用 - 0

            常用鏈接

            隨筆分類

            隨筆檔案

            收藏夾

            Blogs

            c#(csharp)

            C++(cpp)

            Enlish

            Forums(bbs)

            My self

            Often go

            Useful Webs

            Xml/Uml/html

            搜索

            •  

            積分與排名

            • 積分 - 1804314
            • 排名 - 5

            最新評論

            閱讀排行榜

            亚洲精品乱码久久久久久蜜桃| 久久无码国产| 国产成人久久AV免费| 国产精品99久久99久久久| 欧美一区二区精品久久| 精品久久人人爽天天玩人人妻| 欧美精品福利视频一区二区三区久久久精品| 无码8090精品久久一区| 丁香五月网久久综合| 久久精品人妻一区二区三区| 香蕉久久av一区二区三区| 欧美粉嫩小泬久久久久久久 | 久久久久亚洲av综合波多野结衣| 久久久久久久人妻无码中文字幕爆 | 久久国产精品免费| 中文字幕久久波多野结衣av| 久久精品国产亚洲麻豆| 久久国产欧美日韩精品免费| 久久久无码一区二区三区| 久久久久99精品成人片牛牛影视 | 91精品国产91久久久久久| 久久综合亚洲色一区二区三区| 91亚洲国产成人久久精品| 久久99国产综合精品| 一本大道久久东京热无码AV| 久久午夜电影网| 91精品国产综合久久婷婷| 精品无码久久久久国产动漫3d| 国产免费久久精品99久久| 色婷婷久久综合中文久久蜜桃av| 四虎久久影院| 偷窥少妇久久久久久久久| 久久久久一本毛久久久| 国产三级精品久久| 99久久精品国产一区二区三区| 久久99精品国产自在现线小黄鸭| 久久精品日日躁夜夜躁欧美| 久久这里的只有是精品23| 久久久久久精品无码人妻| 99久久夜色精品国产网站| 久久人妻AV中文字幕|