戻る 第15章 コントロールの使用
(スクロールバー)
次へ

ソース 実行ファイル
sdk15.cpp sdk15.exe

今回はスクロールバーです。
Windowの端っこによくついてるあれです。
主な用途は表示しきれない領域を出すための画面移動の役割ですね。
これ以外にもスクロールバーは自由な場所におくことが出来ます。
数字の範囲の選択にも使えます。
リストボックスやコンボボックスにも項目が多くなると出てきますね。
種類の多い範囲から選択するときに便利です。



#include <windows.h>
#define	SCR_MAX	255
#define	SCR_MIN	0
HWND	scr;//スクロールバー用
LRESULT CALLBACK WinProc(HWND hwnd, UINT msg,WPARAM wP, LPARAM lP)
{
	char str[40];
	HDC	hdc;
	static SCROLLINFO si;//スクロールバー情報
	static int dx;
	switch(msg){
		case WM_CREATE:
			scr=CreateWindowEx(0, 
					"SCROLLBAR",//スクロールバークラスを指定
					"",
					WS_CHILD,
					16, 8,160, 24,
					hwnd,
					NULL,
					(HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE),
					NULL);
			ShowWindow(scr,SW_SHOW);
			//注:↓絶対設定しておくこと!
			si.cbSize=sizeof(SCROLLINFO);
			si.fMask=SIF_ALL;
			si.nMin=0;si.nMax=255;//最大値&最小値入力
			SetScrollInfo(scr, SB_CTL, &si, TRUE);
			break;
		case WM_HSCROLL://水平スクロールバーメッセージ
			switch (LOWORD(wP)) {
                case SB_LINELEFT://スクロールバー左ボタン
					if(lP==(int)scr){
						if(si.nPos<=SCR_MIN)si.nPos=SCR_MIN;
						else dx=-1;
					}
                    break;
                case SB_LINERIGHT://スクロールバー右ボタン
                    if(lP==(int)scr){
						if(si.nPos>=SCR_MAX)si.nPos=SCR_MAX;
						else dx=1;
					}
                    break;
                case SB_PAGELEFT://左ページ移動
                    if(lP==(int)scr){
						if(si.nPos-10<=SCR_MIN)si.nPos=SCR_MIN;
						else dx=-10;
					}
                    break;
                case SB_PAGERIGHT://右ページ移動
                    if(lP==(int)scr){
						if(si.nPos+10>=SCR_MAX)si.nPos=SCR_MAX;
						else dx=10;
					}
                    break;
                case SB_THUMBTRACK://領域指定移動
                    if(lP==(int)scr){dx = HIWORD(wP) - si.nPos;}
                    break;
                default:
                    dx =0;
                    break;
            }
			si.nPos += dx;
			SetScrollInfo(scr, SB_CTL, &si, TRUE);
			SetScrollPos(hwnd, SB_CTL	, dx, TRUE);
			UpdateWindow(scr);
			wsprintf(str,"%03d",si.nPos);
			SetWindowText(hwnd,str);
			break;
		case WM_DESTROY:
			PostQuitMessage(0);
			break;
		default:
		return DefWindowProc(hwnd, msg, wP, lP);
	}
	return 0;
}