乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      【圖】【編程開發(fā)】編程開發(fā)教程大全

       牛人的尾巴 2017-01-08

      vc++技術內(nèi)幕(第四版)筆記(第8章)

      2016-02-19 0 1 收藏

      最近很多朋友喜歡上設計,但是大家卻不知道如何去做,別擔心有圖老師給你解答,史上最全最棒的詳細解說讓你一看就懂。

      第八章:使用ActiveX控件

      1,ActiveX控件是一個直接插入到C++程序中的軟件模塊,以前常稱OLE控件(OCX),是基于MS-COM技術。

      2,ActiveX控件與普通Windows控件比較:

      相同點:ActiveX控件也可看成是一個子窗口(可以看成這樣的)。

      如果想在對話框上加入ActiveX控件,則只要在對話框編輯器中,把ActiveX控件放在適當?shù)奈恢蒙?,并在資源模板中標識該控件。如果要在運行的過程中建立ActiveX控件,則可以調(diào)用響應控件類的Create成員函數(shù),而且通常在父窗口的WM_CREATE消息控制函數(shù)中調(diào)用。

      不同點:屬性和方法。

      ActiveX控件不像普通控件那樣發(fā)送以WM_打頭的通知消息給它的包容器窗口,而是激發(fā)事件。事件實際上是由控件調(diào)用包容器函數(shù)。像普通的控件通知消息一樣,事件并沒有返回值傳給ActiveX控件。事件如lick,KeyDown。但對于客戶來說時間與控件的通知消息是一樣的。

      3,在MFC庫中,ActiveX控件就像子窗口一樣,但在控件窗口和包容器窗口之間有一層重要代碼。實際上,ActiveX控件可能沒有窗口。當調(diào)用Create函數(shù)時,并不是直接建立控件窗口,而是把控件代碼載入進來,并激發(fā)一個“實地激活”(in-place activation)命令。然后ActiveX控件再建立它自己的窗口,通過MFC的CWnd類指針我們可以訪問該窗口。不過客戶程序最好不要使用ActiveX控件的hWnd句柄。

      4,通常ActiveX控件會保存在擴展名為OCX的動態(tài)連接庫中。包容器程序回根據(jù)Windows注冊表利用COM技術在需要的時候裝入動態(tài)連接庫。

      說明:

      1)暫時可以這樣認為,如果使用了ActiveX控件,那么在運行時候要裝入該ActiveX控件代碼。顯然在發(fā)布含有ActiveX控件的程序時候,必須要包含相應的OCX文件,而且還得提供一個合適的安裝程序。

      5,安裝ActiveX控件:

      1)把找到的ActiveX控件動態(tài)連接庫拷到硬盤上。

      2)在WINDOWS注冊表中登記注冊。(可使用Regsvr32命令行命令)

      3)在使用該控件的項目中安裝該控件。(選擇Project菜單,再選擇Add To Project,再選擇Components And Controls,再選擇Registered ActiveX Controls,這時列表框列出系統(tǒng)已經(jīng)注冊所有的ActiveX控件,選擇需要的控件INSERT即可。)

      6,ActiveX控件包容器編程:

      1)不管ActiveX控件是作為對話框控件,還是做為“子窗口”,MFC和ClassWizard都支持。

      2)ActiveX控件編寫者設計了ActiveX控件屬性供使用者在設計時訪問。所有的ActiveX控件屬性(包括設計時屬性),在運行時都是可以訪問的,不過有些屬性可能被設計成只讀的。

      3)當在項目中插入ActiveX控件時,ClassWizard就會產(chǎn)生相應的CWnd的派生類C++類,來滿足對空間的方法和屬性進行訪問要求??丶膶傩院头椒ǘ加邢鄳某蓡T函數(shù),同時生成的類還有一個構造函數(shù)可用以動態(tài)創(chuàng)建ActiveX控件的事例。

      4)當在項目中插入ActiveX控件ClassWizard生成的CWnd的派生類C++類中,可以看到其成員函數(shù)的代碼中都有對InvokeHelper函數(shù)的調(diào)用,InvokeHelper函數(shù)的第一個參數(shù)都和對應的屬性或方法在ActiveX控件中的分發(fā)(dispatch)ID(標識ActiveX控件的方法或?qū)傩缘模┫鄬?。通過查看ActiveX控件hlp文件可以發(fā)現(xiàn),ActiveX控件的方法在生存的C++類中都有同名的成員函數(shù)與之對應,ActiveX控件的屬性都有一組Get和Set函數(shù)對其操作,其中ActiveX控件的方法和屬性操作與生成的C++類成員函數(shù)相關聯(lián)都是通過InvokeHelper函數(shù)的調(diào)用來完成的,InvokeHelper函數(shù)的第一個參數(shù)是由Component Gallery(控件提供者)提供的。因為經(jīng)過這樣的處理,所以我們?nèi)绻{(diào)用ActiveX控件的方法或?qū)ζ鋵傩赃M行取和設置操作,只需調(diào)用生成的C++類對應的成員函數(shù)便可。下面對InvokeHelper單獨說明:

      CWnd::InvokeHelper
      void InvokeHelper( DISPID dwDispID, WORD wFlags, VARTYPE vtRet, void* pvRet, const BYTE* pbParamInfo, ... );

      說明:

      Call this member function to invoke the OLE control method or property specified by dwDispID, in the context specified by wFlags.
      其中參數(shù):
      dwDispID:
      //Identifies the method or property to be invoked. This value is usually supplied by Component Gallery.

      (本文來源于圖老師網(wǎng)站,更多請訪問http://www./bianchengyuyan/)

      wFlags:可以為下面些值,指明調(diào)用InvokeHelper的目的。

      //[ DISPATCH_METHOD ]   The member is invoked as a method. If a property has the same name, both this and the DISPATCH_PROPERTYGET flag may be set.
      [ DISPATCH_PROPERTYGET ] The member is retrieved as a property or data member.
      [ DISPATCH_PROPERTYPUT ] The member is changed as a property or data member.
      [ DISPATCH_PROPERTYPUTREF ] The member is changed by a reference assignment, rather than a value assignment. This flag is valid only when the property accepts a reference to an object.

      vtRet:
      //Specifies the type of the return value.
      VT_EMPTY  void
      VT_I2  short
      VT_I4  long
      VT_R4  float
      VT_R8  double
      VT_CY  CY
      VT_DATE  DATE
      VT_BSTR  BSTR
      VT_DISPATCH  LPDISPATCH
      VT_ERROR  SCODE
      VT_BOOL  BOOL
      VT_VARIANT VARIANT
      VT_UNKNOWN  LPUNKNOWN

      pvRet:
      //Address of the variable that will that will receive the property value or return value. It must match the type specified by vtRet.

      pbParamInfo:一般都設置為NULL
      //Pointer to a null-terminated string of bytes specifying the types of the parameters following pbParamInfo.
      specifies the types of the parameters passed to the method or property.
      ...:
      //Variable List of parameters, of types specified in pbParamInfo.

      5)AppWizard對ActiveX控件的支持是通過在生成的應用程序類的成員函數(shù)InitInstance中插入(AfxEnableControlContainer();),同時在響應項目文件的StdAfx.h文件中插入(#includeafxdisp.h)(原因可參考書P38一些說明)。

      如果項目中不包含這兩行,而又要加入ActiveX控件,則只要手工加入上面兩行代碼即可。

      6)可以對話框編輯器來生成對話框的模板中加入一個或多個ActiveX控件,這樣我們可以在對話框模板生成的類中添加數(shù)據(jù)成員或事件控制函數(shù)來獲取ActiveX控件的屬性或?qū)ζ淇刂啤?/p>

      注意:(詳細見書P159頁的[致WIN32程序員])

      實際上,資源模板并不是在對話框編輯器中所看的那樣。函數(shù)CDialog::DoModal在把對話框模板交給WINDOWS內(nèi)部的對話框過程之前,要先對模板進行預處理,即:它先會去掉所有的ActiveX控件,有剩下的控件建立對話框窗口,然后再裝入ActiveX控件,激活它們并在正確的位置上創(chuàng)建它的窗口。

      當模式對話框運行時候,MFC處理所有送給對話框消息時,是不管是有普通控件發(fā)送的,還是ActiveX控件發(fā)送的。故ActiveX控件雖然不是對話框模板一部分,但用戶仍然可以用TAB鍵在所有的控件間切換。

      7)調(diào)用UpdateData(FALSE)將會從所有的對話框控件中讀取所有屬性值。如果只需要得到ActiveX控件屬性的話,可以調(diào)用ActiveX控件生成的C++類中Get函數(shù)(同樣設置調(diào)用Set函數(shù)),這樣就提高了效率。

      8)事例部分代碼對比說明:

      代碼一:

         CDataExchange dx(this,TRUE);
         DDX_Text(&dx,IDC_DAY,m_sDay);
         DDX_Text(&dx,IDC_MONTH,m_sMonth);
         DDX_Text(&dx,IDC_YEAR,m_sYear);

      說明一:

      CDataExchange類構造函數(shù):(注,在MFC|SRC|AFXWIN.H中可以看到其構造函數(shù)聲明,在MFC|SRC|WINCORE.CPP文件中可以看到其構造函數(shù)的定義。)

      (本文來源于圖老師網(wǎng)站,更多請訪問http://www./bianchengyuyan/)

      原型:CDataExchange::CDataExchange(CWnd* pDlgWnd, BOOL bSaveAndValidate);

      定義:

      CDataExchange::CDataExchange(CWnd* pDlgWnd, BOOL bSaveAndValidate)
      {
       ASSERT_VALID(pDlgWnd);
       m_bSaveAndValidate = bSaveAndValidate;
       m_pDlgWnd = pDlgWnd;
       m_hWndLastControl = NULL;
      }

      //其中m_pDlgWnd和m_bSaveAndValidate是CDataExchange數(shù)據(jù)成員,可以通過這中方式給它們賦值。
      m_pDlgWnd:The dialog box or window where the data exchange takes place.
      m_bSaveAndValidate Flag for the direction of DDX and DDV. 詳見說明二。

      說明二:

      //CDataExchange does not have a base class.
      //The CDataExchange class supports the dialog data exchange (DDX) and dialog data validation (DDV) routines used by the Microsoft Foundation classes. Use this class if you are writing data exchange routines for custom data types or controls, or if you are writing your own data validation routines.
      //A CDataExchange object provides the context information needed for DDX and DDV to take place. The flag m_bSaveAndValidate is FALSE when DDX is used to fill the initial values of dialog controls from data members. The flag m_bSaveAndValidate is TRUE when DDX is used to set the current values of dialog controls into data members and when DDV is used to validate the data values. If the DDV validation fails, the DDV procedure will display a message box explaining the input error. The DDV procedure will then call Fail to reset the focus to the offending control and throw an exception to stop the validation process.

      代碼二:(是為了比較代碼一做些說明的)

      (本文來源于圖老師網(wǎng)站,更多請訪問http://www./bianchengyuyan/)

      void CActiveXDialog::DoDataExchange(CDataExchange* pDX)
      {
       CDialog::DoDataExchange(pDX);//調(diào)用基類的DoDataExchange
       //{{AFX_DATA_MAP(CActiveXDialog)
       DDX_Control(pDX, IDC_CALENDAR1, m_calendar);
       DDX_Text(pDX, IDC_DAY, m_sDay);
       DDX_Text(pDX, IDC_MONTH, m_sMonth);
       DDX_Text(pDX, IDC_YEAR, m_sYear);
       /

      來源:http://www./n/20160219/1611590.html 第二天:Microsoft基本類庫應用程序框架

      ◎MFC是C++的Microsoft Windows API,如果想要開發(fā)WINDOWS的應用程序當然VC/MFC是開發(fā)環(huán)境的首選。 
      ◎MFC產(chǎn)生的應用程序使用了標準化的結(jié)構。(我現(xiàn)在還體會不出這點的優(yōu)勢所在,請高手指點) 
      ◎MFC產(chǎn)生的應用程序短而運行速度快。這應該說的是可以很容易的建立動態(tài)連接,其實程序還是需要大量的DLL,不過由于WINDOWS上有很多可以用DLL所以應用程序很短,我是這樣想的不知對否。 
      ◎VC++工具降低了編碼的復雜性。這點不容質(zhì)疑比起TC方便太多了。 
      ◎MFC庫功能非常豐富。書上列出了MFC從1.0--4.21的一些特性,我就不廢話了,大家應該看看。

         這一章節(jié)主要介紹了MFC庫的優(yōu)點,其實我本人認為在某些特定環(huán)境下其實MFC不一定就象說的那樣好。我想不會有人用純VC做MIS系統(tǒng)吧,太累了。我是這樣理解編程序的,如果把學編程看成學武的話,C/C++語言及編程思想(OOP)是內(nèi)功,API是基本功(編程思想是內(nèi)功、API是基本功這適用于任何WIN32編程,不論Visual C++、Delphi、C++Builder、VB......),VC/MFC應該不同武功其中的一種,不同的學習方法效果不一樣,只要下工夫也都可以達到一定的境界。真正的高手是有著深厚的內(nèi)功,扎實的基本功,至于武功招數(shù)無所謂了,隨便一站不丁不八全無破綻,無招勝有招了。對不住扯遠了。

         C++可以通過類庫來進行擴展,我們除了可以使用隨編譯器提供的類庫外還可以很方便使用軟件公司銷售的類庫產(chǎn)品,甚至可以自己開發(fā)。而應用程序框架是一種類庫的超集,它定義了程序的結(jié)構。

         下面給出兩個示例程序(一個是書上的一個是我寫的):

      雷神建議: 雖然現(xiàn)在很多書都附CD,CD上有書中所有示例的源代碼,但還是應該親自在VC6用手敲進去。這樣可以加深印象以及感受一下編譯除錯后程序正確運行時的樂趣,因為是純手工打造。自從我敲了近一百個代碼示例后,由于筆誤的BUG就很少了,打字速度也提高了。而且最好在原示例代碼的基礎上做些改動例如別千篇一律的顯示HELLO WORLD!換點別的,這樣做也可以加深對示例程序的理解。 
         我的HELLO WORLD用AppWizard向?qū)?chuàng)建一個顯示一個字符串的單文檔程序,只需要敲入一行語句,主要是體驗MFC的強大功能。

      1、打開VC++6從菜單選擇NEW,給項目命名為”MyApp01“。

      2、選擇MFC AppWizard[exe] 選項,除STEP 1選擇單文檔外其他STEP缺省。

      3、在Class View選擇CMyApp01View類的OnDraw()成員函數(shù)雙擊會在C++編譯器看到以下內(nèi)容 
      void CMyApp01View::OnDraw(CDC* pDC) 

      CMyApp01Doc* pDoc = GetDocument(); 
      ASSERT_VALID(pDoc); 
      // TODO: add draw code for native data here 

      在 // TODO: add draw code for native data here的位置增加一行代碼 
      void CMyApp01View::OnDraw(CDC* pDC) 

      CMyApp01Doc* pDoc = GetDocument(); 
      ASSERT_VALID(pDoc); 
      pDC-TextOut(10,10,"雷神愿意和所有學VC的朋友共同進步!"); //-----------增加的一行 
      // TODO: add draw code for native data here 

         完了,就這么簡單。編譯運行??吹搅藛??這個程序具備WINDOWS程序的所有特性,例如有菜單、工具條、狀態(tài)欄、最大化、關閉、甚至還有關于對話框、打印預覽.....全了,這就是AppWizard通過MFC動態(tài)創(chuàng)建的一個應用程序。從這個小例子可以看出用VC/MFC設計WINDOWS程序多么方便。下面我們看看書上的例子,以便更進一步了解應用程序框架。

      (本文來源于圖老師網(wǎng)站,更多請訪問http://www./bianchengyuyan/)

           書上的例子:

      1、先建立一個Win32 Application的應用程序。

      2、選擇Project-Add to project-Files,分別創(chuàng)建一個名為MyApp.h和一個名為MyApp.cpp的文件。

      3、添加代碼:(最好照敲以下代碼到編譯器,別用Ctrl+C/Ctrl+V) 
      //*********************************************** 
      // MyApp.h 
      //

      class CMyApp:public CWinApp //見下② 

      public: 
      virtual BOOL InitInstance(); 
      };

      class CMyFrame:public CFrameWnd 

      public: 
      CMyFrame(); 
      protected: 
      afx_msg void OnLButtonDown(UINT nFlags,CPoint point); 
      afx_msg void OnPaint(); 
      DECLARE_MESSAGE_MAP() 
      };

      //***************************************************** 
      // MyApp.cpp 
      //

      #include "afxwin.h" 
      #include "myapp.h" 
      CMyApp theApp;//建立一個CMyAPP對象見下②

      BOOL CMyApp::InitInstance () 

      m_pMainWnd=new CMyFrame(); 
      m_pMainWnd-ShowWindow (m_nCmdShow); 
      m_pMainWnd-UpdateWindow (); 
      return TRUE; 
      }

      BEGIN_MESSAGE_MAP(CMyFrame,CFrameWnd) 
      ON_WM_LBUTTONDOWN() 
      ON_WM_PAINT() 
      END_MESSAGE_MAP()

      CMyFrame::CMyFrame(){ 
      Create(NULL,"MYAPP Application"); 

      void CMyFrame::OnLButtonDown (UINT nFlags,CPoint point) 

      TRACE("Entering CMyFrame::OnLButtonDown - %lx,%d,%d", 
      (long)nFlags,point.x ,point.y); 
      }

      void CMyFrame::OnPaint () 

      CPaintDC dc(this); 
      dc.TextOut (0,0,"Hello World!"); 

      4、編譯運行,報錯。為什么呢?原來還沒有添加MFC的支持,在Project Setting選項General屬性頁選擇”Use MFC in a Static Library"

      5、再Ctrl+F5,哈成功了。

           讓我們看看這個程序中的一些元素。

      ①WinMain函數(shù):并非不存在只是已經(jīng)被隱藏在應用程序框架內(nèi)部。

      ②CMyApp類:CMyApp類的對象代表一個應用程序,CWinApp基類決定它的大部分行為。

      ③應用程序的啟動:當開始運行應用程序時WINDOWS會調(diào)用WinMain函數(shù),WinMain會查找該應用程序的全局對象theApp。

      ④CMyApp::InitInstance成員函數(shù):發(fā)現(xiàn)theApp后自動調(diào)用重載的虛函數(shù)InitInstance來完成主窗口的構造和顯示工作。記住這個函數(shù)。

      ⑤CWinApp::Run成員函數(shù):WinMain在調(diào)用InitInstance之后緊接著調(diào)用Run函數(shù),它被隱藏在基類中負責傳遞應用程序的消息給相映的窗口。(我把它理解為好象SDK的窗口的過程函數(shù)不知對不對)

      ⑥CMyFrame類:此類的對象代表著應用程序的主窗口。它的構造函數(shù)調(diào)用基類CFrameWnd的Create函數(shù)創(chuàng)建具體的窗口結(jié)構。

      (本文來源于圖老師網(wǎng)站,更多請訪問http://www./bianchengyuyan/)

      ⑦CMyFrame::OnLButtonDown函數(shù):演示消息處理機制,當鼠標坐鍵被按下這一事件被映射到CMyFrame的OnLButtonDown函數(shù)上,如果你選擇F5進行編譯運行的話可以在調(diào)試窗口看到TRACE宏顯示的類似下面的信息 
      Entering CMyFrame::OnLButtonDown - 1,309,119 
      Entering CMyFrame::OnLButtonDown - 1,408,221

      ⑧CMyFrame::OnPaint函數(shù):應用程序每次重新繪制窗口都需要調(diào)用此函數(shù),將顯示"Hello World!"放在這里是因為每次窗口發(fā)生變化時保證"Hello World!"被顯示,你可以試著將語句: 
      CPaintDC dc(this); 
      dc.TextOut (0,0,"Hello World!");

      寫在別出,例如寫在 
      void CMyFrame::OnLButtonDown (UINT nFlags,CPoint point) 

      TRACE("Entering CMyFrame::OnLButtonDown - %lx,%d,%d", 
      (long)nFlags,point.x ,point.y); 
      CPaintDC dc(this); 
      dc.TextOut (0,0,"Hello World!"); 

      運行后當點擊左鍵時顯示"Hello World!",但當窗口最小化再最大化時"Hello World!"不見了。

      (本文來源于圖老師網(wǎng)站,更多請訪問http://www./bianchengyuyan/)

      ⑧關閉應用程序:用戶關閉應用程序時會有一系列事件發(fā)生。首先CMyFrame對象被刪除,然后退出Run,進而退出WinMain,最后刪除CMyApp對象。

         通過上面的示例我們看見程序的大部分功能包含在基類CWinApp和CFrameWnd中,我們只寫了很少的函數(shù),便可以完成很復雜的功能。所以應用程序框架不僅僅是一種類庫,它還定義了應用程序的結(jié)構,除了基類外還包括WinMain函數(shù),以及用來支持消息處理、診斷、DLL、等都包含在應用程序框架中。

      來源:http://www./n/20160219/1602452.html

        本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內(nèi)容,請點擊一鍵舉報。
        轉(zhuǎn)藏 分享 獻花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多