#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) ;
}
卷动列 && 子窗口颜色
最新推荐文章于 2012-08-11 10:51:04 发布