ScrollWindow滚动窗口,有动态按钮,且主窗口很大,主窗口有滚动条

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

(1)首先创建主窗口时,在其属性中加上:WS_HSCROLL:
hwnd = CreateWindow (szAppName, TEXT ("Button Look"),
   WS_OVERLAPPEDWINDOW | WS_HSCROLL | WS_VSCROLL,//WS_HSCROLL表示有滚动条
                          CW_USEDEFAULT, CW_USEDEFAULT,
                          CW_USEDEFAULT,  CW_USEDEFAULT,
                          NULL, NULL, hInstance, NULL) ;//hwnd为主窗口


(2)响应WM_VSCROLL消息,在其中调用SetScrollPos()设置滚动条本身的位置,还要调用ScrollWindow()来改变使窗口中的内容滚动(如窗口中的按钮等控件,它们也会上下移动):
case WM_VSCROLL :         
          switch (LOWORD (wParam))
          {          
                                           
          case SB_LINEDOWN :           
    iScroll_y += 10;
    iDir= 1;
               break ;        

          case SB_LINEUP :
                   croll_y -= 10;

     iDir= -1;
     
               break ;
 }
    SetScrollPos   ( hwnd, SB_VERT, iScroll_y, TRUE) ;
    InvalidateRect (hwnd, NULL, TRUE) ;
  //ScrollWindow()可滚动窗口,窗口中客户区的内容会移动
    ScrollWindow( hwnd, 0, -10* iDir, NULL, NULL );
   
          return 0 ;

 

注:本程序是在windows程序设计 第5版中创建动态按钮的代码中修改而来,只是作为测试,会有bug.

全部代码如下:

#include <windows.h>

struct
{
     int     iStyle ;
     TCHAR * szText ;
}
button[] =
{
     BS_PUSHBUTTON,      TEXT ("PUSHBUTTON"),
     BS_DEFPUSHBUTTON,   TEXT ("DEFPUSHBUTTON"),
     BS_CHECKBOX,        TEXT ("CHECKBOX"),
     BS_AUTOCHECKBOX,    TEXT ("AUTOCHECKBOX"),
     BS_RADIOBUTTON,     TEXT ("RADIOBUTTON"),
     BS_3STATE,          TEXT ("3STATE"),
     BS_AUTO3STATE,      TEXT ("AUTO3STATE"),
     BS_GROUPBOX,        TEXT ("GROUPBOX"),
     BS_AUTORADIOBUTTON, TEXT ("AUTORADIO"),
     BS_OWNERDRAW,       TEXT ("OWNERDRAW")
} ;

#define NUM (sizeof button / sizeof button[0])

LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;

static int iScroll_y= 100;

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                    PSTR szCmdLine, int iCmdShow)
{
     static TCHAR szAppName[] = TEXT ("BtnLook") ;
     HWND         hwnd ;
     MSG          msg ;
     WNDCLASS     wndclass ;
    
     wndclass.style         = CS_HREDRAW | CS_VREDRAW ;
     wndclass.lpfnWndProc   = WndProc ;
     wndclass.cbClsExtra    = 0 ;
     wndclass.cbWndExtra    = 0 ;
     wndclass.hInstance     = hInstance ;
     wndclass.hIcon         = LoadIcon (NULL, IDI_APPLICATION) ;
     wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;
     wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
     wndclass.lpszMenuName  = NULL ;
     wndclass.lpszClassName = szAppName ;
    
     if (!RegisterClass (&wndclass))
     {
          MessageBox (NULL, TEXT ("This program requires Windows NT!"),
                      szAppName, MB_ICONERROR) ;
          return 0 ;
     }
    
     hwnd = CreateWindow (szAppName, TEXT ("Button Look"),
   WS_OVERLAPPEDWINDOW | WS_HSCROLL | WS_VSCROLL  ,
                          CW_USEDEFAULT, CW_USEDEFAULT,
                          CW_USEDEFAULT,  CW_USEDEFAULT,
                          NULL, NULL, hInstance, NULL) ;

     
     ShowWindow (hwnd, iCmdShow) ;
     UpdateWindow (hwnd) ;
    
     while (GetMessage (&msg, NULL, 0, 0))
     {
          TranslateMessage (&msg) ;
          DispatchMessage (&msg) ;
     }
     return msg.wParam ;
}

LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
     static HWND  hwndButton[NUM] ;
     static RECT  rect ;
     static TCHAR szTop[]    = TEXT ("message            wParam       lParam"),
                  szUnd[]    = TEXT ("_______            ______       ______"),
                  szFormat[] = TEXT ("%-16s%04X-%04X    %04X-%04X"),
                  szBuffer[50] ;
     static int   cxChar, cyChar ;
     HDC          hdc ;
     PAINTSTRUCT  ps ;
     int          i ;
  static int iDir= 1;
    
     switch (message)
     {
     case WM_CREATE :
          cxChar = LOWORD (GetDialogBaseUnits ()) ;
          cyChar = HIWORD (GetDialogBaseUnits ()) ;
          //创建动态按钮
          for (i = 0 ; i < NUM ; i++)
               hwndButton[i] = CreateWindow ( TEXT("button"),
                                   button[i].szText,
                                   WS_CHILD | WS_VISIBLE | button[i].iStyle,
                                   cxChar, cyChar * (1 + 2 * i)    * 6,
                                   20 * cxChar, 7 * cyChar / 4,
                                   hwnd, (HMENU) i,//i为按钮的ID号
                                   ((LPCREATESTRUCT) lParam)->hInstance, NULL) ;
          return 0 ;

     case WM_SIZE :
          rect.left   = 24 * cxChar ;
          rect.top    =  2 * cyChar ;
          rect.right  = LOWORD (lParam) ;
          rect.bottom = HIWORD (lParam) ;
          return 0 ;
         
     case WM_PAINT :
          InvalidateRect (hwnd, &rect, TRUE) ;
         
          hdc = BeginPaint (hwnd, &ps) ;
          SelectObject (hdc, GetStockObject (SYSTEM_FIXED_FONT)) ;
          SetBkMode (hdc, TRANSPARENT) ;
         
          TextOut (hdc, 24 * cxChar, cyChar, szTop, lstrlen (szTop)) ;
          TextOut (hdc, 24 * cxChar, cyChar, szUnd, lstrlen (szUnd)) ;
         
          EndPaint (hwnd, &ps) ;
          return 0 ;
         
     case WM_DRAWITEM :
     case WM_COMMAND ://按钮事件
          ScrollWindow (hwnd, 0, -cyChar, &rect, &rect) ;
         
          hdc = GetDC (hwnd) ;
          SelectObject (hdc, GetStockObject (SYSTEM_FIXED_FONT)) ;
         
          TextOut (hdc, 24 * cxChar, cyChar * (rect.bottom / cyChar - 1),
                   szBuffer,
                   wsprintf (szBuffer, szFormat,
                         message == WM_DRAWITEM ? TEXT ("WM_DRAWITEM") :
                                                  TEXT ("WM_COMMAND"),
                         HIWORD (wParam), LOWORD (wParam),
                         HIWORD (lParam), LOWORD (lParam))) ;

    //按钮的响应事件
    //if ( wParam == BS_PUSHBUTTON)
    if ( LOWORD( wParam )== 0)//按钮的ID号

    {
     MessageBox( hwnd, TEXT("123"), TEXT("456"), 0);
    }
         
          ReleaseDC (hwnd, hdc) ;
          ValidateRect (hwnd, &rect) ;
          break ;
         
     case WM_DESTROY :
          PostQuitMessage (0) ;
          return 0 ;

 case WM_VSCROLL :
          //int i = GetWindowLong ((HWND) lParam, GWL_ID) ;
         
          switch (LOWORD (wParam))
          {
          
                                             // fall through
          case SB_LINEDOWN :
                //MessageBox( hwnd, TEXT("down"), TEXT("down456"), 0);
    iScroll_y += 10;
    iDir= 1;
               break ;
        
                                             // fall through
          case SB_LINEUP :
               //MessageBox( hwnd, TEXT("up"), TEXT("up456"), 0);
      iScroll_y -= 10;

     iDir= -1;
     
               break ;
    }
    SetScrollPos   ( hwnd, SB_VERT, iScroll_y, TRUE) ;
    InvalidateRect (hwnd, NULL, TRUE) ;

    ScrollWindow( hwnd, 0, -10* iDir, NULL, NULL );//ScrollWindow()可滚动窗口,窗口中客户区的内容会移动
            return 0 ;
     }
     return DefWindowProc (hwnd, message, wParam, lParam) ;
}

 

 

MiniGUI编程速查表 前言 自己学习MiniGui也快一年了,粗浅的学习了一下,本文是根据《MINIGUI-PROG-GUIDE-V3.0-C》中的内容整理而来,根据自己的理解做了一些分类,大部分都是一些函数的说明,方便自己以后学习MiniGui时查阅。现在分享出来,供大家一起学习。当然在学习的过程中也遇到过一些坑,像自定义控件,主窗口透明背景,窗口弹出动画啊,控件动画等等,有时间也会分享出来。 1 窗口的创... 阅读详情

相关推荐

ScrollWindow()函数

在学习windows编程第五版时,介绍scrollbar时,改进的程序用到了ScrollWindow()函数。按照我的理解,如果使用了UpdateWindow()函数可以 不使用ScrollWindow()函数。因为UpdateWindow()函数会产生一个WM_PAINT消息。为了搞清楚ScrollWindow()函数的作用,我将代码加了些调试 代码/*-------------------

yongan1006的专栏 6038

滚动条函数scrollwindow研究

滚动条函数研究   下周工作需要,可能用到滚动条,所以在此先研究一下滚动条相关的知识(可怜我接触UI1年多,尽然没有用过滚动条%>_   查了下资料,感觉滚动条用法比较简单,实在没有什么可说的,具体资料网上一查一大堆,这里就不再一一列举了;但是感觉网上困惑最多的也没有给出具体答案的是scrollwindow这个函数的最后两个参数的含义,对于初学者来说,初看也是十分的困惑,所以打算花点时间研

SunLikeRain的专栏 2189

ScrollWindow函数功能

函数功能:该函数滚动所指定的窗体客户区域内容。函数提供了向后兼容性,新的应用程序应使用ScrollWindowEX。函数原型:BOOL ScrollWindow(HWND hWnd,int XAmount,int YAmount,CONST RECT★IpRect, CONST RECT★lpClipRect);参数:hWnd:客户区域将被滚动的窗体句柄。XAmount:指定水平滚动以设备为单位的

mader的专栏 5251

win32 中关于ScrollWindow函数的应用

1.SetScrollInfo 函数的说明: si.cbSize = sizeof(SCROLLINFO); si.cbMask = SIF_RANGE | SIF_PAGE; si.nMin = 0; si.nMax = NUMLINES - 1; si.nPage = cyClient/cyChar;   SetScrollInfo(hwnd, SB_VERT, &si,

u012513234的专栏 1191

详细解析ScrollWindow()

书籍:《(第五版)》环境:visual studio 2022内容:输出文字->滚动条信息函数说明:以下内容大部分来自腾讯元宝。

felicity_one的博客 703

ScrollWindow()

ScrollWindow()函数滚动的是文本内容,并不对窗口区域进行重画。UpdateWindow()函数和ValidateRect()函数使得窗口无效区域变得有效. 在windows程序设计这本书里是这样解释ScrollWindow的:ScrollWindow最后两个参数设定为NULL,这指出了要卷动整个显示区域。Windows自动把显示区域中未被卷动操作覆盖的矩形设为无效。这会产生WM_P

BEYONDHE_的专栏 1329

深入探索ScrollWindow

最近做WIN32 API开发时发现对ScrollWindow的一些工作原理并不是太清楚,于是做了相关研究,记载下来和大家共同学习。 首先在WM_CREATE中获取系统字符的宽度和高度 case WM_CREATE:         //获取系统字符的宽度和高度         cxChar = LOWORD(GetDialogBaseUnits()) ;         cyChar = HI

文洲的专栏 1万+

Window核心编程

Window核心编程 第一章:错误处理 FormatMessage/LocalLock\LocalFree 第二章: TEXT("..") TCHAR(CHAR,WCHAR)  安全字符串函数 (必须在包含其他所有文件之后才包含StrSafe.h) _tcscpy  _tcscpy_s _CrtSetReportMode(_CRT_ASSERT,0); //禁止可能由C运行时触发的所

零点起步 800

ScrollBar & ScrollWindow

windows创建的window是默认提供scrollbar功能的.在CreateWindow的时候就可以制定window的属性.WS_VSCROLL 和 WM_HSCROLL.另外windows提供了一些api用于操作scrollbar.主要就是这些APIEnableScrollBarThe EnableScrollBar function enables or disables one or both scroll bar arrows. GetScrollBarInfoThe GetScrollB

Johny的专栏 3336

在WTL中利用滚动窗口类CScrollWindowImpl显示BMP图片

转自:http://blog.csdn.net/zhoujielunzhimi/article/details/7963421 之前我也写了一篇用滚动窗口类显示图片的博客: http://blog.csdn.net/zhoujielunzhimi/article/details/7899735 本文与之不同,上面的这个滚动窗口具有通用性,比如滚动窗口可以装载控件,但是比较繁琐

m0_37290785的博客 501

MFC Cwnd窗口添加滚动条

void CDialog1::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) { // TODO: 在此添加消息处理程序代码和/或调用默认值 SCROLLINFO scrollinfo; GetScrollInfo(SB_HORZ,&scrollinfo,SIF_ALL); switch (nSBCode) { case SB_LEFT: //滑块滚动到最左 Sc...

sinat_29890433的博客 933

WINDOWS程序设计KEYVIEW程序,SCROLLWINDOW发送WM_PAINT消息问题,WM_KEYDOWN和WM_CHAR发送WM_PAINT问题

书上的原来的程序是这样 #include <windows.h> LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { static TCHAR szAppName[] = TEXT("KeyView1"); HWND h

qq_45992231的博客 338

探索Win32系统之窗口类(Window Classes in Win32)

 翻译说明: 以前一直没有很在意窗口类的使用,我近期在用vc做一些界面时遇到窗口类定义的概念,这次翻MSDN的时候看到了一篇文章,讲到窗口类的一些基本概念,匆匆看完,翻译出来当学习笔记,可能有一些细节上的谬误,请包涵。放在网上,如果大家觉得值得参考,就看看。 在MFC编程里,窗口类的概念接触的已经比较少了,在SDK编程的时候则至少还需要声明一个WNDCLASS(EX)类RegisterCl

vcbear的专栏 5759

windows标准控件

使用Windows标准控件 我们在前面曾提到过,控件是一些行为标准化了的窗口,一般用于对话框或其它窗口中充当与用户交互的元素。在Visual C++中,可以使用的控件分成三类: (1) Windows标准控件 Windows标准控件由Windows操作系统提供,在Windows 95中还提供了一些新增的控件。所有这些控件对象都是可编程的,我们可以使用Visual C++提供的对话框编辑...

weixin_30875157的博客 643

MFC Windows程序设计学习笔记--滚动条

这里说的是和 窗口关联的滚动条。给窗口添加滚动条,指定窗口风格为 WS_VSCROLL/WS_HSCROLL。 创建了滚动条后,还需设置 范围,位置,页大小。风格1: CWnd::SetScrollRange/GetScrollRange CWnd::SetScrollPos/GetScrollPos关于重画选项的意义: 在连续多次调用,前面重画选项关,最后一次重画选项开,可提高执行效率。风

x13262608581的博客 582

ScrollWindow折腾出来的——关于区域、重画、无效、WM_PANIT等

 =========================ScrollWindow原型========================BOOL ScrollWindow(             HWND hWnd,    int XAmount,    int YAmount,    const RECT *lpRect,    const RECT *lpClipRect);参数: xAmoun

[win程序设计(SDK)]、[win网络编程]、[……] 5226

关于ScrollWindow()和UpdateWindow()

windows程序设计第4章,加滚动条

duwei的专栏 1688

<Win32_7>由浅入深——滚动条

滚动条在Win32程序中是非常常见的一个控件,它的功能和地位也就不言而喻了,在文本输出中算是一个难点…… 我将借用P先生的思路讲述两种不同风格滚动条,下面切入主题:(实例程序都是显示一张位图 当然,位图比客户区大得多,以显示出滚动条的作用) (1)不可变长的滚动条 这是16windows中的版本,windows1.0就有了这个玩意儿 它的使用主要依托以下两个API函数: 设定滚动...

caobihole 241
上一篇: FFT蝶形算法,IFFT
下一篇: windows程序设计 11章的about3 问题 模式对话框 子窗口
tmljs1988
博客等级 码龄19年 134粉丝 107原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值