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

VC 界面窗口,靜態(tài)分割后如何鎖定分隔條或限制分隔條的移動范圍

        來北航做畢業(yè)設(shè)計已經(jīng)有半個月了,由于實驗室中,項目組用的是VC,昨天剛好遇到一個細(xì)節(jié)問題:大家都知道,VC中可以動態(tài)或者靜態(tài)的分割窗口(關(guān)于這點許多地方說的已經(jīng)很清楚了,這里不做討論)但是實際上,很多時候我們想要的只是靜態(tài)的分割出窗口,并不想讓別人移動改變這個比例,或者是需要限定某個分割出的窗口的范圍(比如是小到多少之后就不能再變小了),關(guān)于這個問題許多書上都沒有解釋(PS:莫非是覺得太簡單了,直接忽略么?orz...)本人研究了一下,   關(guān)于鎖定分割大致有兩種方法,而如何限制移動范圍也可已在此基礎(chǔ)上加,特此總結(jié)如下:
        鎖定的話,其中一種方法是直接截獲一個消息,我們知道,其實 CsplitterWnd 是從CWnd 派生出來的,所以其實很容易截獲Window的消息,在這里我們應(yīng)該關(guān)注的其實僅僅只有一個消息WM_NCHITTEST ,其作用大致就是當(dāng)你的鼠標(biāo)在這個劃分出的區(qū)域中移動時為CWnd捕捉你的鼠標(biāo)輸入的,所以,換言之,如果我們截獲了這個消息,直接返回為HTNOWHERE(參考MSDN),那么當(dāng)你的鼠標(biāo)停留在Splitter上時就不會出現(xiàn)任何反應(yīng),從而鎖定的目的就達(dá)到了
        另一種是重載:OnLButtonDown(UINT nFlags, CPoint point),OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) 以及OnMouseMove(UINT nFlags, CPoint point)幾個函數(shù),前兩個函數(shù)的重載也可以達(dá)到鎖定的效果,第三個函數(shù)也就是OnMouseMove()的重載則是為了限定移動的范圍(這種情況可能需要的更多一些)下面貼上這兩種方法的代碼:
        兩種方法有一個共同點就是需要自己從CSplitterWnd類中派生一個自己的類就叫 MySplitterWnd 好了,先采用第一種方法,來鎖定,MySplitterWnd.h中代碼如下:

#if !defined(AFX_MYSPLITTERWND_H__A2E77A4F_BB34_4622_8178_ED5FB394208E__INCLUDED_)
#define AFX_MYSPLITTERWND_H__A2E77A4F_BB34_4622_8178_ED5FB394208E__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// MySplitterWnd.h : header file
//

/////////////////////////////////////////////////////////////////////////////
// MySplitterWnd frame with splitter

#ifndef __AFXEXT_H__
#include 
<afxext.h>
#endif

class MySplitterWnd : public CSplitterWnd
{
    DECLARE_DYNCREATE(MySplitterWnd)
protected:
        
// protected constructor used by dynamic creation

// Attributes
protected:
    CSplitterWnd    m_wndSplitter;
public:

    MySplitterWnd();   

public:

// Overrides
    
// ClassWizard generated virtual function overrides
    
//{{AFX_VIRTUAL(MySplitterWnd)
    protected:
    
virtual BOOL OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext);
    afx_msg UINT    OnNcHitTest(CPoint point);     
//新加的

    
//}}AFX_VIRTUAL

// Implementation
public:
    
virtual ~MySplitterWnd();

    
// Generated message map functions
    
//{{AFX_MSG(MySplitterWnd)
        
// NOTE - the ClassWizard will add and remove member functions here.
    
//}}AFX_MSG
    DECLARE_MESSAGE_MAP()
}
;

/////////////////////////////////////////////////////////////////////////////

//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_MYSPLITTERWND_H__A2E77A4F_BB34_4622_8178_ED5FB394208E__INCLUDED_)

其中關(guān)鍵的語句就是 加一句  afx_msg UINT    OnNcHitTest(CPoint point)的定義,然后再在MySplitterWnd.cpp具體實現(xiàn)這個函數(shù),如下

// MySplitterWnd.cpp : implementation file
//

#include 
"stdafx.h"
#include 
"GL.h"
#include 
"MySplitterWnd.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// MySplitterWnd

IMPLEMENT_DYNCREATE(MySplitterWnd, CSplitterWnd)

MySplitterWnd::MySplitterWnd()
{
}


MySplitterWnd::
~MySplitterWnd()
{
}


BOOL MySplitterWnd::OnCreateClient(LPCREATESTRUCT 
/*lpcs*/, CCreateContext* pContext)
{
    
return m_wndSplitter.Create(this,
        
22,       // TODO: adjust the number of rows, columns
        CSize(1010),  // TODO: adjust the minimum pane size
        pContext);
}


afx_msg UINT MySplitterWnd::OnNcHitTest(CPoint 
/*point*/)
{
    
return HTNOWHERE;
}



/*BEGIN_MESSAGE_MAP(MySplitterWnd, CSplitterWnd)
    //{{AFX_MSG_MAP(MySplitterWnd)
        // NOTE - the ClassWizard will add and remove mapping macros here.
    //}}AFX_MSG_MAP
END_MESSAGE_MAP()
*/



BEGIN_MESSAGE_MAP(MySplitterWnd, CSplitterWnd)
ON_WM_NCHITTEST()
END_MESSAGE_MAP()


/////////////////////////////////////////////////////////////////////////////
// MySplitterWnd message handlers

可以看到,具體實現(xiàn)就一句話,return HTNOWHERE。現(xiàn)在就OK了,我的表述已經(jīng)盡可能清楚了,如果實在不理解也沒關(guān)系,你們可以直接將上面的.h和.cpp直接復(fù)制過去,直接加入到你的工程中,到時候用的時候直接 定義用 MySplitterWnd這個類定義 自己的變量,如  MySplitterWnd  XXX(自己隨便取名)

下面介紹另一種方法,也是同上面一樣需要自己建立一個類,還是叫MySplitterWnd好了,基類還是CSplitterWnd
然后 在MySplitterWnd.h中添加如下代碼(位置 和添加OnNcHitTest(...)函數(shù)一樣)
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
afx_msg BOOL OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message);
afx_msg void OnMouseMove(UINT nFlags, CPoint point);
在MySplitterWnd.cpp中添加三個函數(shù)的具體實現(xiàn)代碼如下:

void MySplitterWnd::OnLButtonDown(UINT nFlags, CPoint point)
{    
    // 直接返回,不處理
 return;
}

BOOL MySplitterWnd::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{  
    // 當(dāng)光標(biāo)進(jìn)入分割窗口時,不允許改變樣子,不處理
 return FALSE;
}

void MySplitterWnd::OnMouseMove(UINT nFlags, CPoint point)
{       
 //將CSplitter類的處理改為由CWnd處理
 //CSplitterWnd::OnMouseMove(nFlags, point);

 if(point.x<250||point.x>500) CWnd::OnMouseMove(nFlags, point);
 else  CSplitterWnd::OnMouseMove(nFlags, point);

 }

好了,其實到了這里還沒有完,剛說到鎖定的問題,大家可以發(fā)現(xiàn)如果三個函數(shù)這樣子寫你的分隔條直接不能動了,和剛才的截取消息的鎖定效果一摸一樣,但是關(guān)于第三個函數(shù)OnMouseMove()的實際作用其實是限定范圍,if(point.x<250||point.x>500) CWnd::OnMouseMove(nFlags, point);
 else  CSplitterWnd::OnMouseMove(nFlags, point); 這兩句的意思是說將移動范圍鎖定在250和500之間(這個數(shù)值大家可以隨便設(shè)置),為了要使得這個函數(shù)生效,大家可以把前面兩個也就是OnLButtonDown()和OnSetCursor()屏蔽掉,只留下第三個OnMouseMove()就可以達(dá)到限制范圍的效果了,當(dāng)然只屏蔽掉OnLButtonDown()函數(shù)也是可以的,因為OnSetCursor()函數(shù)只是改變光標(biāo)樣子用的,(鎖定的另一個方法其實就是只用前面兩個,既屏蔽掉OnMouseMove(),這個函數(shù),大家可以自己試試,分別屏蔽看會出現(xiàn)什么效果)

MySplitterWnd.h和MySplitterWnd.cpp分別如下:

MySplitterWnd.h:

#if !defined(AFX_MYSPLITTERWND_H__7AA280DC_82F5_4FF5_95A6_036C8A20B50D__INCLUDED_)
#define AFX_MYSPLITTERWND_H__7AA280DC_82F5_4FF5_95A6_036C8A20B50D__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// MySplitterWnd.h : header file
//

/////////////////////////////////////////////////////////////////////////////
// MySplitterWnd frame with splitter

#ifndef __AFXEXT_H__
#include 
<afxext.h>
#endif

class MySplitterWnd : public CSplitterWnd
{

  
public:

    MySplitterWnd(); 
// Operations
public:

// Overrides
    
// ClassWizard generated virtual function overrides
    
//{{AFX_VIRTUAL(MySplitterWnd)
    


    
//}}AFX_VIRTUAL

// Implementation
public:
    
virtual ~MySplitterWnd();
    

        
    DECLARE_DYNCREATE(MySplitterWnd)

    
    afx_msg 
void OnLButtonDown(UINT nFlags, CPoint point);     //新加的
    afx_msg BOOL OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message); //新加的
    afx_msg void OnMouseMove(UINT nFlags, CPoint point); //新加的
    
    DECLARE_MESSAGE_MAP()     
//后加的


}
;

/////////////////////////////////////////////////////////////////////////////

//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_MYSPLITTERWND_H__7AA280DC_82F5_4FF5_95A6_036C8A20B50D__INCLUDED_)


MySplitterWnd.cpp:

// MySplitterWnd.cpp : implementation file
//

#include 
"stdafx.h"
#include 
"GL.h"
#include 
"MySplitterWnd.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// MySplitterWnd


IMPLEMENT_DYNCREATE(MySplitterWnd, CSplitterWnd)


BEGIN_MESSAGE_MAP(MySplitterWnd, CSplitterWnd)
//ON_WM_LBUTTONDOWN()
//ON_WM_SETCURSOR()
ON_WM_MOUSEMOVE()

END_MESSAGE_MAP()




MySplitterWnd::MySplitterWnd()
{
}


MySplitterWnd::
~MySplitterWnd()
{
}


/*void MySplitterWnd::OnLButtonDown(UINT nFlags, CPoint point)
{     
    // 直接返回,不處理
    return;
}

BOOL MySplitterWnd::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{   
    // 當(dāng)光標(biāo)進(jìn)入分割窗口時,不允許改變樣子,不處理
    return FALSE;
}
*/


void MySplitterWnd::OnMouseMove(UINT nFlags, CPoint point)
{       
    
    
//將CSplitter類的處理改為由CWnd處理
    
//CSplitterWnd::OnMouseMove(nFlags, point); 

    
if(point.x<250||point.x>500) CWnd::OnMouseMove(nFlags, point); 
    
else  CSplitterWnd::OnMouseMove(nFlags, point); 

}





/*
BEGIN_MESSAGE_MAP(MySplitterWnd, CSplitterWnd)
    //{{AFX_MSG_MAP(MySplitterWnd)
        // NOTE - the ClassWizard will add and remove mapping macros here.
    //}}AFX_MSG_MAP
END_MESSAGE_MAP()
*/


/////////////////////////////////////////////////////////////////////////////
// MySplitterWnd message handlers

說的可能有些不清楚,不清楚的也沒關(guān)系,可以直接將上面的MySplitterWnd.h和MySplitterWnd.cpp導(dǎo)入到自己的工程中,直接用就行了,將你要鎖定或者限制移動范圍的分割區(qū)域用MySplitterWnd定義,不做限制,鎖定的區(qū)域用CSplitterWnd類定義,這樣子就可以做到有選擇的限制鎖定某幾個分割區(qū)域的效果.

posted on 2010-03-29 15:09 蝸牛也Coding 閱讀(4385) 評論(5)  編輯 收藏 引用

評論

# re: VC 界面窗口,靜態(tài)分割后如何鎖定分隔條或限制分隔條的移動范圍 2010-03-29 17:03 Jakcie

和我想的辦法一樣。呵呵。
不知道有沒有別的辦法。  回復(fù)  更多評論   

# re: VC 界面窗口,靜態(tài)分割后如何鎖定分隔條或限制分隔條的移動范圍 2010-03-29 18:46 MasterLuo

都是畢業(yè)生,感覺與你差距很大啊。我連VC一點都不會。  回復(fù)  更多評論   

# re: VC 界面窗口,靜態(tài)分割后如何鎖定分隔條或限制分隔條的移動范圍 2010-03-29 19:43 蝸牛也Coding

@MasterLuo
呵呵,其實差不多了,我VC也是邊學(xué)邊用的,多多指教....  回復(fù)  更多評論   

# re: VC 界面窗口,靜態(tài)分割后如何鎖定分隔條或限制分隔條的移動范圍 2011-04-29 09:35 zhou

非常感謝,網(wǎng)上雖然很多方法,但是都有問題,這個好,一下子就解決了問題。  回復(fù)  更多評論   

# re: VC 界面窗口,靜態(tài)分割后如何鎖定分隔條或限制分隔條的移動范圍 2013-03-18 16:36 zheng

很不錯,版主慷慨  回復(fù)  更多評論   


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


<2015年9月>
303112345
6789101112
13141516171819
20212223242526
27282930123
45678910

導(dǎo)航

統(tǒng)計

常用鏈接

留言簿(8)

隨筆檔案(78)

搜索

積分與排名

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美一二三视频| 久久久久久久久久久久久女国产乱| 欧美激情在线狂野欧美精品| 亚洲国产日韩一区二区| 亚洲日韩视频| 欧美香蕉视频| 欧美一区二区三区婷婷月色 | 精品999在线观看| 蜜桃av久久久亚洲精品| 亚洲激情社区| 午夜精品剧场| 在线成人av.com| 欧美日韩中字| 久久久国产精品一区二区三区| 亚洲国产精品久久久久秋霞影院| 一区二区动漫| 国产亚洲精品久久久久婷婷瑜伽| 美女免费视频一区| 制服丝袜激情欧洲亚洲| 久久香蕉国产线看观看av| 亚洲精品美女久久7777777| 国产精品一区二区视频| 麻豆freexxxx性91精品| 亚洲色图综合久久| 欧美成人高清视频| 亚洲综合大片69999| 伊人久久大香线| 国产精品久久久久77777| 久久色在线观看| 一区二区三区免费观看| 免费观看久久久4p| 亚洲欧美日韩国产综合在线 | 日韩性生活视频| 久久一区二区视频| 亚洲午夜精品国产| 亚洲国产美女| 国产伦精品一区二区三| 欧美理论电影在线播放| 久久久高清一区二区三区| 亚洲视频1区| 亚洲第一免费播放区| 欧美在线免费视频| 在线综合欧美| 亚洲人成网站影音先锋播放| 国产在线精品二区| 国产精品激情av在线播放| 欧美成黄导航| 久久综合999| 性高湖久久久久久久久| 国产精品99久久久久久久久久久久| 欧美成人精品h版在线观看| 欧美亚洲一级片| 亚洲性人人天天夜夜摸| 亚洲看片免费| 亚洲国产日韩在线| 1024国产精品| 一区福利视频| 国产自产v一区二区三区c| 国产精品女人网站| 欧美午夜不卡在线观看免费 | 国产精品视频大全| 欧美日韩高清在线播放| 欧美成人免费在线观看| 免费观看亚洲视频大全| 久热精品视频在线| 久久综合给合久久狠狠狠97色69| 久久精品123| 久久国产高清| 久久久999精品视频| 久久黄金**| 久久久久中文| 久久一区二区三区国产精品| 久久久久综合一区二区三区| 久久久久久尹人网香蕉| 久久在线免费观看| 欧美成人福利视频| 欧美激情一区二区久久久| 欧美精品日韩一本| 欧美午夜宅男影院| 国产精自产拍久久久久久| 国产精品一区二区三区四区| 国产日韩在线播放| 黄色成人在线网站| 亚洲片区在线| 亚洲一区二区高清| 欧美一区二区在线视频| 久久久一区二区三区| 麻豆九一精品爱看视频在线观看免费| 老牛影视一区二区三区| 亚洲大胆女人| 日韩视频免费在线观看| 亚洲欧美美女| 久久久久一区二区| 欧美日韩国产精品一卡| 国产精品午夜av在线| 国内激情久久| 亚洲欧洲一二三| 亚洲小视频在线观看| 欧美一区二区私人影院日本| 免费观看成人网| 亚洲免费观看| 欧美一级视频精品观看| 欧美.com| 国产精品免费电影| 在线欧美一区| 亚洲综合视频在线| 久热精品视频在线| 日韩亚洲欧美一区二区三区| 午夜精品在线| 欧美精品一区二区高清在线观看| 国产精品日日摸夜夜添夜夜av| 影音先锋日韩资源| 亚洲一区二区黄色| 免费高清在线一区| 亚洲小少妇裸体bbw| 欧美www视频在线观看| 国产精品一二三| 91久久一区二区| 久久久久久久久久看片| 日韩视频在线播放| 久久一区激情| 国产亚洲欧美另类中文| 99re66热这里只有精品3直播| 久久se精品一区精品二区| 91久久精品视频| 久久精品国产亚洲精品| 欧美系列一区| 日韩网站在线看片你懂的| 久久精品一区二区三区不卡| 99re热这里只有精品视频| 久久九九精品| 国产日韩一区欧美| 亚洲在线一区| 亚洲精品乱码| 免费成人高清视频| 国产专区精品视频| 香蕉久久精品日日躁夜夜躁| 日韩视频在线观看一区二区| 裸体丰满少妇做受久久99精品| 国产情人节一区| 亚洲欧美制服中文字幕| 亚洲日本在线视频观看| 老司机午夜精品| 狠狠干综合网| 欧美日韩国产色综合一二三四| 国产主播精品| 亚洲国产日韩在线一区模特| 欧美亚洲视频在线看网址| 欧美性猛片xxxx免费看久爱 | 美女精品国产| 黄色国产精品一区二区三区| 久久久久久久波多野高潮日日| 亚洲一级免费视频| 国产精品va| 亚洲欧美日韩一区二区三区在线观看 | 91久久精品国产91久久| 浪潮色综合久久天堂| 久久av在线看| 国产综合自拍| 久久裸体艺术| 久久久精品动漫| 激情综合电影网| 免费欧美日韩国产三级电影| 久久久999精品免费| 在线免费观看日本一区| 欧美成年人网站| 欧美成人中文| 一区二区三区四区五区在线| 日韩视频永久免费观看| 国产精品成人va在线观看| 亚洲影院在线| 午夜精品区一区二区三| 国产在线精品成人一区二区三区| 久久婷婷国产综合国色天香| 久久久久久999| 91久久嫩草影院一区二区| 亚洲精品久久久久| 国产精品av免费在线观看| 欧美在线91| 久久久九九九九| 亚洲精品极品| 宅男精品视频| 国内精品久久久久影院色| 欧美福利一区| 欧美三级中文字幕在线观看| 欧美在线视频一区| 久久免费视频网站| 亚洲最新合集| 午夜在线电影亚洲一区| 在线观看亚洲a| 亚洲免费观看高清在线观看 | 欧美日韩国产限制| 欧美亚洲色图校园春色| 久久亚洲综合| 亚洲一区二区免费看| 久久福利毛片| 亚洲天堂网在线观看| 欧美一级在线视频| 亚洲乱码国产乱码精品精天堂 | 91久久精品日日躁夜夜躁国产|