滚动条已经定义好了,怎样与鼠标滚动消息关联?
谢谢~

解决方案 »

  1.   

    OnMouseWheel(UINT nFlags, short zDelta, CPoint pt) 
    { if(zDelta == 120)
    向上滚动
    if(zDelta == -120)
                     向下滚动
      

  2.   

    谢谢,可能是我没说明白,我想问怎样直接用windows API处理
    case WM_MOUSEWHEEL:
    这个消息,下面应该怎么做?怎样把鼠标滚轮消息与滚动条消息联系起来?
    呵呵~
      

  3.   

    发WM_HSCROLL或WM_VSCROLL消息,你可以指定每次滚多少。
      

  4.   

    你知道你要问什么? 是不是看了WINDOWS 程序设计这本书? 自己也试了一下,  结果在 WM_MOUSEWHEEL 处出现问题了??  那本书那个例子是95平台,现在你要加一些预处理才行~  如果是的话我就贴出来~
      

  5.   

    #define VC_EXTRALEAN// Exclude rarely-used stuff from Windows headers
    #ifndef WINVER
    #define WINVER 0x0400// 0x0400 == Windows 98 and Windows NT 4.0 (because of '_WIN32_WINDOWS=0x0410')
    #endif#ifndef _WIN32_WINNT
    #define _WIN32_WINNT 0x0400// 0x0400 == Windows NT 4.0
    #endif#ifndef _WIN32_WINDOWS
    #define _WIN32_WINDOWS 0x0410   // 0x0410 == Windows 98
    #endif#ifndef _WIN32_IE
    #define _WIN32_IE 0x0400// 0x0400 == Internet Explorer 4.0 -> Comctl32.dll v4.71
    #endif
    #define NUMLINES ((int)(sizeof(sysmetrics)/sizeof(sysmetrics[0])))
    struct
    {
    int Index;
    TCHAR * szLabel;
    TCHAR * szDesc;
    }
    sysmetrics[]=
    {
        SM_CXSCREEN,TEXT("SM_CXSCREEN"),TEXT("Screen Width in pixels"),
        SM_CYSCREEN,TEXT("SM_CYSCREEN"),TEXT("Screen height in pixels"),
        SM_CXVSCROLL,TEXT("SM_CXVSCROLL"),TEXT("Vertical scroll width"),
    SM_CYHSCROLL,TEXT("SM_CYHSCROLL"),TEXT("Horizontal scroll height"),
    SM_CYCAPTION,TEXT("SM_CYCAPTION"),TEXT("Caption bar height"),
    SM_CXBORDER,TEXT("SM_CXBORDER"),TEXT("Window Border width"),
    SM_CYBORDER,TEXT("SM_CYBORDER"),TEXT("Window Border height"),
    SM_CXFIXEDFRAME,TEXT("SM_CXFIXEDFRAME"),TEXT("Dialog window frame width"),
    SM_CYFIXEDFRAME,TEXT("SM_CYFIXEDFRAME"),TEXT("Dialog window frame height"),
    SM_CYVTHUMB,TEXT("SM_CYVTHUMB"),TEXT("Horizontal scroll thumb height"),
    SM_CXHTHUMB,TEXT("SM_CXHTHUMB"),TEXT("Horizontal scroll thumb width"),
    SM_CXICON,TEXT("SM_CXICON"),TEXT("Icon width"),
    SM_CYICON,TEXT("SM_CYICON"),TEXT("Icon height"),
    SM_CXCURSOR,TEXT("SM_CXCURSOR"),TEXT("Cursor width"),
    SM_CYCURSOR,TEXT("SM_CYCURSOR"),TEXT("Cursor height"),
            SM_CYMENU,TEXT("SM_CYMENU"),TEXT("Menu bar height"),
            SM_CXFULLSCREEN,TEXT("SM_CXFULLSCREEN"),TEXT("Full screen client area width"),
    SM_CYFULLSCREEN,TEXT("SM_CYFULLSCREEN"),TEXT("Full screen client area height"),
            SM_CYKANJIWINDOW,TEXT("SM_CYKANJIWINDOW"),TEXT("Kanji window height"),
    SM_MOUSEPRESENT,TEXT("SM_MOUSEPRESENT"),TEXT("Mouse present flag"),
    SM_CYVSCROLL,TEXT("SM_CYVSCROLL"),TEXT("Vertical scroll arrow height"),
    SM_CXHSCROLL,TEXT("SM_CXHSCROLL"),TEXT("Horizontal scroll arrow width"),
    SM_DEBUG,TEXT("SM_DEBUG"),TEXT("Debug version flag"),
    SM_SWAPBUTTON,TEXT("SM_SWAPBUTTON"),TEXT("Mouse buttons swapped flag"),
    SM_CXMIN,TEXT("SM_CXMIN"),TEXT("Minimum window width"),
    SM_CYMIN,TEXT("SM_CYMIN"),TEXT("Minimum window height"),
            SM_CXSIZE,TEXT("SM_CXSIZE"),TEXT("Min/Max/Close button width"),
            SM_CYSIZE,TEXT("SM_CYSIZE"),TEXT("Min/Max/Close button height"),
            SM_CXSIZEFRAME,TEXT("SM_CXSIZEFRAME"),TEXT("window sizing frame width"),
    SM_CYSIZEFRAME,TEXT("SM_CYSIZEFRAME"),TEXT("window sizint frame height"),
    SM_CXMINTRACK,TEXT ("SM_CXMINTRACK"),TEXT ("Minimum window tracking width"),
        SM_CYMINTRACK,TEXT ("SM_CYMINTRACK"),TEXT ("Minimum window tracking height"),
        SM_CXDOUBLECLK,  TEXT ("SM_CXDOUBLECLK"),           
             TEXT ("Double click x tolerance"),
        SM_CYDOUBLECLK,  TEXT ("SM_CYDOUBLECLK"),           
             TEXT ("Double click y tolerance"),
        SM_CXICONSPACING,TEXT ("SM_CXICONSPACING"),         
             TEXT ("Horizontal icon spacing"),
        SM_CYICONSPACING,TEXT ("SM_CYICONSPACING"),         
             TEXT ("Vertical icon spacing"),
    SM_MENUDROPALIGNMENT, TEXT ("SM_MENUDROPALIGNMENT"),     
                    TEXT ("Left or right menu drop"),
    SM_PENWINDOWS,         TEXT ("SM_PENWINDOWS"),            
                    TEXT ("Pen extensions installed"),
    SM_DBCSENABLED,         TEXT ("SM_DBCSENABLED"),           
                    TEXT ("Double-Byte Char Set enabled"),
    SM_CMOUSEBUTTONS,     TEXT ("SM_CMOUSEBUTTONS"),         
                    TEXT ("Number of mouse buttons"),
    SM_SECURE,              TEXT ("SM_SECURE"),                
                    TEXT ("Security present flag"),
    SM_CXEDGE,             TEXT ("SM_CXEDGE"),                
                    TEXT ("3-D border width"),
    SM_CYEDGE,             TEXT ("SM_CYEDGE"),                
                    TEXT ("3-D border height"),
    SM_CXMINSPACING,      TEXT ("SM_CXMINSPACING"),          
                    TEXT ("Minimized window spacing width"),
    SM_CYMINSPACING,     TEXT ("SM_CYMINSPACING"),          
                    TEXT ("Minimized window spacing height"),
    SM_CXSMICON,         TEXT ("SM_CXSMICON"),              
                    TEXT ("Small icon width"),
    SM_CYSMICON,         TEXT ("SM_CYSMICON"),              
                    TEXT ("Small icon height"),
    SM_CYSMCAPTION,         TEXT ("SM_CYSMCAPTION"),           
                    TEXT ("Small caption height"),
    SM_CXSMSIZE,         TEXT ("SM_CXSMSIZE"),              
                    TEXT ("Small caption button width"),
    SM_CYSMSIZE,         TEXT ("SM_CYSMSIZE"),              
                    TEXT ("Small caption button height"),
    SM_CXMENUSIZE,         TEXT ("SM_CXMENUSIZE"),            
                    TEXT ("Menu bar button width"),
    SM_CYMENUSIZE,         TEXT ("SM_CYMENUSIZE"),            
                    TEXT ("Menu bar button height"),
    SM_ARRANGE,             TEXT ("SM_ARRANGE"),               
                    TEXT ("How minimized windows arranged"),
    SM_CXMINIMIZED,         TEXT ("SM_CXMINIMIZED"),           
                    TEXT ("Minimized window width"),
    SM_CYMINIMIZED,         TEXT ("SM_CYMINIMIZED"),           
                    TEXT ("Minimized window height"),
    SM_CXMAXTRACK,         TEXT ("SM_CXMAXTRACK"),            
                    TEXT ("Maximum draggable width"),
    SM_CYMAXTRACK,         TEXT ("SM_CYMAXTRACK"),            
                    TEXT ("Maximum draggable height"),
    SM_CXMAXIMIZED,         TEXT ("SM_CXMAXIMIZED"),           
                    TEXT ("Width of maximized window"),
    SM_CYMAXIMIZED,         TEXT ("SM_CYMAXIMIZED"),           
                    TEXT ("Height of maximized window"),
    SM_NETWORK,          TEXT ("SM_NETWORK"),               
                    TEXT ("Network present flag"),
    SM_CLEANBOOT,        TEXT ("SM_CLEANBOOT"),             
                    TEXT ("How system was booted"),
    SM_CXDRAG,             TEXT ("SM_CXDRAG"),                
                    TEXT ("Avoid drag x tolerance"),
    SM_CYDRAG,             TEXT ("SM_CYDRAG"),                
                    TEXT ("Avoid drag y tolerance"),
    SM_SHOWSOUNDS,          TEXT ("SM_SHOWSOUNDS"),            
                    TEXT ("Present sounds visually"),
    SM_CXMENUCHECK,         TEXT ("SM_CXMENUCHECK"),           
                    TEXT ("Menu check- width"),
    SM_CYMENUCHECK,         TEXT ("SM_CYMENUCHECK"),           
                        TEXT ("Menu check- height"),
    SM_SLOWMACHINE,         TEXT ("SM_SLOWMACHINE"),           
                    TEXT ("Slow processor flag"),
    SM_MIDEASTENABLED,     TEXT ("SM_MIDEASTENABLED"),TEXT ("Hebrew and Arabic enabled flag"),
    SM_MOUSEWHEELPRESENT,TEXT ("SM_MOUSEWHEELPRESENT"),TEXT ("Mouse wheel present flag"),
    SM_XVIRTUALSCREEN,TEXT ("SM_XVIRTUALSCREEN"),TEXT ("Virtual screen x origin"),
    SM_YVIRTUALSCREEN,TEXT ("SM_YVIRTUALSCREEN"),TEXT ("Virtual screen y origin"),
    SM_CXVIRTUALSCREEN,     TEXT ("SM_CXVIRTUALSCREEN"),       
                    TEXT ("Virtual screen width"),
    SM_CYVIRTUALSCREEN,     TEXT ("SM_CYVIRTUALSCREEN"),       
                    TEXT ("Virtual screen height"),
    SM_CMONITORS,         TEXT ("SM_CMONITORS"),             
                    TEXT ("Number of monitors"),
    SM_SAMEDISPLAYFORMAT, TEXT ("SM_SAMEDISPLAYFORMAT"),     
                    TEXT ("Same color format flag")
    } ;
      

  6.   

    下面是 SYSMETS4.C 文件
    上面的是 sysmets.h

    #include <windows.h>
    #include "sysmets.h"
    LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
    int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                         PSTR szCmdLine, int iCmdShow)
    {
          static TCHAR  szAppName[] = TEXT ("SysMets") ;
          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 ("Program requires Windows NT!"), 
                           szAppName, MB_ICONERROR) ;
               return 0 ;
          }
         
    hwnd = CreateWindow ( szAppName, TEXT ("Get System Metrics"),
                               WS_OVERLAPPEDWINDOW | WS_VSCROLL | WS_HSCROLL,
                                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  int cxChar, cxCaps, cyChar, cxClient, cyClient, iMaxWidth ;
    HDC hdc;
    TEXTMETRIC tm;
    static  int iDeltaPerLine, iAccumDelta ; 
    ULONG   ulScrollLines ; 
    PAINTSTRUCT  ps ;
        SCROLLINFO   si ;
        TCHAR   szBuffer[10] ;
    int         i, x, y, iVertPos, iHorzPos, iPaintBeg, iPaintEnd ;
    switch (message)
    {
    case WM_CREATE:
    hdc=GetDC(hwnd);
    GetTextMetrics(hdc,&tm); cxChar=tm.tmAveCharWidth ;
    cyChar=tm.tmExternalLeading +tm.tmHeight ; cxCaps=(tm.tmPitchAndFamily & 1 ? 3 : 2) * cxChar / 2 ; ReleaseDC(hwnd,hdc); iMaxWidth = 40 * cxChar + 22 * cxCaps ;
    return 0;case  WM_SETTINGCHANGE:
    return 0;
      

  7.   

    谢谢surstar帮我贴出来……我们用的是《Windows 下的C/C++高级编程》这本书,上面的程序可以在NT下运行。有个程序已经把滚动条做出来了但是不能响应鼠标滚轮消息,老师让我们添加……具体程序如下:
    LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    static int cxChar,cyChar; // 用于记录字符的宽度和高度
    static int cyClient; // 用于记录窗口用户区的高度
    static int nVScrollPos; // 用于记录滚动块当前的位置
    static int cLineNumber; // 用于记录源文件总行数
    int nCurrentLineNumber; // 用于记录当前所在行数
    TCHAR szBuff[256]; // 用于存放读入的字符
    HDC hdc; // 显示设备句柄
    PAINTSTRUCT ps; // 绘图信息结构体
    TEXTMETRIC tm; // 字符信息结构体
    FILE *fp; // 文件指针,用于打开、读写、关闭文件等操作 switch( message )
    {
    case WM_CREATE:
    // 获得设备句柄
    hdc = GetDC( hwnd ); // 获得字符信息,并确定字符宽度和字符高度
    GetTextMetrics( hdc, &tm );
    cxChar = tm.tmAveCharWidth;
    cyChar = tm.tmHeight + tm.tmExternalLeading; // 释放设备句柄
    ReleaseDC( hwnd, hdc ); /******* 获得源文件DisplayWithScrollBar.c的总行数 *******/
    cLineNumber = 0;
    // 以只读方式打开源文件DisplayWithScrollBar.c
    if( (fp=fopen("DisplayWithScrollBar.cpp", "r")) != NULL )
    {
    while( !feof(fp) )
    {
    char ch;
    // 一次读入一个字符,直到一行的结尾
    while( (ch=fgetc(fp)) != '\n' && ch != EOF )
    ;
    cLineNumber++;
    }
    // 关闭打开的文件
    fclose(fp);
    }
    /*******************************************************/ // 设置垂直滚动条的范围
    SetScrollRange( hwnd, SB_VERT, 0, cLineNumber-1, FALSE );
    // 设置垂直滚动条的初始位置
    SetScrollPos( hwnd, SB_VERT, 0, TRUE );
    return 0; case WM_SIZE:
    // 设置窗口用户区的高度
    cyClient = HIWORD(lParam);
    return 0;
    case WM_VSCROLL:
    switch( LOWORD(wParam) )
    {
    case SB_LINEUP: // 向上一行
    nVScrollPos-= 1;
    break;
    case SB_LINEDOWN: // 向下一行
    nVScrollPos += 1;
    break;
    case SB_PAGEUP: // 向上一屏
    nVScrollPos-= cyClient / cyChar;
    break;
    case SB_PAGEDOWN: // 向下一屏
    nVScrollPos += cyClient / cyChar;
    break;
    case SB_THUMBTRACK: //muhahahahaha~~~
    nVScrollPos = HIWORD(wParam);
    break;
    case SB_THUMBPOSITION: // 停止拖动滚动块
    nVScrollPos = HIWORD(wParam);
    break;
    default:
    break;
    } // 设置当前滚动块位置,min及max函数用于确保该位置在滚动条范围以内
    nVScrollPos = min( cLineNumber-1, max(nVScrollPos,0) ); // 如果滚动块位置改变,则重新设置滚动块,并重绘
    if( nVScrollPos != GetScrollPos(hwnd, SB_VERT) )
    {
    SetScrollPos( hwnd, SB_VERT, nVScrollPos, TRUE );
    InvalidateRect( hwnd, NULL, TRUE );
    }
    return 0; case WM_PAINT:
    hdc = BeginPaint( hwnd, &ps ); // 以只读方式打开源文件DisplayWithScrollBar.c
    if( (fp=fopen("DisplayWithScrollBar.cpp", "r")) != NULL )
    {
    for(nCurrentLineNumber=0;nCurrentLineNumber<cLineNumber; nCurrentLineNumber++ )
    {
    int j=0,k;
    char ch; // 从文件中读取字符,一次一个,直到一行结束或文件结束
    while( (ch=fgetc(fp)) != '\n' && ch != EOF )
    if( ch == '\t' ) // 以4个空格代替一个制表符
    for( k=0; k<4; k++ )
    szBuff[j++] = ' ';
    else
    szBuff[j++] = ch; TextOut( hdc, cxChar, cyChar*( nCurrentLineNumber-nVScrollPos), szBuff, j);
    }
    } EndPaint( hwnd, &ps );
    return 0; case WM_DESTROY:
    PostQuitMessage( 0 );
    return 0;
    }
    return DefWindowProc( hwnd, message, wParam, lParam );
    }
    谢谢大虾们指点,小妹感激不尽~