请教一个小问题

时间:2022-08-10 17:36:05
我的一个程序在创建窗口时用到了
WS_HSCROLL | WS_VSCROLL | WS_OVERLAPPEDWINDOW 却没有显示水平滚动条。

程序代码如下:
//头文件 Accel.h

#define LINESIZE 8

class CMyAPP:public CWinApp
{
public:
virtual BOOL InitInstance();

};

class CMainWindow:public CFrameWnd
{
protected:
int m_nCellWidth; //Cell width in Pixels
int m_nCellHeight; //Cell height in Pixels
int m_nRibbonWidth; //Ribbon width in Pixels
int m_nViewWidth; //Workspace width in Pixels
int m_nViewHeight; //Workspace height in Pixels
int m_nHScrollPos; //Horizonal scroll position
int m_nVScrollPos; //Vertical SCroll position
int m_nHPageSize; //Horizontal page size
int m_nVPageSize; //Vertical Page Size

public:
CMainWindow();
protected:
afx_msg void OnPaint();
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
afx_msg void OnSize(UINT nType,int cx,int cy);
afx_msg void OnHScroll(UINT nCode,UINT nPos,CScrollBar* pScrollBar);
afx_msg void OnVScroll(UINT nCode,UINT nPos,CScrollBar* pScrollBar);

DECLARE_MESSAGE_MAP()
};




//.cpp文件
#include <afxwin.h>
#include "Accel.h"

CMyAPP myApp;

/////////////////////////////////////////
//CMyApp member functions

BOOL CMyAPP::InitInstance()
{  
m_pMainWnd=new CMainWindow;
m_pMainWnd->ShowWindow(m_nCmdShow);
m_pMainWnd->UpdateWindow();
//::CWinApp::InitInstance();
return TRUE;
}


////////////////////////////////////////////////
//CMainWindow message map and member functions

BEGIN_MESSAGE_MAP(CMainWindow,CFrameWnd)
ON_WM_PAINT()
ON_WM_CREATE()
ON_WM_SIZE()
ON_WM_HSCROLL()
ON_WM_VSCROLL()
END_MESSAGE_MAP()  

CMainWindow::CMainWindow()
{
Create(NULL,
                _T("Accel"),WS_OVERLAPPEDWINDOW|WS_HVSCROLL|WS_VSCROLL);
}

int CMainWindow::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if(CFrameWnd::OnCreate(lpCreateStruct)==-1)
return -1;
CClientDC dc(this);
m_nCellWidth=dc.GetDeviceCaps(LOGPIXELSX);
m_nCellHeight=dc.GetDeviceCaps(LOGPIXELSX)/4;
m_nRibbonWidth=m_nCellWidth/2;
m_nViewWidth=(26*m_nCellWidth)+m_nRibbonWidth;
m_nViewHeight=m_nCellHeight*100;
return 0;
}

void CMainWindow::OnSize(UINT nType,int cx,int cy)
{
CFrameWnd::OnSize(nType,cx,cy);
//
//Set the horizonal scrolling parameters
//

int nHScrollMax=0;
m_nHScrollPos=m_nHPageSize=0;
if(cx < m_nViewWidth){
nHScrollMax=-1;
m_nHPageSize=cx;
m_nHScrollPos=min(m_nHScrollPos,m_nViewWidth-m_nHPageSize-1);
}

SCROLLINFO si;
si.fMask=SIF_PAGE|SIF_RANGE|SIF_POS;
si.nMin=0;
si.nMax=nHScrollMax;
si.nPos=m_nHScrollPos;
si.nPage=m_nHPageSize;

SetScrollInfo(SB_HORZ,&si,TRUE);
//
//Set the vertical scrolling parameters.
//

int nVScrollMax=0;
m_nVScrollPos=m_nVPageSize=0;

if(cy<m_nViewHeight){
nVScrollMax=m_nViewHeight-1;
m_nVPageSize=cy;
m_nVScrollPos=min(m_nVScrollPos,m_nViewHeight-m_nVPageSize-1);
}

si.fMask=SIF_PAGE|SIF_RANGE|SIF_POS;
si.nMin=0;
si.nMax=nVScrollMax;
si.nPos=m_nVScrollPos;
si.nPage=m_nVPageSize;

SetScrollInfo(SB_VERT,&si,TRUE);
}



void CMainWindow::OnPaint()
{
CPaintDC dc(this);
//
//Set the window origin to reflect the current scroll position.
//

dc.SetWindowOrg(m_nHScrollPos,m_nVScrollPos);
//
//Draw the grid lines.
//
CPen pen(PS_SOLID,0,RGB(192,192,192));
CPen* pOldPen = dc.SelectObject(&pen);

for(int i=0;i<99;i++)
{
int y=(i*m_nCellHeight)+m_nCellHeight;
dc.MoveTo(0,y);
dc.LineTo(m_nViewWidth,y);
}

for(int j=0;j<26;j++)
{
 int x=(j*m_nCellWidth)+m_nRibbonWidth;
 dc.MoveTo(x,0);
 dc.LineTo(x,m_nViewHeight);
}

dc.SelectObject(pOldPen);

//
//Draw the bodies of the rows and the column headers.
//

CBrush brush;
brush.CreateStockObject(LTGRAY_BRUSH);

CRect rctop(0,0,m_nViewWidth,m_nCellHeight);
dc.FillRect(rctop,&brush);
CRect rcLeft(0,0,m_nRibbonWidth,m_nViewHeight);
dc.FillRect(rcLeft,&brush);

dc.MoveTo(0,m_nCellHeight);

dc.LineTo(m_nViewWidth,m_nCellHeight);
dc.MoveTo(m_nRibbonWidth,0);
dc.LineTo(m_nRibbonWidth,m_nViewHeight);

dc.SetBkMode(TRANSPARENT);

//
//Add numbers and button outlines to the row headers.
//

for(i=0;i<99;i++){
int y= (i*m_nCellHeight)+m_nCellHeight;
dc.MoveTo(0,y);
dc.LineTo(m_nViewWidth,y);
 
CString string;
string.Format(_T("%d"),i+1);

CRect rect(0,y,m_nRibbonWidth,y+m_nCellHeight);
dc.DrawText(string,&rect,DT_SINGLELINE|DT_CENTER|DT_VCENTER);

rect.top++;
dc.Draw3dRect(rect,RGB(255,255,255),RGB(128,128,128));
}

//
//Add letters and button outlines to the column headers.
//

for(j=0;j<26;j++){
int x=(j*m_nCellWidth)+m_nRibbonWidth;
dc.MoveTo(x,0);
dc.LineTo(x,m_nCellHeight);

CString string;
string.Format(_T("%c"),j+'A');
CRect rect(x,0,x+m_nCellWidth,m_nCellHeight);
dc.DrawText(string,&rect,DT_SINGLELINE|DT_CENTER|DT_VCENTER);

rect.left++;
dc.Draw3dRect(rect,RGB(255,255,255),RGB(128,128,128));
}

}


void CMainWindow::OnHScroll(UINT nCode,UINT nPos,CScrollBar* pScrollBar)
{
int nDelta;

switch(nCode){

case SB_LINELEFT:
nDelta=-LINESIZE;
break;
case SB_PAGELEFT:
nDelta=-m_nHPageSize;
break;
case SB_THUMBTRACK:
nDelta=(int)nPos-m_nHScrollPos;
break;
case SB_PAGERIGHT:
nDelta=m_nHPageSize;
break;
case SB_LINERIGHT:
nDelta=LINESIZE;
break;
default:
return;
}



int nSCrollPos=m_nHScrollPos+nDelta;
int nMaxPos=m_nViewWidth-m_nHPageSize;

if(nSCrollPos<0)
nDelta=-m_nHScrollPos;
else if(nSCrollPos>nMaxPos)
nDelta=nMaxPos-m_nHScrollPos;

if(nDelta!=0){
m_nHScrollPos+=nDelta;
SetScrollPos(SB_HORZ,m_nHScrollPos,TRUE);
ScrollWindow(-nDelta,0);
}
}

void CMainWindow::OnVScroll(UINT nCode,UINT nPos,CScrollBar* pScrollBar)
{
int nDelta;
switch(nCode){
case SB_LINEUP:
nDelta=-LINESIZE;
break;
case SB_PAGEUP:
nDelta=-m_nVPageSize;
break;
case SB_THUMBTRACK:
nDelta=(int)nPos-m_nVScrollPos;
break;
case SB_LINEDOWN:
nDelta=LINESIZE;
break;
default:
return;
}

int nScrollPos=m_nVScrollPos+nDelta;
int nMaxPos=m_nViewHeight-m_nVPageSize;

if(nScrollPos<0)
nDelta=-m_nVScrollPos;
else if(nScrollPos>nMaxPos)
nDelta=nMaxPos-m_nVScrollPos;

if(nDelta!=0){
m_nVScrollPos+=nDelta;
SetScrollPos(SB_VERT,m_nVScrollPos,TRUE);
ScrollWindow(0,-nDelta);
}
}

3 个解决方案

#1


简单看了下,你的程序问题大大,Create方法放到构造函数中不说,Create什么都不知道了。

#2


但是可以运行,

#3


nHScrollMax=-1;  ?

#1


简单看了下,你的程序问题大大,Create方法放到构造函数中不说,Create什么都不知道了。

#2


但是可以运行,

#3


nHScrollMax=-1;  ?