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

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

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

   第一步:定義消息。一個(gè)消息實(shí)際上是開(kāi)發(fā) Windows95 應(yīng)用程序時(shí), Microsoft 推薦用戶(hù)自定義消息至少是 WM_USER+100 ,因?yàn)楹芏嘈驴丶惨褂?WM_USER 消息。

   第二步:實(shí)現(xiàn)消息處理函數(shù)。該函數(shù)使用 WPRAM 和 LPARAM 參數(shù)并返回 LPESULT 。

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

   第三步:在類(lèi)頭文件的 AFX_MSG 塊中說(shuō)明消息處理函數(shù):
   class CMainFrame:public CMDIFrameWnd{
   ...
   // 一般消息映射函數(shù)

   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()}

   第四步:在用戶(hù)類(lèi)的消息塊中,使用 ON_MESSAGE 宏指令將消息映射到消息處理函數(shù)中。
   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()

   這樣,一個(gè)用戶(hù)自定義消息就可以使用了,如果用戶(hù)需要一個(gè)整個(gè)系統(tǒng)唯一的消息,可以調(diào)用 SDK 函數(shù) RegisterWindowMessage 并使用 ON_REGISTER_MESSAGE 宏指令取代 ON_MESSAGE 宏指令,其余步驟同上。

   VC++ 為程序員提供了一套功能強(qiáng)大、方便快捷的編程工具,它可以幫你方便的生成窗口、菜單等用戶(hù)界面,可惜就是做出來(lái)的東西都一樣,沒(méi)有一點(diǎn)個(gè)性。下面,就介紹一些方法,讓我們可以按照自己的設(shè)計(jì)定制出更加符合自己程序風(fēng)格的窗口。

   一、如何在多文檔界面下去掉開(kāi)始的子窗口

   在多文檔界面程序中,程序剛啟動(dòng)的時(shí)候會(huì)自動(dòng)打開(kāi)一個(gè)新的子窗口,而一個(gè)實(shí)際的應(yīng)用系統(tǒng)往往是由用戶(hù)操作后再生成新的窗口。下面是如何去掉開(kāi)始的子窗口。

   首先在應(yīng)用程序的 App 類(lèi)里找到

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

   這是在處理命令行參數(shù),在這幾句話(huà)后面加一行:

   cmdInfo.m_nShellCommand=CCommandLineInfo::FileNothing; 就可以了。再運(yùn)行程序,就會(huì)發(fā)現(xiàn)程序并沒(méi)有自動(dòng)開(kāi)啟一個(gè)子窗口,而只剩下主框架窗口了。

   二、修改窗口標(biāo)題欄

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

   如果你不想讓系統(tǒng)自動(dòng)幫你把文檔的文件名添加到標(biāo)題欄中,需要在 CMainFram 的 PreCreateWindow 函數(shù)中刪除 FWS_ADDTOTITLE 標(biāo)志的窗口樣式:

   cs.style &= ~FWS_ADDTOTITLE ;

   這樣,程序運(yùn)行起來(lái),窗口標(biāo)題就是 "MyProgram" 而沒(méi)有后面的 "- 文檔 1.txt" 這樣的字符串了。

   三、修改主框架窗口、子窗口及其顯示風(fēng)格

   MFC 的 CWnd 類(lèi)會(huì)在調(diào)用 CWnd::Create() 方法前先調(diào)用一下 PreCreateWindo() 方法,其參數(shù)是 CREATESTRUCT cs ,其中包括了創(chuàng)建窗口時(shí)各參數(shù),例如大小,風(fēng)格等等,我們可以通過(guò)重載這個(gè)成員函數(shù)來(lái)修改主窗口和子窗口的風(fēng)格等屬性。 PreCreateWindow 函數(shù)的原型為: Virtual BOOL PreCreateWindow ( CREATESTRUCT cs )。重載 PreCreateWindow 函數(shù)以后,則在創(chuàng)建窗口前可以修改 CREATESTRUCT 結(jié)構(gòu)以替換缺省參數(shù)。 CREATESTRUCT 結(jié)構(gòu)存放窗口特征,如窗口坐標(biāo)、風(fēng)格等,還可以定義新窗口風(fēng)格。

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

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

   BOOL CMainFrame::PreCreateWindow(CREATESTRUCT&cs)
{
// 通過(guò)修改 CREATESTRUCT 結(jié)構(gòu)來(lái)修改窗口類(lèi)或風(fēng)格
return CMDIChildWnd::PreCreateWindow(cs);
}

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

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

   上述各參數(shù)用于定義風(fēng)格,其含義分別為光標(biāo)資源句柄、背景資源句柄、圖標(biāo)資源句柄。上述增加的語(yǔ)句的作用是:改變窗口大小時(shí)重畫(huà)窗口、不顯示光標(biāo)圖標(biāo)、設(shè)置白色背景。

   四、窗口的滾動(dòng)

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

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

   五、窗口分割

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

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

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

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

評(píng)論

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

不好意思,雖然很唐突,想要請(qǐng)教您幾個(gè)問(wèn)題。
我最近才開(kāi)始因?yàn)楫呍O(shè)的關(guān)系接觸MFC,現(xiàn)在用MDI框架作了一個(gè)程序,搜索圖片的。現(xiàn)在有個(gè)問(wèn)題:
我想要在一個(gè)按鍵的事件響應(yīng)里,新開(kāi)一個(gè)窗口,繪制我查找到的圖片,現(xiàn)在圖片路徑找到了,但是由于MDI很復(fù)雜,我不知道怎么調(diào)用OnDraw()重繪這幅圖。。。現(xiàn)在很困擾,看了您的自定制窗口技巧,覺(jué)得和我的問(wèn)題有些沾邊,所以冒昧給您發(fā)郵件,希望您能幫幫我,不勝感激。  回復(fù)  更多評(píng)論   

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

給你發(fā)過(guò)去了,你是做圖像檢索的嗎??可以交流一下,  回復(fù)  更多評(píng)論   

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

看了你的帖子,很有收獲,也很好用。我是做圖像處理和模式識(shí)別的,因?yàn)閯傞_(kāi)始上手,被MFC的機(jī)制弄得無(wú)比煩惱。現(xiàn)在想請(qǐng)教一個(gè)問(wèn)題:假設(shè)要對(duì)一幅圖像做邊緣檢測(cè),很多程序都是在原視圖中直接修改然后你可以點(diǎn)另存。我希望重新打開(kāi)一個(gè)子窗口顯示檢測(cè)后的圖,而原圖還保留在原來(lái)的子窗口中。不知該怎么做。如果能得到您的幫助那就太感謝了。  回復(fù)  更多評(píng)論   

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

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

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

多謝你的回復(fù)!!!
因?yàn)橐吹剿膫€(gè)不同方向的邊緣檢測(cè)結(jié)果,我用的是后一種方法。我已經(jīng)打開(kāi)了新文檔,不過(guò)處理結(jié)果顯示不出來(lái)。我有個(gè)例子是新建一個(gè)DIB對(duì)象將原圖的頭部信息拷過(guò)來(lái),加上處理好的數(shù)據(jù)顯示:
POSITION posTemplate = pApp->GetFirstDocTemplatePosition();
CDocTemplate* pDocTemplate = pApp->GetNextDocTemplate(posTemplate);

CDipDoc* pDocument = (CDipDoc*) pDocTemplate->OpenDocumentFile(NULL);
pDocument->m_pDibObject = green;//green就是一個(gè)DIB對(duì)象
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定義有很大區(qū)別,所以我始終不能將這個(gè)新的DIB對(duì)象構(gòu)建好。
再次表示感謝!  回復(fù)  更多評(píng)論   


只有注冊(cè)用戶(hù)登錄后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


導(dǎo)航

<2008年12月>
30123456
78910111213
14151617181920
21222324252627
28293031123
45678910

統(tǒng)計(jì)

常用鏈接

留言簿(19)

隨筆檔案

文章檔案

收藏夾

搜索

最新評(píng)論

閱讀排行榜

評(píng)論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美精品一区二区三区在线看午夜| 日韩视频第一页| 一本不卡影院| 久久野战av| 亚洲成人原创| 国产日韩精品一区二区三区在线| 欧美一级播放| 欧美色精品在线视频| 国产精品久久久91| 亚洲啪啪91| 亚洲午夜视频在线| 亚洲激情视频在线| 亚洲电影观看| 欧美日韩成人激情| 亚洲精品国产精品国自产在线| 国产精品色婷婷| 亚洲电影免费在线观看| 欧美风情在线| 久久精视频免费在线久久完整在线看| 亚洲在线视频网站| 欧美日韩国产综合一区二区| 亚洲视频一二区| 亚洲精品综合| 91久久精品国产91性色| 午夜精品久久久久久久男人的天堂| 亚洲美洲欧洲综合国产一区| 亚洲黄色影院| 国产精品久久久久久久免费软件| 亚洲国产欧美日韩精品| 亚洲欧美国产日韩中文字幕| 亚洲精品免费观看| 国产精品五区| 免费成人在线观看视频| 一本久道久久久| 亚洲一区国产| 91久久线看在观草草青青| 欧美一区二区三区喷汁尤物| 久久亚洲综合色| 国产毛片一区二区| 欧美日韩在线播| 国产情人综合久久777777| 久久免费99精品久久久久久| 午夜精品久久久久久久白皮肤| 一区二区三区四区五区精品| 国产精品久久综合| 亚洲综合另类| 欧美.日韩.国产.一区.二区| 欧美日韩一区二区视频在线观看| 99精品视频一区二区三区| 欧美久久一级| 亚洲欧美国产高清| 国产精品高清免费在线观看| 亚洲黄一区二区三区| 亚洲与欧洲av电影| 国产一区二区三区高清| 亚洲午夜在线视频| 欧美中文字幕不卡| 中文日韩在线视频| 欧美大片在线观看| 欧美日韩国产免费观看| 亚洲综合精品四区| 狠狠色狠狠色综合系列| 翔田千里一区二区| 国产精品永久入口久久久| 日韩亚洲精品视频| 欧美一站二站| 一区二区电影免费在线观看| 欧美电影在线| 欧美激情免费观看| 欧美视频在线观看一区二区| 1000部精品久久久久久久久| 亚洲欧美区自拍先锋| 久久久精品一区| 美女诱惑一区| 欧美精品精品一区| 欧美激情aaaa| 在线看欧美日韩| 欧美一级电影久久| 国产午夜精品久久久久久久| 久久天天综合| 蜜臀99久久精品久久久久久软件| 麻豆freexxxx性91精品| 亚洲一区二区欧美日韩| 欧美激情一区二区久久久| 亚洲午夜精品17c| 一区二区三区.www| 欧美成人久久| 亚洲精品视频啊美女在线直播| 99精品国产福利在线观看免费| 亚洲国产成人精品女人久久久| 久久综合999| 午夜影院日韩| 免费黄网站欧美| 亚洲在线成人| 欧美激情第六页| 久久免费视频在线观看| 亚洲综合二区| 亚洲欧美在线一区| 欧美激情视频网站| 午夜精品在线| 久久久人成影片一区二区三区 | 亚洲国产成人久久| 欧美色欧美亚洲另类七区| 欧美激情亚洲视频| 欧美区在线观看| 国产一区二区三区奇米久涩| 亚洲性视频网站| 国产欧美日韩免费| 欧美日韩系列| 国产一区二区激情| 欧美午夜欧美| 欧美日韩综合| 欧美激情中文字幕在线| 一区二区三区四区国产| 久久精品成人一区二区三区蜜臀| 免费成人在线视频网站| 久久久久久久久伊人| 国产精品视频观看| 亚洲国产精品嫩草影院| 亚洲一区二区三区精品在线观看| 欧美亚洲在线观看| 在线综合欧美| 国产午夜一区二区三区| 美女视频黄免费的久久| 欧美国产高潮xxxx1819| 久久久国产精品一区二区中文 | 亚洲一区欧美二区| 久久免费视频在线| 99re热这里只有精品视频| 亚洲在线视频一区| 在线中文字幕一区| 狠狠色丁香久久婷婷综合_中| 久久精品99国产精品日本 | 免费人成精品欧美精品| 欧美在线1区| 欧美在线高清| 久久riav二区三区| 国产精品s色| 亚洲观看高清完整版在线观看| 欧美国产三区| 尤物精品国产第一福利三区 | 91久久极品少妇xxxxⅹ软件| 亚洲激情国产精品| 欧美久久婷婷综合色| 欧美高清视频一区二区| 欧美三级在线| 亚洲一区二区三区在线视频| 欧美日本网站| 伊人男人综合视频网| 久久久亚洲国产美女国产盗摄| 99在线精品视频在线观看| 亚洲国产精品久久久| 免费成人性网站| 国产欧美一区二区精品仙草咪| 国产精品日日做人人爱| 亚洲国产黄色| 国语自产偷拍精品视频偷 | 欧美专区亚洲专区| 国产最新精品精品你懂的| 最近看过的日韩成人| 亚洲美女啪啪| 亚洲精品一区二区三区樱花| 欧美电影在线观看完整版| 狂野欧美一区| 模特精品在线| 欧美精品自拍偷拍动漫精品| 中日韩高清电影网| 亚洲靠逼com| 性欧美精品高清| 欧美中文字幕在线播放| 国产女人18毛片水18精品| 欧美日韩在线一二三| 久久精品30| 亚洲美女在线观看| 国产伦理精品不卡| 国产亚洲二区| 欧美精品久久99| 99视频精品全部免费在线| 国产美女诱惑一区二区| 亚洲视频中文字幕| 午夜电影亚洲| 国产精品久久久久久久久免费桃花| 欧美一区二区大片| 久久在线播放| 亚洲国产合集| 亚洲毛片在线看| 欧美午夜精彩| 欧美激情片在线观看| 亚洲国产合集| 欧美在线视频观看免费网站| 中文av一区特黄| 久久影音先锋| 亚洲一区二区三区视频| 欧美在线观看视频在线| 老色批av在线精品| 性欧美18~19sex高清播放| 在线亚洲一区二区| 国产在线精品自拍| 久久综合久久综合这里只有精品 | 久久久久久电影|