CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  图形处理/算法

在控件中画图超出边界 如何让他自动产生滚动条?

楼主zjfzju(zjf)2004-05-04 12:42:07 在 VC/MFC / 图形处理/算法 提问

在控件中画图超出边界   如何让他自动产生滚动条?  
  谢谢! 问题点数:30、回复次数:9Top

1 楼playboy132(一塌糊涂)回复于 2004-05-05 11:57:41 得分 30

判断所有图形所需的最小区域,和当前的用户区域比较。  
  然后。。。。。。。。。  
   
   
  给分!!!!!!Top

2 楼zjfzju(zjf)回复于 2004-05-05 14:36:58 得分 0

upTop

3 楼playboy132(一塌糊涂)回复于 2004-05-05 16:22:24 得分 0

判断所有图形所需的最小区域,储存在CSize   size中  
  然后在View中调用SetScrollSizes(MM_TEXT,   size);//重新设置滚动条  
   
   
   
  快给分!!!!!!  
  Top

4 楼puhuofeie(扑火飞蛾)回复于 2004-05-05 20:27:55 得分 0

 
  这个问题我也想知道!  
   
  比如,用CStatic控件画图,如果图片大于控件大小,怎样在CStatic上产生滚动条!Top

5 楼puhuofeie(扑火飞蛾)回复于 2004-05-05 20:28:37 得分 0

我没有产生滚动条,我是将图片缩小!Top

6 楼zjfzju(zjf)回复于 2004-05-06 00:29:09 得分 0

有没有好的办法啊Top

7 楼byry(百事罐头)回复于 2004-05-06 12:05:51 得分 0

在Windows   应   用   程   序   中,   大   多   数   应   用   程   序   通   过   滚   动  
    条   来   实   现   窗   口   客   户   区   域   的   滚   动。   在   某   些   情   况   下,   使  
    用   滚   动   条   则   有   些   不   方   便。   例   如,   在   绘   图   软   件   中   使   用  
    鼠   标   拖   动   的   方   法   画   线   时,   若   两   端   点   不   能   同   时   出   现   在  
    客   户   区   域   内,   则   不   能   用   滚   动   条   来   实   现   客   户   区   域   的   滚  
    动。   本   文   仅   就   实   现   窗   口   客   户   区   域   自   动   滚   动   的   方   法   谈  
    谈   自   己   的   看   法,   并   且   编   写   了   一   个   能   绘   制   直   线   的   绘   图  
  小   程   序。  
       当   光   标   移   动   到   窗   口   边   界   附   近   时,   客   户   区   域   自   动   滚   动  
  ,   将   用   户   操   作   的   位   置   向   窗   口   中   心   移   动,   这   是   该   绘   图   小   程  
    序   总   的   设   计   思   想。   在   实   际   操   作   过   程   中,   用Workshop   制   作   了  
  形   状   为   向   上   箭   头、   向   下   箭   头、   向   左   箭   头、   向   右   箭   头   的   光   标,  
    作   为   窗   口   滚   动   时   的   光   标。   在WinMain()   函   数   登   记   窗   口   类   时   将  
  窗   口   类   的hCursor   设   置   为NULL。   程   序   中   保   留   了   滚   动   条,   也   可   通  
    过   滚   动   条   来   操   作。   在WM_MOUSEMOVE   消   息   的   处   理   中,   如   果   光   标  
  移   到   边   界   附   近,   并   且   客   户   区   域   可   以   滚   动,   则   将   光   标   置   为   相  
    应   形   状   的   光   标,   并   设   置   一   个   定   时   器   ;   如   果   光   标   移   出   边   界  
    附   近   的   区   域   并   且   已   设   置   定   时   器,   则   删   除   定   时   器。   在WM_TIMER  
  消   息   的   处   理   中,   如   果   窗   口   不   需   要   滚   动   则   删   除   定   时   器,   否   则  
  判   断   滚   动   方   向   并   发   送   相   应   的WM_HSCROLL   或WM_VSCROLL   消   息。   在WM_HSCROLL  
  或WM_VSCROLL   消   息   的   处   理   中   实   现   窗   口   客   户   区   域   的   滚   动。   在WM_CREATE  
  和WM_SIZE   消   息   的   处   理   中,   获   得   窗   口   的   客   户   区   域   大   小   并   保   存   在   静  
    态   变   量nClientWidth   和nClientHeight   中。  
  Top

8 楼byry(百事罐头)回复于 2004-05-06 12:05:58 得分 0

程   序   清   单   如   下,   其   中   省   略   了WinMain()   函   数、rc   文   件、def   文   件、  
  rh   文   件。  
    //   pan.c  
    #define   LINE_UP   100  
    #define   VIRTUE_WIDTH   4000  
    #define   VIRTUE_HEIGHT   3000  
    HINSTANCE   hInst;  
    static   char   szAppName[]   =   "PanExample"   ;  
    LRESULT   FAR   PASCAL   _export   WndProc   (HWND   hwnd,   UINT   message,   WPARAM   wParam,   LPARAM   lParam)  
    {  
    static   int   nVirtueWidth   ,nVirtueHeight   ,nClientWidth   ,nClientHeight;  
    static   BOOL   bDraw;  
    static   HCURSOR   hLeft,hRight,hUp,hDown,hCursor,hDraw;  
    static   HPEN   hPen;  
    HDC   hdc;  
    PAINTSTRUCT   ps;  
    RECT   rectClient;  
    POINT   point;  
    static   RECT*   pRect;  
    static   int   nNum;  
    static   HANDLE   hMem;  
    int   n,x,y;  
    RECT*   p;  
    static   UINT   IdTimer=0;  
    switch   (message)  
    {  
    case   WM_CREATE:  
       //   装   入   光   标   资   源  
       hLeft=LoadCursor(hInst,LEFT_CURSOR);  
       hRight=LoadCursor(hInst,RIGHT_CURSOR);  
       hUp=LoadCursor(hInst,UP_CURSOR);  
       hDown=LoadCursor(hInst,DOWN_CURSOR);  
       hCursor=LoadCursor(NULL,IDC_ARROW);  
       hDraw=LoadCursor(NULL,IDC_CROSS);  
       hPen=CreatePen(PS_SOLID,1,RGB(255,0,0));  
       //   分   配   内   存   保   存   线   数   据  
       hMem=GlobalAlloc(GMEM_MOVEABLE,100*sizeof(RECT));  
       pRect=(RECT*)(GlobalLock(hMem));  
       nNum=0;  
       hdc=GetDC(hwnd);  
       //   获   得   客   户   区   域   的   大-  
       GetClientRect(   hwnd   ,   &rectClient   );  
       nClientWidth   =   rectClient.right;  
       nClientHeight   =   rectClient.bottom;  
       ReleaseDC(hwnd,hdc);  
       nVirtueWidth=VIRTUE_WIDTH;  
       nVirtueHeight=VIRTUE_HEIGHT;  
       //   设   置   滚   动   范   围  
       SetScrollRange(hwnd,SB_HORZ,0,nVirtueWidth,TRUE)   ;  
       SetScrollRange(hwnd,SB_VERT,0,nVirtueHeight,TRUE);  
       break;  
    case   WM_PAINT:  
       hdc   =   BeginPaint(   hwnd,   &ps   );  
       SelectObject(hdc,hPen);  
       SetROP2(hdc,R2_XORPEN);  
       x=GetScrollPos(hwnd,SB_HORZ);  
       y=GetScrollPos(hwnd,SB_VERT);  
       for   (p=pRect,n=0;n        {  
       MoveTo(hdc,p->left-x,p->top-y);  
       LineTo(hdc,p->right-x,p->bottom-y);  
       }  
       EndPaint(   hwnd,   &ps   );  
       break;  
    case   WM_LBUTTONDOWN:  
       if(SetCapture(hwnd))  
       return   (1);  
       bDraw=TRUE;  
       x=GetScrollPos(hwnd,SB_HORZ);  
       y=GetScrollPos(hwnd,SB_VERT);  
       //   保   存   直   线   的   起   始   位   置  
       pRect[nNum].right=LOWORD(lParam)+x;  
       pRect[nNum].left=pRect[nNum].right;  
       //   终   止   位   置   与   起   始   位   置   相   同  
       pRect[nNum].bottom=HIWORD(lParam)+y;  
       pRect[nNum].top=pRect[nNum].bottom;  
       nNum++;  
       break;  
    case   WM_LBUTTONUP:  
       x=GetScrollPos(hwnd,SB_HORZ);  
       y=GetScrollPos(hwnd,SB_VERT);  
       //   保   存   直   线   的   终   止   位   置  
       pRect[nNum-1].right=LOWORD(lParam)+x;  
       pRect[nNum-1].bottom=HIWORD(lParam)+y;  
       ReleaseCapture();  
       bDraw=FALSE;  
       break;  
    case   WM_MOUSEMOVE:  
       //   获   得   滚   动   块   的   位   置  
       x=GetScrollPos(hwnd,SB_HORZ);  
       y=GetScrollPos(hwnd,SB_VERT);  
       //   获   得   光   标   的   位   置  
       point.x=LOWORD(lParam)+x;  
       point.y=HIWORD(lParam)+y;  
       if   (bDraw)  
       {  
       hdc=GetDC(hwnd);  
       SelectObject(hdc,hPen);  
       SetROP2(hdc,R2_XORPEN);  
       //   擦   除   上   次   画   的   线  
       MoveTo(hdc,pRect[nNum-1].left-x,pRect[nNum-  
       1].top-y);  
       LineTo(hdc,pRect[nNum-1].right-x,pRect[nNum-  
       1].bottom-y);  
       pRect[nNum-1].right=point.x;  
       pRect[nNum-1].bottom=point.y;  
       //   绘   制-   孪  
       MoveTo(hdc,pRect[nNum-1].left-x,pRect[nNum-   1].top-y);  
       LineTo(hdc,pRect[nNum-1].right-x,pRect[nNum-  
       1].bottom-y);  
       ReleaseDC(hwnd,hdc);  
       }  
  if   ((point.x-x<10)&&(x!=0))  
       //   光   标   在   左   边   界   附   近   并   且   滚   动   块   不   在   最   左   方  
       {  
       SetCursor(hLeft);   //   设   置   光   标   为   左   箭   头  
       if   (!IdTimer)   //   未   设   置   定   时   器  
       IdTimer=SetTimer(hwnd,1,500,NULL);   }  
       else   if   ((point.x-x>nClientWidth-10)&&(x!=VIRTUE_WIDTH))  
       //   光   标   在   右   边   界   附   近   并   且   滚   动   块   不   在   最   右   方  
       {  
       SetCursor(hRight);//   设   置   光   标   为   右   箭   头  
       if   (!IdTimer)  
       IdTimer=SetTimer(hwnd,1,500,NULL);   }  
       else   if   ((point.y-y<10)&&(y!=0))  
       //   在   上   边   界   附   近   并   且   滚   动   块   不   在   最   上   方  
       {  
       SetCursor(hUp);   //   设   置   光   标   为   上   箭   头  
       if   (!IdTimer)  
       IdTimer=SetTimer(hwnd,1,500,NULL);   }  
       else   if   ((point.y-y>nClientHeight-10)&&   (y!=VIRTUE_HEIGHT))  
       //   光   标   在   下   边   界   附   近   并   且   滚   动   块   不   在   最   下   方  
       {  
       SetCursor(hDown);   //   设   置   光   标   为   下   箭   头  
       if   (!IdTimer)  
       IdTimer=SetTimer(hwnd,1,500,NULL);   }  
       else   //   不-   枰      龆      突        
       {  
       if   (bDraw)  
       SetCursor(hDraw);   //   设   置   光   标   为   十   字   叉   丝  
       else  
       SetCursor(hCursor);   //   设   置   光   标   为   普   通   光   标  
       if   (IdTimer)   //--   设   置   定   时   器  
       {  
       KillTimer(hwnd,IdTimer);  
       IdTimer=0;  
       }  
       }  
       break;  
    case   WM_SIZE:  
       //   获   得   客   户   区   域   的   大-  
       nClientWidth=LOWORD(lParam);  
       nClientHeight=HIWORD(lParam);  
       break;  
    case   WM_HSCROLL:  
       x=GetScrollPos(hwnd,SB_HORZ);  
       switch   (wParam)  
       {  
       case   SB_LINEDOWN:   //   单   击   滚   动   条   右   箭   头  
       if   (x>nVirtueWidth-LINE_UP   )  
       x=nVirtueWidth;  
       else  
       x+=LINE_UP;  
       SetScrollPos(hwnd,SB_HORZ,x,TRUE);  
       InvalidateRect(hwnd,NULL,TRUE);  
       break;  
       case   SB_LINEUP:   //   单   击   滚   动   条   左   箭   头  
       if   (x        x=0;  
       else  
       x-=LINE_UP;  
       SetScrollPos(hwnd,SB_HORZ,x,TRUE);  
       InvalidateRect(hwnd,NULL,TRUE);  
       break;   }  
       break;  
    case   WM_VSCROLL:  
       y=GetScrollPos(hwnd,SB_VERT);  
       switch   (wParam)  
       {  
       case   SB_LINEDOWN:   //   单   击   滚   动   条   下   箭   头  
       if   (y>nVirtueHeight-LINE_UP   )  
       y=nVirtueHeight;  
       else  
       y+=LINE_UP;  
       SetScrollPos(hwnd,SB_VERT,y,TRUE);  
       InvalidateRect(hwnd,NULL,TRUE);  
       break;  
       case   SB_LINEUP://   单   击   滚   动   条   上   箭   头  
       if   (y        y=0;  
       else  
       y-=LINE_UP;  
       SetScrollPos(hwnd,SB_VERT,y,TRUE);  
       InvalidateRect(hwnd,NULL,TRUE);  
       break;   }  
       break;  
    case   WM_TIMER:  
       //   获   得   滚   动   块   的   位   置  
       x=GetScrollPos(hwnd,SB_HORZ);  
       y=GetScrollPos(hwnd,SB_VERT);  
       //   获   得   光   标   的   位   置  
       GetCursorPos(&point);  
       ScreenToClient(hwnd,&point);  
       //   滚   动   块--   到   尽   头  
    if(((x==0)&&(point.x<10))||((x==VIRTUE_WIDTH)&&(point.  
    x>nClientWidth-10))||((y==0)&&(point.y<10))||  
    ((y==VIRTUE_HEIGHT)&&(point.y>nClientHeight-10)))  
       {  
       if(IdTimer)  
       KillTimer(hwnd,IdTimer);   }  
       else  
       {  
       if   (point.x<10)  
       //   向   左   滚   动  
       SendMessage(hwnd,WM_HSCROLL,SB_LINEUP,0);  
       else   if   (point.x>nClientWidth-10)  
       //   向   右   滚   动  
       SendMessage(hwnd,WM_HSCROLL,SB_LINEDOWN,0);  
       else   if   (point.y<10)  
       //   向   上   滚   动  
       SendMessage(hwnd,WM_VSCROLL,SB_LINEUP,0);  
       else   if(point.y>nClientHeight-10)  
       //   向   下   滚   动  
       SendMessage(hwnd,WM_VSCROLL,SB_LINEDOWN,0);  
       }  
       break;  
    case   WM_DESTROY:  
       //   释   放   所-   资   源  
       GlobalUnlock(hMem);  
       GlobalFree(hMem);  
       DestroyCursor(hLeft);  
       DestroyCursor(hRight);  
       DestroyCursor(hUp);  
       DestroyCursor(hDown);  
       DeleteObject(hPen);  
       PostQuitMessage   (0)   ;  
       break;  
    default:  
       return   DefWindowProc   (hwnd,   message,   wParam,   lParam)   ;   }  
    return   (0L);  
    }  
  Top

9 楼playboy132(一塌糊涂)回复于 2004-05-08 11:48:11 得分 0

不好意思,说错了。  
  我说的是在文档中自动产生滚动条!Top

相关问题

  • 在static控件上画图,我该怎样让他滚动
  • 什么容器控件可以在子控件超出边界时出现滚动条?
  • 如何在Picture控件中画图??
  • ************对话框控件上画图**************
  • 怎么在STATIC控件上画图
  • 可以在Image控件上画图吗?
  • 滚动超出边界,怎么办?
  • Microsoft Debug 恳请高手帮忙,一个画图的ActiveX,但是只要一有滚动条,ActiveX控件里面就闪烁,怎么去掉这个闪烁,谢谢
  • 怎样为控件加上滚动条?
  • 如何控制TMEMO控件的滚动?

关键词

  • 控件
  • idtimer
  • nvirtuewidth
  • nclientwidth
  • nclientheight
  • virtue
  • 滚动
  • loadcursor
  • 设置
  • hdraw

得分解答快速导航

  • 帖主:zjfzju
  • playboy132

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo