请输入您要查询的百科知识:

 

词条 COLORS1程式
释义

为了解卷动列和静态子视窗的一些用法-也为了深入了解颜色-我们将使用COLORS1程式,如程式9-3所示。COLORS1在显示区域的左半部显示三种卷动列,并分别标以「Red」、「 Green」和「Blue」。当您挪动卷动列时,显示区域的右半部将变为三种原色混合而成的合成色,三种原色的数值显示在三个卷动列的下面。

程式9-3 COLORS1

COLORS1.C

/*------------------------------------------------------------------------

COLORS1.C -- Colors Using Scroll Bars

(c) Charles Petzold, 1998

-------------------------------------------------------------------------*/

#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 COLORREF crPrim[3] = { RGB (255, 0, 0), RGB (0, 255, 0),

RGB (0, 0, 255) } ;

static HBRUSH hBrush[3], hBrushStatic ;

static HWND hwndScroll[3], hwndLabel[3], hwndValue[3], hwndRect ;

static int color[3], cyChar ;

static RECT rcColor ;

static TCHAR * szColorLabel[] = { TEXT ("Red"), TEXT ("Green"),

TEXT ("Blue") } ;

HINSTANCE hInstance ;

int i, cxClient, cyClient ;

TCHAR szBuffer[10] ;

switch (message)

{

case WM_CREATE :

hInstance = (HINSTANCE) GetWindowLong (hwnd, GWL_HINSTANCE) ;

// Create the white-rectangle window against which the

// scroll bars will be positioned. The child window ID is 9.

hwndRect = CreateWindow (TEXT ("static"), NULL,

WS_CHILD | WS_VISIBLE | SS_WHITERECT,

0, 0, 0, 0,

hwnd, (HMENU) 9, hInstance, NULL) ;

for (i = 0 ; i < 3 ; i++)

{

// The three scroll bars have IDs 0, 1, and 2, with

// scroll bar ranges from 0 through 255.

hwndScroll= CreateWindow (TEXT ("scrollbar"), NULL,

WS_CHILD | WS_VISIBLE |

WS_TABSTOP | SBS_VERT,

0, 0, 0, 0,

hwnd, (HMENU) i, hInstance, NULL) ;

SetScrollRange (hwndScroll, SB_CTL, 0, 255, FALSE) ;

SetScrollPos (hwndScroll, SB_CTL, 0, FALSE) ;

// The three color-name labels have IDs 3, 4, and 5,

// and text strings "Red", "Green", and "Blue".

hwndLabel = CreateWindow (TEXT ("static"), zColorLabel,

WS_CHILD | WS_VISIBLE | SS_CENTER,

0, 0, 0, 0,

hwnd, (HMENU) (i + 3),

hInstance, NULL) ;

// The three color-value text fields have IDs 6, 7,

// and 8, and initial text strings of "0".

hwndValue = CreateWindow (TEXT ("static"), TEXT ("0"),

WS_CHILD | WS_VISIBLE | SS_CENTER,

0, 0, 0, 0,

hwnd, (HMENU) (i + 6),

hInstance, NULL) ;

OldScroll = (WNDPROC) SetWindowLong (hwndScroll,

GWL_WNDPROC, (LONG) ScrollProc) ;

hBrush = CreateSolidBrush (crPrim) ;

}

hBrushStatic = CreateSolidBrush (

GetSysColor (COLOR_BTNHIGHLIGHT)) ;

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,

(2 * i + 1) * cxClient / 14, 2 * cyChar,

cxClient / 14, cyClient - 4 * cyChar, TRUE) ;

MoveWindow (hwndLabel,

(4 * i + 1) * cxClient / 28, cyChar / 2,

cxClient / 7, cyChar, TRUE)

MoveWindow (hwndValue,

(4 * i + 1) * cxClient / 28,

cyClient - 3 * cyChar / 2,

cxClient / 7, cyChar, TRUE) ;

}

SetFocus (hwnd) ;

return 0 ;

case WM_SETFOCUS :

SetFocus (hwndScroll[idFocus]) ;

return 0 ;

case WM_VSCROLL :

i = GetWindowLong ((HWND) lParam, GWL_ID) ;

switch (LOWORD (wParam))

{

case SB_PAGEDOWN :

color += 15 ;

// fall through

case SB_LINEDOWN :

color = min (255, color + 1) ;

break ;

case SB_PAGEUP :

color -= 15 ;

// fall through

case SB_LINEUP :

color = max (0, color - 1) ;

break ;

case SB_TOP :

color = 0 ;

break ;

case SB_BOTTOM :

color = 255 ;

break ;

case SB_THUMBPOSITION :

case SB_THUMBTRACK :

color = HIWORD (wParam) ;

break ;

default :

break ;

}

SetScrollPos (hwndScroll, SB_CTL, color, TRUE) ;

wsprintf (szBuffer, TEXT ("%i"), color) ;

SetWindowText (hwndValue, szBuffer) ;

DeleteObject ((HBRUSH)

SetClassLong (hwnd, GCL_HBRBACKGROUND, (LONG)

CreateSolidBrush (RGB (color[0], color[1], color[2])))) ;

InvalidateRect (hwnd, &rcColor, TRUE) ;

return 0 ;

case WM_CTLCOLORSCROLLBAR :

i = GetWindowLong ((HWND) lParam, GWL_ID) ;

return (LRESULT) hBrush ;

case WM_CTLCOLORSTATIC :

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 ;

}

break ;

case WM_SYSCOLORCHANGE :

DeleteObject (hBrushStatic) ;

hBrushStatic = CreateSolidBrush (GetSysColor(COLOR_BTNHIGHLIGHT)) ;

return 0 ;

case WM_DESTROY :

DeleteObject ((HBRUSH)

SetClassLong (hwnd, GCL_HBRBACKGROUND, (LONG)

GetStockObject (WHITE_BRUSH))) ;

for (i = 0 ; i < 3 ; i++)

DeleteObject (hBrush) ;

DeleteObject (hBrushStatic) ;

PostQuitMessage (0) ;

return 0 ;

}

return 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) ;

}

COLORS1利用子视窗进行工作,该程式使用10个子视窗控制项:3个卷动列、6个静态文字视窗和1个静态矩形框。COLORS1拦截WM_CTLCOLORSCROLLBAR讯息来给红、绿、蓝3个卷动列的内部著色,并拦截WM_CTLCOLORSTATIC讯息来著色静态文字。

随便看

 

百科全书收录4421916条中文百科知识,基本涵盖了大多数领域的百科知识,是一部内容开放、自由的电子版百科全书。

 

Copyright © 2004-2023 Cnenc.net All Rights Reserved
更新时间:2025/3/14 19:24:25