• <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++ 基礎(chǔ)} {C++ 高級(jí)} {C#界面,C++核心算法} {設(shè)計(jì)模式} {C#基礎(chǔ)}

            vc技巧3

            1. 窗口最大化、最小化的實(shí)現(xiàn)

            當(dāng)我們不能用標(biāo)題欄的最大化、最小化及恢復(fù)按鈕而又需在其他的地方實(shí)現(xiàn)這些功能,可以在指定的消息處理函數(shù)里添加:

            WINDOWPLACEMENT wndpl;

            WINDOWPLACEMENT *pwndpl;

            pwndpl = &wndpl;

            GetWindowPlacement(pwndpl);

            pwndpl->showCmd = SW_SHOWMINMIZED; //實(shí)現(xiàn)窗口最小化

            SetWindowPlacement(pwndpl);

            其中GetWindowPlacement()函數(shù)獲取當(dāng)前窗口布局的結(jié)構(gòu)WINDOWPLACEMENT的結(jié)構(gòu)變量指針,結(jié)構(gòu)WINDOWPLACEMENT定義為:

            typedef struct tagWINDOWPLACEMENT{

                UINT length;

                UINT flags;

                UINT showCmd;

                POINT ptMinPosition;

                POINT ptMaxPosition;

                RECT rcNormalPosition;

            }WINDOWPLACEMENT;

            其中的成員變量showCmd確定當(dāng)前窗口的狀態(tài),取值一般為:

            ·SW_HIDE:隱藏窗口

            ·SW_MINIMIZE:最小化指定的窗口

            ·SW_RESTORE:恢復(fù)原來(lái)的大小

            ·SW_SHOW:以原來(lái)的大小激活并顯示

            ·SW_SHOWMAXIMIZED:激活并最大化窗口

            SetWindowPlacement()函數(shù)就是按WINDOWPLACEMENT的設(shè)置來(lái)顯示窗口

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

            當(dāng)我們想得到一個(gè)窗口對(duì)象(CWnd的派生對(duì)象)指針的句柄(HWND)時(shí),最安全的方法是使用GetSafeHwnd()函數(shù),通過(guò)下面的例子來(lái)看其理由:

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

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

            這樣的代碼當(dāng)開(kāi)始得到的pwnd為空的時(shí)候就會(huì)出現(xiàn)一個(gè)“General protection error”,并關(guān)閉應(yīng)用程序,因?yàn)橐话悴荒軐?duì)一個(gè)NULL指針訪問(wèn)其成員,如果用下面的代碼:

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

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

            就不會(huì)出現(xiàn)問(wèn)題,因?yàn)楸M管當(dāng)pwnd是NULL時(shí),GetSafeHwnd仍然可以用,只是返回NULL,通過(guò)GetSafeHwnd()的實(shí)現(xiàn)代碼就更清楚了:

            _AFXWIN_INLINE HWND CWnd::GetSafeHwnd() const

            {

               return this == NULL?NULL:m_hWnd;

            }

            3. 如何使程序處于極小狀態(tài)

            如果我們不想讓程序的窗口被別人看見(jiàn),就可以讓它保持在極小狀態(tài):在恢復(fù)程序窗口的時(shí)候,Window會(huì)發(fā)送WM_QUERYOPEN消息,只要在其消息處理函數(shù)里返回false就可以了。

            BOOL CmainFrame::OnQueryOpen()

            {

              return false;

            }

            4. 如何禁止和能用關(guān)閉按鈕

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

              if(pmenu)

              {

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

              }

            恢復(fù)時(shí)只需將MF_GRAYED改為MF_ENABLED

            5. 如何在程序中延時(shí)

            方法一:

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

            方法二:

              使用sleep函數(shù)的不利在于延時(shí)期間不能處理其他的消息,如果時(shí)間太長(zhǎng),就好象死機(jī)一樣,利用ColeDateTime類(lèi)和ColeDateTimeSpan類(lèi)實(shí)現(xiàn)延時(shí)就不會(huì)出現(xiàn)那樣的問(wèn)題:

            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;

            }

            這樣在延時(shí)的時(shí)候我們也能夠處理其他的消息。
            6. 如何創(chuàng)建可伸縮的對(duì)話框

                在進(jìn)行對(duì)話框的設(shè)計(jì)時(shí),有時(shí)候我們需要設(shè)計(jì)可伸縮的對(duì)話框,當(dāng)用戶(hù)按下某個(gè)按鈕時(shí)彈出或隱藏對(duì)話框的下半部分。

            (1)、首先在對(duì)話框中建立一個(gè)圖片控件把ID設(shè)為IDC_DIVIDER,Type設(shè)置為矩形,Color設(shè)置為黑色,并將其設(shè)定為一線狀,拖放在適當(dāng)?shù)奈恢米鰹樯炜s對(duì)話框的分割線,屬性設(shè)為不可見(jiàn)。

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

            先在對(duì)話框上的伸縮按鈕添加單擊消息處理函數(shù):

            void C***Dlg::OnButtonExpand()

            {

              
            static int bexpand = FALSE; //設(shè)初始時(shí)為已擴(kuò)展的

              ExpandDialog(IDC_DIVIDER,bexpand);
            //調(diào)用擴(kuò)展或縮減處理函數(shù)

              Bexpand 
            = !bexpand;//狀態(tài)取反,為下次的單擊處理準(zhǔn)備

            }


            //在對(duì)話框中添加一個(gè)成員函數(shù)ExpandDialog,用于擴(kuò)展或縮減

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

            {

            //參數(shù)nResourceID表示分割線的ID

            //參數(shù)bexpand為T(mén)RUE時(shí)表示要擴(kuò)展對(duì)話框,否則縮減對(duì)話框

            static CRect rcLarge;

            static CRect rcSmall;

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

            {

               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();

            }


            }


             

            //在對(duì)話框中添加一個(gè)成員函數(shù)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控件的對(duì)話框無(wú)法顯示

                如果在對(duì)話框上放一個(gè)RichEdit控件,往往發(fā)現(xiàn)對(duì)話框卻無(wú)法正常顯示,這是因?yàn)閼?yīng)用程序還沒(méi)有為RichEdit控件的編輯功能做好準(zhǔn)備,解決辦法就是在應(yīng)用程序的InitInstance()函數(shù)調(diào)用AfxInitRichEdit()函數(shù)初始化RichEdit控件

            8. 如何指定對(duì)話框的默認(rèn)按鈕

                當(dāng)建立一個(gè)對(duì)話框的時(shí)候,在默認(rèn)條件下,確定按鈕(IDOK)是默認(rèn)按鈕,如果需要改變默認(rèn)的按鈕有兩種方法:

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

            其二: 在運(yùn)行的時(shí)候用代碼實(shí)現(xiàn),如:

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

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

            Pokbutton->ModifyStyle(BS_DEFPUSHBUTTON,0);

              //添加IDCANCEL的默認(rèn)按鈕風(fēng)格

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

            pcancelbutton->SetButtonStyle(BS_DEFPUSHBUTTON);

            posted on 2006-01-13 10:34 夢(mèng)在天涯 閱讀(533) 評(píng)論(0)  編輯 收藏 引用


            只有注冊(cè)用戶(hù)登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


            公告

            EMail:itech001#126.com

            導(dǎo)航

            統(tǒng)計(jì)

            • 隨筆 - 461
            • 文章 - 4
            • 評(píng)論 - 746
            • 引用 - 0

            常用鏈接

            隨筆分類(lèi)

            隨筆檔案

            收藏夾

            Blogs

            c#(csharp)

            C++(cpp)

            Enlish

            Forums(bbs)

            My self

            Often go

            Useful Webs

            Xml/Uml/html

            搜索

            •  

            積分與排名

            • 積分 - 1807503
            • 排名 - 5

            最新評(píng)論

            閱讀排行榜

            久久久久久久波多野结衣高潮| 69久久夜色精品国产69| 久久久久亚洲av毛片大| 中文字幕久久亚洲一区| 少妇精品久久久一区二区三区 | 无码精品久久久久久人妻中字| 国产A三级久久精品| 久久久久亚洲AV片无码下载蜜桃 | 久久国产香蕉视频| 亚洲综合日韩久久成人AV| 国产产无码乱码精品久久鸭| 国产精品99久久久久久董美香| 久久久久99这里有精品10| 久久久久久综合一区中文字幕| 无码人妻久久一区二区三区蜜桃| 性欧美丰满熟妇XXXX性久久久 | 久久综合88熟人妻| 一本色道久久88综合日韩精品| 狠狠色丁香久久婷婷综合五月 | 国产福利电影一区二区三区久久老子无码午夜伦不 | 久久精品亚洲日本波多野结衣 | 精品国产91久久久久久久a| 久久久久波多野结衣高潮| 精品久久久久久久久久久久久久久| 久久精品aⅴ无码中文字字幕不卡| 国产精品成人精品久久久| 91精品国产高清久久久久久io| 亚洲熟妇无码另类久久久| 久久久久国产精品麻豆AR影院| 久久精品国产亚洲精品2020 | 老色鬼久久亚洲AV综合| 亚洲精品第一综合99久久| 香蕉aa三级久久毛片| 久久中文字幕无码专区| 国产激情久久久久影院老熟女| 久久国产精品久久| 国产亚洲婷婷香蕉久久精品| 国内精品久久久久久99蜜桃| 1000部精品久久久久久久久| 99国产欧美精品久久久蜜芽 | 久久午夜无码鲁丝片午夜精品|