卷动列 && 子窗口颜色

#include <windows.h>

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

int     idFocus ;
WNDPROC OldScroll[3] ;

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                    PSTR szCmdLine, int iCmdShow)
{
	static TCHAR szAppName[] = TEXT ("Colors1") ;
	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 = CreateSolidBrush (0) ;
	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, TEXT ("Color Scroll"),
		WS_OVERLAPPEDWINDOW,
		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 HWND		hwndScroll[3],hwndLabel[3],hwndValue[3],hwndRect;
	HINSTANCE		hInstance;
	static TCHAR	*szColorLable[3] = {TEXT("RED"),TEXT("GREEN"),TEXT("Blue")};
	int				i,cxClient,cyClient;
	static	int		cyChar,color[3] = {0};
	static COLORREF crPrim[3] = {RGB(255,0,0),RGB(0,25,0),RGB(0,0,255)};
	static HBRUSH	hBrush[3],hBrushStatic;
	static RECT     rcColor ;
	TCHAR			Buffer[50];
	switch (message)
	{
	case WM_CREATE:
		{
			hInstance = (HINSTANCE) GetWindowLong (hwnd, GWL_HINSTANCE) ;
			hwndRect = CreateWindow("static",NULL,WS_CHILD | WS_VISIBLE
				| SS_WHITERECT,0,0,0,0,hwnd,(HMENU) 9 ,hInstance,NULL) ;
			for(i = 0 ; i < 3 ; i++)
			{
				hwndScroll[i] = CreateWindow(TEXT("ScrollBar"),NULL,
					WS_TABSTOP | SBS_VERT |WS_CHILD | WS_VISIBLE,0,0,0,0,
					hwnd,(HMENU) i,hInstance,NULL);
				SetScrollRange(hwndScroll[i],SB_CTL,0,255,FALSE);
				SetScrollPos(hwndScroll[i],SB_CTL,0,FALSE) ;

				hwndLabel[i] = CreateWindow("static",szColorLable[i],
					WS_CHILD | WS_VISIBLE | SS_CENTER,
					0,0,0,0,hwnd,(HMENU) (i + 3),hInstance,NULL) ;

				hwndValue[i] = CreateWindow("static","0",WS_CHILD | 
						WS_VISIBLE | SS_CENTER,
						0,0,0,0,hwnd,(HMENU) (i +6),hInstance,NULL) ;

				OldScroll[i] = (WNDPROC) SetWindowLong (hwndScroll[i], 
                                             GWL_WNDPROC, (LONG) ScrollProc) ;
				hBrush[i] = CreateSolidBrush(crPrim[i]) ;
			}
			hBrushStatic = CreateSolidBrush(GetSysColor(COLOR_BTNHILIGHT)) ;
			cyChar = HIWORD(GetDialogBaseUnits()) ;
			return 0 ;
		}

	case  WM_SIZE:
		{
			cxClient = LOWORD (lParam) ;
			cyClient = HIWORD (lParam) ;
			
			SetRect (&rcColor, cxClient / 2, 0, cxClient, cyClient) ;
			
			MoveWindow (hwndRect, 0, 0, cxClient / 2, cyClient, TRUE) ;
			
			for (i = 0 ; i < 3 ; i++)
			{
				MoveWindow (hwndScroll[i],
					(2 * i + 1) * cxClient / 14, 2 * cyChar,
					cxClient / 14, cyClient - 4 * cyChar, TRUE) ;
				
				MoveWindow (hwndLabel[i],
					(4 * i + 1) * cxClient / 28, cyChar / 2,
					cxClient / 7, cyChar, TRUE) ;
				
				MoveWindow (hwndValue[i],
					(4 * i + 1) * cxClient / 28, 
					cyClient - 3 * cyChar / 2,
					cxClient / 7, cyChar, TRUE) ;
			}
			SetFocus (hwnd) ;   //引发 WM_SETFOCUS消息
          return 0 ;
		}

	case WM_VSCROLL:
		{
			i = GetWindowLong((HWND)lParam,GWL_ID);
			switch (LOWORD(wParam))
			{
			case SB_LINEDOWN:
				{
					color[i] = min(255,color[i] + 1);
					break;
				}
			case SB_PAGEDOWN:
				{
					color[i] += min(255,color[i] + 15);
					break;
				}
			case SB_LINEUP:
				{
					color[i] =max(0,color[i] - 1);
					break;
				}
			case SB_PAGEUP:
				{
					color[i] += max(0,color[i] - 15);
					break;
				}
			case SB_TOP:
				{
					color[i] = 0;
					break;
				}
			case  SB_BOTTOM:
				{
					color[i] = 255;
					break;
				}
			case SB_THUMBPOSITION:
			case SB_THUMBTRACK:
				{
					color[i] =HIWORD(wParam);
					break;
				}
			default:
					break;
			}
			color[i] = max(0,min(255,color[i]));
			SetScrollPos(hwndScroll[i],SB_CTL,color[i],TRUE);
			wsprintf(Buffer,"%i",color[i]);
			SetWindowText(hwndValue[i],Buffer);
			
			DeleteObject ((HBRUSH) SetClassLong (hwnd, GCL_HBRBACKGROUND, (LONG) 
                    CreateSolidBrush (RGB (color[0], color[1], color[2])))) ;   //??

			InvalidateRect(hwnd,&rcColor,TRUE);
			return 0;
		}

	case WM_SETFOCUS :
		{
			SetFocus (hwndScroll[idFocus]) ;
			return 0 ;
		}
	case WM_CTLCOLORSCROLLBAR ://The WM_CTLCOLORSCROLLBAR message is sent
								//to the parent window of a scroll bar control
								//when the control is about to be drawn.
		{
			i = GetWindowLong ((HWND) lParam, GWL_ID) ;
			return (LRESULT) hBrush[i] ;
		}

	case WM_SYSCOLORCHANGE :
		{
			DeleteObject (hBrushStatic) ;
			hBrushStatic = CreateSolidBrush (GetSysColor (COLOR_BTNHIGHLIGHT)) ;
			return 0 ;
		}

	case WM_CTLCOLORSTATIC :  //A static control 
		{				//sends the WM_CTLCOLORSTATIC message
							//to its parent window when the control
							//is about to be drawn     
			i = GetWindowLong ((HWND) lParam, GWL_ID) ;
		
			if (i >= 3 && i <= 8)    // static text controls
			{
				SetTextColor ((HDC) wParam, crPrim[i % 3]) ;
				SetBkColor ((HDC) wParam, GetSysColor (COLOR_BTNHIGHLIGHT));
				return (LRESULT) hBrushStatic ;
			}
			  return 0 ;
		}
	case WM_DESTROY :
		{
			DeleteObject ((HBRUSH)
			SetClassLong (hwnd, GCL_HBRBACKGROUND, (LONG) 
			GetStockObject (WHITE_BRUSH))) ;
			for (i = 0 ; i < 3 ; i++)
			DeleteObject (hBrush[i]) ;
			DeleteObject (hBrushStatic) ;
			PostQuitMessage (0) ;
			return 0 ;
		}
	}
	DefWindowProc(hwnd,message,wParam,lParam);
}

LRESULT CALLBACK ScrollProc (HWND hwnd, UINT message, 
                             WPARAM wParam, LPARAM lParam)    //很重要。!!!
{
	int id = GetWindowLong (hwnd, GWL_ID) ;
	
	switch (message)
	{
	case WM_KEYDOWN :
		if (wParam == VK_TAB)
			SetFocus (GetDlgItem (GetParent (hwnd), 
			(id + (GetKeyState (VK_SHIFT) < 0 ? 2 : 1)) % 3)) ;
		break ;
		
	case WM_SETFOCUS :
		idFocus = id ;
		break ;
	}
	return CallWindowProc (OldScroll[id], hwnd, message, wParam, lParam) ;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值