スクロールバークラス


スクロールバーコントロール

今回はスクロールバーコントロールについて説明します
これは、ウィンドウスクロールバーの応用ですので、簡単に理解できるでしょう

スクロールバーコントロールは、ウィンドウスクロールバーと異なり
ウィンドウのクライアント領域の好きな場所に、自由なサイズで配置できます

スクロールバーコントロールを作成するには CreateWindow() で
定義済みクラス SCROLLBAR を選択します
また、スタイルに垂直 SBS_VERT、または水平 SBS_HORZ
いずれかを選択し、垂直または水平スクロールバーを作成することができます

このコントロールは WM_COMMAND をポストしません
操作方法やページサイズの設定は、ウィンドウスクロールバーと同じです
つまり、SetScrollInfo() や WM_HSCROLL メッセージなどを使って処理することができます
#include <windows.h>

LRESULT CALLBACK WndProc(HWND hwnd , UINT msg , WPARAM wp , LPARAM lp) {
	static HWND scroll , label;
	static SCROLLINFO scr;
	static TCHAR strScroll[32];

	switch (msg) {
	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
	case WM_CREATE:
		scroll = CreateWindow(
			TEXT("SCROLLBAR") , TEXT("") ,
			WS_CHILD | WS_VISIBLE | SBS_HORZ ,
			0 , 0 , 200 , 20 ,
			hwnd , (HMENU)1 ,
			((LPCREATESTRUCT)(lp))->hInstance , NULL
		);
		label = CreateWindow(
			TEXT("STATIC") , TEXT("0") ,
			WS_CHILD | WS_VISIBLE | SS_LEFT ,
			0 , 20 , 50 , 20 ,
			hwnd , (HMENU)2 ,
			((LPCREATESTRUCT)(lp))->hInstance , NULL
		);

		scr.cbSize = sizeof(SCROLLINFO);
		scr.fMask = SIF_PAGE | SIF_RANGE;
		scr.nMin = 0;	scr.nMax = 100;
		scr.nPage = 10;

		SetScrollInfo(scroll , SB_CTL , &scr , TRUE);
		scr.fMask = SIF_POS;

		return 0;
	case WM_HSCROLL:
		switch(LOWORD(wp)) {
		case SB_LEFT:
			scr.nPos = scr.nMin;
			break;
		case SB_RIGHT:
			scr.nPos = scr.nMax;
			break;
		case SB_LINELEFT:
			if (scr.nPos) scr.nPos--;
			break;
		case SB_LINERIGHT:
			if (scr.nPos < scr.nMax - 9) scr.nPos++;
			break;
		case SB_PAGELEFT:
			scr.nPos -= scr.nPage;
			break;
		case SB_PAGERIGHT:
			scr.nPos += scr.nPage;
			break;
		case SB_THUMBPOSITION:
			scr.nPos = HIWORD(wp);
			break;
		}
		SetScrollInfo(scroll , SB_CTL , &scr , TRUE);
		wsprintf(strScroll , "%d" , scr.nPos);
		SetWindowText(label , strScroll);
		return 0;
	}
	return DefWindowProc(hwnd , msg , wp , lp);
}

int WINAPI WinMain(HINSTANCE hInstance , HINSTANCE hPrevInstance ,
			PSTR lpCmdLine , int nCmdShow ) {
	HWND hwnd;
	MSG msg;
	WNDCLASS winc;

	winc.style		= CS_HREDRAW | CS_VREDRAW;
	winc.lpfnWndProc	= WndProc;
	winc.cbClsExtra	= winc.cbWndExtra	= 0;
	winc.hInstance		= hInstance;
	winc.hIcon		= LoadIcon(NULL , IDI_APPLICATION);
	winc.hCursor		= LoadCursor(NULL , IDC_ARROW);
	winc.hbrBackground	= (HBRUSH)GetStockObject(WHITE_BRUSH);
	winc.lpszMenuName	= NULL;
	winc.lpszClassName	= TEXT("KITTY");

	if (!RegisterClass(&winc)) return -1;

	hwnd = CreateWindow(
			TEXT("KITTY") , TEXT("Kitty on your lap") ,
			WS_OVERLAPPEDWINDOW | WS_VISIBLE ,
			CW_USEDEFAULT , CW_USEDEFAULT ,
			CW_USEDEFAULT , CW_USEDEFAULT ,
			NULL , NULL , hInstance , NULL
	);

	if (hwnd == NULL) return -1;

	while(GetMessage(&msg , NULL , 0 , 0)) DispatchMessage(&msg);
	return msg.wParam;
}


これが、コントロールとして配置されたスクロールバーの例です
重要なことに、ウィンドウスクロールバーと処理はほとんど変わっていません

スクロールバーコントロールも、メッセージの処理や通知コードなどは
ウィンドウのスクロールバーと何ら変わっていないのです



前のページへ戻る次のページへ