回 帖 发 新 帖 刷新版面

主题:[原创]分享滚动条的使用

//ScrollBar.c

#include <windows.h>
#include<tchar.h>
#include "resource.h"

#define UNICODE



BOOL CALLBACK DlgProc(HWND,UINT,WPARAM,LPARAM);


int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{    
    DialogBoxParam(hInstance,MAKEINTRESOURCE(IDD_DIALOG1),NULL,DlgProc,(LPARAM)NULL);
    return 0;
}


BOOL CALLBACK DlgProc(HWND hDlg,UINT message,WPARAM wParam,LPARAM lParam)
{
    SCROLLINFO    si;
    int    nMin,nMax,nPos;
    switch(message)
    {
    case WM_HSCROLL:
        si.cbSize = sizeof(si);
        si.fMask = SIF_ALL;
        GetScrollInfo(GetDlgItem(hDlg,IDC_SRBAR1),SB_CTL,&si);
        switch(LOWORD(wParam))
        {
        case SB_LEFT:
            si.nPos = si.nMin;
            break;
        case SB_LINELEFT:            
            si.nPos--;        
            break;
        case SB_PAGELEFT:
            si.nPos -= si.nPage;
            break;
        case SB_THUMBTRACK:
            si.nPos = si.nTrackPos;
            break;
        case SB_PAGERIGHT:
            si.nPos += si.nPage;
            break;
        case SB_LINERIGHT:            
            si.nPos++;
            break;
        case SB_RIGHT:
            si.nPos = si.nMax;
            break;
        }
        SetScrollInfo(GetDlgItem(hDlg,IDC_SRBAR1),SB_CTL,&si,TRUE);
        GetScrollInfo(GetDlgItem(hDlg,IDC_SRBAR1),SB_CTL,&si);
        if(si.nPos == si.nMin) SendDlgItemMessage(hDlg,IDC_SRBAR1,SBM_ENABLE_ARROWS,ESB_DISABLE_LTUP,0);
        if(si.nPos == si.nMax) SendDlgItemMessage(hDlg,IDC_SRBAR1,SBM_ENABLE_ARROWS,ESB_DISABLE_RTDN,0);
        SetDlgItemInt(hDlg,IDC_SRBARPOS1,si.nPos,FALSE);
        return TRUE;
    case WM_VSCROLL:
        nPos = SendDlgItemMessage(hDlg,IDC_SRBAR2,SBM_GETPOS,0,0);
        SendDlgItemMessage(hDlg,IDC_SRBAR2,SBM_GETRANGE,(WPARAM)&nMin,(LPARAM)&nMax);
        switch(LOWORD(wParam))
        {
        case SB_TOP:
            nPos = nMin;
            break;
        case SB_LINEUP:            
            nPos--;        
            break;
        case SB_PAGEUP:
            nPos -= 100;
            break;
        case SB_THUMBTRACK:
            nPos = HIWORD(wParam);
            break;
        case SB_PAGEDOWN:
            nPos += 100;
            break;
        case SB_LINEDOWN:            
            nPos++;
            break;
        case SB_BOTTOM:
            nPos = nMax;
            break;
        }
        nPos = min(nPos,nMax);
        nPos = max(nPos,nMin);
        SendDlgItemMessage(hDlg,IDC_SRBAR2,SBM_SETPOS,nPos,TRUE);
        if(nPos == nMin) SendDlgItemMessage(hDlg,IDC_SRBAR2,SBM_ENABLE_ARROWS,ESB_DISABLE_LTUP,0);
        if(nPos == nMax) SendDlgItemMessage(hDlg,IDC_SRBAR2,SBM_ENABLE_ARROWS,ESB_DISABLE_RTDN,0);
        SetDlgItemInt(hDlg,IDC_SRBARPOS2,nPos,FALSE);
        return TRUE;
    case WM_CTLCOLORSCROLLBAR:
        if((HWND)lParam == GetDlgItem(hDlg,IDC_SRBAR1))
            return (BOOL)CreateSolidBrush(RGB(80,80,0));
        else
            return (BOOL)CreateSolidBrush(RGB(0,80,80));
    case WM_INITDIALOG:
        si.cbSize = sizeof(si);
        si.fMask = SIF_ALL;
        si.nPage = 100;
        si.nMin = 1;
        si.nMax = 10000;
        si.nPos = 1;
        SetScrollInfo(GetDlgItem(hDlg,IDC_SRBAR1),SB_CTL,&si,TRUE);    
        SendDlgItemMessage(hDlg,IDC_SRBAR1,SBM_ENABLE_ARROWS,ESB_DISABLE_LTUP,0);
        SetDlgItemInt(hDlg,IDC_SRBARPOS1,1,FALSE);
        SendDlgItemMessage(hDlg,IDC_SRBAR2,SBM_SETRANGE,1,10000);
        SendDlgItemMessage(hDlg,IDC_SRBAR2,SBM_ENABLE_ARROWS,ESB_DISABLE_LTUP,0);
        SetDlgItemInt(hDlg,IDC_SRBARPOS2,1,FALSE);
        return TRUE;
    case WM_CLOSE:        
        EndDialog(hDlg,TRUE);
        return TRUE;
    }
    return FALSE;
}


//resource.h

//{{NO_DEPENDENCIES}}
// Microsoft Developer Studio generated include file.
// Used by Script1.rc
//
#define IDD_DIALOG1                     101
#define IDC_SRBAR1                      1001
#define IDC_SRBAR2                      1002
#define IDC_SRBARPOS1                   1003
#define IDC_SRBARPOS2                   1004

// Next default values for new objects
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE        102
#define _APS_NEXT_COMMAND_VALUE         40001
#define _APS_NEXT_CONTROL_VALUE         1004
#define _APS_NEXT_SYMED_VALUE           101
#endif
#endif

//ScrollBar.rc

//Microsoft Developer Studio generated resource script.
//
#include "resource.h"

#define APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 2 resource.
//
#include "afxres.h"

/////////////////////////////////////////////////////////////////////////////
#undef APSTUDIO_READONLY_SYMBOLS

/////////////////////////////////////////////////////////////////////////////
// Chinese (P.R.C.) resources

#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS)
#ifdef _WIN32
LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED
#pragma code_page(936)
#endif //_WIN32

/////////////////////////////////////////////////////////////////////////////
//
// Dialog
//

IDD_DIALOG1 DIALOG DISCARDABLE  50, 50, 252, 155
STYLE DS_MODALFRAME | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Dialog"
FONT 10, "System"
BEGIN
    SCROLLBAR       IDC_SRBAR1,40,70,100,10,WS_TABSTOP
    RTEXT           "",IDC_SRBARPOS1,40,83,40,12,SS_CENTERIMAGE | WS_BORDER
    SCROLLBAR       IDC_SRBAR2,179,25,10,100,SBS_VERT | WS_TABSTOP
    RTEXT           "",IDC_SRBARPOS2,191,25,40,12,SS_CENTERIMAGE | WS_BORDER
END


/////////////////////////////////////////////////////////////////////////////
//
// DESIGNINFO
//

#ifdef APSTUDIO_INVOKED
GUIDELINES DESIGNINFO DISCARDABLE
BEGIN
    IDD_DIALOG1, DIALOG
    BEGIN
        LEFTMARGIN, 7
        RIGHTMARGIN, 245
        TOPMARGIN, 7
        BOTTOMMARGIN, 148
    END
END
#endif    // APSTUDIO_INVOKED


#ifdef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// TEXTINCLUDE
//

1 TEXTINCLUDE DISCARDABLE
BEGIN
    "resource.h\0"
END

2 TEXTINCLUDE DISCARDABLE
BEGIN
    "#include ""afxres.h""\r\n"
    "\0"
END

3 TEXTINCLUDE DISCARDABLE
BEGIN
    "\r\n"
    "\0"
END

#endif    // APSTUDIO_INVOKED

#endif    // Chinese (P.R.C.) resources
/////////////////////////////////////////////////////////////////////////////



#ifndef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 3 resource.
//


/////////////////////////////////////////////////////////////////////////////
#endif    // not APSTUDIO_INVOKED



回复列表 (共1个回复)

沙发

BOOL CALLBACK DlgProc(HWND,UINT,WPARAM,LPARAM);


int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{    
    DialogBoxParam(hInstance,MAKEINTRESOURCE(IDD_DIALOG1),NULL,DlgProc,(LPARAM)NULL);
    return 0;
}


这一部分不用象这样定义的吗?



    

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

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
        
                   PSTR szCmdLine, int iCmdShow)
        
{
        
    static TCHAR szAppName[] = TEXT ("HelloWin") ;
        
    HWND   hwnd ;
        
    MSG    msg ;
        
    WNDCLASS wndclass ;
        
    
   wndclass.style = CS_HREDRAW | CS_VREDRAW |CS_NOCLOSE;
        
   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,      // window class name
        
                   TEXT ("The Hello Program"),   // window caption
        
                   WS_OVERLAPPEDWINDOW,  // window style
        
                   CW_USEDEFAULT,// initial x position
        
                   CW_USEDEFAULT,// initial y position
        
                   CW_USEDEFAULT,// initial x size
        
                   CW_USEDEFAULT,// initial y size
        
                   NULL,                 // parent window handle
        
               NULL,            // window menu handle
        
               hInstance,   // program instance handle
        
               NULL) ;      // creation parameters
        
   
        
    ShowWindow (hwnd, iCmdShow) ;
        
    UpdateWindow (hwnd) ;
        
   
        
    while (GetMessage (&msg, NULL, 0, 0))
        
    {
        
            TranslateMessage (&msg) ;
        
          DispatchMessage (&msg) ;
        
    }
        
    return msg.wParam ;
        
}

为什么可以省这么多的呢???

我来回复

您尚未登录,请登录后再回复。点此登录或注册