<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    weidagang2046的專欄

    物格而后知致
    隨筆 - 8, 文章 - 409, 評論 - 101, 引用 - 0
    數據加載中……

    VC++中使用用戶自定義消息及自定制窗口技巧

    Windows 應用程序所要做的每項工作幾乎都是基于消息處理的, Windows 系統消息分為常用 Windows 消息,控件通知消息和命令。然而,有時我們需要定義自己的消息來通知程序什么事情發生了,這就是用戶自定義消息。 ClassWizard 并沒有提供增加用戶自定義消息的功能,所以要使用用戶自定義消息,必須手工編寫代碼。然后 ClassWizard 才可以象處理其它消息一樣處理你自定義的消息。具體做法如下詳解:

       第一步:定義消息。一個消息實際上是開發 Windows95 應用程序時, Microsoft 推薦用戶自定義消息至少是 WM_USER+100 ,因為很多新控件也要使用 WM_USER 消息。

       第二步:實現消息處理函數。該函數使用 WPRAM 和 LPARAM 參數并返回 LPESULT 。

       LPESULT CMainFrame::OnMyMessage(WPARAM wParam, LPARAM lParam){// TODO: 處理用戶自定義消息 AfxMessageBox(" 處理用戶自定義消息 "); return 0;}

       第三步:在類頭文件的 AFX_MSG 塊中說明消息處理函數:
       class CMainFrame:public CMDIFrameWnd{

       ...

       // 一般消息映射函數

       protected:

       // {{AFX_MSG(CMainFrame)

       afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);

       afx_msg void OnTimer(UINT nIDEvent);

       afx_msg LRESULT OnMyMessage(WPARAM wParam, LPARAM lParam);

       //}}AFX_MSG

       DECLARE_MESSAGE_MAP()}

       第四步:在用戶類的消息塊中,使用 ON_MESSAGE 宏指令將消息映射到消息處理函數中。
       BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWnd)

       //{{AFX_MSG_MAP(CMainFrame)

       ON_WM_CREATE()

       ON_WM_TIMER()

       ON_MESSAGE(WM_MY_MESSAGE, OnMyMessage)

       //}}AFX_MSG_MAPEND_MESSAGE_MAP()

       這樣,一個用戶自定義消息就可以使用了,如果用戶需要一個整個系統唯一的消息,可以調用 SDK 函數 RegisterWindowMessage 并使用 ON_REGISTER_MESSAGE 宏指令取代 ON_MESSAGE 宏指令,其余步驟同上。

       VC++ 為程序員提供了一套功能強大、方便快捷的編程工具,它可以幫你方便的生成窗口、菜單等用戶界面,可惜就是做出來的東西都一樣,沒有一點個性。下面,就介紹一些方法,讓我們可以按照自己的設計定制出更加符合自己程序風格的窗口。

       一、如何在多文檔界面下去掉開始的子窗口

       在多文檔界面程序中,程序剛啟動的時候會自動打開一個新的子窗口,而一個實際的應用系統往往是由用戶操作后再生成新的窗口。下面是如何去掉開始的子窗口。

       首先在應用程序的 App 類里找到

       BOOL CMyMDIApp::InitInstance() 下面有:
    // Parse command line for standard shell commands, DDE, file open
    CCommandLineInfo cmdInfo;
    ParseCommandLine(cmdInfo);


       這是在處理命令行參數,在這幾句話后面加一行:

       cmdInfo.m_nShellCommand=CCommandLineInfo::FileNothing; 就可以了。再運行程序,就會發現程序并沒有自動開啟一個子窗口,而只剩下主框架窗口了。

       二、修改窗口標題欄

       在缺省情況下,窗口標題欄中顯示的標題為程序名 + 當前文檔的文件名。比如 " MyProgram - 文檔 1 . t x t " ,那若要在標題欄顯示一個自己定義的字符串,而不是程序名,可以通過在程序里調用 CWnd::SetWindowText() 方法來實現,而如果我們還想要后面的文檔名自動顯示,這么做就不行了,這時可以用資源編輯器編輯字符串表( StringTable )資源,在 StringTable 中雙擊 IDR-MAIN-FRAME 項, caption 中顯示一字符串 xx\n\yy...... ,將第一個參數修改為用戶自己希望見到的主窗口標題即可。

       如果你不想讓系統自動幫你把文檔的文件名添加到標題欄中,需要在 CMainFram 的 PreCreateWindow 函數中刪除 FWS_ADDTOTITLE 標志的窗口樣式:

       cs.style &= ~FWS_ADDTOTITLE ;

       這樣,程序運行起來,窗口標題就是 "MyProgram" 而沒有后面的 "- 文檔 1.txt" 這樣的字符串了。

       三、修改主框架窗口、子窗口及其顯示風格

       MFC 的 CWnd 類會在調用 CWnd::Create() 方法前先調用一下 PreCreateWindo() 方法,其參數是 CREATESTRUCT cs ,其中包括了創建窗口時各參數,例如大小,風格等等,我們可以通過重載這個成員函數來修改主窗口和子窗口的風格等屬性。 PreCreateWindow 函數的原型為: Virtual BOOL PreCreateWindow ( CREATESTRUCT cs )。重載 PreCreateWindow 函數以后,則在創建窗口前可以修改 CREATESTRUCT 結構以替換缺省參數。 CREATESTRUCT 結構存放窗口特征,如窗口坐標、風格等,還可以定義新窗口風格。

       若想修改主框架窗口,則可以在 MainFrm.cpp 的下列成員函數中加入待修改的內容。例如:
       BOOL CMainFrame::PreCreateWindow(CREATESTRUCT&cs)
    {
    // 通過修改 CREATESTRUCT 結構來修改窗口類或風格
    cs.cx=450;
    cs.cy=300;
    // 定義新窗口的高度、寬度
    // 定義新窗口風格為去掉主窗口名及最大化等按鈕
    cs.style=ws-POPWINDO;
    return CFrameWnd::PreCreateWindow(cs); }

       定制子窗口的操作與上述主窗口相同,可在 ChildFrame.cpp 中加入以下內容:

       BOOL CMainFrame::PreCreateWindow(CREATESTRUCT&cs)
    {
    // 通過修改 CREATESTRUCT 結構來修改窗口類或風格
    return CMDIChildWnd::PreCreateWindow(cs);
    }

      要修改視圖窗口的顯示性質,則可在視圖文件 MyView.cpp 的下述成員函數中加入以下語句:
       BOOL MyView::PreCreateWindow(CREATESTRUCT&cs)
    {
    // 在這里修改 cs 結構,改變 View 的風格。
    cs.lpszClass=AfxRegisterWndClass(cs-HREDRAW|CS-VREDRAW,0,(HBRUSH))::GetStockObject(WHITE-BRUSH),0);
    return CScrollView::PreCreateWindow(cs);
    }

       其中, cs 的參數 pszClass 用于存放 Windows 窗口類名稱。要想注冊 Windows 窗口類,則必須調用全局函數 AfxRegisterWndClass 。該函數原型為:
       LPCTSTR AFXAPI AfxRegisterWndClass(UINTnClassStyle,HCURSOR hCursor=0,HBRUSH hbrBackground=0,HICON hIcon=0)


       上述各參數用于定義風格,其含義分別為光標資源句柄、背景資源句柄、圖標資源句柄。上述增加的語句的作用是:改變窗口大小時重畫窗口、不顯示光標圖標、設置白色背景。

       四、窗口的滾動

       MFC 中的 CScrollView 可以幫助你自動實現窗口滾動的決大部分功能,使用 CscrollView 時, ClassWizard 生成 OnInitialUpdate() 成員函數為:
       void CMyScrollView::OnInitialUpdat()
    {
    CScrollView::OnIntialUpdate();
    CSize sizePage;
    sizePage.cs=sizePage.cy=400;
    SetScrollSizes(MM-TEXT,sizePage);
    }

       其中, cs 和 cy 分別為滾動窗口的水平、垂直分量,表明窗口的水平、垂直方向尺寸小于 400 像素單位時將出現水平方向滾動條和垂直方向滾動條。通過修改滾動尺寸,可改變出現滾動條的最小窗口。例如,若 sizePage.cx=600;sizePage.cy=800; ,則當窗口尺寸小于 600*800 時,就會出現滾動條。

       五、窗口分割

       該功能可將窗口分割成多個可滾動的幀,幀之間的邊界稱為分割條,可用分割條來調整每個幀的相對大小。要想增加窗口分割功能,則必須修改主窗口類。首先,在主窗口類的頭文件 MainFrm.h 中添加以下代碼:
       CSplitterWnd m-SWnd;
    Virtual BOOL OnCreateClient (LPCREATESTRUCTcs,CcreateContext *pContext);

       再在 MainFrm.cpp 中添加成員函數 OnCreateClient 的定義:
       BOOL CmainFrame::OnCreateCline(LPCREATESTRUCTcs,CcreateContext *p Context)
    {
    return m-SWnd.Creat(this,2,2,Csize(20,20),pContext);
    }

       新的 CSplitterWnd 類對象 m-SWnd 用于創建和管理分割窗口,該窗口中可以包含一個或多個幀。首次創建主窗口時,將調用成員函數 OnCreateClient 。在缺省情況下,該函數創建一個填充主框窗口客戶區的視圖窗口。覆蓋該函數后,將調用 CsplitterWnd 的成員函數 Create 來創建分割窗口。其中,第一個參數用于指定分割的父窗口(主窗口);第二個參數指定垂直方向上的幀個數為 2 ;第三個參數指定水平方向上的幀的個數;第四個參數用于設置每個幀的最小尺寸;第五個參數傳遞描述信息。上述分割窗口的每個幀都是由視圖類對象管理的,當用戶在某一幀內顯示文檔和圖形時,必須在其它幀中重新繪制,從而在多個幀中均顯示相同的內容。為此,必須調用顯示文檔類的 UpdateALLView 成員函數來更新其它幀。此時,只需加入 pdoc- > UpdataALLView(NULL) 即可。

    from: http://sanjianxia.diy.myrice.com/vc/vc40.htm

    posted on 2006-07-23 16:56 weidagang2046 閱讀(467) 評論(0)  編輯  收藏 所屬分類: Windows

    主站蜘蛛池模板: 国内外成人免费视频| 24小时日本韩国高清免费| 国产成人精品免费视频大全五级 | 日韩高清在线免费看| 国产男女猛烈无遮档免费视频网站| 亚洲AV中文无码乱人伦| 真人无码作爱免费视频| 无码少妇精品一区二区免费动态| 亚洲国产成人高清在线观看| 亚洲精品无码少妇30P| 在线A级毛片无码免费真人| 亚洲AV日韩精品久久久久| AV激情亚洲男人的天堂国语| 国产免费av一区二区三区| 国产精品亚洲一区二区三区在线观看| 小草在线看片免费人成视久网| 亚洲av无码国产精品色在线看不卡 | 亚洲美女免费视频| 亚洲精品视频免费| 午夜精品在线免费观看| 亚洲五月激情综合图片区| 希望影院高清免费观看视频| 久久精品国产亚洲Aⅴ蜜臀色欲| 一级成人生活片免费看| 亚洲2022国产成人精品无码区 | 女人18毛片a级毛片免费| 美女尿口扒开图片免费| 久久亚洲国产中v天仙www| 一级黄色免费大片| 亚洲伦理一区二区| 男人的天堂网免费网站| 波多野结衣亚洲一级| 6080午夜一级毛片免费看| 亚洲AV日韩综合一区尤物| 免费福利网站在线观看| 日本久久久久亚洲中字幕| 国内少妇偷人精品视频免费| 在线观看亚洲精品国产| 一级做a爱过程免费视频高清| 免费国产成人高清在线观看麻豆 | 国产2021精品视频免费播放|