• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
  • 開始VC之路--創建窗體

    發表于:2007-07-01來源:作者:點擊數: 標簽:
    第一講 用Create()方法新建一個窗體應用程序 一般來講,大多數 Windows 應用程序的界面都是由一個或數個窗體構成。 而VC++中提供了豐富的類庫,用于創建Windows窗體應用程序。 我們一般可以通過CFreameWnd類中的Create()方法來創建一個窗體,Create() 函數的

    第一講 用Create()方法新建一個窗體應用程序

      一般來講,大多數Windows應用程序的界面都是由一個或數個窗體構成。
    而VC++中提供了豐富的類庫,用于創建Windows窗體應用程序。
      我們一般可以通過CFreameWnd類中的Create()方法來創建一個窗體,Create()
    函數的定義如下:

    BOOL Create(LPCTSTR lpszClassName,
      LPCTSTR lpszWindowName,
      DWORD dwStyle = WS_OVERLAPPEDWINDOW,
      const RECT& rect = rectDefault,
      CWnd* pParentWnd = NULL,        // != NULL for popups
      LPCTSTR lpszMenuName = NULL,
      DWORD dwExStyle = 0,
      CCreateContext* pContext = NULL);


      這是一個虛函數①,第一個參數lpszClassName是一個窗體類名字符串的指針
    (一個WNDCLASS②結構體)。此類名可以是任意的由全局函數AfxRegisterWndClass
    注冊過的預定義控件類名。如果為空,則使用CWnd類的默認屬性。第二個參數
    lpszWindowName是作為窗體標題的字符串指針。
      第三個參數dwStyle是宏定義的窗體類型,具體定義如下:

    WS_BORDER  創建一個有邊框的窗體。

    WS_CAPTION  創建一個有標題欄的窗體(隱含了WS_BORDER). 不能和WS_DLGFRAME
       一起使用.

    WS_CHILD  創建一個子窗體。不能和WS_POPUP一起使用。

    WS_CLIPCHILDREN  不包括在父窗體中被子窗體占用的區域。用于創建父窗體。

    WS_CLIPSIBLINGS  使子窗體彼此別??;就是當一個指定的子窗體接收到一個
       paint消息時,WS_CLIPSIBLINGS類型將別住所有重疊的子窗
       體超過區域的部分一起更新,(如果沒有使用WS_CLIPSIBLINGS
       并且子窗體重疊,當你在一個子窗體的客戶區繪圖時,可能
       會繪圖到鄰近的子窗體的客戶區。)只與WS_CHILD一起使用。

    WS_DISABLED  創建一個初始不可用的窗體。

    WS_DLGFRAME  創建一個有雙邊但無標題的窗體。

    WS_GROUP  指定一個用戶可以用方向鍵從一個控件移到另一個控件的控
       件組的第一個控件。All controls defined with the WS_GROUP
       style FALSE after the first control belong to the same
       group. The next control with the WS_GROUP style starts
       the next group (that is, one group ends where the next
       begins).

    WS_HSCROLL  創建一個帶水平滾動條的窗體。

    WS_MAXIMIZE  創建一個最大尺寸的窗體。

    WS_MAXIMIZEBOX  創建一個有最大化按扭的窗體。

    WS_MINIMIZE  創建一個初始最小化的窗體。只與WS_OVERLAPPED一起使用。

    WS_MINIMIZEBOX  創建一個有最小化按扭的窗體。

    WS_OVERLAPPED  創建一個重疊窗體。一個重疊窗體一般有標題和邊框。

    WS_OVERLAPPEDWINDOW 創建一個和WS_OVERLAPPED, WS_CAPTION, WS_SYSMENU,
       WS_THICKFRAME, WS_MINIMIZEBOX, and WS_MAXIMIZEBOX一
       使用的重疊窗體。

    WS_POPUP  創建一個彈出式窗體。不能和WS_CHILD一起使用。

    WS_POPUPWINDOW  創建一個和WS_BORDER, WS_POPUP, and WS_SYSMENU一起使
       用的彈出式窗體。WS_CAPTION必須和WS_POPUPWINDOW組合使
       用才能讓控件菜單可見。

    WS_SYSMENU  創建一個在標題欄有控件菜單框的窗體。只能和有標題欄的
       窗體一起使用。

    WS_TABSTOP  指定任意數量控件中的一個可以由用戶使用TAB鍵移動到的
       控件。TAB鍵使用戶移動到由WS_TABSTOP指定的下一個控件。

    WS_THICKFRAME  創建一個有厚邊框的Window,使其可以改變大小。

    WS_VISIBLE  創建一個初始可見的窗體。

    WS_VSCROLL  創建一個有垂直滾動條的窗體。

      由于上表中常量可以進行組合,用按位或運算,所以常量名的值被定義為類似于
    0x00C00000L的32位16進制數型式。例如進行WS_SYSMENU|WS_MINIMIZEBOX運算時即
    0x00080000L|0x00020000L。數字前面的0x是16位數的標識符,L表示32位,上式的演
    算式可表示如下:

    =
     00000000000010000000000000000000
        (|) 00000000000000100000000000000000
    ------------------------------------------
            00000000000010100000000000000000  =  0X000A0000L = 655360;

      當你用十進制數655360替代WS_SYSMENU|WS_MINIMIZEBOX作為實參時,你會看到相
    同的結果。

      第四個參數rect是一個RECT結構體的對象,用于指定窗體的尺寸和位置。RECT結
    構體的定義如下:

    typedef struct tagRECT
    {
        LONG    left;
        LONG    top;
        LONG    right;
        LONG    bottom;
    } RECT, *PRECT, NEAR *NPRECT, FAR *LPRECT;

      我們可以利用從tagRECT結構體派生出的CRect類的構造函數來初始化一個RECT結構
    體。CRect的一個重載構造函數定義如下:

    // from left, top, right, and bottom
    CRect(int l, int t, int r, int b);


      第五個參數pParentWnd用于指定父窗體,這是一個指向CWnd類對象的指針。第六
    個參數nID用于指定作為子窗體的窗體ID。最后一個參數是關于創建內容的指針,已
    被默認為NULL,不用理會。


    注釋:

    ① 虛函數的作用:如果沒有把需要在派生類中重載的同名
    基類函數定義為虛函數,則當用基類定義的指針指向派生類對象的地址時(賦
    值兼容規則),通過此指針調用的該同名函數是在基類中定義的;反之如果定
    義的虛函數,則通過指針調用的該同名函數是在指針指向的對象中定義的。

     

    第二講 Create()方法的應用

    下面是一個用CFrameWnd類的Create()函數創建一個窗體的例子:

    /////////////////////////////////////////////
    #include <afxwin.h>

    class CMyWnd:public CFrameWnd
    {
    public:
     CMyWnd()
     {
      Create(AfxRegisterWndClass(CS_DBLCLKS,0,HBRUSH(COLOR_WINDOWFRAME),AfxGetApp()->LoadStandardIcon(IDI_APPLICATION)),__T("Creamdog"),WS_SYSMENU,CRect(100, 100, 500, 500),this,NULL);
      ShowWindow(SW_SHOWNORMAL);
     };
    };

    class CMyApp:public CWinApp
    {
    public:
     virtual BOOL InitInstance()
     {
      m_pMainWnd=new CMyWnd;
      return TRUE;
     };
    };

    CMyApp myApp;
    /////////////////////////////////////////

      首先從其類CFrame中派生出CMyWnd類,并定義構造函數,用于生成一個新窗體。
    在構造函數中是使用Creat()函數創建窗體的,其中系統全局函數AfxRegisterWndClass()
    用于注冊一個窗體類,該函數的具體定義如下:

    LPCTSTR AFXAPI AfxRegisterWndClass(UINT nClassStyle, HCURSOR hCursor = 0, HBRUSH hbrBackground = 0, HICON hIcon = 0);

      第一個參數nClassStyle指定了窗體類的類型,如果為NULL則所有參數都使用
    默認值。具體默認值為:

    nClassStyle=CS_DBLCLKS;//響應雙擊事件
    hCursor=IDC_ARROW;//標準箭頭
    hbrBackground=Null;//不更新背景
    hIcon=IDI_APPLICATION;//Windows徽標(在WinXP中為小窗口)

      由于用默認值時窗體不會更新,一般函數的四個參數需要人為指定,第一個參數
    設為為CS_DBLCLKS即可。CS_DBLCLKS是窗體類型的一個宏定義,下表列出了所有窗體
    類型的宏定義。

    CS_BYTEALIGNCLIENT 在字節邊界(在X方向)上對齊窗體的客戶區。此類型將影
       響到在窗體顯示時它的寬度和它的水平位置。

    CS_BYTEALIGNWINDOW 在字節邊界(在X方向)上對齊窗體。此類型將影響到在窗
       體顯示時它的寬度和它的水平位置。

    CS_CLASSDC  分配一個設備環境并被類中的所有窗體共享。由于窗體類
       被處理特化,它是可以適用于一個應用程序的若干線程創
       建一個相同類的窗體。它同樣適用于多個線程試圖同時使
       用相同的設備環境。當此種情況發生時,系統只允許一個
       線程去成功的它的繪圖操作。

    CS_DBLCLKS  當指針在屬于此類的窗體內部,并且用戶雙擊鼠標時,將
       會發送一個雙擊消息到窗體程序。

    CS_GLOBALCLASS  指定此窗體類是一個應用程序全局類。應用程序全局類是
       由一個在進程中對所有模塊有效的exe或ddl注冊的一個窗
       體類。

    CS_HREDRAW  如果窗體被移動或尺寸調整器改變了客戶區的大小,重繪
       全部的窗體。

    CS_NOCLOSE  關閉按扭不可用。

    CS_OWNDC  為此類中的每一個窗體分配唯一的設備環境。

    CS_PARENTDC  設置子窗體中剪下的矩形到父窗體中,以使子窗全可以在父
       窗體上繪圖。一個具有CS_PARENTDC屬性控制的窗體從設備
       環境的系統緩存中接收到一個規則的設備環境。它不把父窗
       體的設備環境或設備環境設置給予子窗體。指定CS_PARENTDC
       以提高應用程序的性能。

    CS_SAVEBITS  保存被此類的一個窗體摭住的屏幕圖象的一部分為位圖。當
       窗體被移動,系統使用保存過的位圖去恢復屏幕圖象,包括
       其它被摭住的窗體。因此如果被位圖使用內存沒有被釋放,
       并且其它的屏幕動作沒有使儲存的圖像無效。系統不會發送
       WM_PAINT消息到被摭蓋的窗體。
       這種類型對在其它屏幕動作發生時被暫時顯示小窗體(如菜
       單或對話框)很有用。這種類型增加了顯示窗體所需的時間,
       因為系統必須先分配內存去存儲位圖。
     
    CS_VREDRAW  如果窗體被移動或尺寸調整器改變了客戶區的高度,重繪
       全部的窗體。

      上表中的宏定義值是類似于0x0080的16位16進制數,因此它們之間可以用按位
    或 | 符號進行組合,原理前面以經介紹過了。

      第二個參數hCursor為鼠標指針的句柄,但由于在窗體打開事件發生時,光標就
    會被重繪為箭頭,因此在注冊窗體類時對此進行設置意義不大,設為0即可。如果需
    要定義光標,首先應關閉數標重繪,方法是:重載窗體類基類的OnSetCursor()函數,
    讓其返回TRUE值,這樣當重繪時調用OnSetCursor()函就不起作用了??梢杂孟旅娴?BR>語句進行設置。

    SetCursor(AfxGetMainWnd()->LoadStandardCursor(IDC_IBEAM));

      其中::SetCursor()是全局函數,用來設置整個例程的光標參數是宏定義光標句
    柄。AfxGetMainWnd()是一個系統函數,它返回當前主窗體的句柄。而CWinApp的
    LoadStandardCursor()成員函數用來讀取一個系統指針,每一種系統指針的具體宏
    定義如下:

    IDC_APPSTARTING  帶小沙漏的標準箭頭
    IDC_ARROW  標準箭頭
    IDC_CROSS  十字光標(用于定位)
    IDC_HAND  Windows 2000:手型
    IDC_HELP  帶問號的箭頭
    IDC_IBEAM  I型標
    IDC_ICON  Obsolete for applications marked version 4.0 or later.
    IDC_NO   禁止符號
    IDC_SIZE  Obsolete for applications marked version 4.0 or later. Use IDC_SIZEALL.
    IDC_SIZEALL  十字箭頭
    IDC_SIZENESW  指向東北和西南的雙向箭頭
    IDC_SIZENS  指向南和北的雙向箭頭
    IDC_SIZENWSE  指向西北和東南的雙向箭頭
    IDC_SIZEWE  指向東西的雙向箭頭
    IDC_UPARROW  上箭頭
    IDC_WAIT  沙漏

      上表中宏定義值為類似于MAKEINTRESOURCE(32649)的函數,MAKEINTRESOURCE()的
    定義如下:

    #define MAKEINTRESOURCEW(i) (LPWSTR)((DWORD)((WORD)(i)))   //UNICODE
    #define MAKEINTRESOURCE  MAKEINTRESOURCEW

      將其還原為容易理解的C代碼:

    char *(unsigned long(unsigned short(32649))
      至于為什么系統要將其倒來倒去,是為了在重載函數中和一般的整形實參相區
    別(本人估計)。另外,如果想要使用自定義圖標或指針文件,則牽扯到實例資源
    分配的問題,將在以后進行說明。

      第三個參數hbrBackground,指定窗體背景的畫筆資源,應該指定一個,否則
    背景將不會更新。此參數可使用系統顏色,定義如下:

    COLOR_SCROLLBAR   0
    COLOR_BACKGROUND  1
    COLOR_ACTIVECAPTION  2
    COLOR_INACTIVECAPTION  3
    COLOR_MENU   4
    COLOR_WINDOW   5
    COLOR_WINDOWFRAME  6
    COLOR_MENUTEXT       7
    COLOR_WINDOWTEXT  8
    COLOR_CAPTIONTEXT  9
    COLOR_ACTIVEBORDER  10
    COLOR_INACTIVEBORDER  11
    COLOR_APPWORKSPACE  12
    COLOR_HIGHLIGHT   13
    COLOR_HIGHLIGHTTEXT  14
    COLOR_BTNFACE   15
    COLOR_BTNSHADOW   16
    COLOR_GRAYTEXT   17
    COLOR_BTNTEXT   18
    COLOR_INACTIVECAPTIONTEXT 19
    COLOR_BTNHIGHLIGHT  20

      第四個參數為程序圖標的標識符,為0時是默認的Windows徽標。與光標同樣,
    需要自定義圖標時,添加設置圖標的語句,例如:

    AfxGetMainWnd()->SetIcon(AfxGetApp()->LoadStandardIcon(IDI_EXCLAMATION),FALSE);

      與設置光標不同的是,設置光標的函數是全局函數,而設置圖標的函數是
    CWinApp類的成員函數(因為圖標只在窗體內有效),故在函數調用之前需要用系
    統函數AfxGetMainWnd()來獲取當前主窗體的句柄,再用CWinApp的LoadStandardIcon()
    成員函數來讀取系統圖標并返回一個圖標的句柄,最后CFrameWnd類的SetIcon()
    成員函數將窗體的圖標設置為剛才返回的圖標句柄。

      回到剛才的Create()語句,第一個參數用的是剛才注冊的類名。第二個參數中
    用到了強制類型轉換(__T),這個數據類型不對字符串做任何的改變,只是起到規
    范化編程的做用。第三個參數是前面提過的窗體類型,WS_SYSMENU是使窗體具有最
    大化、最小化、關閉三個按扭。第四個參數使窗體在所給出的位置和尺寸上打開。
    第五個參數this的意義是此窗體為父窗體。第六個參數表示無子窗體。
      ShowWindow()故名思意,即顯示窗體。其參數nCmdShow是確定窗體被怎樣顯示。
    它必須是下面宏定義中的一個:

    SW_HIDE   0 隱藏此窗體并激活其它窗體。

    SW_MAXIMIZE  3 激活并顯示此窗體為最大化。

    SW_MINIMIZE  6 最小化指定的窗體并激活下一個在Z順序中位
        于頂層的窗體。

    SW_RESTORE  9 激活并顯示此窗體。如果此窗體已被最大化或
        最小化,系統將恢復此窗體至原尺寸和原位置。
        一個應用程序應該在恢復一個最小化窗體時指
        定這個標記。

    SW_SHOW   5 在當前尺寸和位置上激活并顯示此窗體。

    SW_SHOWMAXIMIZED 3 同SW_MAXIMIZE

    SW_SHOWMINIMIZED 2 激活并顯示此窗體為最小化。

    SW_SHOWMINNOACTIVE 7 顯示此窗體為最小化。這個值類似于SW_SHOWMINIMIZED,
        除非窗體未被激活。
    SW_SHOWNA  8 在最近一次的尺寸和位置顯示此窗體,這個值
        類似于SW_SHOWNORMAL,除非窗體未被激活。

    SW_SHOWNOACTIVATE 4 在當前的尺寸和位置顯示此窗體。這個值類似于SW_SHOW,
        除非窗體未被激活。

    SW_SHOWNORMAL  1 激活并顯示一個窗體。如果此窗體已被最大化
        或最小化,系統將恢復此窗體至原尺寸和原位置。
        一個應用程序應該在第一次打開這個窗體時指定
        這個標記。

      有關窗體框架的定義就結束了,下面是由CWinApp基類派生出的類CMyApp,在
    類定義中對基類中的虛成員函數InitInstance()進行了重載,關于虛函數的有關概
    念前面以經提過了。在開始說明此函數內部的語句時首先需要對CWinApp的數據成員
    m_pMainWnd進行說明。
      m_pMainWnd數據成員被用于儲存一個指向你的線程中主窗體對向的指針。當涉
    及到m_pMainWnd的窗體被關閉時,MFC庫將自動的終止你的線程。如果此線程為你的
    應用程序中的主線程,應用程序也將同樣被終止。如果此數據成員為NULL,當終止
    此線程時,為了應用程序的CWinApp對象的主窗體也將常常被終止。m_pMainWnd是
    CWnd類指針的一個公有變量。
      一般來講,當你重載InitInstance()函數時設置此變量。在一個工作線程中,
    此數據成員的值是從它的父線程中繼承來的。
      正如上面所說,例子中在重載InitInstance()函數時對此變量進行了賦值,讓
    它指向一個新的框架窗體類對象,而這個對象是由剛才定義的派生類CMyWnd實例化
    出來的。下來返回一個真值,表示初始化實例成功。
      最后,用CMyApp類實例化出一個對象,名子隨意。系統將對前面定義的類和函
    進行構造,這樣就完成了一個簡單窗體的創建。


    原文轉自:http://www.kjueaiud.com

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>