MFC對話方塊處理滾動條

2021-08-01 12:43:32 字數 4387 閱讀 9955

mfc對話方塊處理滾動條

flyfish

原理nmin

specifies the minimum scrolling position.

滾動條範圍最小值

nmax

specifies the maximum scrolling position.

滾動條範圍最大值

proportional scroll box.

頁尺寸,用來確定比例滾動條的大小

npos

specifies the position of the scroll box.

滾動條的位置

以垂直滾動條為例,假設乙個視窗高度1080畫素,而顯示器或者使用者看到的只有768畫素,那麼就可以設定

nmax=1080,npage=768.

標頭檔案

//成員變數

//在資源檢視中看到的對話方塊的大小

crect m_rectoriginal;

// 滑鼠拖拽

bool m_bdragging;

cpoint m_ptdragpoint;

// 滾動條實際位置

int m_nscrollpos;

// 對話方塊實際高度

int m_ncurrentheight;

//訊息函式

afx_msg void onvscroll(uint nsbcode, uint npos, cscrollbar* pscrollbar);

afx_msg void onsize(uint ntype, int cx, int cy);

afx_msg bool onmousewheel(uint nflags, short zdelta, cpoint pt);

afx_msg void onlbuttondown(uint nflags, cpoint point);

afx_msg void onlbuttonup(uint nflags, cpoint point);

afx_msg void onmousemove(uint nflags, cpoint point);

afx_msg void onkillfocus(cwnd* pnewwnd);

//重寫函式

virtual bool oninitdialog();

//增加函式

void enddrag();

實現檔案

//訊息對映

on_wm_vscroll()

on_wm_size()

on_wm_mousewheel()

on_wm_lbuttondown()

on_wm_lbuttonup()

on_wm_mousemove()

on_wm_killfocus()

//實現函式

void cdlgx::onvscroll(uint nsbcode, uint npos, cscrollbar* pscrollbar)

m_nscrollpos += ndelta;

setscrollpos(sb_vert, m_nscrollpos, true);

scrollwindow(0, -ndelta);

cdialogex::onvscroll(nsbcode, npos, pscrollbar);

}void cdlgx::onsize(uint ntype, int cx, int cy)

bool cdlgx::onmousewheel(uint nflags, short zdelta, cpoint pt)

}else

}return cdialogex::onmousewheel(nflags, zdelta, pt);

}void cdlgx::onlbuttondown(uint nflags, cpoint point)

void cdlgx::onlbuttonup(uint nflags, cpoint point)

void cdlgx::onmousemove(uint nflags, cpoint point)

cdialogex::onmousemove(nflags, point);

}void cdlgx::onkillfocus(cwnd* pnewwnd)

bool cdlgx::oninitdialog()

void cdlgx::enddrag()

對話方塊中新增乙個垂直滾動條 vertical scroll bar

為其繫結乙個控制項變數 m_vscroll

增加訊息wm_mousewheel ,wm_vscroll

標頭檔案

增加 cscrollbar m_vscroll;

afx_msg void onvscroll(uint nsbcode, uint npos, cscrollbar* pscrollbar);

afx_msg bool onmousewheel(uint nflags, short zdelta, cpoint pt);

int m_nscrollunitheight = 20;//一條記錄的高度

int m_nunitcount = 10;//記錄總數

crect m_rectscroll;//滾動條的rect

int m_nscrollpos;//滾動條位置

實現檔案

繫結變數的時候嚮導會自動增加資料交換

void cmfcdlg::dodataexchange(cdataexchange* pdx)

增加訊息的時候 嚮導會自動增加訊息對映的**

begin_message_map(cmfcdlg, cdialogex)

on_wm_vscroll()

on_wm_mousewheel()

end_message_map()

對話方塊初始化增加

crect rect;

getclientrect(rect);

scrollinfo si;

si.cbsize = sizeof(scrollinfo);;

si.nmin = 0;

si.nmax = m_nscrollunitheight*m_nunitcount;

si.npage = m_nscrollunitheight;

si.fmask = sif_pos | sif_range | sif_page;

m_vscroll.setscrollinfo(&si, true);

m_vscroll.getwindowrect(m_rectscroll);//滾動條所在的位置

screentoclient(m_rectscroll);

其他實現函式

void cmfcdlg::onvscroll(uint nsbcode, uint npos, cscrollbar* pscrollbar)

break;

case sb_lineup: m_nscrollpos -= 10;

if (m_nscrollpos < si.nmin)

break;

case sb_pagedown: m_nscrollpos += si.npage;

if (m_nscrollpos > (si.nmax - si.nmin - si.npage))

break;

case sb_pageup: m_nscrollpos -= si.npage;

if (m_nscrollpos < si.nmin)

break;

case sb_thumbtrack: m_nscrollpos = npos; break;

}scrollwindow(0, -(m_nscrollpos - si.npos), null, null);

m_vscroll.movewindow(m_rectscroll, true);

si.fmask = sif_pos;

si.npos = m_nscrollpos;

m_vscroll.setscrollinfo(&si, true);

cdialogex::onvscroll(nsbcode, npos, pscrollbar);

}bool cmfcdlg::onmousewheel(uint nflags, short zdelta, cpoint pt)

else

if (zdelta == 120)

m_vscroll.movewindow(m_rectscroll, true);

return cdialogex::onmousewheel(nflags, zdelta, pt);

}

MFC,對話方塊滾動條使用

不用管是什麼意思,我也不知道,能用就行,對話方塊中設定自動新增那種滾動條,在建立滾動條函式,複製貼上 橫向滾動條 onhscroll scrollinfo scrollinfo getscrollinfo sb horz,scrollinfo,sif all switch nsbcode setsc...

mfc 帶滾動條的對話方塊 滾動條訊息響應方法

在對話方塊對應的類屬性裡新增onvscroll 裡面新增 如下 void picture parent dlg onvscroll uint nsbcode,uint npos,cscrollbar pscrollbar setscrollinfo sb vert,scrollinfo,sif al...

對話方塊中滾動條方便用

在對話方塊上要應用滾動條,首先當然是要將對話方塊的屬性vertical scroll選中 在這裡只介紹縱向滾動條,橫向滾動條與之原理相同 然後是按ctlr w進入classwizard選中對話訊息wm onvscroll,並新增它的響應函式,接著進入 編輯區,寫入 void crq onvscrol...