• <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>
            posts - 131, comments - 12, trackbacks - 0, articles - 0
              C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

            2013年5月7日

            http://blog.csdn.net/lanshengsheng2012

            由于
            這個博客僅限于c++方面。目前進行我的博客轉(zhuǎn)移到csdn

            posted @ 2013-05-07 16:53 盛勝 閱讀(365) | 評論 (0)編輯 收藏

            2013年4月7日

            VC動態(tài)創(chuàng)建控件
            2010-12-15 11:09

            動態(tài)控件是指在需要時由Create()創(chuàng)建的控件,這與預(yù)先在對話框中放置的控件是不同的。 

              一、創(chuàng)建動態(tài)控件:

              為了對照,我們先來看一下靜態(tài)控件的創(chuàng)建。

              放置靜態(tài)控件時必須先建立一個容器,一般是對話框,這時我們在對話框編輯窗口中,從工具窗口中拖出所需控件放在對話框中即可,再適當(dāng)修改控件ID,設(shè)置控件屬性,一個靜態(tài)控件就創(chuàng)建好了,當(dāng)對話框被顯示時,其上的控件也會顯示。

              靜態(tài)控件不需要調(diào)用Create()函數(shù)來創(chuàng)建。

              而創(chuàng)建動態(tài)控件有很大不同,以下以按鈕為例,看一下動態(tài)控件的創(chuàng)建過程:

              1.建立控件ID號:

              ID號是控件的標(biāo)識,創(chuàng)建控件前必須先為它設(shè)置一個ID號。

              打開資源中的“String Table”,在空白行上雙擊鼠標(biāo),這時會彈出一個ID屬性對話框,在其中的ID編輯框中輸入ID,如:IDC_MYBUTTON,在Caption中輸入控件標(biāo)題或注解(注:Caption框不能為空,為空會導(dǎo)致創(chuàng)建失敗),這里我輸入的是按鈕上要顯示的文字--動態(tài)按鈕。

              2.建立控件對象:

              不同種類的控件應(yīng)創(chuàng)建不同的類對象:

              ·按鈕控件 CButton (包括普通按鈕、單選按鈕和復(fù)選按鈕)
              ·編輯控件 CEdit
              ·靜態(tài)文本控件 CStatic
              ·標(biāo)簽控件 CTabCtrl
              ·旋轉(zhuǎn)控件 CSpinButtonCtrl
              ·滑標(biāo)控件 CSliderCtrl
              ·多信息編輯控件 CRichEditCtrl
              ·進度條控件 CProgressCtrl
              ·滾動條控件 CSrcollBar
              ·組合框控件 CComboBox
              ·列表框控件 CListBox
              ·圖像列表控件 CImageCtrl
              ·樹狀控件 CTreeCtrl
              ·動畫控件 CAnimateCtrl

              本例中我們創(chuàng)建一個CButton類的普通按鈕。注意不能直接定義CButton對象,如:CButton m_MyBut;這種定義只能用來給靜態(tài)控件定義控制變量,不能用于動態(tài)控件。

              正確做法是用new調(diào)用CButton構(gòu)造函數(shù)生成一個實例:

            CButton *p_MyBut = new CButton();

              然后用CButton類的Create()函數(shù)創(chuàng)建,該函數(shù)原型如下:

            BOOL Create( LPCTSTR lpszCaption, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID );

              lpszCaption是按鈕上顯示的文本;dwStyle指定按鈕風(fēng)格,可以是按鈕風(fēng)格與窗口風(fēng)格的組合,取值有:

              窗口風(fēng)格:

              ·WS_CHILD 子窗口,必須有
              ·WS_VISIBLE 窗口可見,一般都有
              ·WS_DISABLED 禁用窗口,創(chuàng)建初始狀態(tài)為灰色不可用的按鈕時使用
              ·WS_TABSTOP 可用Tab鍵選擇
              ·WS_GROUP 成組,用于成組的單選按鈕中的第一個按鈕

              按鈕風(fēng)格:

              ·BS_PUSHBUTTON 下壓式按鈕,也即普通按鈕
              ·BS_AUTORADIOBUTTON 含自動選中狀態(tài)的單選按鈕
              ·BS_RADIOBUTTON 單選按鈕,不常用
              ·BS_AUTOCHECKBOX 含自動選中狀態(tài)的復(fù)選按鈕
              ·BS_CHECKBOX 復(fù)選按鈕,不常用
              ·BS_AUTO3STATE 含自動選中狀態(tài)的三態(tài)復(fù)選按鈕
              ·BS_3STATE 三態(tài)復(fù)選按鈕,不常用
             
              以上風(fēng)格指定了創(chuàng)建的按鈕類型,不能同時使用,但必須有其一。

              ·BS_BITMAP 按鈕上將顯示位圖
              ·BS_DEFPUSHBUTTON 設(shè)置為默認(rèn)按鈕,只用于下壓式按鈕,一個對話框中只能指定一個默認(rèn)按鈕
              ·rect指定按鈕的大小和位置;
              ·pParentWnd指示擁有按鈕的父窗口,不能為NULL;
              ·nID指定與按鈕關(guān)聯(lián)的ID號,用上一步創(chuàng)建的ID號。

              不同控件類的Create()函數(shù)略有不同,可參考相關(guān)資料。

              例:p_MyBut->Create( "動態(tài)按鈕", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, CRect(20,10,80,40), this, IDC_MYBUTTON );
            這樣,我們就在當(dāng)前對話框中的(20,10)處創(chuàng)建了寬60,高30,按鈕文字為“動態(tài)按鈕”的下壓式按鈕。

              為了使創(chuàng)建過程更方便易用,我定義了如下函數(shù):

            CButton* CTextEditorView::NewMyButton(int nID,CRect rect,int nStyle)
            {
            CString m_Caption;
            m_Caption.LoadString( nID ); //取按鈕標(biāo)題
            CButton *p_Button = new CButton();
            ASSERT_VALID(p_Button);
            p_Button->Create( m_Caption, WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | nStyle, rect, this, nID ); //創(chuàng)建按鈕
            return p_Button;
            }

              其中m_Caption.LoadString( nID )是從字符串表中讀取按鈕文本,這樣在創(chuàng)建按鈕ID時,應(yīng)該把文本設(shè)置好,參數(shù)nStyle為除必須風(fēng)格外的額外風(fēng)格。

              以下,調(diào)用該函數(shù)在ONINIATIAL中創(chuàng)建三個按鈕,并指定第一個按鈕為默認(rèn)按鈕,按鈕的ID在STRING TABLE中已預(yù)先設(shè)置好了:

            //CButton *p_MyBtn[3];//為了在后面釋放資源,改為在類頭文件中聲明為

                                                  //公有變量
             p_MyBtn[0]=NewMyButton(ID_MYBTN1,CRect(10,20,60,40),BS_DEFPUSHBUTTON);
             p_MyBtn[1]=NewMyButton(ID_MYBTN2,CRect(10,50,60,70),0);
             p_MyBtn[2]=NewMyButton(ID_MYBTN3,CRect(10,80,60,100),0);

             

             

            二、動態(tài)控件的響應(yīng):

              動態(tài)控件的響應(yīng)函數(shù)不能用ClassWizard添加,只能手動添加。仍以上面的按鈕為例,我們制作按鈕的單擊響應(yīng)函數(shù)。

              1.在MESSAGE_MAP中添加響應(yīng)函數(shù):

              MESSAGE_MAP表中定義了消息響應(yīng)函數(shù),其格式為:消息名(ID,函數(shù)名),當(dāng)我們用ClassWizard添加函數(shù)時,會自動添加在AFX_MSG_MAP括起的區(qū)間內(nèi),如:

            BEGIN_MESSAGE_MAP(CTextEditorView, CFormView)
            //{{AFX_MSG_MAP(CTextEditorView)
            ON_BN_CLICKED(IDC_ICONBUT0, OnIconbut0)
            //}}AFX_MSG_MAP
            END_MESSAGE_MAP()

             

             
              手工添加時不要添加到AFX_MSG_MAP區(qū)間內(nèi),以防ClassWizard不能正常工作,如: 

            BEGIN_MESSAGE_MAP(CTextEditorView, CFormView)
            //{{AFX_MSG_MAP(CTextEditorView)
            ON_BN_CLICKED(IDC_ICONBUT0, OnIconbut0)
            //}}AFX_MSG_MAP
            ON_BN_CLICKED(ID_MYBTN1, OnMybtn1)
            ON_BN_CLICKED(ID_MYBTN2, OnMybtn2)
            ON_BN_CLICKED(ID_MYBTN3, OnMybtn3)
            END_MESSAGE_MAP()

             


              其中ON_BN_CLICKED是按鈕單擊消息。

              2.在頭文件中添加函數(shù)定義:

              用ClassWizard添加函數(shù)時,會在頭文件的AFX_MSG區(qū)間內(nèi)添加函數(shù)定義,如: 

            protected:
            //{{AFX_MSG(CTextEditorView)
            afx_msg void OnIconbut0();
            //}}AFX_MSG
            DECLARE_MESSAGE_MAP()

             


              我們模仿這種形式,只是把函數(shù)定義添加到AFX_MSG區(qū)間外就行了:

            protected:
            //{{AFX_MSG(CTextEditorView)
            afx_msg void OnIconbut0();
            //}}AFX_MSG
            afx_msg void OnMybtn1();
            afx_msg void OnMybtn2();
            afx_msg void OnMybtn3();
            DECLARE_MESSAGE_MAP()

             


              3.編寫消息響應(yīng)函數(shù):

              以上是把消息和函數(shù)關(guān)聯(lián)起來了,具體在單擊按鈕后應(yīng)做的工作在函數(shù)中完成: 

            void CTextEditorView::OnMybtn1()
            {
            MessageBox( "哈!你單擊了動態(tài)按鈕。" );
            }
            void CTextEditorView::OnMybtn2()
            {
            ……
            }
            void CTextEditorView::OnMybtn3()
            {
            ……
            }

             


              除了按鈕的響應(yīng)函數(shù)外,你還可以用上面獲得的指針訪問按鈕,如:

              修改按鈕的大小和位置:p_MyBtn[0]->MoveWindow(……);

              修改按鈕文本:p_MyBtn[0]->SetWindowText(……);

              顯示/隱藏按鈕:p_MyBtn[0]->ShowWindow(……);等等。

            三、回收資源:

              由于動態(tài)控件對象是由new生成的,它不會被程序自動釋放,所以需手工釋放。在控件不再使用時可以刪除它,在對話框中的析構(gòu)函數(shù)中銷毀(析構(gòu)函數(shù)沒有手動添加):

            CMonthCalCtrlDlg::~CMonthCalCtrlDlg()
            {
             for(int i=0;i<3;i++)
                {if(p_MyBtn[i])
                 delete p_MyBtn[i];

                p_MyBtn[0]=NULL;//若采用其他方式釋放,則加上這句,否則會出錯
                }
            }

             


              以上就是按鈕控件動態(tài)生成的方法。

            posted @ 2013-04-07 14:36 盛勝 閱讀(402) | 評論 (0)編輯 收藏

            vc 如何建動態(tài)按鈕

             

            在類的定義中,定義如下變量

            [c-sharp] view plaincopy
            1. Cbutton m_btn;  

             

             

            那么在類的成員函數(shù)中就可以使用了如下來創(chuàng)建按鈕。

            [c-sharp] view plaincopy
            1. m_btn.Create("動態(tài)創(chuàng)建的按鈕",BS_DEFPUSHBUTTON|WS_VISIBLE|WS_CHILD,CRect(0,0,100,100),this,123);  

             

            注,創(chuàng)建第二次的時候會出錯。所以要用。

            [c-sharp] view plaincopy
            1. M_btn. DestroyWindow();  

             

            來釋放再進行創(chuàng)建。

            借由這個動態(tài)創(chuàng)建,弄清了一些MFC的構(gòu)架,MFC是基于所有的類而得出的成果,一個類派生與另一個基類,從CWnd到CDialog就是一個很好的例子。CDialog派生與CWnd。

            如果我要創(chuàng)建一個按鈕,就必須用CDialog定義一個新的變量,這個變量就成了一個按鈕,我就可以利用這個按鈕類進行 各類操作,例如定義其的大小,風(fēng)格。

             

            皆由此可見,所有的窗口都是一個類定義來的。無論是按鈕,標(biāo)簽,ComBox,List等等,都可以使用這個方法進行創(chuàng)建。

            在編輯代碼方面,VC與VB就有了,對于用戶來說,就有了本質(zhì)上的差別,VB的或許更加方便,而VC需要處理的細節(jié)太多了。


            //創(chuàng)建按鈕 
            CButton   *m_pBt1   =   new   CButton();     
            ASSERT_VALID(m_pBt1); 
            m_pBt1-> Create(_T("進入[A]"),   WS_GROUP ¦WS_CHILD ¦WS_VISIBLE ¦BS_PUSHBUTTON,   CRect(10,10,20,20),   this,   IDC_AUTOCUT_POSTEACH   );         
            m_pBt1-> MoveWindow(0,   152,   100,   100);   
            //修改風(fēng)格   
            HWND       hwnd=m_pBt1-> GetSafeHwnd();       
            long       lStyle=GetWindowLong(hwnd,GWL_EXSTYLE); 
            SetWindowLong(hwnd,GWL_EXSTYLE,lStyle ¦WS_EX_DLGMODALFRAME);               
            ::SetWindowPos(hwnd,0,   12,   55,   55,   111,   SWP_NOREPOSITION ¦SWP_NOACTIVATE ¦SWP_NOMOVE ¦SWP_FRAMECHANGED);

            posted @ 2013-04-07 14:33 盛勝 閱讀(368) | 評論 (0)編輯 收藏

            2013年3月30日

             //m_pdbado->GetFieldValue(_T("AccountCreateDate"),str);
            m_pdbado->GetFieldValue(_T("AccountCreateDate"),coledatetime);
            str = coledatetime.Format("%Y-%m-%d %H:%M:%S");
            if (str.size()>64)
            {
            m_strError = "超過長度";
            //m_pdbado->CloseRecordset();
            return false;
            }
            strcpy_s(user_info.AccountCreateDate,64,str.c_str());
            要用COleDateTime coledatetime; 讀取,再格式化 

            posted @ 2013-03-30 12:10 盛勝 閱讀(195) | 評論 (0)編輯 收藏

            BOOL C*****::StartMakeing( void )
            {
            unsigned threadID = 0;   
            m_start = true;
            m_hThread =(HANDLE) _beginthreadex(NULL, 0, MakeMontage, (LPVOID)this, 0, &threadID );
            return (m_start != NULL);   
            }

            unsigned __stdcall C*****::MakeMontage( LPVOID lpParameter )
            {
            if(lpParameter)
            {
            C***** *pclient = (CDossierMontage*)lpParameter;
            pclient->doMake();
            }
            return 0xdead;
            }

            void C*****::doMake( )

            posted @ 2013-03-30 10:18 盛勝 閱讀(323) | 評論 (0)編輯 收藏

            2013年3月29日

            OnPain()
            CPaintDC *pdc=&dc;
            CRect r;
            GetClientRect(&r);
            CBitmap *pBitmap= new CBitmap;
            BITMAP bm;
            pBitmap->LoadBitmap(IDB_BG_NEW);
            pBitmap->GetBitmap(&bm);
            CDC* pDisplayMemDC = new CDC;
            pDisplayMemDC->CreateCompatibleDC(pdc);
            pDisplayMemDC->SelectObject(pBitmap);
            pdc->StretchBlt(r.left,r.top+30,r.Width(),r.Height()-30,pDisplayMemDC,
            0,0,bm.bmWidth,bm.bmHeight,SRCCOPY);
            pBitmap->DeleteObject();

            ReleaseDC(pdc);
            ReleaseDC(pDisplayMemDC);
            delete pDisplayMemDC;
            delete pBitmap;

            OnCtlColor
            //修改窗口控件背景顏色
            if (nCtlColor == CTLCOLOR_STATIC)
            {
            pDC->SetBkMode(TRANSPARENT);
            pDC->SetTextColor(#dedede);
            pDC->SetBkColor(#383838);
            hbr = CreateSolidBrush(#383838);
            }
            if (nCtlColor == CTLCOLOR_EDIT)
            {
            pDC->SetTextColor(#dedede);
            pDC->SetBkColor(#13344d);
            hbr = CreateSolidBrush(#13344d);
            }
            OnEraseBkgnd
            CRect windowRect;
            GetWindowRect(windowRect);
            ScreenToClient(windowRect);
            pDC->FillSolidRect(windowRect, #383838);
            return TRUE;

            posted @ 2013-03-29 17:30 盛勝 閱讀(437) | 評論 (0)編輯 收藏

            if (PathFileExists(path))
            {
            CString tempStr;
            tempStr.Format("shell32.dll,OpenAs_RunDLL %s",path);
            int isError=(int)ShellExecute(NULL, "open", "rundll32.exe ", tempStr, "", SW_SHOW);
            if (isError<32)
            {
            MessageBox("相應(yīng)文件打開失敗","提示");
            }
            }
            else
            {
            MessageBox("文件路徑有誤!");
            }

            posted @ 2013-03-29 17:26 盛勝 閱讀(261) | 評論 (0)編輯 收藏

            關(guān)閉
            SendMessage(WM_SYSCOMMAND, SC_CLOSE);
            最小化
            SendMessage(WM_SYSCOMMAND, SC_MINIMIZE);
            最大化
            SendMessage(WM_SYSCOMMAND, SC_MAXIMIZE);
            恢復(fù)原來大小
            SendMessage(WM_SYSCOMMAND, SC_RESTORE);
            對話框接受拖動
            PostMessage(WM_NCLBUTTONDOWN,HTCAPTION,MAKELPARAM(point.x,point.y));


            B00L PostMessage(HWNDhWnd,UINTMsg,WPARAMwParam,LPARAMlParam);
            hWnd:其窗口程序接收消息的窗口的句柄。可取有特定含義的兩個值:
                    HWND_BROADCAST:消息被寄送到系統(tǒng)的所有頂層窗口,包括無效或不可見的非自身擁有的窗口、  被覆蓋的窗口和彈出式窗口。消息不被寄送到子窗口
                    NULL:此函數(shù)的操作和調(diào)用參數(shù)dwThread設(shè)置為當(dāng)前線程的標(biāo)識符PostThreadMessage函數(shù)一樣
                    Msg:指定被寄送的消息。
            wParam:指定附加的消息特定的信息。
            IParam:指定附加的消息特定的信息。
            返回值:如果函數(shù)調(diào)用成功,返回非零值:如果函數(shù)調(diào)用失敗,返回值是零。若想獲得更多的錯誤信息,請調(diào)用GetLastError函數(shù)。

            posted @ 2013-03-29 16:58 盛勝 閱讀(453) | 評論 (0)編輯 收藏

            2013年3月26日

            SELECT COUNT(1) AS RecordNum FROM (SELECT MonitoryPointID FROM casedatarel WHERE 1=1 AND Type = 1 GROUP BY MonitoryPointID)a

            posted @ 2013-03-26 14:16 盛勝 閱讀(427) | 評論 (0)編輯 收藏

            2013年3月25日

            在VC中,也常常為一些圖片按鈕添加一些功能提示。
            下面講解實現(xiàn)過程:
            該功能的實現(xiàn)主要是用CToolTipCtrl類。該類在VC  msdn中有詳細說明。
            首先在對話框的頭文件中加入初始化語句:public:下,加入:CToolTipCtrl    m_Mytip;
            然后在初始化對話框函數(shù)中加入:
            m_Mytip.Create(this);  
            m_Mytip.AddTool( GetDlgItem(IDC_BUTTON), "你想要添加的提示信息" ); //IDC_BUTTON為你要添加提示信息的按鈕的ID
            m_Mytip.SetDelayTime(200); //設(shè)置延遲
            m_Mytip.SetTipTextColor( #0000ff ); //設(shè)置提示文本的顏色
            m_Mytip.SetTipBkColor( #ffffff); //設(shè)置提示框的背景顏色
            m_Mytip.Activate(TRUE); //設(shè)置是否啟用提示

            然后在類向?qū)е刑砑覲reTranslateMessage消息響應(yīng)函數(shù)
            BOOL CXXXDlg::PreTranslateMessage(MSG* pMsg)
            {
            // TODO: Add your specialized code here and/or call the base class
              if(pMsg->message==WM_MOUSEMOVE)
              m_Mytip.RelayEvent(pMsg);
            return CDialog::PreTranslateMessage(pMsg);
            }
            注:如果要為多個按鈕添加功能提示只需在
            m_Mytip.AddTool( GetDlgItem(IDC_BUTTON), "你想要添加的提示信息" );
            的下面再加上類似語句,如
            m_Mytip.AddTool( GetDlgItem(IDC_BUTTON1), "你想要添加的提示信息1" );
            m_Mytip.AddTool( GetDlgItem(IDC_BUTTON2), "你想要添加的提示信息2" );
            。。。。。。。。


            例子:

            聲明:
            CToolTipCtrl m_Tip;

            初始化:
            BOOL C***Dlg::OnInitDialog()
            {
            省略部分。。。。。。。。。。
            //按鈕浮動提示
            m_Tip.Create(this);
            m_Tip.AddTool(&m_BtnPlay,"播放");
            m_Tip.SetDelayTime(100);
            m_Tip.Activate(TRUE);
            }
            類視圖中重寫:
            BOOL C****Dlg::PreTranslateMessage(MSG* pMsg)
            {
            // TODO: 在此添加專用代碼和/或調(diào)用基類
            m_Tip.RelayEvent(pMsg);
            }

            posted @ 2013-03-25 09:25 盛勝 閱讀(759) | 評論 (0)編輯 收藏

            久久久久精品国产亚洲AV无码| 成人免费网站久久久| 波多野结衣AV无码久久一区| 无码国内精品久久人妻| 久久久久久综合一区中文字幕| 久久久久婷婷| 久久精品九九亚洲精品| 久久久久久久久久久免费精品| 性高湖久久久久久久久| 99久久精品国产一区二区蜜芽 | 久久国产高清字幕中文| 日韩久久久久中文字幕人妻 | 亚洲精品NV久久久久久久久久| 久久精品一区二区三区AV| 亚洲国产成人久久综合一| 亚洲美日韩Av中文字幕无码久久久妻妇 | 久久亚洲国产最新网站| 久久综合九色综合久99| 久久精品国产AV一区二区三区 | 久久久国产打桩机| 久久精品亚洲精品国产欧美| 国产精品久久久久9999高清| 久久国产劲爆AV内射—百度| 亚洲欧美国产精品专区久久| 久久久久亚洲av毛片大| 中文精品久久久久国产网址 | 久久久亚洲裙底偷窥综合| 久久中文字幕无码专区| 久久er国产精品免费观看8| 国内精品伊人久久久久| 99久久99久久久精品齐齐| 国内精品久久久久久久97牛牛| 久久久久久久精品成人热色戒 | 久久国产一区二区| 国产国产成人精品久久| 97久久精品人妻人人搡人人玩| 色综合久久久久久久久五月| 久久久久亚洲AV无码麻豆| 久久久久亚洲av无码专区喷水 | 囯产精品久久久久久久久蜜桃| 国产69精品久久久久9999APGF |