【发布时间】:2016-07-01 15:53:39
【问题描述】:
累死了! 我如何说服 MFC 的 CScrollView 按整行滚动,而不仅仅是按像素滚动? 我非常绝望,甚至拿 Jeff Procise 的“Programming Windows with MFC”复制并粘贴在那里找到的简单示例.没有成功...!
我正在使用一个相当简化的 hexa 编辑器扩展一个更大的项目,但我遇到了这个噩梦。通常情况下,我错过了一些非常小的东西来使它工作。
请参阅下面的代码以及我怀疑是问题根源的OnSize 处理程序的两个版本。在其中的每一个中,我:(a)确定代表文件的行数(每行有 16 个字节,例如,一个 500 字节的文件由 32 行表示),以及(b)设置参数垂直滚动条。如果要显示 32 行,我将范围设置为 0..32。不幸的是,MFC 将此范围视为像素而不是“线”,我无法说服它在我的 OnDraw 方法中这样做。
提到OnDraw 方法,这个问题在视觉上似乎存在一个无法通过调用myDC.SelectClipRgn(NULL); 删除的剪辑区域。 Aka,我无法通过移动原始内容在 Windows 知道如何自行绘制的区域中绘制。然而,问题肯定会出在其他地方......
// MFC message map set correctly
afx_msg int CHexaEditor::OnCreate(LPCREATESTRUCT lpcs){
// window created; instantiating the window manually
if (CScrollView::OnCreate(lpcs)==-1) return -1;
m_nMapMode=MM_TEXT; // reason - see OnSize version 2
m_lineDev=CSize(0,1); // reason - see OnSize version 2
}
void CHexaEditor::PostNcDestroy(){
// window ready to be destroyed
//nop (I'll do the job)
}
// OnSize handler version 1 (making use of MFC methods)
afx_msg void CHexaEditor::OnSize(UINT nType,int cx,int cy){
// window size changed
nLinesTotal=...;
SetScrollSizes( MM_TEXT,
CSize(0,nLinesTotal),
...page size...,
CSize(0,1) // scroll up & down by one line
);
ShowScrollBar(SB_VERT,TRUE); // force visible
}
// OnSize handler version 2 (making use of API functions)
afx_msg void CHexaEditor::OnSize(UINT nType,int cx,int cy){
// window size changed
nLinesTotal=...;
SCROLLINFO si={ sizeof(si), SIF_RANGE|SIF_PAGE, ... };
SetScrollInfo( SB_VERT, &si, FALSE );
ShowScrollBar(SB_VERT,TRUE); // force visible
}
感谢任何帮助,在此先感谢!
托马斯
【问题讨论】:
标签: c++ winapi mfc hex scrollview