使用SCROLLINFO结构和SetScrollInfo()

时间:2013-11-27 13:33:38

标签: winapi scrollbar

我仍然是Win32 API的新手。我主要是一名C ++程序员。

我正在尝试通过使用SetScrollInfo和nPage使我的滚动条拇指与页面大小成比例。 我的理解是,这是更好的方法之一。

这是我到目前为止所做的:

typedef struct tagSCROLLINFO 
{
    UINT cbSize;
    UINT fMask;
    int  nMin;
    int  nMax;
    UINT nPage;
    int  nPos;
    int  nTrackPos;
} SCROLLINFO, *LPCSCROLLINFO; // I don't have an understanding of what these 
                              // following variables(?) are: "SCROLLINFO", "*LPCSROLLINFO"

SCROLLINFO mainVertScroll;
mainVertScroll.cbSize    = 0;
mainVertScroll.fMask     = SIF_ALL;
mainVertScroll.nMin      = 0;
mainVertScroll.nMax      = 0;
mainVertScroll.nPage     = 0;
mainVertScroll.nPos      = 0;
mainVertScroll.nTrackPos = 0;

// ...

::SetScrollInfo(ghMainWnd, SB_VERT, ? , true);

我要将什么指针包含到SetScrollInfo中以将其指向我在mainVertScroll中声明的滚动条参数?

代码提取

// bitmapDraw.cpp

#include <Windows.h>
#include <string>
#include <vector>

#include "resource.h"

//=======================================================
// Globals

HINSTANCE ghAppInst = 0;
HWND      ghMainWnd = 0;

HBITMAP   ghBitMap  = 0;

// Step 1: Define and implement main window procedure
LRESULT CALLBACK
WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
// Objects for paint
HDC hdc   = 0;
HDC bmHDC = 0;
PAINTSTRUCT ps;

typedef struct tagSCROLLINFO 
{
    UINT cbSize;
    UINT fMask;
    int  nMin;
    int  nMax;
    UINT nPage;
    int  nPos;
    int  nTrackPos;
} SCROLLINFO, *LPCSCROLLINFO;

SCROLLINFO mainVert;
mainVert.cbSize    = 0;
mainVert.fMask     = SIF_ALL;
mainVert.nMin      = 0;
mainVert.nMax      = 0;
mainVert.nPage     = 0;
mainVert.nPos      = 0;
mainVert.nTrackPos = 0;

BITMAP bitmap = {0};

static int bmWidth  = 0;
static int bmHeight = 0;

HBITMAP oldBM = 0;

switch(msg)
{
case WM_CREATE:
    ghBitMap = (HBITMAP)LoadImage(ghAppInst, "childrenRunning.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);

    GetObject(ghBitMap, sizeof(BITMAP), &bitmap);

    bmWidth  = bitmap.bmWidth;
    bmHeight = bitmap.bmHeight;

    ::SetScrollInfo(ghMainWnd, SB_VERT, &mainVert, true);

    return 0;

1 个答案:

答案 0 :(得分:2)

只需

::SetScrollInfo(ghMainWnd, SB_VERT, &mainVertScroll, true);

并且不要忘记设置实际的cbSize

mainVertScroll.cbSize = sizeof( SCROLLINFO );

关于

  

我不了解以下变量(?)是什么:“SCROLLINFO”,“* LPCSROLLINFO”

如果要在C中创建SCROLLINFO的实例,则需要编写

struct SCROLLINFO info;

因此,typedef结构被认为是一种很好的做法,因此您可以创建没有struct关键字的对象。

所以

typedef struct tagSCROLLINFO 
{
    ...
} SCROLLINFO, *LPCSCROLLINFO;

与:

相同
struct tagSCROLLINFO { ... };
typedef struct tagSCROLLINFO  SCROLLINFO;
typedef struct tagSCROLLINFO* LPCSCROLLINFO;