青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

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) 即可。

posted on 2008-04-08 19:35 wrh 閱讀(2241) 評論(5)  編輯 收藏 引用

評論

# re: VC++中使用用戶自定義消息及自定制窗口技巧 2008-05-20 11:49 n

不好意思,雖然很唐突,想要請教您幾個問題。
我最近才開始因為畢設的關系接觸MFC,現在用MDI框架作了一個程序,搜索圖片的。現在有個問題:
我想要在一個按鍵的事件響應里,新開一個窗口,繪制我查找到的圖片,現在圖片路徑找到了,但是由于MDI很復雜,我不知道怎么調用OnDraw()重繪這幅圖。。。現在很困擾,看了您的自定制窗口技巧,覺得和我的問題有些沾邊,所以冒昧給您發郵件,希望您能幫幫我,不勝感激。  回復  更多評論   

# re: VC++中使用用戶自定義消息及自定制窗口技巧 2008-05-21 21:38 wrh

給你發過去了,你是做圖像檢索的嗎??可以交流一下,  回復  更多評論   

# re: VC++中使用用戶自定義消息及自定制窗口技巧 2008-12-25 13:51 qiaoyusun

看了你的帖子,很有收獲,也很好用。我是做圖像處理和模式識別的,因為剛開始上手,被MFC的機制弄得無比煩惱。現在想請教一個問題:假設要對一幅圖像做邊緣檢測,很多程序都是在原視圖中直接修改然后你可以點另存。我希望重新打開一個子窗口顯示檢測后的圖,而原圖還保留在原來的子窗口中。不知該怎么做。如果能得到您的幫助那就太感謝了。  回復  更多評論   

# re: VC++中使用用戶自定義消息及自定制窗口技巧 2008-12-30 09:47 wrh

@qiaoyusun
有兩種方式,一種是將視圖分成兩個視圖,左和右,左邊視圖顯示原圖,右邊視圖顯示處理后的圖像,將處理函數加到右邊視圖中,處理完后更新視圖就行了。另一種方式是建成多文檔的,每處理完后都在新文檔中打開顯示。建議你用第一種。
  回復  更多評論   

# re: VC++中使用用戶自定義消息及自定制窗口技巧 2008-12-31 08:39 qiaoyusun

多謝你的回復!!!
因為要看到四個不同方向的邊緣檢測結果,我用的是后一種方法。我已經打開了新文檔,不過處理結果顯示不出來。我有個例子是新建一個DIB對象將原圖的頭部信息拷過來,加上處理好的數據顯示:
POSITION posTemplate = pApp->GetFirstDocTemplatePosition();
CDocTemplate* pDocTemplate = pApp->GetNextDocTemplate(posTemplate);

CDipDoc* pDocument = (CDipDoc*) pDocTemplate->OpenDocumentFile(NULL);
pDocument->m_pDibObject = green;//green就是一個DIB對象
pDocument->m_bImageLoaded = TRUE;
pDocument->SetTitle("*****");

//獲取子框架窗口指針
CChildFrame *pChild = (CChildFrame *) pFrame->MDIGetActive();
pChild->m_nWidth = m_pDibObject->GetWidth();
pChild->m_nHeight = m_pDibObject->GetHeight();
pChild->SetWindowPos( NULL, 0, 0, pChild->m_nWidth + 12,
pChild->m_nHeight + 38, SWP_NOZORDER | SWP_NOMOVE );

pDocument->UpdateAllViews(NULL);
和我的DIB定義有很大區別,所以我始終不能將這個新的DIB對象構建好。
再次表示感謝!  回復  更多評論   


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


導航

<2010年12月>
2829301234
567891011
12131415161718
19202122232425
2627282930311
2345678

統計

常用鏈接

留言簿(19)

隨筆檔案

文章檔案

收藏夾

搜索

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美视频一区在线| 亚洲国内自拍| 亚洲一区在线直播| 欧美国产精品久久| 99re6这里只有精品| 亚洲自拍电影| 亚洲欧美另类综合偷拍| 国产一区二区三区奇米久涩| 久久久精品日韩欧美| 亚洲东热激情| 99国产精品| 国产欧美激情| 亚洲高清自拍| 亚洲午夜女主播在线直播| 国产精品午夜在线| 亚洲精品久久久久久久久久久 | 裸体歌舞表演一区二区| 久久天天狠狠| 久久久国产一区二区三区| 国产精品99一区| 欧美va亚洲va香蕉在线| 久久久久久久999| 亚洲第一狼人社区| 一本久道综合久久精品| 国产午夜精品久久久| 久久久福利视频| 夜夜嗨av一区二区三区免费区| 欧美一区二区视频在线| 欧美在线视频免费观看| 久久九九久精品国产免费直播| 欧美成人免费全部| 亚洲经典在线| 亚洲人成在线免费观看| 欧美激情综合色| 一区二区三区偷拍| 久久高清一区| 久久久欧美精品sm网站| 欧美巨乳在线| 国产亚洲福利社区一区| 亚洲一区二区欧美日韩| 国产精品久久久久久久午夜片| 久久精品99久久香蕉国产色戒| 欧美freesex交免费视频| 亚洲精品免费一区二区三区| 国产精品99久久久久久www| 亚洲人午夜精品| 日韩午夜黄色| 国产日韩欧美麻豆| 国产精品国产三级国产aⅴ浪潮| 亚洲尤物在线视频观看| 狠狠色狠狠色综合日日小说| 久久嫩草精品久久久精品一| 欧美在线播放高清精品| 欧美电影资源| 最新亚洲电影| 欧美一区二区三区精品电影| 欧美日本国产视频| 国产精品啊v在线| 亚洲精品日韩综合观看成人91| 欧美国产日韩在线观看| 久久亚洲捆绑美女| 欧美国产视频日韩| 亚洲第一偷拍| 亚洲国产精品999| 免费欧美在线| 国产精品视频网址| 欧美freesex8一10精品| 亚洲欧美激情在线视频| 久久在线免费观看| 欧美大片国产精品| 久久超碰97人人做人人爱| 欧美国产综合视频| 久久久精品一区| 国产精品va| 日韩网站在线| 亚洲免费观看高清在线观看| 国产一区二区三区免费不卡| 欧美福利视频在线| 狠狠88综合久久久久综合网| 夜夜嗨av一区二区三区| 国产精品久久久久久久电影| 亚洲黄色一区二区三区| 在线精品一区二区| 亚洲国产精品传媒在线观看 | 国产精品福利在线观看网址| 欧美国产欧美亚洲国产日韩mv天天看完整| 国产麻豆一精品一av一免费| 日韩一级精品视频在线观看| 夜夜夜久久久| 暖暖成人免费视频| 久久一区欧美| 国产综合色产| 亚洲成色www8888| 欧美精品激情blacked18| 蜜桃久久精品乱码一区二区| 免费亚洲电影| 亚洲电影下载| 日韩一级精品视频在线观看| 欧美精品一区三区| 亚洲卡通欧美制服中文| 国产精品在线看| 亚洲已满18点击进入久久| 亚洲欧美日韩国产一区二区| 欧美精品色网| 欧美一区二区三区在线观看| 欧美亚洲免费在线| 久久性色av| 亚洲精品网站在线播放gif| 影音先锋中文字幕一区| 亚洲欧美精品在线| 亚洲视频在线二区| 在线观看视频欧美| 亚洲高清资源综合久久精品| 久久国产精品久久国产精品 | 久久精品久久综合| 另类欧美日韩国产在线| 欧美激情精品久久久久久免费印度 | 亚洲免费在线观看| 久久综合九色综合欧美狠狠| 亚洲高清网站| 欧美日韩中文字幕| 亚洲欧美日韩综合国产aⅴ| 亚洲人成网站777色婷婷| 欧美国产欧美亚洲国产日韩mv天天看完整 | 亚洲一级二级在线| 伊人夜夜躁av伊人久久| 欧美xart系列高清| 亚洲深夜福利在线| 久久久久久久久久久一区| 亚洲激情在线| 久久精品国产91精品亚洲| 欧美搞黄网站| 欧美日韩另类视频| 六月天综合网| 国产日韩一区二区三区在线| 久久久久国色av免费观看性色| 亚洲国内精品在线| 久久久久国产成人精品亚洲午夜| 亚洲欧美激情四射在线日| 一区二区在线视频| 一道本一区二区| 美日韩免费视频| 亚洲综合视频一区| 亚洲全部视频| 国产日韩av高清| 欧美日韩国产成人| 日韩一级在线观看| 女人天堂亚洲aⅴ在线观看| 国产亚洲一区在线播放| 欧美精品福利视频| 久久免费视频在线| 亚洲在线观看视频| 亚洲精品国产拍免费91在线| 久久婷婷国产综合国色天香| 亚洲自拍偷拍色片视频| 日韩西西人体444www| 狠狠色狠狠色综合日日tαg| 国产精品美女久久久久久免费| 欧美精品首页| 欧美成在线观看| 老色鬼精品视频在线观看播放| 先锋影音网一区二区| 久久久激情视频| 亚洲一区在线直播| 一区二区三区四区五区精品| 欧美三级乱码| 欧美巨乳在线| 欧美美女操人视频| 欧美激情第二页| 免费不卡在线观看av| 久久免费偷拍视频| 久久青青草综合| 久久久夜夜夜| 久久综合狠狠综合久久综青草 | 亚洲特色特黄| 一本久久a久久精品亚洲| 99国产精品久久久久老师| 亚洲欧洲三级| 99精品福利视频| 亚洲视频1区2区| 亚洲在线视频网站| aa级大片欧美| 亚洲午夜一区二区| 亚洲午夜羞羞片| 欧美一级成年大片在线观看| 国产欧美日韩视频| 国产精品私房写真福利视频| 欧美色区777第一页| 欧美午夜不卡视频| 国产精品乱人伦中文| 国产伦理精品不卡| 国语自产精品视频在线看一大j8 | 香蕉乱码成人久久天堂爱免费| 亚洲天堂成人在线视频| 亚洲男女自偷自拍图片另类| 亚洲影视中文字幕| 欧美一区二区在线看| 久久久久久久久蜜桃| 麻豆成人综合网| 亚洲国产成人高清精品|