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

            twzheng's cppblog

            『站在風(fēng)口浪尖緊握住鼠標(biāo)旋轉(zhuǎn)!』 http://www.cnblogs.com/twzheng

              C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
              136 隨筆 :: 78 文章 :: 353 評(píng)論 :: 0 Trackbacks
            [源] http://henrycgf.bokee.com/2662860.html


            VC編程經(jīng)驗(yàn)匯總

                                                  

             

            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ù)原來的大小

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

            ·SW_SHOWMAXIMIZED:激活并最大化窗口

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

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

             

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

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

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

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

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

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

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

            _AFXWIN_INLINE HWND CWnd::GetSafeHwnd() const

            {

               return this == NULL?NULL:m_hWnd;

            }

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

             

            如果我們不想讓程序的窗口被別人看見,就可以讓它保持在極小狀態(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í)間太長,就好象死機(jī)一樣,利用ColeDateTime類和ColeDateTimeSpan類實(shí)現(xiàn)延時(shí)就不會(huì)出現(xià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í)候我們也能夠處理其他的消息。

             

             

             

            看了論壇里的一些總結(jié)文章很好,我把里面沒有怎么看到的也寫了一點(diǎn)點(diǎn)出來,不知道有沒有重復(fù),希望能有些微的作用.



            本文引用通告地址: http://blog.csdn.net/laiyiling/services/trackbacks/22293.aspx

            6. 如何創(chuàng)建可伸縮的對(duì)話框

             

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

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

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

            先在對(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ù)bexpandTRUE時(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ì)話框無法顯示

             

            如果在對(duì)話框上放一個(gè)RichEdit控件,往往發(fā)現(xiàn)對(duì)話框卻無法正常顯示,這是因?yàn)閼?yīng)用程序還沒有為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);

            本文引用通告地址: http://blog.csdn.net/laiyiling/services/trackbacks/22294.aspx

            1. 顯示和隱藏標(biāo)題欄

            方法一:使用API實(shí)現(xiàn)

            //隱藏TitleBar
            LONG lStyle = ::GetWindowLong(this->m_hWnd, GWL_STYLE);
            ::SetWindowLong(this->m_hWnd, GWL_STYLE, lStyle & ~WS_CAPTION);
            ::SetWindowPos(this->m_hWnd, NULL, 0, 0, 0, 0,
            SWP_NOSIZE | SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE | SWP_FRAMECHANGED);

            // 顯示TitleBar
            ::SetWindowLong(this->m_hWnd, GWL_STYLE, lStyle | WS_CAPTION);
            ::SetWindowPos(this->m_hWnd, NULL, 0, 0, 0, 0,??SWP_NOSIZE | SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE | SWP_FRAMECHANGED);
            方法二:使用CWnd成員函數(shù)ModifyStyle實(shí)現(xiàn)
            // 隱藏TitleBar
            ModifyStyle(WS_CAPTION, 0, SWP_FRAMECHANGED);
            // 顯示TitleBar
            ModifyStyle(0, WS_CAPTION, SWP_FRAMECHANGED);

            2 . 怎么用SendMessage()來發(fā)送消息來清空它的內(nèi)容??
            HWND hEditWnd=GetDlgItem(IDC_EDIT1)->GetSafeHwnd();
            ::SendMessage(hEditWnd,WM_SETTEXT,(WPARAM)0,(LPARAM)"");

            3. 彈出文件的屬性窗口
            SHELLEXECUTEINFO ShExecInfo ={0};
            ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
            ShExecInfo.fMask = SEE_MASK_INVOKEIDLIST ;
            ShExecInfo.hwnd = NULL;
            ShExecInfo.lpVerb = "properties";
            ShExecInfo.lpFile = "c:\"; //也可以是文件
            ShExecInfo.lpParameters = "";
            ShExecInfo.lpDirectory = NULL;
            ShExecInfo.nShow = SW_SHOW;
            ShExecInfo.hInstApp = NULL;
            ShellExecuteEx(&ShExecInfo);

            4. 刪除一個(gè)目錄下的所有文件

            BOOL DeleteDirectory(LPCTSTR DirName)
            {
              CFileFind tempFind; //聲明一個(gè)CFileFind類變量,以用來搜索
              char tempFileFind[200]; //用于定義搜索格式
              sprintf(tempFileFind,"%s\\*.*",DirName);
              //匹配格式為*.*,即該目錄下的所有文件 
             
              BOOL IsFinded=(BOOL)tempFind.FindFile(tempFileFind);
              //查找第一個(gè)文件
               while(IsFinded)
              {
                 IsFinded=(BOOL)tempFind.FindNextFile(); //遞歸搜索其他的文件 
                if(!tempFind.IsDots()) //如果不是"."目錄
            {
             char foundFileName[200];
             strcpy(foundFileName,tempFind.GetFileName().GetBuffer(200));
            if(tempFind.IsDirectory()) //如果是目錄,則遞歸地調(diào)用
            { //DeleteDirectory
             char tempDir[200];
            sprintf(tempDir,"%s\\%s",DirName,foundFileName);
            DeleteDirectory(tempDir);
            }
            else
             { //如果是文件則直接刪除之
             char tempFileName[200];
            sprintf(tempFileName,"%s\\%s",DirName,foundFileName);
            DeleteFile(tempFileName);
            }
            }
            }
             tempFind.Close();
            if(!RemoveDirectory(DirName)) //刪除目錄
             {
            AfxMessageBox("刪除目錄失敗!",MB_OK);
             return FALSE;
             }
            return TRUE;
            }

            5.? lib和dll文件的區(qū)別和聯(lián)系

            .dll是在你的程序運(yùn)行的時(shí)候才連接的文件,因此它是一種比較小的可執(zhí)行文件格式,.dll還有其他的文件格式如.ocx等,所有的.dll文件都是可執(zhí)行。

            .lib是在你的程序編譯連接的時(shí)候就連接的文件,因此你必須告知編譯器連接的lib文件在那里。一般來說,與動(dòng)態(tài)連接文件相對(duì)比,lib文件也被稱為是靜態(tài)連接庫。當(dāng)你把代碼編譯成這幾種格式的文件時(shí),在以后他們就不可能再被更改。如果你想使用lib文件,就必須:
            1? 包含一個(gè)對(duì)應(yīng)的頭文件告知編譯器lib文件里面的具體內(nèi)容
            2? 設(shè)置lib文件允許編譯器去查找已經(jīng)編譯好的二進(jìn)制代碼

            如果你想從你的代碼分離一個(gè)dll文件出來代替靜態(tài)連接庫,仍然需要一個(gè)lib文件。這個(gè)lib文件將被連接到程序告訴操作系統(tǒng)在運(yùn)行的時(shí)候你想用到什么dll文件,一般情況下,lib文件里有相應(yīng)的dll文件的名字和一個(gè)指明dll輸出函數(shù)入口的順序表。如果不想用lib文件或者是沒有l(wèi)ib文件,可以用WIN32 API函數(shù)LoadLibrary、GetProcAddress。事實(shí)上,我們可以在Visual C++ IDE中以二進(jìn)制形式打開lib文件,大多情況下會(huì)看到ASCII碼格式的C++函數(shù)或一些重載操作的函數(shù)名字。

            一般我們最主要的關(guān)于lib文件的麻煩就是出現(xiàn)unresolved symble 這類錯(cuò)誤,這就是lib文件連接錯(cuò)誤或者沒有包含.c、.cpp文件到工程里,關(guān)鍵是如果在C++工程里用了C語言寫的lib文件,就必需要這樣包含:
            extern "C"
            {
            #include "myheader.h"
            }
            這是因?yàn)镃語言寫的lib文件沒有C++所必須的名字破壞,C函數(shù)不能被重載,因此連接器會(huì)出錯(cuò)。

            posted on 2007-03-26 14:34 譚文政 閱讀(520) 評(píng)論(0)  編輯 收藏 引用 所屬分類: C/C++
            色综合合久久天天综合绕视看| 久久久WWW成人免费精品| 久久亚洲精品无码aⅴ大香| 久久天天躁狠狠躁夜夜avapp| 免费精品99久久国产综合精品| 9191精品国产免费久久| 欧洲成人午夜精品无码区久久| 久久久精品人妻一区二区三区四 | 热RE99久久精品国产66热| 亚洲国产另类久久久精品黑人 | 91精品国产色综合久久| 麻豆亚洲AV永久无码精品久久| 国产精品久久久久久久 | 亚洲欧美国产精品专区久久| 国产精品xxxx国产喷水亚洲国产精品无码久久一区 | 亚洲国产精品18久久久久久| 99久久婷婷国产一区二区| 久久精品国产亚洲av麻豆图片| 久久婷婷五月综合色99啪ak| 久久99精品久久久久久秒播| 亚洲国产精品婷婷久久| 狠狠色婷婷久久一区二区| 久久天天躁狠狠躁夜夜avapp| 亚洲国产精品热久久| 狠狠色婷婷综合天天久久丁香| aaa级精品久久久国产片| 久久精品国产免费观看三人同眠| 久久久久人妻一区精品果冻| 久久久久久狠狠丁香| 99999久久久久久亚洲| 久久99精品国产| 精品一区二区久久久久久久网站| 性高湖久久久久久久久| 久久99国产综合精品| 国产福利电影一区二区三区,免费久久久久久久精 | 精品熟女少妇av免费久久| 777午夜精品久久av蜜臀| 欧洲成人午夜精品无码区久久| 欧美噜噜久久久XXX| 久久99精品久久久久久久不卡| 久久久亚洲欧洲日产国码二区|