�������� Linux Tags

9. ���Ӵ�������

��������µ�CHECKER��ʽ����Щ��ʽ��ʾ�˾������񡣵�����һ�������а��»��󰴼�ʱ���ó�ʽ�ͻ�һ��x��������ٰ�һ�λ��󰴼�����ôx����ʧ����Ȼ�����ʽ��CHECKER1��CHECKER2�汾ֻʹ��һ�����Ӵ�����CHECKER3�汾ȴΪÿ������ʹ��һ�����Ӵ�����Щ������һ������ChildProc�Ķ����Ӵ�ѶϢ������ʽά����

����б�Ҫ�����۾����Ƿ�ѡ�У������Ը�ChildProc����һ�����丸�Ӵ�ѶϢ������ʽ(WndProc)����ѶϢ���ֶΡ�ͨ������GetParent�����Ӵ�ѶϢ������ʽ��ȷ���丸�Ӵ����Ӵ����ţ�

hwndParent = GetParent (hwnd) ;

���У�hwnd�����Ӵ����Ӵ����š����������丸�Ӵ�ѶϢ������ʽ����ѶϢ��

SendMessage (hwndParent, message, wParam, lParam) ;

��ômessageӦ���趨Ϊʲô�أ�������������趨����ֵ��С������WM_USER��ͬ�������Щ���ִ�����Ԥ�ȶ����WM_ ѶϢ����ͻ��ѶϢ��Ҳ�������ѶϢ�����Ӵ����Խ�wParam�趨Ϊ�������Ӵ�ID������ڸ����Ӵ���������ôlParam���Ա���Ϊ1�����δ�ڸ����Ӵ��ϵ�������ôlParam������Ϊ0�����Ǵ�����ʽ��һ��ѡ��

��ʵ�ϣ������ڽ���һ�������Ӵ�������������Ӵ���״̬�ı�ʱ�����Ӵ���������ͼ���ѶϢ��֪ͨ���Ӵ���ʹ�����ַ��������Ӵ��ͱ�����丸�Ӵ��ĸ߽�����װ�á��������Լ���өĻ�ϵ�ͼ�������Ӧ�Ĵ�������ʹ��������Ļ�Ӧ�Լ��ڷ�����Ҫ�������¼�ʱ֪ͨ��һ���Ӵ��ķ�������װ������

��Ȼ�����Խ����Լ������Ӵ����������Ҳ��������һЩԤ�ȶ�����Ӵ���𣨺��Ӵ�ѶϢ������ʽ����������׼�����Ӵ��������һ���ڱ��Windows��ʽ�п�������Щ�������Щ��������õ���ʽ�У���ť����ȡ���顢�༭���顢�嵥���顢����ʽ�嵥���顢�ִ���ǩ�;����С����磬������������������ʽ��ij���������һ�����С�Recalculate���İ�ť����ô������ͨ������CreateWindow�����������ť�������ص��Ļ����������ť��ʾ�������¸ð�ťʱ���Զ���˸��������Щ����Windows�ڲ���ɵġ�����Ҫ����ֻ������WM_COMMANDѶϢ������ť������ʱ����ͨ����һѶϢ֪ͨ�����Ӵ�ѶϢ������ʽ��������������ǵģ�һ��Ҳû����

���Ӵ��������ڶԻ���������á��ڵ�ʮһ���������ῴ�������Ӵ��������λ�úͳߴ磬���ڷ�����ʽ����Դ���������еĶԻ�����ģ���ﶨ��ġ����ǣ���Ҳ����ʹ��Ԥ�ȶ���ģ�����ͨ�Ӵ���ʾ����������Ӵ�����������Ժ���һ��CreateWindow������һ�����Ӵ�����ͨ������MoveWindow���������Ӵ���λ�úͳߴ硣���Ӵ�ѶϢ������ʽ�����Ӵ��������ѶϢ�����Ӵ����������Ӵ�ѶϢ������ʽ����ѶϢ��

�ڽ�����ͨ�Ӵ�ʱ�����ȶ����Ӵ���𣬲�ʹ��RegisterClass����ע�ᵽWindows�У�Ȼ����CreateWindow�������ݸ��Ӵ������һ����ͨ�Ӵ����ӵ����¿�ʼ�����Ǿ�����ô���ġ����ǣ�����ʹ��Ԥ�ȶ����ij��������ʱ������Ϊ���Ӵ�ע���Ӵ�����Ӵ�����Ѿ������Windows֮�У�������һ��Ԥ�ȶ�������֡���ֻ����CreateWindow�а����������Ӵ���������CreateWindow�е��Ӵ���ʽ����׼ȷ�ض��������Ӵ�����������κ͹��ܡ�Windows�ڽ��˴������͸�������Щ�Ӵ�����������Ӵ�ѶϢ���Ӵ�ѶϢ������ʽ��

ֱ���������Ӵ���ʹ�����Ӵ����������ijЩ������Щ����IJ�ε���ڶԻ�������ʹ�����Ӵ���������Ҫ��IJ�Ρ�����Ի���������������ij�ʽ�Ϳ�����֮������һ������㡣ֵ��һ��ģ������ܻᷢ���������Ӵ��Ͻ��������Ӵ������û������Tab������������뽹���һ���������ƶ�����һ����������ڲ����ܡ����Ӵ��������ܹ�������뽹�㣬���ǻ���ᣬ�������ܰ����뽹�㴫�ظ����Ӵ�������DZ���Ҫ��������⡣

Windows��ʽ��Ƶ��ļ��������ط����������Ӵ�����������ǣ��򵥵ij��ÿ�������ǿ�����/Platform SDK/User Interface Services/Controls���ļ��������������Ի������п�������Щ���Ӵ�������ť�����а�����ȡ����ĵ�ѡ��ť������̬������������ֱ�ǩ�����༭���飨�������ڴ˱༭һ�л�������֣��������С��嵥���������ʽ�嵥���顣������ʽ�嵥�������⣬��Windows 1.0�оͰ�������Щ������ⲿ�ֵ�Windows�ļ�������Rich Text���ֱ༭���������༭�������ƣ����������༭��ͬ��������ʽ�ĸ�ʽ�����֣��Լ�����Ӧ�ù����С�

���춡����ÿ����������һЩ���ص�����������Щ��������/Platform SDK/User Interface Services/Shell and Common Controls/Common Controls���������²����۳��ÿ���������ǽ������ڱ�����������֡����ⲿ�ֵ�Windows�ļ��У��������ҵ�����ӱ��WindowsӦ�ó�ʽ��Ӧ�õ����Լ���Ӧ�ó�ʽ��ͷ��Щ������Ѷ��

��ť���
��

�������ǽ�ͨ������BTNLOOK����button look�����ij�ʽ����ʼ���ܰ�ť�Ӵ�������ʽ9-1��ʾ��BTNLOOK����10�����Ӵ���ť�����ÿ���������Ӧһ����׼�İ�ť��ʽ����˹���10�ֱ�׼��ť��ʽ��

 ï¿½ï¿½Ê½9-1  BTNLOOK
BTNLOOK.C
/*--------------------------------------------------------------------------
   	BTNLOOK.C -- 	Button Look Program
         					(c) Charles Petzold, 1998
---------------------------------------------------------------------------*/

#include <windows.h>
struct
{
     	int  			iStyle ;
     	TCHAR * 		szText ;
}
button[] =
{
     	BS_PUSHBUTTON,      	 TEXT ("PUSHBUTTON"),
     	BS_DEFPUSHBUTTON,   	 TEXT ("DEFPUSHBUTTON"),
     	BS_CHECKBOX,        	 TEXT ("CHECKBOX"), 
     	BS_AUTOCHECKBOX,         TEXT ("AUTOCHECKBOX"),
     	BS_RADIOBUTTON,     	 TEXT ("RADIOBUTTON"),
     	BS_3STATE,          	 TEXT ("3STATE"),
     	BS_AUTO3STATE,      	 TEXT ("AUTO3STATE"),
     	BS_GROUPBOX,        	 TEXT ("GROUPBOX"),
     	BS_AUTORADIOBUTTON,      TEXT ("AUTORADIO"),
     	BS_OWNERDRAW,            TEXT ("OWNERDRAW")
} ;

#define NUM (sizeof button / sizeof button[0])
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                    						PSTR szCmdLine, int iCmdShow)
{
     	static TCHAR 	szAppName[] = TEXT ("BtnLook") ;
     	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 		= (HBRUSH) GetStockObject (WHITE_BRUSH) ;
     	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 ("Button Look"),
                          		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  		hwndButton[NUM] ;
     	static RECT 		rect ;
     	static TCHAR 		szTop[]		= TEXT ("message   wParam  lParam"),
						szUnd[]		= TEXT ("_______   ______  ______"),
						szFormat[]	= TEXT ("%-16s%04X-%04X   %04X-%04X"),
 						szBuffer[50] ;
     	static int   		cxChar, cyChar ;
     	HDC          				hdc ;
     	PAINTSTRUCT  		ps ;
 	int          				i ;
     
     	switch (message)
     	{
     	case 	WM_CREATE :
          		cxChar = LOWORD (GetDialogBaseUnits ()) ;
          		cyChar = HIWORD (GetDialogBaseUnits ()) ;
          
          		for (i = 0 ; i < NUM ; i++)
               				hwndButton[i] =	CreateWindow ( TEXT("button"),button[i].szText,
   WS_CHILD | WS_VISIBLE | button[i].iStyle,
    cxChar, cyChar * (1 + 2 * i),
    20 * cxChar, 7 * cyChar / 4,
                               hwnd, (HMENU) i,
               ((LPCREATESTRUCT) lParam)->hInstance, NULL) ;
          		return 0 ;

     	case 	WM_SIZE :
          		rect.left   		= 24 * cxChar ;
          		rect.top    		=  2 * cyChar ;
          		rect.right  		= LOWORD (lParam) ;
          		rect.bottom 		= HIWORD (lParam) ;
          		return 0 ;
     	case 	WM_PAINT :
          		InvalidateRect (hwnd, &rect, TRUE) ;
          
          		hdc = BeginPaint (hwnd, &ps) ;
          		SelectObject (hdc, GetStockObject (SYSTEM_FIXED_FONT)) ;
          		SetBkMode (hdc, TRANSPARENT) ;
          
          		TextOut (hdc, 24 * cxChar, cyChar, szTop, lstrlen (szTop)) ;
          		TextOut (hdc, 24 * cxChar, cyChar, szUnd, lstrlen (szUnd)) ;
          
          		EndPaint (hwnd, &ps) ;
          		return 0 ;
          
     	case 	WM_DRAWITEM :
     	case 	WM_COMMAND :
          		ScrollWindow (hwnd, 0, -cyChar, &rect, &rect) ;
          
          		hdc = GetDC (hwnd) ;
          		SelectObject (hdc, GetStockObject (SYSTEM_FIXED_FONT)) ;
          
          		TextOut(	hdc, 24 * cxChar, cyChar * (rect.bottom / cyChar - 1),
                   					szBuffer,
                   					wsprintf (szBuffer, szFormat,
                         					message == WM_DRAWITEM ? 	TEXT ("WM_DRAWITEM") : 
                                            TEXT ("WM_COMMAND"),
                         					HIWORD (wParam), LOWORD (wParam),
                         					HIWORD (lParam), LOWORD (lParam))) ;
          
          		ReleaseDC (hwnd, hdc) ;
          		ValidateRect (hwnd, &rect) ;
          		break ;
          
     	case 	WM_DESTROY :
          		PostQuitMessage (0) ;
          		return 0 ;
     }
     	return DefWindowProc (hwnd, message, wParam, lParam) ;
}

������ťʱ����ť�͸����Ӵ�ѶϢ������ʽ����һ��WM_COMMANDѶϢ��Ҳ������������Ϥ��WndProc��BTNLOOK��WndProc����ѶϢ��wParam������lParam������ʾ����ʾ������ұߣ���ͼ9-1��ʾ��

����BS_OWNERDRAW��ʽ�İ�ť���Ӵ�����ʾΪһ��������Ӱ����Ϊ������ʽ�İ�ť���ɳ�ʽ��������Ƶġ��ð�ť��ʾ����Ҫ�ɰ���lParamѶϢ������WM_DRAWITEMѶϢ�����ƣ���lParamѶϢ������һ��ָ��DRAWITEMSTRUCT��̬�ṹ��ָ�ꡣ��BTNLOOK�У���ЩѶϢҲͬ������ʾ���ҽ��ڱ��µ��������ϸ����������ӵ���߻��ƣ�owner draw����ť��


��

ͼ9-1 BTNLOOK��өĻ��ʾ

�������Ӵ�
��

BTNLOOK������һ������button�Ľṹ���������˰�ť�Ӵ���ʽ���������ִ������Ƕ�Ӧ�10����ť��̬�����а�ť�Ӵ���ʽ������ĸ��BS����ͷ������ʾ����ť��ʽ����10����ť���Ӵ�����WndProc�д���WM_CREATEѶϢ�Ĺ�����ʹ��һ��for��Ȧ�����ġ�CreateWindow����ʹ��������Щ������

Class name��������ƣ�

Window text���Ӵ����֣�

Window style���Ӵ���ʽ��

x position��xλ�ã�

y position��yλ�ã�

Width�����ȣ�

Height���߶ȣ�

Parent window�����Ӵ���

Child window ID�����Ӵ�ID��

Instance handle��ִ��ʵ����ţ�

Extra parameters�����Ӳ�����

TEXT ("button")

button[i].szText

WS_CHILD | WS_VISIBLE | button[i].iStyle

cxChar

cyChar * (1 + 2 * i)

20 * xChar

7 * yChar / 4

hwnd

(HMENU) i

((LPCREATESTRUCT) lParam) -> hInstance

NULL

������Ʋ�����Ԥ�ȶ�������֡��Ӵ���ʽʹ��WS_CHILD��WS_VISIBLE�Լ���button�ṹ�ж����10����ť��ʽ֮һ��BS_PUSHBUTTON��BS_DEFPUSHBUTTON�ȵȣ����Ӵ����ֲ����������ͨ�Ӵ���˵��������ʾ�ڱ������е����֣�����ÿ����ť����ʾ�������Ҽ򵥵�ʹ�ñ�ʶ��ť��ʽ���ֵ�xλ�ú�yλ�ò�����˵�����Ӵ����Ͻ����춸��Ӵ���ʾ�������Ͻǵ�λ�á����Ⱥ͸߶Ȳ����涨��ÿ�����Ӵ��Ŀ��Ⱥ͸߶ȡ���ע�⣬���õ���GetDialogBaseUnits��ʽ������ڶ�������Ԫ�Ŀ��Ⱥ͸߶ȡ����ǶԻ���������������ֳߴ�ĺ�ʽ���˺�ʽ����һ��32λԪ��ֵ�����е������ʾ���ȣ��������ʾ�߶ȡ����GetDialogBaseUnits���ص�ֵ���GetTextMetrics��õ�ֵ��������ͬ����GetDialogBaseUnits��ʱʹ�������������Щ�������ܹ���Ի������������õر���һ�¡�

��ÿ�����Ӵ����������Ӵ�ID����Ӧ�ø�����ͬ���ڴ����������Ӵ���WM_COMMANDѶϢʱ��ID���������Ӵ�ѶϢ������ʽʶ�����Ӧ�����Ӵ���ע�����Ӵ�ID����ΪCreateWindow��һ���������ݵģ��ò���ͨ�����ָ����ʽ�Ĺ��ܱ���������Ӵ�ID���뱻ǿ��ת��ΪHMENU��

CreateWindow���е�ִ��ʵ����ſ������е���֣����������������µ���ʵ���༴�ڴ���WM_CREATEѶϢ�Ĺ����У�lParamʵ������ָ��CREATESTRUCT ���������ṹ�����ṹ��ָ�꣬�ýṹ��һ��hInstance��Ա�����Խ�lParamת����ָ��CREATESTRUCT�ṹ��һ��ָ�꣬��ȡ��hInstance��

����ЩWindows��ʽʹ����ΪhInst�����������ʹ�Ӵ�ѶϢ������ʽ�ܴ�ȡWinMain�е�ִ��ʵ����š���WinMain�У���ֻ���ڽ������Ӵ�֮ǰ�趨��

hInst = hInstance ;

�ڵ������е�CHECKER3��ʽ�У���������GetWindowLongȡ��ִ��ʵ����ţ�

GetWindowLong (hwnd, GWL_HINSTANCE)

�⼸�ַ���������ȷ�ġ���

�ں���CreateWindow֮�ᣬ���Dz�����Ϊ��Щ���Ӵ����κ����飬��Windows�еİ�ť�Ӵ�ѶϢ������ʽ����ά�����ǣ����������е��ػ�������BS_OWNERDRAW��ʽ�İ�ť���⣬��Ҫ���ʽ����������Щ��������������ۣ����ڳ�ʽ��ֹʱ��������Ӵ��Ѿ����������ôWindows�������Щ���Ӵ���

���Ӵ����Ӵ���ѶϢ
��

����ִ��BTNLOOKʱ������������ʾ�������߻���ʾ����ͬ�İ�ť��̬������ǰ���Ѿ��ᵽ�����û��󵥻���ťʱ�����Ӵ�����������丸�Ӵ�����һ��WM_COMMANDѶϢ��BTNLOOK����WM_COMMANDѶϢ����ʾwParam��lParam��ֵ�����ǵĺ������£�

LOWORD (wParam)

HIWORD (wParam)

lParam

���Ӵ�ID

֪ͨ��

���Ӵ�����

�����������ֲ16λԪWindows��ʽ����ôҪע��ı���ЩѶϢ����������32λԪ�Ĵ��š�

���Ӵ�ID���ڽ������Ӵ�ʱ���ݸ�CreateWindow��ֵ����BTNLOOK�У���ЩID����ʾ����ʾ�����У���ʹ��0��9�ֱ��ʶ10����ť�����Ӵ�������Windows��CreateWindow���ص�ֵ��

֪ͨ�����ϸ��ʾ��ѶϢ�ĺ��塣��ť֪ͨ��Ŀ���ֵ��Windows��ͷ�����ж������£�

��9-1
��ť֪ͨ��ʶ���� ֵ
BN_CLICKED 0
BN_PAINT 1
BN_HILITE or BN_PUSHED 2
BN_UNHILITE or BN_UNPUSHED 3
BN_DISABLE 4
BN_DOUBLECLICKED or BN_DBLCLK 5
BN_SETFOCUS 6
BN_KILLFOCUS 7

ʵ���ϣ������ῴ����Щ��ťֵ�еĴ��������1��4��֪ͨ�������һ�ֽ���BS_USERBUTTON���Ѳ���ʹ�õİ�ť�ģ����Ѿ���BS_OWNERDRAW����һ�ֲ�ͬ��֪ͨ��ʽ���滻����֪ͨ��6��7ֻ�е���ť��ʽ������ʶBS_NOTIFY�ŷ��͡�֪ͨ��5ֻ��BS_RADIOBUTTON��BS_AUTORADIOBUTTON��BS_OWNERDRAW��ť���ͣ����ߵ���ť��ʽ�а���BS_NOTIFYʱ��ҲΪ������ť���͡�

����ע�⵽�����û��󵥻���ťʱ���ð�ť���ֵ���Χ�������ߡ����ʾ�ð�ťӵ�������뽹�㣬���м������붼�����͸����Ӵ���ť����������Ǵ��͸����Ӵ������ǣ����ð�ť������ӵ�����뽹��ʱ�������������еļ������룬����Spacebar�����⣬��ʱSpacebar���뻬�������ͬ��Ч����

���Ӵ������Ӵ�����ѶϢ
��

��ȻBTNLOOK��û����ʾ��һ��ʵ�����Ǹ��Ӵ�ѶϢ������ʽҲ�������Ӵ��������ѶϢ����ЩѶϢ����������WM��ͷ������ѶϢ�����⣬��WINUSER.H�л�������8����ť˵��ѶϢ������BM��ʾ����ťѶϢ������Щ��ťѶϢ���±���ʾ��

��9-2
��ťѶϢ ֵ
BM_GETCHECK 0x00F0
BM_SETCHECK 0x00F1
BM_GETSTATE 0x00F2
BM_SETSTATE 0x00F3
BM_SETSTYLE 0x00F4
BM_CLICK 0x00F5
BM_GETIMAGE 0x00F6
BM_SETIMAGE 0x00F7

BM_GETCHECK��BM_SETCHECKѶϢ�ɸ��Ӵ����͸����Ӵ��������ȡ�û����趨��ȡ����͵�ѡ��ť��ѡ�б�ǡ�BM_GETSTATE��BM_SETSTATEѶϢ��ʾ��ť�������״̬���ǣ������Spacebar������ʱ�ģ������¡�״̬�����ǽ������۰�ť��ÿ����̬ʱ��������ЩѶϢ����������õġ�BM_SETSTYLEѶϢ�������ڰ�ť����֮��ı䰴ť��ʽ��

ÿ�����Ӵ����������һ�������ֵ���Ψһ���Ӵ����ź�IDֵ����춴��ź�ID�����ߣ�֪�����е�һ�����Ϳ��Ի����һ���������֪�����Ӵ���������Ӵ����ţ���ô����������������������ID��

id = GetWindowLong (hwndChild, GWL_ID) ;

�����µ�CHECKER3��ʽ���ô˺�ʽ����SetWindowLongһ����ά��ע���Ӵ����ʱ������������������ϡ��ڽ������Ӵ�ʱ��Windows������GWL_IDʶ���ִ�ȡ�����ϡ���Ҳ����ʹ�ã�

id = GetDlgCtrlID (hwndChild) ;

��Ȼ��ʽ�еġ�Dlg������ָ���ǶԻ����飬��ʵ��������һ��ͨ�õĺ�ʽ��

֪��ID�͸��Ӵ����ţ������ܻ�����Ӵ����ţ�

hwndChild = GetDlgItem (hwndParent, id) ;

����
��

��BTNLOOK����ʾ��ǰ������ť�ǡ�ѹ�롹��ť����ť��һ�����Σ�������CreateWindow�������Ӵ����ֲ�����ָ�������֡��þ���ռ������CreateWindow����MoveWindow�����и�����ȫ���߶ȺͿ��ȣ��������ھ��ε����ġ�

������������Ҫ��������һ��������Ӧ�Ķ��������������κ���ʽ�Ŀ�/��ָʾ��������̬�İ�ť�������������Ӵ���ʽ���ֱ����BS_PUSHBUTTON��BS_DEFPUSHBUTTON��BS_DEFPUSHBUTTON�еġ�DEF���������ڶ�������������ƶԻ�����ʱ��BS_PUSHBUTTON�������BS_DEFPUSHBUTTON����������ò�ͬ�����ǵ��������Ӵ�������ʱ��������̬�İ�ť������ͬ������BS_DEFPUSHBUTTON�ı߿�Ҫ��һЩ��

����ť�ĸ߶�Ϊ������Ԫ�߶ȵ�7/4��ʱ����ť����ۿ�������ã�����������Ԫ��BTNLOOKʹ�ã�����ť�Ŀ������ٵ��ڵ����ֵĿ����ټ���������Ԫ�Ŀ��ȡ�

�������α��ڰ�ť��ʱ�����»��󰴼���ʹ��ť����ά��Ӱ�ػ��Լ����ͺ�����ı�����һ�����ſ����󰴼�ʱ���ͻָ���ť��ԭò�������Ӵ�����һ��WM_COMMANDѶϢ��BN_CLICKED֪ͨ�롣��������ť��̬���ƣ�����ťӵ�����뽹��ʱ�������ֵ���Χ�������ߣ����¼��ͷ�Spacebar���밴�¼��ͷŻ��󰴼�������ͬ��Ч����

������ͨ�����Ӵ�����BM_SETSTATEѶϢ��ģ�ⰴť���������µIJ��������°�ť�����£�

SendMessage (hwndButton, BM_SETSTATE, 1, 0) ;

����ĺ���ʹ��ť�ָ�������

SendMessage (hwndButton, BM_SETSTATE, 0, 0) ;

hwndButton�Ӵ������Ǵ�CreateWindow���д��ص�ֵ��

��Ҳ�����򰴼�����BM_GETSTATEѶϢ�����Ӵ�������ذ�ťĿǰ��״̬�������ť�����£��򴫻�TRUE�������ť�������״̬���򴫻�FALSE�����ǣ��������Ӧ�ò�����Ҫ��һѶϢ����Ϊ��ť�������κο�/����Ѷ������BM_SETCHECKѶϢ��BM_GETCHECKѶϢ���ᱻ�õ���

��ȡ����
��

��ȡ������һ�����ַ��飬����ͨ�������ں�ȡ������ұߣ�������ڽ�����ťʱָ����BS_LEFTTEXT��ʽ����ô���ֻ��������ߣ���Ҳ������BS_RIGHTֱ�ӵ�����������ϴ���ʽ������ȡ����ͨ���������ʹ���߶�ѡ�����ѡ���Ӧ�ó�ʽ�С���ȡ����ij��ù�����ͬһ�����أ�������һ�ν���ʾ��ѡ��ǣ��ٴε��������ѡ��ǡ�

��ȡ������õ�������ʽ��BS_CHECKBOX��BS_AUTOCHECKBOX����ʹ��BS_CHECKBOXʱ������Ҫ�Լ���ÿ������BM_SETCHECKѶϢ���趨��ѡ��ǡ�wParam������1ʱ�趨��ѡ��ǣ���0ʱ�����ѡ��ǡ�ͨ����ÿ������BM_GETCHECKѶϢ�������Եõ��ú�ȡ�����Ŀǰ״̬���ڴ������Կ������WM_COMMANDѶϢʱ�������������µ�ָ������תX��ǣ�

SendMessage 		((HWND) lParam, BM_SETCHECK, (WPARAM)
			!SendMessage ((HWND) lParam, BM_GETCHECK, 0, 0), 0) ;

ע��ڶ���SendMessage����ǰ��������ӡ�!��������lParam����WM_COMMANDѶϢ�д���ʹ�����Ӵ�ѶϢ������ʽ�����Ӵ����š��������������֪����ť��״̬����ô��������������һ��BM_GETCHECKѶϢ����Ҳ���Խ�Ŀǰ״̬�����������Ӵ�ѶϢ������ʽ�е�һ����̬�����������������BM_SETCHECKѶϢ����ʼ������ѡ��ǵ�BS_CHECKBOX��ȡ���飺

SendMessage (hwndButton, BM_SETCHECK, 1, 0) ;

��BS_AUTOCHECKBOX��ʽ����ť�Լ�������ѡ��ǵĿ��͹أ����������Ӵ�ѶϢ������ʽ���Ժ���WM_COMMANDѶϢ��������Ҫ��ťĿǰ��״̬ʱ��������������BM_GETCHECKѶϢ��

iCheck = (int) SendMessage (hwndButton, BM_GETCHECK, 0, 0) ;

����ð�ť��ѡ�У���iCheck��ֵΪTRUE���߷������������ťĩ��ѡ�У���iCheck��ֵΪFALSE��0��

�������ֺ�ȡ������ʽ��BS_3STATE��BS_AUTO3STATE������������������ʾ�ģ���������ʽ����ʾ������״̬����ȡ�������ǻ�ɫ������������������wParam���2��WM_SETCHECKѶϢʱ����ɫ����ʹ���߱�ʾ�˿��ܱ�ѡ���µĻ��߽�ֹʹ�á�

��ȡ�����ؾ��ε���߿���룬�������ں���CreateWindowʱ�涨�ľ��εĶ��ߺ͵ױ�֮�䣬�ڸþ����ڵ��κεط����»��󶼻����丸�Ӵ�����һ��WM_COMMANDѶϢ����ȡ�������С�߶���һ����Ԫ�ĸ߶ȣ���С�����������е���Ԫ����2��

��ѡ��ť
��

��ѡ��ť��������һ�а�ť�����棬��Щ��ť���������ϵ�������һ���������������ϵ�ÿһ����ť����Ӧһ������״̬������һ��ֻ����һ����ť�����¡��ڶԻ������У���ѡ��ť�鳣��������ʾ�໥�ų��ѡ����ȡ���鲻ͬ����ѡ��ť�Ĺ����뿪�ز�һ����Ҳ����˵�����ڶ��ΰ���ѡ��ťʱ������״̬�ᱣ�ֲ��䡣

��ѡ��ť����״��һ��ԲȦ�������Ƿ��򣬳���֮�⣬���dz����ȡ���顣ԲȦ�ڵļ���Բ���ʾ�õ�ѡ��ť�Ѿ���ѡ�С���ѡ��ť���Ӵ���ʽBS_RADIOBUTTON��BS_AUTORADIOBUTTON���֣���������ֻ��춶Ի����顣

�����յ����Ե�ѡ��ť��WM_COMMANDѶϢʱ��Ӧ����������wParam���1��BM_SETCHECKѶϢ����ʾ��ѡ��״̬��

SendMessage (hwndButton, BM_SETCHECK, 1, 0) ;

��ͬ���е��������е�ѡ��ť��������ͨ�������Ƿ���wParam���0��BM_SETCHECKѶϢ����ʾ��δѡ��״̬��

SendMessage (hwndButton, BM_SETCHECK, 0, 0) ;

���鷽��
��

���鷽�鼴��ʽΪBS_GROUPBOX��ѡ������ǰ�ť���е��������Ȳ�������������ͼ������룬Ҳ�����丸�Ӵ�����WM_COMMANDѶϢ�����鷽����һ�����ο򣬷��鷽��������䶥����ʾ�����鷽�鳣�������������İ�ť�����

�ı䰴ť����
��

������ͨ��SetWindowText���ı䰴ť�����������κ��Ӵ����ڵ����֣�

SetWindowText (hwnd, pszString) ;

����hwnd�����ı��Ӵ��Ĵ��ţ�pszString��һ��ָ����nullΪ�ս���ִ�ָ�ꡣ���һ����Ӵ���˵����������DZ����е����֣���춰�ť��������˵�����������ð�ť��ʾ�����֡�

��Ҳ����ȡ���Ӵ�Ŀǰ�����֣�

iLength = GetWindowText (hwnd, pszBuffer, iMaxLength) ;

iMaxLengthָ�����Ƶ�pszBufferָ��Ļ������е������Ԫ�����ú�ʽ���ظ��Ƶ���Ԫ��������������ͨ������ĺ���������ض����ֵij��ȣ�

iLength = GetWindowTextLength (hwnd) ;

�ɼ��ĺ����õİ�ť
��

Ϊ�˽��ջ���ͼ������룬���Ӵ������ǿɼ��ģ�����ʾ���ͱ����õġ����Ӵ��ǿɼ��Ķ�δ������ʱ����ô�Ӵ����Ի�ɫ���Ǻ�ɫ��ʾ���֡�

����ڽ������Ӵ�ʱ����û�н�WS_VISIBLE�������Ӵ�����У���ôֱ������ShowWindowʱ���Ӵ��Żᱻ��ʾ������

ShowWindow (hwndChild, SW_SHOWNORMAL) ;

�������WS_VISIBLE�������Ӵ�����У���û�б�Ҫ����ShowWindow�����ǣ�������ͨ������ShowWindow�����Ӵ�����������

ShowWindow (hwndChild, SW_HIDE) ;

������ͨ������ĺ�����ȷ�����Ӵ��Ƿ�ɼ���

IsWindowVisible (hwndChild) ;

��Ҳ����ʹ���Ӵ������û��߲������á����ڶ�����£��Ӵ��DZ����õġ�������ͨ������ĺ���ʹ�Ӵ��������ã�

EnableWindow (hwndChild, FALSE) ;

��춰�ť����������ʹ��ť�ִ���ɻ�ɫ�����á���ť�����ٶԻ�������ͼ�������������Ӧ�����DZ�ʾ��ťѡ��Ŀǰ�����õ���÷�����

������ͨ������ĺ���ʹ���Ӵ��ٴα����ã�

EnableWindow (hwndChild, TRUE) ;

��������ʹ������ĺ�����ȷ�����Ӵ��Ƿ����ã�

IsWindowEnabled (hwndChild) ;

��ť�����뽹��
��

���ڱ���ǰ���Ѿ��ᵽ�������û��󵥻���ť����ȡ���顢��ѡ���ӵ���߻��ư�ťʱ�����ǽ��յ����뽹�㡣��Щ������ʹ��������Χ����������ʾ��ӵ�������뽹�㡣�����Ӵ�������õ����뽹��ʱ���丸�Ӵ���ʧȥ�����뽹�㣻���еļ������붼�������Ӵ��������������븸�Ӵ��С����ǣ����Ӵ�������ֻ��Spacebar��������Ӧ����ʱSpacebar�������þ���ͬ���󰴼�һ�����������ε�����һ�����Ե����⣺���ij�ʽʧȥ�˶Լ��̴����Ŀ���������ǿ������ǶԴ�����һЩʲô��

���ڵ��������Ѿ��ᵽ������Windows�����뽹���һ���Ӵ�������һ�����Ӵ���ת������һ���Ӵ�������һ�����Ӵ������ʱ�������ȸ�����ʧȥ���뽹����Ӵ�����һ��WM_KILLFOCUSѶϢ��wParam�����ǽ������뽹����Ӵ��Ĵ��š�Ȼ�ᣬWindows�����ڽ������뽹����Ӵ�����һ��WM_SETFOCUSѶϢ��ͬʱwParam�ǻ���ʧȥ���뽹����Ӵ��Ĵ��ţ�������������У�wParamֵ����ΪNULL������ʾû���Ӵ�ӵ�л������ڽ������뽹�㣩��

ͨ������WM_KILLFOCUSѶϢ�����Ӵ�������ֹ���Ӵ������������뽹�㡣�ٶ�����hwndChild�������������Ӵ����Ӵ����ţ��������ں���CreateWindow�������Ӵ���ʱ�򴢴浽�����еģ��� NUM�����Ӵ�����Ŀ��

case 	WM_KILLFOCUS :
     		for (	i = 0 ; i < NUM ; i++)
          					if (hwndChild [i] == (HWND) wParam)
          		{
               					SetFocus (hwnd) ;
               					break ;
          		}
     	return 0 ;

����γ�ʽ���У������Ӵ���֪������ʧȥ���뽹�㣬��������ij�����Ӵ��õ����뽹��ʱ����������SetFocus������ȡ�����뽹�㡣

�����ǿɴﵽ��ͬĿ�ġ�����Ϊ�򵥣�����ֱ̫�ۣ��ķ�����

case WM_KILLFOCUS :
     if (hwnd == GetParent ((HWND) wParam))
          			SetFocus (hwnd) ;
     	return 0 ;

���ǣ������ַ�������ȱ�㣺������ֹ��ť��Spacebar��������Ӧ����Ϊ�ð�ť���ǵò������뽹�㡣һ�����õķ�����ʹ��ť�õ����뽹�㣬Ҳ����ʹ������Tab����һ����ťת�Ƶ���һ����ť�����������ƺ���̫���ܣ��ڱ��µ����棬���ǽ�Ҫ˵����COLORS1��ʽ������á��Ӵ�����𻯡�������ʵ�����ַ�����

����������ɫ
��

��������ͼ9-1�п��������ఴť����ʾ������������ȷ���������ã�����������ťȴ����һ������Ӧ���������һ�����λ�ɫ������������Ϊ��Щ��ť������Ϊ�Ի������е���ʾ����Ƶģ�����Windows 98�У��Ի�������һ����ɫ�ı��档���ǵ��Ӵ���һ����ɫ�ı��棬������Ϊ������WNDCLASS�ṹ�о�����������ġ�

wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;

�����Ѿ���ô���ˣ���Ϊ���Ǿ�������ʾ��������ʾ���֣���GDIʹ�����ڶ�װ�������ж����������ɫ�ͱ�����ɫ���������Ǻ�ɫ�Ͱ�ɫ��Ϊ��ʹ��Щ��ť��������һЩ�����DZ���Ҫ�ı���ʾ�������ɫʹ֮�Ͱ�ť�ı�����ɫһ�£�����Ҫ��ij�ַ�������ť�ı�����ɫ��Ϊ��ɫ��

���������ĵ�һ����������Windows�ԡ�ϵͳ��ɫ����ʹ�á�

ϵͳ��ɫ
��

Windows������29��ϵͳ��ɫ�Թ�������ʾʹ�á�������ʹ��GetSysColor��SetSysColors����ú��趨��Щ��ɫ����Windows��ͷ�����ж����ʶ���ֹ涨��ϵͳ��ɫ��ʹ��SetSysColors�趨��ϵͳ��ɫֻ��ĿǰWindows�Ի���������Ч��

����Windows������̨����ʽ�ġ���ʾ�������֣������Ըı�һЩ��������ȫ����ϵͳ��ɫ������Microsoft Windows NT��ѡ�е���ɫ�ᴢ����ϵͳ��¼�У�����Microsoft Windows 98���򴢴���WIN.INI�����С�ϵͳ��¼��WIN.INI������Ϊ��29��ϵͳ��ɫʹ���˹ؼ��֣���GetSysColor��SetSysColors��ʶ���ֲ�ͬ������ϵͳ��ɫ����������졢�̡���������ɫ��ֵ����ֵ�ı仯��Χ��0��255���±�˵������29��ϵͳ��ɫ�������GetSysColor��SetSysColors�Լ�WIN.INI�ؼ������ó�������ʶ�ġ����ű��ǰ���COLOR_ ����ֵ����0��ʼ��28������˳�����еģ�

��9-3
GetSysColor��SetSysColors ϵͳ��¼����WIN.INIʶ���� �ڶ���RGBֵ
COLOR_SCROLLBAR Scrollbar C0-C0-C0
COLOR_BACKGROUND Background 00-80-80
COLOR_ACTIVECAPTION ActiveTitle 00-00-80
COLOR_INACTIVECAPTION InactiveTitle 80-80-80
COLOR_MENU Menu C0-C0-C0
COLOR_WINDOW Window FF-FF-FF
COLOR_WINDOWFRAME WindowFrame 00-00-00
COLOR_MENUTEXT MenuText C0-C0-C0
COLOR_WINDOWTEXT WindowText 00-00-00
COLOR_CAPTIONTEXT TitleText FF-FF-FF
COLOR_ACTIVEBORDER ActiveBorder C0-C0-C0
COLOR_INACTIVEBORDER InactiveBorder C0-C0-C0
COLOR_APPWORKSPACE AppWorkspace 80-80-80
COLOR_HIGHLIGHT Highlight 00-00-80
COLOR_HIGHLIGHTTEXT HighlightText FF-FF-FF
COLOR_BTNFACE ButtonFace C0-C0-C0
COLOR_BTNSHADOW ButtonShadow 80-80-80
COLOR_GRAYTEXT GrayText 80-80-80
COLOR_BTNTEXT ButtonText 00-00-00
COLOR_INACTIVECAPTIONTEXT InactiveTitleText C0-C0-C0
COLOR_BTNHIGHLIGHT ButtonHighlight FF-FF-FF
COLOR_3DDKSHADOW ButtonDkShadow 00-00-00
COLOR_3DLIGHT ButtonLight C0-C0-C0
COLOR_INFOTEXT InfoText 00-00-00
COLOR_INFOBK InfoWindow FF-FF-FF
[no identifier; use value 25] ButtonAlternateFace B8-B4-B8
COLOR_HOTLIGHT HotTrackingColor 00-00-FF
COLOR_GRADIENTACTIVECAPTION GradientActiveTitle 00-00-80
COLOR_GRADIENTINACTIVECAPTION GradientInactiveTitle 80-80-80

��29����ɫ��Ԥ��ֵ������ʾ������ʽ�ṩ�ģ��ڲ�ͬ�Ļ����Ͽ������в�ͬ��

����Ϣ����Ȼ��Щ��ɫ���������ƺ������Դ���ɫ�����������˽���������壨���磬COLOR_BACKGROUND�������Ӵ����������������ɫ����������汾��Windows��ϵͳ��ɫ��ʹ�ñ�÷dz����ҡ���ǰ��Windows���Ӿ���Ҫ�Ƚ���򵥵öࡣʵ���ϣ���Windows 3.0��ǰ��ֻ������ǰ13��ϵͳ��ɫ��������ʹ�ÿ�����Խ��Խ���Կ��Ƶ�������ۣ����Ӧ��Ҳ��Ҫ�����ϵͳ��ɫ��

��ť��ɫ
��

����Ҫ������ɫ��ÿһ����ť��˵�����������ӵ����ԡ�COLOR_BTNFACE����춰�����Ҫ�ı�����ɫ���Լ�������ť��Ҫ�ı�����ɫ����Ҳ����춶Ի������ѶϢ�����ϵͳ��ɫ����COLOR_BTNSHADOW�����������������±ߡ��Լ���ȡ�����ڲ��͵�ѡ��ťԲ�����Ӱ����춰�����COLOR_BTNTEXT������������ɫ������������İ�ť����ʹ��COLOR_WINDOWTEXT��Ϊ������ɫ��������������ϵͳ��ɫ��춰�ť��Ƶĸ������֡�

��ˣ�������������ǵ���ʾ���������ʾ��ť����ôһ�ֱ�����ɫ��ͻ�ķ��������������Щϵͳ��ɫ�����ȣ��ڶ����Ӵ����ʱʹ��COLOR_BTNFACE��Ϊ����ʾ����ı�����ɫ��

wndclass.hbrBackground = (HBRUSH) (COLOR_BTNFACE + 1) ;

��������BTNLOOK��ʽ�г������ַ�������WNDCLASS�ṹ�е�hbrBackgroundֵ�����ֵʱ��Windows��������ʵ����ָ����һ��ϵͳ��ɫ����һ��ʵ�ʵĴ��š�WindowsҪ������WNDCLASS�ṹ��hbrBackground����ָ����Щʶ����ʱ����1����������Ŀ���Ƿ�ֹ��ֵΪNULL����û���κ�����Ŀ�ġ���������ڳ�ʽִ�й����У�ϵͳ��ɫǡ�÷����˱仯����ô��ʾ���򽫱����Ч����Windows��ʹ���µ�COLOR_BTNFACEֵ������������������������һ�����⡣����ʹ��TextOut��ʾ����ʱ��Windowsʹ�õ�����װ��������Ϊ������ɫ��������������ı�������������ɫ�����ֵ����Ԥ��ֵΪ��ɫ���������ͺ�ɫ�����֣���������ϵͳ��ɫ���Ӵ����ṹ�е�hbrBackground��λΪ��ֵ�����ԣ�����Ҫʹ��SetTextColor��SetBkColor�����ֺ����ֱ�������ɫ�ı�Ϊϵͳ��ɫ���������ڻ��װ�����ݴ���֮����ô����

SetBkColor (hdc, GetSysColor (COLOR_BTNFACE)) ;
SetTextColor (hdc, GetSysColor (COLOR_WINDOWTEXT)) ;

��������ʾ���򱳾������ֱ��������ֵ���ɫ���밴ť����ɫһ���ˡ����ǣ���������ij�ʽִ��ʱ��ʹ���߸ı���ϵͳ��ɫ��������Ҫ�ı����ֱ�����ɫ��������ɫ����ʱ������ʹ������ij�ʽ�룺

case 	WM_SYSCOLORCHANGE:
     	InvalidateRect (hwnd, NULL, TRUE) ;
     	break ;

WM_CTLCOLORBTNѶϢ
��

������Ѿ���������ν���ʾ�������ɫ��������ɫ���ڳɰ�ť�ı�����ɫ�������Ƿ���Խ���ʽ�а�ť����ɫ����Ϊ����ϲ������ɫ�أ�������û�����⣬����ʵ�����������������SetSysColors���ı䰴ť����ۿ��ܲ����������ģ����Ӱ��Ŀǰ��Windows��ִ�е����г�ʽ����Ҳ��ʹ���߲�̫ϲ���ġ�

���õķ�����ͬ��Ҳֻ�������ϣ��Ǵ���WM_CTLCOLORBTNѶϢ�����ǵ����Ӵ�����Ϊ����ʾ������ɫʱ���ɰ�ť������͸��丸�Ӵ�ѶϢ������ʽ��һ��ѶϢ�����Ӵ�������������������ı����Ӵ�ѶϢ������ʽ��������ɫ����ɫ����Windows��16λԪ�汾�У�һ����ΪWM_CTLCOLOR��ѶϢ��������еĿ�����������ÿ����̬�ı�׼������ֱ��֮�Բ�ͬ��ѶϢ����

�����Ӵ�ѶϢ������ʽ�յ�WM_CTLCOLORBTNѶϢʱ��wParamѶϢ�����ǰ�ť��װ�����ݴ��ţ�lParam�ǰ�ť���Ӵ����š������Ӵ�ѶϢ������ʽ�õ����ѶϢʱ����ť�������Ѿ����������װ�����ݡ��������Ӵ�ѶϢ������ʽ����һ��WM_CTLCOLORBTNѶϢʱ�������������������������

  • ʹ��SetTextColorѡ���趨һ��������ɫ��
    ��
  • ʹ��SetBkColorѡ���趨һ�����ֱ�����ɫ��
    ��
  • ��һ����ˢ���Ŵ��ظ����Ӵ���
    ��

�����ϣ����Ӵ�ʹ�øû�ˢ����ɫ��������������Ҫ�����ˢʱ����Ӧ�ø����������

������ʹ��WM_CTLCOLORBTN���������ڣ�ֻ�а�����ӵ���߻��ư�ť�Ÿ��丸�Ӵ�����WM_CTLCOLORBTN����ֻ��ӵ���߻��ư�ť�Ż��Ӧ���Ӵ�ѶϢ������ʽ��ѶϢ�Ĵ�������ʹ�û�ˢ����ɫ���������������û������ģ���Ϊ�������������ɸ��Ӵ����������ӵ���߻��ư�ť��

�ڱ������棬���ǽ�˵������ijЩ����£�һЩ�����WM_CTLCOLORBTN�������������̬�������ѶϢ����Ϊ���á�

ӵ���߻��ư�ť
��

�������԰�ť�����пɼ�����ʵ��ȫ����ƣ������뱻���̺ͻ���ѶϢ���������ţ���ô�����Խ���BS_OWNERDRAW��ʽ�İ�ť�����ʽ9-2��չʾ��������

 ï¿½ï¿½Ê½9-2  OWNDRAW
OWNDRAW.C
/*------------------------------------------------------------------------
   OWNDRAW.C --	Owner-Draw Button Demo Program
        					(c) Charles Petzold, 1996
-------------------------------------------------------------------------*/

#include <windows.h>

#define ID_SMALLER      					1
#define ID_LARGER       					2
#define BTN_WIDTH        			 	(	8 * cxChar)
#define BTN_HEIGHT       			 	(	4 * cyChar)

LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
HINSTANCE hInst ;
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
						PSTR szCmdLine, int iCmdShow)
{
     	static TCHAR 	szAppName[] = TEXT ("OwnDraw") ;
     	MSG          				msg ;
     	HWND         				hwnd ;
     	WNDCLASS     			wndclass ;
     
     	hInst = hInstance ;
     	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 		= (HBRUSH) GetStockObject (WHITE_BRUSH) ;
     	wndclass.lpszMenuName  		= szAppName ;
     	wndclass.lpszClassName 		= szAppName ;
     
     	if (!RegisterClass (&wndclass))
	{
          		MessageBox (	NULL, TEXT ("This program requires Windows NT!"),
                      							szAppName, MB_ICONERROR) ;
          		return 0 ;
     	}

     	hwnd = CreateWindow (	szAppName, TEXT ("Owner-Draw Button Demo"),
                         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 ;
}

void Triangle (HDC hdc, POINT pt[])
{
     	SelectObject (hdc, GetStockObject (BLACK_BRUSH)) ;
     	Polygon (hdc, pt, 3) ;
     	SelectObject (hdc, GetStockObject (WHITE_BRUSH)) ;
}

LRESULT CALLBACK WndProc (	HWND hwnd, UINT message, WPARAM wParam,LPARAM lParam)
{
     	static HWND   			hwndSmaller, hwndLarger ;
     	static int   				cxClient, cyClient, cxChar, cyChar ;
     	int       						cx, cy ;
     	LPDRAWITEMSTRUCT pdis ;
     	POINT    						pt[3] ;
     	RECT             						rc ;
     
     	switch (message)
     	{
     	case 	WM_CREATE :
          		cxChar = LOWORD (GetDialogBaseUnits ()) ;
          		cyChar = HIWORD (GetDialogBaseUnits ()) ;
          
               			// Create the owner-draw pushbuttons
          
          		hwndSmaller = CreateWindow (TEXT ("button"), TEXT (""),
                              WS_CHILD | WS_VISIBLE | BS_OWNERDRAW,
                               0, 0, BTN_WIDTH, BTN_HEIGHT,
                               hwnd, (HMENU) ID_SMALLER, hInst, NULL) ;
          
          		hwndLarger  = CreateWindow (TEXT ("button"), TEXT (""),
                              WS_CHILD | WS_VISIBLE | BS_OWNERDRAW,
                               0, 0, BTN_WIDTH, BTN_HEIGHT,
                               hwnd, (HMENU) ID_LARGER, hInst, NULL) ;
          		return 0 ;
          
     	case 	WM_SIZE :
          		cxClient = LOWORD (lParam) ;
          		cyClient = HIWORD (lParam) ;
               			// Move the buttons to the new center
          
          	MoveWindow	(	hwndSmaller, 	cxClient / 2 - 3 * 	BTN_WIDTH  / 2,
                                cyClient / 2 -  	BTN_HEIGHT / 2,
                      			BTN_WIDTH, BTN_HEIGHT, TRUE) ;
          		MoveWindow (	hwndLarger,	cxClient / 2 + 	BTN_WIDTH  / 2,cyClient / 2 -  BTN_HEIGHT / 2,
							BTN_WIDTH, BTN_HEIGHT, TRUE) ;
          		return 0 ;
          
     	case 	WM_COMMAND :
          		GetWindowRect (hwnd, &rc) ;
          
               				// Make the window 10% smaller or larger
          
          		switch (wParam)
          		{
          		case 	ID_SMALLER :
               				rc.left 	+= cxClient / 20 ;
               				rc.right	-= cxClient / 20 ;
               				rc.top 		+= cyClient / 20 ;
               				rc.bottom	-= cyClient / 20 ;
               				break ;
               
          		case 	ID_LARGER :
               				rc.left 	-= cxClient / 20 ;
               				rc.right	+= cxClient / 20 ;
               				rc.top 		-= cyClient / 20 ;
               				rc.bottom	+= cyClient / 20 ;
               				break ;
          	}
          
          		MoveWindow (	hwnd, rc.left, rc.top, rc.right  - rc.left,
                            							rc.bottom - rc.top, TRUE) ;
          		return 0 ;
          
     	case 	WM_DRAWITEM :
          		pdis = (LPDRAWITEMSTRUCT) lParam ;
               
               				// Fill area with white and frame it black
               
          		FillRect 		(pdis->hDC, &pdis->rcItem,
                    			(HBRUSH) GetStockObject (WHITE_BRUSH)) ;
               
          		FrameRect (	pdis->hDC, &pdis->rcItem,
                     			(	HBRUSH) GetStockObject (BLACK_BRUSH)) ;
               				// 			Draw inward and outward black triangles
          		cx = 		pdis->rcItem.right  - pdis->rcItem.left ;
          		cy = 		pdis->rcItem.bottom - pdis->rcItem.top  ;

          		switch (pdis->CtlID)
          		{
          		case 	ID_SMALLER :
               				pt[0].x = 3 * cx / 8 ;  pt[0].y = 1 * cy / 8 ;
               				pt[1].x = 5 * cx / 8 ;  pt[1].y = 1 * cy / 8 ;
               				pt[2].x = 4 * cx / 8 ;  pt[2].y = 3 * cy / 8 ;
                    
               				Triangle (pdis->hDC, pt) ;
                    
               				pt[0].x = 7 * cx / 8 ;  pt[0].y = 3 * cy / 8 ;
               				pt[1].x = 7 * cx / 8 ;  pt[1].y = 5 * cy / 8 ;
               				pt[2].x = 5 * cx / 8 ;  pt[2].y = 4 * cy / 8 ;
                    
               				Triangle (pdis->hDC, pt) ;
                    
               				pt[0].x = 5 * cx / 8 ;  pt[0].y = 7 * cy / 8 ;
               				pt[1].x = 3 * cx / 8 ;  pt[1].y = 7 * cy / 8 ;
               				pt[2].x = 4 * cx / 8 ;  pt[2].y = 5 * cy / 8 ;
                    
               				Triangle (pdis->hDC, pt) ;
                    
               				pt[0].x = 1 * cx / 8 ;  pt[0].y = 5 * cy / 8 ;
               				pt[1].x = 1 * cx / 8 ;  pt[1].y = 3 * cy / 8 ;
               				pt[2].x = 3 * cx / 8 ;  pt[2].y = 4 * cy / 8 ;
                    
               			Triangle (pdis->hDC, pt) ;
               			break ;
                    
          			case ID_LARGER :
               			pt[0].x = 5 * cx / 8 ;  pt[0].y = 3 * cy / 8 ;
               			pt[1].x = 3 * cx / 8 ;  pt[1].y = 3 * cy / 8 ;
               			pt[2].x = 4 * cx / 8 ;  pt[2].y = 1 * cy / 8 ;
                    
               			Triangle (pdis->hDC, pt) ;
                    
               			pt[0].x = 5 * cx / 8 ;  pt[0].y = 5 * cy / 8 ;
               			pt[1].x = 5 * cx / 8 ;  pt[1].y = 3 * cy / 8 ;
               			pt[2].x = 7 * cx / 8 ;  pt[2].y = 4 * cy / 8 ;
                    
               			Triangle (pdis->hDC, pt) ;
               			pt[0].x = 3 * cx / 8 ;  pt[0].y = 5 * cy / 8 ;
               			pt[1].x = 5 * cx / 8 ;  pt[1].y = 5 * cy / 8 ;
               			pt[2].x = 4 * cx / 8 ;  pt[2].y = 7 * cy / 8 ;
                    
               			Triangle (pdis->hDC, pt) ;
               			pt[0].x = 3 * cx / 8 ;  pt[0].y = 3 * cy / 8 ;
               			pt[1].x = 3 * cx / 8 ;  pt[1].y = 5 * cy / 8 ;
               			pt[2].x = 1 * cx / 8 ;  pt[2].y = 4 * cy / 8 ;
                    
               			Triangle (pdis->hDC, pt) ;
               			break ;
         		 }
               
               			// Invert the rectangle if the button is selected
               
          		if (pdis->itemState & ODS_SELECTED)
               				InvertRect (pdis->hDC, &pdis->rcItem) ;
               
               			// Draw a focus rectangle if the button has the focus
               
          		if (pdis->itemState & ODS_FOCUS)
          		{
               				pdis->rcItem.left  += cx / 16 ;
               				pdis->rcItem.top   += cy / 16 ;
               				pdis->rcItem.right -= cx / 16 ;
               				pdis->rcItem.bottom-= cy / 16 ;
                    
               				DrawFocusRect (pdis->hDC, &pdis->rcItem) ;
          		}
          		return 0 ;
               
   	case 	WM_DESTROY :
          		PostQuitMessage (0) ;
          		return 0 ;
     	}
     	return DefWindowProc (hwnd, message, wParam, lParam) ;
}

�ó�ʽ������ʾ��������������������ť����ͼ9-2��ʾ����ߵİ�ť���ĸ�������ָ��ť�����룬���¸ð�ťʱ���Ӵ��ijߴ罫��С10�����ұߵİ�ť���ĸ�����ָ�������Σ����´˰�ťʱ���Ӵ��ijߴ罫����10����

�����ֻ��Ҫ�ڰ�ť����ʾͼʾ�����ͼ����������BS_ICON��BS_BITMAP��ʽ������BM_SETIMAGEѶϢ�趨����ͼ�����ǣ����BS_OWNERDRAW��ʽ�İ�ť����������ȫ���ɵػ��ư�ť��


��

ͼ9-2 OWNDRAW��өĻ��ʾ

�ڴ���WM_CREATEѶϢ�����ڼ䣬OWNDRAW����������BS_OWNERDRAW��ʽ�İ�ť����ť�Ŀ�����ϵͳ�����8�����߶���ϵͳ�����4������ʹ��Ԥ�ȶ���õĵ���ͼ���ư�ťʱ����Щ�ߴ���VGA�Ͻ����İ�ťΪ64ͼ�ؿ�64ͼ�ظߣ�֪����Щ���Ͻ��dz����ã�����Щ��ť��δ�Ͷ�λ���ڴ���WM_SIZEѶϢ�����ڼ䣬ͨ������MoveWindow��ʽ��OWNDRAW����ťλ�÷�����ʾ��������ġ�

������Щ��ťʱ�����Ǿͻ����WM_COMMANDѶϢ��Ϊ�˴�����ЩWM_COMMANDѶϢ��OWNDRAW����GetWindowRect���������Ӵ�����ֻ����ʾ���򣩵�λ�úͳߴ�����RECT�����Σ��ṹ�У����λ��������өĻ�ġ�Ȼ�ᣬ���ݰ��µ�����߻����ұߵİ�ť��OWNDRAW����������νṹ�ĸ�����λֵ����ʽ��ͨ������MoveWindow������ȷ��λ�úͳߴ硣�⽫������һ��WM_SIZEѶϢ����ť�����¶�λ����ʾ��������롣

������dz�ʽ������ȫ����������ô����ȫ���ԣ�ֻ������ť�Dz��ɼ��ġ�ʹ��BS_OWNERDRAW��ʽ�����İ�ť������Ҫ������ɫ���κ�ʱ�������ĸ��Ӵ�����һ��WM_DRAWITEMѶϢ������������¼�������У�����ť������ʱ������ť�����»򱻷ſ�ʱ������ť�õ�����ʧȥ���뽹��ʱ���Լ�����ť��Ҫ������ɫ���κ�ʱ��

�ڴ���WM_DRAWITEMѶϢ�����ڼ䣬lParamѶϢ������ָ����̬DRAWITEMSTRUCT�ṹ��ָ�꣬OWNDRAW��ʽ�����ָ�괢����pdis�����У�����ṹ�����˻��ð�ťʱ��ʽ�������ѶϢ������ṹҲ�������Ի��嵥����͹��ܱ�ʹ�ã����԰�ť���Էdz���Ҫ�Ľṹ��λ��hDC ����ť��װ�����ݣ���rcItem���ṩ��ť�ߴ��RECT�ṹ����CtlID���������Ӵ�ID����itemState ����˵����ť�Ƿ񱻰��£����߰�ť�Ƿ�ӵ�����뽹�㣩��

����FillRect�ð�ɫ��ˢĨ����ť�����棬����FrameRect�ڰ�ť����Χ���Ϻڿ��ɴ�OWNDRAW��������WM_DRAWITEM�������̡�Ȼ�ᣬͨ������Polygon��OWNDRAW�ڰ�ť�ϻ���4����ɫʵ�ĵ������Ρ�����һ������Ρ�

�����ťĿǰ�����£���ôDRAWITEMSTRUCT��itemState��λ�е�ijλԪ������Ϊ1��������ʹ��ODS_SELECTED������������ЩλԪ�������ЩλԪ����������ôOWNDRAW��ͨ������InvertRect����ť��תΪ�෴����ɫ�������ťӵ�����뽹�㣬��ôitemState��ODS_FOCUSλԪ��������������������£�OWNDRAWͨ������DrawFocusRect���ڰ�ť�ı߽��ڻ�һ�����ߵľ��Ρ�

��ʹ��ӵ���߻��ư�ťʱ��Ӧ��ע�����¼������棺Windows���װ�����ݲ�������ΪDRAWITEMSTRUCT�ṹ��һ����λ������װ�����ݴ�����ҵ���ʱ������״̬���κα�ѡ��װ�����ݵ�GDI��������豻�ͷš����⣬���IJ�Ҫ�ڶ��尴ť�߽�ľ���������л��ơ�

��̬���
��

��CreateWindow��ʽ��ָ���Ӵ����Ϊ��static�������Ϳ��Խ�����̬���ֵ����Ӵ��������Щ���Ӵ��dz����ľ��������Ȳ����ջ����������룬Ҳ�����Ӵ�����WM_COMMANDѶϢ��

�����ھ�̬���Ӵ����ƶ����߰��»���ʱ��������Ӵ�������WM_NCHITTESTѶϢ����HTTRANSPARENT��ֵ���ظ�Windows���⽫ʹWindows�����²��Ӵ���ͨ�������ĸ��Ӵ���������ͬ��WM_NCHITTESTѶϢ�����Ӵ���������ѶϢ���ݸ�DefWindowProc�����������ת��Ϊ��ʾ����Ļ���ѶϢ��

ǰ������̬�Ӵ���ʽֻ�򵥵������Ӵ�����ʾ�����ڻ�һ�����λ��߱߿����±����ϲ�����RECT����̬��ʽ�����У�������ͼ���ľ�����ʽ��������FRAME����ʽ�����У���û������ͼ���ľ���������

SS_BLACKRECT

SS_GRAYRECT

SS_WHITERECT

SS_BLACKFRAME

SS_GRAYFRAME

SS_WHITEFRAME

��BLACK������GRAY������WHITE��������ζ���ڡ��ҺͰ�ɫ����Щ��ɫ����ϵͳ��ɫ�����ģ����9-4��ʾ��

��9-4
��̬������ ϵͳ��ɫ
BLACK COLOR_3DDKSHADOW
GRAY COLOR_BTNSHADOW
WHITE COLOR_BTNHIGHLIGHT

����Щ��ʽ��CreateWindow�����е��Ӵ�������λ�����ԡ����ε����Ͻǿ�ʼ�xλ�������yλ�����꣬��Щ���궼���춸��Ӵ�����Ҳ����ʹ��SS_ETCHEDHORZ��SS_ETCHEDVERT����SS_ETCHEDFRAME �����û�ɫ�Ͱ�ɫ����һ��������Ӱ�ı߿�

��̬���Ҳ����������������ʽ��SS_LEFT��SS_RIGHT��SS_CENTER�����ǽ�������롢���Ҷ���;������֡�������CreateWindow���е��Ӵ����ֲ����и��������������������SetWindowText���ı���������̬��������Ӵ�ѶϢ������ʽ��ʾ����ʱ����ʹ��DrawText��ʽ�Լ�DT_WORDBREAK��DT_NOCLIP��DT_EXPANDTABS���������������Ӵ��ľ����ڿ��԰����ֽ��л��С�

������������ʽ���Ӵ��ı���ͨ��ΪCOLOR_BTNFACE�������ֱ�����COLOR_WINDOWTEXT��������WM_CTLCOLORSTATICѶϢʱ��������ͨ������SetTextColor���ı�������ɫ��ͨ��SetBkColor���ı䱳����ɫ�������ر�����ˢ���š������COLORS1��ʽչʾ����һ�㡣

���ᣬ��̬��𻹰������Ӵ���ʽSS_ICON��SS_USERITEM�����ǵ����DZ��������Ӵ�������ʱȴû���κ����塣���������۶Ի�����ʱ��Ҫ�ἰ���ǡ�

���������
��

���ڵ������״������˾����У�Ҳ�����ˡ��Ӵ������С��͡������п����֮���һЩ����SYSMETS��ʽʹ���Ӵ������У����������Ӵ����ұߺ͵ײ����������ڽ����Ӵ�ʱͨ����ʶ����WS_VSCROLL��WS_HSCROLL�������߶��������Ӵ���ʽ�У����Ӵ����Ͼ����С���������׼������һЩ�����п�������������ڸ��Ӵ�����ʾ������κεط����ֵ����Ӵ���������ʹ��Ԥ�ȶ�����Ӵ����scrollbar���Լ�������������ʽSBS_VERT��SBS_HORZ�е�һ�����������Ӵ������п����

�밴ť������Լ������������۵ı༭���嵥����������ͬ�������п�������Ӵ�����WM_COMMANDѶϢ���������Ӵ���������������WM_VSCROLL��WM_HSCROLLѶϢ���ڴ�������ѶϢʱ��������ͨ��lParam�����������Ӵ�������������п���������Ӵ���������ֵΪ0����춾����п�������ֵΪ�������Ӵ����š����Ӵ������к;����п�������˵��wParam�����ĸ�����͵�����ĺ�����ͬ��

��Ȼ�Ӵ��������й̶��Ŀ��ȣ�Windowsʹ��CreateWindow�����У������������MoveWindow�����У������ľ��γߴ���ȷ�������п�����ijߴ硣�����Խ���ϸ�����ľ����п����Ҳ���Խ����̶��ֵľ����п����

������뽨�����Ӵ������гߴ���ͬ�ľ����п������ô����ʹ��GetSystemMetricsȡ��ˮƽ�����еĸ߶ȣ�

GetSystemMetrics (SM_CYHSCROLL) ;

���ߴ�ֱ�����еĿ��ȣ�

GetSystemMetrics (SM_CXVSCROLL) ;

����Windows�ļ��������д���ʽʶ����SBS_LEFTALIGN��SBS_RIGHTALIGN��SBS_TOP ALIGN��SBS_BOTTOMALIGN���������еı�׼�ߴ磬������Щ��ʽֻ�ڶԻ������жԾ�������Ч��

���Ӵ������У�������ʹ��ͬ���ĺ��������������п�����ķ�Χ��λ�ã�

SetScrollRange (hwndScroll, SB_CTL, iMin, iMax, bRedraw) ;
SetScrollPos (hwndScroll, SB_CTL, iPos, bRedraw) ;
SetScrollInfo (hwndScroll, SB_CTL, &si, bRedraw) ;

��������춣��Ӵ������н����Ӵ��Ĵ�����Ϊ��һ��������������SB_VERT����SB_HORZ��Ϊ�ڶ���������

���˳Ծ����ǣ���ΪCOLOR_SCROLLBAR��ϵͳ��ɫ������춾����С����˵İ�ť��С�������ɫ��COLOR_BTNFACE��COLOR_BTNHILIGHT��COLOR_BTNSHADOW��COLOR_BTNTEXT �����С��ͷ����COLOR_DKSHADOW��COLOR_BTNLIGHT���������˰�ť֮���������ɫ��COLOR_BTNFACE��COLOR_BTNHIGHLIGHT������

�����������WM_CTLCOLORSCROLLBARѶϢ����ô������ѶϢ�����д��ػ�ˢ��ȡ������ɫ������������һ�¡�

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[i] = CreateWindow (TEXT ("scrollbar"), NULL,
                                WS_CHILD | WS_VISIBLE | 
                                WS_TABSTOP | SBS_VERT,
                               	0, 0, 0, 0, 
                hwnd, (HMENU) i, hInstance, NULL) ;
               
               		SetScrollRange (hwndScroll[i], SB_CTL, 0, 255, FALSE) ;
               		SetScrollPos   (hwndScroll[i], SB_CTL, 0, FALSE) ;
               
       // The three color-name labels have IDs 3, 4, and 5, 
      // and text strings "Red", "Green", and "Blue".
               
     	hwndLabel [i] = CreateWindow (TEXT ("static"), zColorLabel[i],
                                      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 [i] = CreateWindow (TEXT ("static"), TEXT ("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_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[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) ;
          		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[i] += 15 ;
                            // fall through
          		case 	SB_LINEDOWN :
               				color[i] = min (255, color[i] + 1) ;
               				break ;
               
          		case 	SB_PAGEUP :
               				color[i] -= 15 ;
                            // fall through
          		case 	SB_LINEUP :
               				color[i] = max (0, color[i] - 1) ;
               				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 ;
          		}
          		SetScrollPos  (hwndScroll[i], SB_CTL, color[i], TRUE) ;
          		wsprintf (szBuffer, TEXT ("%i"), color[i]) ;
          		SetWindowText (hwndValue[i], 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[i] ;
               
     	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[i]) ;
               
          		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ѶϢ����ɫ��̬���֡�

������ʹ�û�����߼�����Ų�������У��Ӷ�����COLORS1��Ϊһ��ʵ����ɫ��ʾ�Ŀ������ߣ�Ϊ���Լ���Windows��ʽѡ��Ư������ɫ�����ߣ������ܸ�ϲ���ѿ�����ɫ����COLORS1����ʾ��ͼ9-3��ʾ�����ҵ��ǣ���Щ��ɫ��ӡ��ֽ�ϱ���ʾΪ��ͬ��dz�Ļ�ɫ��


��

ͼ9-3 COLORS1��өĻ��ʾ

COLORS1������WM_PAINTѶϢ�����еĹ����������������Ӵ���ɵġ�

��ʾ�����Ұ벿��ʾ����ɫʵ�������Ӵ��ı�����ɫ��SS_WHITERECT��ʽ�ľ�̬���Ӵ���ʾ����ʾ�������벿��������������SBS_VERT��ʽ�����Ӵ���������DZ���λ��SS_WHITERECT���Ӵ��Ķ�������������SS_CENTER��ʽ���������֣��ľ�̬���Ӵ��ṩ��ǩ����ɫֵ��COLORS1��WinMain��ʽ����CreateWindow����������ͨ�ص�ʽ�Ӵ���10�����Ӵ���SS_WHITERECT��SS_CENTER��̬�Ӵ�ʹ���Ӵ����static��������������ʹ���Ӵ����scrollbar����

CreateWindow�����е�xλ�á�yλ�á����Ⱥ͸߶Ȳ��������Ϊ0����Ϊλ�úʹ�С��ȡ�����ʾ����ijߴ磬����Ŀǰ��δȷ����COLORS1���Ӵ�ѶϢ������ʽ�ڽ��յ�WM_SIZEѶϢʱ����ʹ��MoveWindow��10�����Ӵ�����ȷ����С�����ԣ�ÿ������COLORS1�Ӵ���������ʱ�������еijߴ�ͻᰴ�����仯��

��WndProc�Ӵ�ѶϢ������ʽ�յ�WM_VSCROLLѶϢʱ��lParam�����ĸ�����������Ӵ��Ĵ��š����ǿ���ʹ��GetWindowWord���õ����Ӵ���ID��

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

��������������У������Ѿ���ϰ�߽���ID��Ϊ0��1��2������WndProc����������ĸ��������ڲ���ѶϢ��

������Ӵ��Ĵ����ڽ���ʱ�ͱ������������У�����WndProc���ܶ����Ӧ�ľ�����ѶϢ���д�������ͨ������SetScrollPos���趨���Ӧ����ֵ��

SetScrollPos (hwndScroll[i], SB_CTL, color[i], TRUE) ;

WndProcҲ�ı�����еײ����Ӵ������֣�

wsprintf (szBuffer, TEXT ("%i"), color[I]) ;
SetWindowText (hwndValue[i], szBuffer) ;

�Զ����̽���
��

�����п�����Ҳ�ܴ����������룬����ֻ����ӵ�����뽹��ʱ���С��±�˵�������������α��ת��Ϊ����ѶϢ��

��9-5
�α�� ����ѶϢ��wParamֵ
Home SB_TOP
End SB_BOTTOM
Page Up SB_PAGEUP
Page Down SB_PAGEDOWN
����� SB_LINEUP
�һ��� SB_LINEDOWN

��ʵ�ϣ�SB_TOP��SB_BOTTOM����ѶϢֻ���ü��̲�������ʹ�û��󰴶�������ʱ�������ʹ�þ����л�����뽹�㣬��ô�����뽫WS_TABSTOPʶ���ְ�����CreateWindow���е��Ӵ��������С���������ӵ�����뽹��ʱ���ڸþ����е�С�����Ͻ���ʾһ����˸�Ļ�ɫ�顣

Ϊ�˸��������ṩȫ��ļ��̽��棬����Ҫ����һЩ���������ȣ�WndProc�Ӵ�ѶϢ������ʽ����ʹ������ӵ�����뽹�㣬����ͨ������WM_SETFOCUSѶϢ�������һ��ģ���WM_SETFOCUSѶϢ�ǵ������л�����뽹��ʱ�丸�Ӵ����յ��ġ�WndProc������һ���������趨���뽹�㡣

SetFocus (hwndScroll[idFocus]) ;

����idFocus��һ�����������

���ǣ�����ҪһЩ��������������Tab��������һ��������ת������һ�������еķ�������Ƚ����ѣ���Ϊһ��ij��������ӵ�������뽹�㣬���ʹ������еļ������룬��������ֻ�����α����������Tab���������һ���Ѵ����ķ����ǡ��Ӵ�����𻯡������ǽ���������COLORS1����ʹ��Tab����һ��������������һ�������еĹ��ܡ�

�Ӵ�����𻯣�Window Subclassing��
��

�����п�������Ӵ�ѶϢ������ʽ��Windows�ڲ��ġ����ǣ���GWL_WNDPROCʶ������Ϊ����������GetWindowLong�����Ϳ��Եõ�����Ӵ�ѶϢ������ʽ��λַ�����⣬�����Ժ���SetWindowLong���þ������趨һ���µ��Ӵ�ѶϢ������ʽ����������������Ӵ�����𻯡����dz����á������������ִ���Ӵ�ѶϢ������ʽ�趨���ҹ������Ա����Լ��ij�ʽ�д���һЩѶϢ��ͬʱ����������ѶϢ���ݸ��ɵ��Ӵ�ѶϢ������ʽ��

��COLORS1�жԾ���ѶϢ���г����������Ӵ�ѶϢ������ʽ����ScrollProc������COLORS1.C������β�������ScrollProc��COLORS1�еĺ�ʽ����Windows������COLORS1������ScrollProc���뱻����Ϊcallback��ʽ��

�������������е�ÿһ����COLORS1ʹ��SetWindowLong���趨�µľ������Ӵ�ѶϢ������ʽ��λַ����ȡ���ִ�������Ӵ�ѶϢ������ʽ��λַ��

OldScroll[i] = (WNDPROC) SetWindowLong (hwndScroll[i], GWL_WNDPROC,
          (LONG) ScrollProc)) ;

���ڣ���ʽScrollProc�õ���Windows���͵�COLORS1�����������У���Ȼ����������ʽ�еľ����У��ľ������Ӵ�ѶϢ������ʽ��ȫ��ѶϢ��ScrollProc�Ӵ�ѶϢ������ʽ�ڽ��յ�Tab����Shift-Tab��ʱ���ͽ����뽹��ı䵽��һ����������һ���������С���ʹ��CallWindowProc���оɵľ������Ӵ�ѶϢ������ʽ��

��������ɫ
��

��COLORS1���������Ӵ����ʱ��ҲΪ����ʾ���򱳾�������һ��ʵ�ĵĺ�ɫ��ˢ��

wndclass.hbrBackground = CreateSolidBrush (0) ;

�����ı�COLORS1�ľ������趨ʱ����ʽ���뽨��һ���µĻ�ˢ���������»�ˢ���ŷ����Ӵ����ṹ�С���ͬʹ��GetWindowLong��SetWindowLong�ܵõ����趨�������Ӵ�ѶϢ������ʽһ������GetClassWord��SetClassWord�ܵõ������ˢ�Ĵ��š�

�����Խ����µĻ�ˢ��������Ų����Ӵ����ṹ�У�Ȼ��ɾ���ɵĻ�ˢ��

DeleteObject ((HBRUSH)
     	SetClassLong (hwnd, GCL_HBRBACKGROUND, (LONG)
          		CreateSolidBrush (RGB (color[0], color[1], color[2])))) ;

Windows��һ������Ϊ�Ӵ��ı�����ɫʱ����ʹ������»�ˢ��Ϊ��ǿ��WindowsĨ�����������ǽ�ʹ������ʾ������Ч��

InvalidateRect (hwnd, &rcColor, TRUE) ;

TRUE�����㣩ֵ��Ϊ��������������ʾϣ����������ɫ֮ǰɾȥ������

InvalidateRectʹWindows���Ӵ�ѶϢ������ʽ��ѶϢ�����зŽ�һ��WM_PAINTѶϢ�����WM_PAINTѶϢ�����ȵȼ��Ƚϵͣ����ԣ����������ʹ�û�������α���ƶ������еĻ������ѶϢ�����������������������������ɫ�ı�֮��ʹ���Ӵ�����������µģ�Ŀǰ�ģ�����ô��������InvalidateRect֮�����������������

UpdateWindow (hwnd) ;

�����ʹ�ü��̺ͻ�����������

COLORS1�е�WndProc��ʽ������WM_PAINTѶϢ�����ǽ��䴫��DefWindowProc��Windows��WM_PAINTѶϢ���ڶ�����ֻ�Ǻ���BeginPaint��EndPaintʹ�Ӵ���Ч����Ϊ��InvalidateRect�������Ѿ�ָ������Ҫ��Ĩ��������BeginPaint����ʹWindows����һ��WM_ERASEBKGND��ɾ��������ѶϢ��WndProcҲ���������ѶϢ��Windows���Ӵ������ָ���Ļ�ˢ����ʾ����ı���Ĩȥ�������ʹ��������ѶϢ��

����ֹ��ǰ�����������һ�������⣬����ڴ���WM_DESTROYѶϢ�����ڼ䣬��һ�κ���DeleteObject��

DeleteObject ((HBRUSH)
     	SetClassLong (hwnd, GCL_HBRBACKGROUND,
          		(LONG) GetStockObject (WHITE_BRUSH))) ;

�������к;�̬������ɫ
��

��COLORS1�У����������е��ڲ�������������λ�е�������ɫΪ�졢�̺���ɫ�������е���ɫ��ͨ������WM_CTLCOLORSCROLLBARѶϢ����ɵġ�

��WndProc�У�����Ϊ��ˢ������һ��������������ɵľ�̬���У�

static HBRUSH hBrush [3] ;

�ڴ���WM_CREATE�ڼ䣬���ǽ���������ˢ��

for (I = 0 ; I < 3 ; I++)
     hBrush[0] = CreateSolidBrush (crPrim [I]) ;

����crPrim�����а�������ԭɫ��RGBֵ����WM_CTLCOLORSCROLLBAR�����ڼ��Ӵ�ѶϢ������ʽ����������ˢ�е�һ����

case 	WM_CTLCOLORSCROLLBAR:
     	i = GetWindowLong ((HWND) lParam, GWL_ID) ;
     	return (LRESULT) hBrush [i] ;

�ڴ���WM_DESTROYѶϢ�Ĺ����У���Щ��ˢ���뱻ɾ����

for 	(i = 0 ; i < 3 ; i++)
     	DeleteObject (hBrush [i])) ;

ͬ���أ���̬������λ�е��������ڴ���WM_CTLCOLORSTATICѶϢ�к���SetTextColor����ɫ�ġ����ֱ�����SetBkColor��ʽ�趨Ϊϵͳ��ɫCOLOR_BTNHIGHLIGHT���⵼�����ֱ�����ɫ�;���������������ľ�̬���ο��������ɫһ������춾�̬���ֿ�����������ֱ�����ɫֻ����ִ���ÿ����Ԫ����ľ��Σ���������������������Ӵ���Ϊ��ʵ����һ�㣬�Ӵ�ѶϢ������ʽ�����봫��COLOR_BTNHIGHLIGHT��ɫ��ˢ�Ĵ��š������ˢ����ΪhBrushStatic������WM_CREATEѶϢ�����ڼ佨������WM_DESTROYѶϢ�����ڼ������

��WM_CREATEѶϢ�����ڼ�����COLOR_BTNHIGHLIGHT��ɫ������ˢ��������ִ���ڼ�ʹ����һ��ˢʱ������������һ��С���⡣�����ʽ��ִ���ڼ�ı���COLOR_BTNHIGHLIGHT��ɫ����ô��̬���ε���ɫ�������仯���������ֱ�������ɫҲ��仯�����������Ӵ����������������������ԭ�е�COLOR_BTNHIGHLIGHT��ɫ��

Ϊ�˽��������⣬COLORS1Ҳ�򵥵�ͨ��ʹ������ɫ���½���hBrushStatic������WM_SYSCOLORCHANGEѶϢ��

�༭���
��

��ijЩ���棬�༭�������򵥵�Ԥ�ȶ����Ӵ��������һ���棬��������ӵ��Ӵ���𡣵���ʹ��������ơ�edit���������Ӵ�ʱ��������CreateWindow�����е�xλ�á�yλ�á����Ⱥ͸߶���Щ����������һ�����Ρ��˾��κ��пɱ༭���֡������Ӵ�������ӵ�����뽹��ʱ���������������֣��ƶ��α꣬ʹ�û������Shift����һ���α����ѡȡ�������֣���Ctrl-X��ɾ����ѡ���ֻ�Ctrl-C��������ѡ���֡����͵��������ϣ���Ctrl-V������������ϵ����֡�

�༭���������򵥵�Ӧ��֮һ����Ϊ�����������򡣵��DZ༭�����������춵��У���һ���ҽ��ڳ�ʽ9-4 POPPAD1��˵�������������Ȿ�����������ĸ�����������һ���� POPPAD��ʽ������ǿ��ʹ�ù��ܱ����Ի�����(�����봢�浵��)����ӡ������İ汾����һ���򵥶����������ֱ༭���������ʽ�뽫�dz���ࡣ

 ï¿½ï¿½Ê½9-4  POPPAD1
POPPAD1.C
/*---------------------------------------------------------------------------
   POPPAD1.C -- Popup Editor using child window edit box
					(c) Charles Petzold, 1998
---------------------------------------------------------------------------*/

#include <windows.h>
#define ID_EDIT     1

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

TCHAR szAppName[] = TEXT ("PopPad1") ;

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                    	PSTR szCmdLine, int iCmdShow)
{
     	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 			= (HBRUSH) GetStockObject (WHITE_BRUSH) ;
     	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, szAppName,
                        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 hwndEdit ;
     	switch (message)
     	{
     	case 	WM_CREATE :
          		hwndEdit = CreateWindow (TEXT ("edit"), NULL,
                WS_CHILD | WS_VISIBLE | WS_HSCROLL | WS_VSCROLL |
                WS_BORDER | ES_LEFT | ES_MULTILINE |
                ES_AUTOHSCROLL | ES_AUTOVSCROLL,
                0, 0, 0, 0, hwnd, (HMENU) ID_EDIT,
                ((LPCREATESTRUCT) lParam) -> hInstance, NULL) ;
          		return 0 ;
          
     	case 	WM_SETFOCUS :
          		SetFocus (hwndEdit) ;
          		return 0 ;
          
     	case 	WM_SIZE : 
          	MoveWindow (hwndEdit, 0, 0, LOWORD (lParam), HIWORD (lParam), TRUE) ;
          		return 0 ;
          
     	case 	WM_COMMAND :
          		if (LOWORD (wParam) == ID_EDIT)
                if (HIWORD (wParam) == EN_ERRSPACE || 
                    HIWORD (wParam) == EN_MAXTEXT)
		MessageBox (hwnd, TEXT ("Edit control out of space."),
                    szAppName, MB_OK | MB_ICONSTOP) ;
          		return 0 ;
               
     	case 	WM_DESTROY :
          		PostQuitMessage (0) ;
          		return 0 ;
     	}
     	return DefWindowProc (hwnd, message, wParam, lParam) ;
}

POPPAD1��һ�����б༭����ֻ��û�е���I/O������C����ԭʼ�벻��100�У���������һ��ȱ�ݣ���Ԥ�ȶ���Ķ��б༭������ֻ���30,000��Ԫ�����֣��������Կ�����POPPAD1������û�������ٹ�����Ԥ�ȶ���ı༭��������������๤����������������֪�����������ij�ʽʱ�༭����������Щʲô��

�༭�����ʽ
��

��ǰ�����ᵽ�ģ���CreateWindow�����н���edit����Ϊ�Ӵ��������һ���༭������Ӵ���ʽ��WS_CHILD���ϼ���ѡ���ͬ�ھ�̬���Ӵ���������һ�����༭�������е����ֿ���������롢���Ҷ�����߾��У���ʹ���Ӵ���ʽES_LEFT��ES_RIGHT��ES_CENTER��ָ����Щ��ʽ��

�ڶ�״̬�£��༭�������ǵ��еġ���ʹ��ES_MULTILINE�Ӵ���ʽ���Խ������б༭�������춵��б༭�������һ��ֻ�����ڱ༭��������ε�β���������֡�Ҫ����һ���Զ�ˮƽ�����ı༭����������Բ�����ʽES_AUTOHSCROLL����һ�����б༭��������ֻ��Զ����У�����ʹ��ES_AUTOHSCROLL��ʽ������������£������밴Enter������ʼ�µ�һ�С��������Ա�����ʽES_AUTOVSCROLL������ֱ�����а����ڶ��б༭�������С�

�����ڶ��б༭�������а�����Щ������ʽʱ��Ҳ��������༭���������Ӿ����С�Ҫ������Щ�����ԶԷ����Ӵ�ʹ��ͬһ�Ӵ���ʽʶ����WS_HSCROLL��WS_VSCROLL���ڶ�״̬�£��༭������û�б߽磬������ʽWS_BORDER��������ӱ߽硣

�����ڱ༭��������ѡ������ʱ��Windows��ѡ������ַ�����ʾ�����ǵ��༭������ʧȥ���뽹��ʱ����ѡ������ֽ����ٱ����������ϣ���ڱ༭������û�����뽹��ʱ��ѡ���������Ȼ��������������ʹ����ʽES_NOHIDESEL��

��POPPAD1������༭������ʱ��CreateWindow������������ʽ������ʽ��

WS_CHILD | WS_VISIBLE | WS_HSCROLL | WS_VSCROLL |
     	WS_BORDER | ES_LEFT | ES_MULTILINE |
    	ES_AUTOHSCROLL | ES_AUTOVSCROLL

��POPPAD1�У��༭������Ĵ�С��������WndProc���յ�WM_SIZEѶϢʱͨ������MoveWindow������ġ��༭������ijߴ类�򵥵��趨Ϊ���Ӵ��ijߴ磺

MoveWindow (hwndEdit, 0, 0, LOWORD (lParam),
                            	HIWORD (lParam), TRUE) ;

��춵��б༭�����������ĸ߶ȱ����������һ����Ԫ������༭�������б߽磨��������У�����ôʹ��һ����Ԫ�߶ȵ�1.5���������ⲿ��ࣩ��

�༭������֪ͨ
��

�༭����������Ӵ�ѶϢ������ʽ����WM_COMMANDѶϢ���԰�ť��������˵��wParam��lParam�����ĺ�������ͬ�ģ�

LOWORD (wParam)

HIWORD (wParam)

lParam

���Ӵ�ID

֪ͨ��

���Ӵ�����

֪ͨ��������ʾ��

EN_SETFOCUS

EN_KILLFOCUS

EN_CHANGE

EN_UPDATE

EN_ERRSPACE

EN_MAXTEXT

EN_HSCROLL

EN_VSCROLL

�༭�������Ѿ�������뽹��

�༭�������Ѿ�ʧȥ���뽹��

�༭����������ݽ��ı�

�༭������������Ѿ��ı�

�༭������ִ���Ѿ������м�

�༭�������ڲ���ʱִ�г����ռ�

�༭�������ˮƽ�������Ѿ�������

�༭������Ĵ�ֱ�������Ѿ�������

POPPAD1ֻ����EN_ERRSPACE��EN_MAXTEXT֪ͨ�룬����ʾһ��ѶϢ���顣

ʹ�ñ༭������
��

������������Ӵ���ʹ���˼������б༭�������ô����Ҫ���Ӵ�������Ա�����뽹���һ��������ת�Ƶ���һ�������������ͨ������Tab����Shift-Tab������������ƶ����dz���COLORS1�������ģ��Ӵ�����𻯵���һ�������������HEAD��ʽ��˵��������δ���Enter��ȡ�������������Tab������ʹ�ã�Ҳ���Ե��ɸ���ʽ���źţ���ʾ���еı༭��λ��׼�����ˡ�

��������ڱ༭���в������֣���ô����ʹ��SetWindowText�������������ִӱ༭��������ȡ���漰��GetWindowTextLength��GetWindowText�����ǽ���POPPAD��ʽ���޶��汾�п�����Щ������ʵ����

���͸��༭�������ѶϢ
��

��Ϊ��SendMessage���͸��༭�������ѶϢ�ܶ࣬�������еļ�������������POPPAD�޶��汾���õ����������ﲻ��˵������SendMessage���͸��༭�������ѶϢ��ֻ��Ҫ��˵��һ�¡�

��ЩѶϢ���������¡����ƻ������Ŀǰ��ѡ������֡�ʹ����ʹ�û������Shift�������α���������ѡ�����ֲ���������IJ������������ڱ༭��������ѡ�е����ֽ���������

SendMessage (hwndEdit, WM_CUT, 0, 0) ;
SendMessage (hwndEdit, WM_COPY, 0, 0) ;
SendMessage (hwndEdit, WM_CLEAR, 0, 0) ;

WM_CUT��Ŀǰѡ������ִӱ༭�����������ߣ������䷢�͵��������У�WM_COPY��ѡ������ָ��Ƶ��������ϲ����ֱ༭�������е������������WM_CLEAR��ѡ������ݴӱ༭��������ɾ�������Dz���������з��͡�

��Ҳ���Խ��������ϵ����ֲ��뵽�༭�������е��α�λ�ã�

SendMessage (hwndEdit, WM_PASTE, 0, 0) ;

������ȡ��Ŀǰѡ�����ʼλ�ú�ĩβλ�ã�

SendMessage (hwndEdit, EM_GETSEL, (WPARAM) &iStart, 
                                  	(LPARAM) &iEnd) ;

����λ��ʵ����������һ��ѡ����Ԫ��λ�ü�1��

������ѡ�����֣�

SendMessage (hwndEdit, EM_SETSEL, iStart, iEnd) ;

��������ʹ�ñ���������û�Ŀǰ��ѡ�����ݣ�

SendMessage (hwndEdit, EM_REPLACESEL, 0, (LPARAM) szString) ;

�Զ��б༭�����������ȡ��������

iCount = SendMessage (hwndEdit, EM_GETLINECOUNT, 0, 0) ;

���κ��ض����У�������ȡ�þ���༭���������ֿ�ͷ��ƫ������

iOffset = SendMessage (hwndEdit, EM_LINEINDEX, iLine, 0) ;

������0��ʼ���㣬iLineֵΪ-1ʱ���ذ����α������е�ƫ������������ȡ���еij��ȣ�

iLength = SendMessage (hwndEdit, EM_LINELENGTH, iLine, 0) ;

�����б������Ƶ�һ���������У�

iLength = SendMessage (hwndEdit, EM_GETLINE, iLine, (LPARAM) szBuffer) ;

�嵥�������
��

���ڱ������۵�����һ��Ԥ�ȶ������Ӵ����������嵥���顣һ���嵥�������ִ��ļ��ϣ���Щ�ִ���һ�������п��Ծ�����ʾ���嵥������ʽͨ�����嵥�����Ӵ�ѶϢ������ʽ����ѶϢ���������嵥�����ӻ���ɾ���ִ������嵥�����е�ij�ѡ��ʱ���嵥�������������丸�Ӵ�����WM_COMMANDѶϢ�����Ӵ�Ҳ�Ϳ���ȷ��ѡ�������һ�

һ���嵥��������ǵ�ѡ�ģ�Ҳ�����Ƕ�ѡ�ģ���������ʹ���ߴ��嵥������ѡ������Ŀ�����嵥����ӵ�����뽹��ʱ��������Ŀ����Χ��ʾ�����ߡ����嵥�����У��α�λ�ò���ָ����ѡ�����Ŀ����ѡ�����Ŀ��������ʾ�������Ƿ�����ʾ�ġ�

�ڵ���ѡ����嵥�����У�ʹ���߰�Spacebar���Ϳ���ѡ���α�����λ�õ���Ŀ��������ƶ��α��Ŀǰѡ��ָʾ�������ܹ������嵥��������ݡ�Page Up��Page Down��Ҳ�ܹ����嵥���飬�����ƶ������α������ѡ��ָʾ������ĸ���ܽ��α��ѡ��ָʾ�Ƶ��Դ���ĸ��ͷ�ĵ�һ��������һ����ѡ�Ҳ����ʹ�û�����Ҫѡ�����Ŀ�ϵ�������˫����ѡ������

�ڶ���ѡ���嵥�����У�Spacebar�������л��α�����λ�õ���Ŀ��ѡ��״̬����������Ѿ���ѡ����ȡ��ѡ�񣩡���ͬ�ڵ���ѡ���嵥������һ���������ȡ��ǰ��ѡ�������Ŀ�������ƶ��α��ѡ��ָʾ�����ǣ�Ctrl���ͷ�����ܹ����ƶ��α��ͬʱ���ƶ�ѡ��Shift���ӷ��������չһ��ѡ��

�ڶ���ѡ���嵥�����У���������˫�����󰴼���ȡ��֮ǰ���е�ѡ�񣬶�ѡ�񱻵��е���Ŀ�����ǣ�����ڻ������ijһ���ͬʱҲ����Shift������ֻ���л������ѡ��״̬��������ı��κ��������ѡ��״̬��

�嵥������ʽ
��

����ʹ��CreateWindow�����嵥�������Ӵ�ʱ����Ӧ�ý���listbox����Ϊ�Ӵ���𣬽�WS_CHILD��Ϊ�Ӵ���ʽ�����ǣ�����ڶ��嵥������ʽ�����丸�Ӵ�����WM_COMMANDѶϢ������һ������ʽ�������嵥����ѯ�����е���Ŀ��ѡ��״̬������춷��͸��嵥����������ѶϢ�������ԣ��嵥���������ͨ���������嵥������ʽʶ����LBS_NOTIFY�����������Ӵ����������嵥�����WM_COMMANDѶϢ�������ϣ���嵥�����������嵥�����е���Ŀ����������ô������ʹ����һ�ֳ��õ���ʽLBS_SORT��

�ڶ�����£��嵥�����ǵ���ѡ��ġ�����ѡ����嵥�����൱�١�������뽨��һ������ѡ���嵥���飬��ô������ʹ����ʽLBS_MULTIPLESEL��ͨ���������о����е��嵥������������Ŀʱ���嵥���鱾�����Լ��ػ���������ͨ������ʽLBS_NOREDRAW������ȥ����ֹ�������󡣵�����Ҳ������ʹ��������ʽ����ʱ����ʹ��WM_SETREDRAWѶϢ����ʱ��ֹ�嵥������������»������ҽ�����������WM_SETREDRAWѶϢ��

�ڶ�״̬�£��嵥�����Ӵ�ѶϢ������ʽֻ��ʾ�б���Ŀ��������Χû���κα߽硣������ʹ���Ӵ���ʽʶ����WS_BORDER�����ϱ߽硣���⣬������ʹ���Ӵ���ʽʶ����WS_VSCROLL�����Ӵ�ֱ�����У��Ա��û����������б���Ŀ��

Windows��ͷ����������һ���嵥������ʽ������LBS_STANDARD������������õ���ʽ���䶨�����£�

(LBS_NOTIFY | LBS_SORT | WS_VSCROLL | WS_BORDER)

��Ҳ���Բ���WS_SIZEBOX��WS_CAPTIONʶ���֣�����������ʶ�������������¶����嵥����Ĵ�С��Ҳ���������嵥���鸸�Ӵ�����ʾ�������ƶ��嵥���顣

�嵥����Ŀ���Ӧ���ܹ�������ִ��Ŀ��ȼ��Ͼ����еĿ��ȡ�������ʹ�ã�

GetSystemMetrics (SM_CXVSCROLL) ;

����ô�ֱ�����еĿ��ȡ�����һ����Ԫ�ĸ߶ȳ�����Ҫ���Ӳ�����ʾ����Ŀ����������嵥����ĸ߶ȡ�

���ִ������嵥����
��

�����嵥����֮�ᣬ��һ���ǽ��ִ��������У�������ͨ������SendMessageΪ�嵥�����Ӵ�ѶϢ������ʽ����ѶϢ��������һ�㡣�ִ�ͨ��ͨ����0��ʼ�����������������ã�����0��Ӧ���ϵ���Ŀ��������������У�hwndList�����Ӵ��嵥���������Ĵ��ţ���iIndex������ֵ����ʹ��SendMessage�����ִ�������£�lParam������ָ����null��Ԫ��β�ִ���ָ�ꡣ

�ڴ���������У����Ӵ�ѶϢ������ʽ������嵥�������ݳ����˿��ü�����ռ�ʱ��SendMessage������LB_ERRSPACE������Ϊ-2�����������Ϊ����ԭ�����������ôSendMessage������LB_ERR��-1������������ɹ�����ôSendMessage������LB_OKAY��0����������ͨ������SendMessage�ķ���ֵ���ж������ִ���

���������LBS_SORT��ʽ��������������嵥�����а�����Ҫ���ֵ�˳�������ִ�������ô�����嵥������򵥵ķ����ǽ���LB_ADDSTRINGѶϢ��

SendMessage (hwndList, LB_ADDSTRING, 0, (LPARAM) szString) ;

�����û�в���LBS_SORT����ô����ʹ��LB_INSERTSTRINGָ��һ������ֵ�����ִ����뵽�嵥�����У�

SendMessage (hwndList, LB_INSERTSTRING, iIndex, (LPARAM) szString) ;

���磬���iIndex���4����ôszString����Ϊ����ֵΪ4���ִ����Ӷ�ͷ��ʼ����ĵ�5���ִ�����Ϊ�Ǵ�0��ʼ�����ģ���λ����������������ִ������������ơ�����ֵΪ-1ʱ�����ִ����������ᡣ�����Զ���ʽΪLBS_SORT���嵥����ʹ��LB_INSERTSTRING����������嵥��������ݲ��ܱ�����������Ҳ����ʹ��LB_DIRѶϢ���ִ����뵽�嵥�����У��⽫�ڱ��µ�����������ۣ���

��������ָ������ֵ��ͬʱʹ��LB_DELETESTRING��������Ϳ��Դ��嵥������ɾ���ִ���

SendMessage (hwndList, LB_DELETESTRING, iIndex, 0) ;

������ʹ��LB_RESETCONTENT����嵥�����е����ݣ�

SendMessage (hwndList, LB_RESETCONTENT, 0, 0) ;

�����嵥���������ӻ���ɾ���ִ�ʱ���嵥�����Ӵ�ѶϢ������ʽ��������ʾ��������������ִ���Ҫ���ӻ���ɾ������ô��Ҳ��ϣ����ʱ��ֹ��һ�������䷽���ǹص���������ػ���꣺

SendMessage (hwndList, WM_SETREDRAW, FALSE, 0) ;

��������ᣬ�����ٴ��ػ���꣺

SendMessage (hwndList, WM_SETREDRAW, TRUE, 0) ;

ʹ��LBS_NOREDRAW��ʽ�������嵥���鿪ʼʱ���ػ�����ǹرյġ�

ѡ���ȡ����
��

SendMessage���������������������֮�ᣬͨ������һ��ֵ�������������ô���ֵ�����趨ΪLB_ERR������Ϊ-1����

���嵥�����з���һЩ��Ŀ֮�ᣬ������Ū����嵥�������ж�����Ŀ��

iCount = SendMessage (hwndList, LB_GETCOUNT, 0, 0) ;

����һЩ���жԵ���ѡ���嵥����Ͷ���ѡ���嵥�����Dz�ͬ�ġ�������������������ѡ���嵥���顣

ͨ��������ʹ�������嵥������ѡ����Ŀ������������������ʾһ���ڶ�ѡ�������ʹ�ã�

SendMessage (hwndList, LB_SETCURSEL, iIndex, 0) ;

��iParam�趨Ϊ-1��ȡ������ѡ��

��Ҳ���Ը�����Ŀ�ĵ�һ����ĸ��ѡ��

iIndex = SendMessage (hwndList, LB_SELECTSTRING, iIndex,
                      (LPARAM) szSearchString) ;

��SendMessage�����н�iIndex��ΪiParam����ʱ��iIndex�����������Ը����������俪ͷ��Ԫ��szSearchString��ƥ�����Ŀ��iIndex��ֵ���-1ʱ��ͷ��ʼ������SendMessage���ر�ѡ����Ŀ�����������û�п�ͷ��Ԫ��szSearchString��ƥ�����Ŀʱ��SendMessage����LB_ERR��

�����õ������嵥�����WM_COMMANDѶϢʱ���������κ�����ʱ�򣩣�������ʹ��LB_GETCURSEL��ȷ��Ŀǰѡ���������

iIndex = SendMessage (hwndList, LB_GETCURSEL, 0, 0) ;

���û����Ŀ��ѡ�У���ô�Ӻ����д��ص�iIndexֵΪLB_ERR��

������ȷ���嵥�������ִ��ij��ȣ�

iLength = SendMessage (hwndList, LB_GETTEXTLEN, iIndex, 0) ;

�����Խ�ij��Ŀ���Ƶ����ֻ������У�

iLength = SendMessage (	hwndList, LB_GETTEXT, iIndex,
          								(LPARAM) szBuffer) ;

������������£��Ӻ��д��ص�iLengthֵ���ִ��ij��ȡ�����NULL��Ԫ�ս���ִ�������˵��szBuffer���б��빻����Ҳ������LB_GETTEXTLEN�ȷ���һЩ�ֲ�������������ִ���

���һ������ѡ���嵥���飬������ʹ��LB_SETCURSEL��LB_GETCURSEL����LB_SELECTSTRING������������ʹ��LB_SETSEL���趨ij�ض���Ŀ��ѡ��״̬������Ӱ���п��ܱ�ѡ��������

SendMessage (hwndList, LB_SETSEL, wParam, iIndex) ;

wParam������Ϊ0ʱ��ѡ�񲢼���ijһ��Ŀ��wParamΪ0ʱ��ȡ��ѡ�����wParam���-1����ô��ѡ��������Ŀ����ȡ�����б�ѡ�е���Ŀ������������ȷ��ij�ض���Ŀ��ѡ��״̬��

iSelect = SendMessage (hwndList, LB_GETSEL, iIndex, 0) ;

���У������iIndexָ������Ŀ��ѡ�У�iSelect����Ϊ��0��������Ϊ0��

���������嵥�����ѶϢ
��

��ʹ�����û��󵥻��嵥����ʱ���嵥���齫�������뽹�㡣����IJ�������ʹ���Ӵ������뽹��ת�����嵥��������

SetFocus (hwndList) ;

���嵥����ӵ�����뽹��ʱ���α��ƶ�������ĸ����Spacebar�������������ڸ��嵥������ѡ��ij�

�嵥������������丸�Ӵ�����WM_COMMANDѶϢ���԰�ť�ͱ༭��������˵��wParam��lParam�����ĺ�������ͬ�ģ�

LOWORD (wParam) ���Ӵ�ID
HIWORD (wParam) ֪ͨ��
]
lParam ���Ӵ�����

֪ͨ�뼰��ֵ������ʾ��

LBN_ERRSPACE -2
LBN_SELCHANGE 1
LBN_DBLCLK 2
LBN_SELCANCEL 3
LBN_SETFOCUS 4
LBN_KILLFOCUS 5

ֻ���嵥�����Ӵ���ʽ����LBS_NOTIFYʱ���嵥���������Ż����Ӵ�����LBN_SELCHANGE��LBN_DBLCLK��

LBN_ERRSPACE��ʾ�嵥�����Ѿ�����ִ�пռ䡣LBN_SELCHANGE��ʾĿǰѡ���Ѿ����ı䡣��ЩѶϢ��������������£�ʹ�������嵥�������ƶ���������Ŀʱ��ʹ����ʹ��Spacebar���л�ѡ��״̬����ʹ�û��󵥻�ij��ʱ��LBN_DBLCLK˵��ij��Ŀ�Ѿ�������˫����LBN_SELCHANGE��LBN_DBLCLK֪ͨ���ֵ��ʾ�����µĴ�������

����Ӧ�õ���Ҫ����Ҳ��Ҫʹ��LBN_SELCHANGE��LBN_DBLCLK��Ҳ�����߶�Ҫʹ�á����ij�ʽ���յ�����LBN_SELCHANGEѶϢ������LBN_DBLCLKѶϢֻ�е�ʹ����˫������ʱ�Ż���֡�������ij�ʽʹ��˫������ô����Ҫ�ṩһ������LBN_DBLCLK�ļ��̽��档

һ���򵥵��嵥����Ӧ�ó�ʽ
��

��Ȼ��֪������ν����嵥���飬���ʹ��������Ŀ�����嵥���飬��ν��������嵥����Ŀ������Լ����ȡ���ִ��������ǵ���дһ��Ӧ�ó�ʽ��ʱ���ˡ����ʽ9-5����ʾ��ENVIRON��ʽ����ʾ������ʹ���嵥��������ʾĿǰ��ҵϵͳ��������������PATH��WINDIR��������ѡ��һ����������ʱ�������ݽ���ʾ����ʾ����Ķ�����

 ï¿½ï¿½Ê½9-5  ENVIRON
ENVIRON.C
/*------------------------------------------------------------------------- 
   	ENVIRON.C -- Environment List Box
  					(c) Charles Petzold, 1998
---------------------------------------------------------------------------*/

#include <windows.h>
#define ID_LIST     1
#define ID_TEXT     2

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

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                    						PSTR szCmdLine, int iCmdShow)
{
     	static TCHAR 	szAppName[] = TEXT ("Environ") ;
     	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 			= (HBRUSH) (COLOR_WINDOW + 1) ;
     	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 ("Environment List Box"),
                       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 ;
}

void FillListBox (HWND hwndList) 
{
     	int     iLength ;
     	TCHAR * pVarBlock, * pVarBeg, * pVarEnd, * pVarName ;

     	pVarBlock = GetEnvironmentStrings () ; 	// Get pointer to environment block

     	while (*pVarBlock)
     	{
          	if (*pVarBlock != '=') 		// Skip variable names beginning with '='
          	{
                pVarBeg = pVarBlock ; 	// Beginning of variable name
		while (*pVarBlock++ != '=') ; 	// Scan until '='
		pVarEnd = pVarBlock - 1 ; 		// Points to '=' sign
		iLength = pVarEnd - pVarBeg ; 	// Length of variable name

		// Allocate memory for the variable name and terminating
		// zero. Copy the variable name and append a zero.

		pVarName = calloc (iLength + 1, sizeof (TCHAR)) ;
		CopyMemory (pVarName, pVarBeg, iLength * sizeof (TCHAR)) ;
		pVarName[iLength] = '\0' ;

		// Put the variable name in the list box and free memory.
		SendMessage (hwndList, LB_ADDSTRING, 0, (LPARAM) pVarName) ;
					free (pVarName) ;
		}
		while (*pVarBlock++ != '\0') ; 	// Scan until terminating zero
     	}
     	FreeEnvironmentStrings (pVarBlock) ;
}

LRESULT CALLBACK WndProc (	HWND hwnd, UINT message, WPARAM wParam,LPARAM lParam)
{
     	static HWND	hwndList, hwndText ;
     	int     				iIndex, iLength, cxChar, cyChar ;
     	TCHAR   			* 	pVarName, * pVarValue ;

     	switch (message)
     	{
     	case 	WM_CREATE :
          		cxChar = LOWORD (GetDialogBaseUnits ()) ;
          		cyChar = HIWORD (GetDialogBaseUnits ()) ;
               				// Create listbox and static text windows.

          		hwndList = CreateWindow (TEXT ("listbox"), NULL,
                           WS_CHILD | WS_VISIBLE | LBS_STANDARD,
                           cxChar, cyChar * 3,
                           cxChar * 16 + GetSystemMetrics (SM_CXVSCROLL),
                           cyChar * 5,
                           hwnd, (HMENU) ID_LIST,
                           (HINSTANCE) GetWindowLong (hwnd, GWL_HINSTANCE),
                              						NULL) ;
          
          		hwndText = CreateWindow (TEXT ("static"), NULL,
                           WS_CHILD | WS_VISIBLE | SS_LEFT,
                           cxChar, cyChar, 
                           GetSystemMetrics (SM_CXSCREEN), cyChar,
                           hwnd, (HMENU) ID_TEXT,
                           (HINSTANCE) GetWindowLong (hwnd, GWL_HINSTANCE),
                              							NULL) ;

          		FillListBox (hwndList) ;
          		return 0 ;
          
   	case 	WM_SETFOCUS :
          		SetFocus (hwndList) ;
          		return 0 ;
     	case 	WM_COMMAND :
          		if (LOWORD (wParam) == ID_LIST && HIWORD (wParam) == LBN_SELCHANGE)
          		{
                    						// Get current selection.

               iIndex  = SendMessage (hwndList, LB_GETCURSEL, 0, 0) ;
               iLength = SendMessage (hwndList, LB_GETTEXTLEN, iIndex, 0) + 1 ;
              pVarName = calloc (iLength, sizeof (TCHAR)) ;
              SendMessage (hwndList, LB_GETTEXT, iIndex, (LPARAM) pVarName) ;

                    						// Get environment string.

               iLength = GetEnvironmentVariable (pVarName, NULL, 0) ;
               pVarValue = calloc (iLength, sizeof (TCHAR)) ;
               GetEnvironmentVariable (pVarName, pVarValue, iLength) ;

                    						// Show it in window.
               
               SetWindowText (hwndText, pVarValue) ;
               free (pVarName) ;
               free (pVarValue) ;
          		}
          		return 0 ;

     	case 	WM_DESTROY :
          		PostQuitMessage (0) ;
          		return 0 ;
     	}
     	return DefWindowProc (hwnd, message, wParam, lParam) ;
}

ENVIRON�����������Ӵ���һ����LBS_STANDARD��ʽ���嵥���飬��һ����SS_LEFT��ʽ������������֣��ľ�̬�Ӵ���ENVIRONʹ�ú�ʽGetEnvironmentStrings�����һ��ָ�꣬��ָ��ָ�����ȫ����������������ֵ�ļ��������顣ENVIRON��FillListBox��ʽ�������˼��������飬��ʹ��LB_ADDSTRINGѶϢ��ָ���嵥�����Ӵ�ѶϢ������ʽ��ÿ���ִ������嵥�����С�

����ִ��ENVIRONʱ������ʹ�û�����߼�����ѡ�񻷾�������ÿ�����ı�ѡ��ʱ���嵥���鶼����丸�Ӵ�WndProc����һ��WM_COMMANDѶϢ����WndProc�յ�WM_COMMANDѶϢʱ�����ͼ��wParam�ĵ������Ƿ�ΪID_LIST���嵥��������Ӵ�ID����wParam�ĸ����飨֪ͨ�룩�Ƿ���LBN_SELCHANGE������ǵģ���ô����ʹ��LB_GETCURSELѶϢ�����ѡ����Ŀ����������ʹ��LB_GETTEXT������ⲿ�������������ִ�������ENVIRON��ʽʹ��C���Ժ�ʽGetEnvironmentVariable�������������Ӧ�Ļ����ִ���ʹ��SetWindowText�����ִ����ݵ���̬���Ӵ��������У������̬���Ӵ������������ʾ���֡�

�����б�
��

�ҽ���õ��������᣺LB_DIR�����ǹ�����ǿ���嵥����ѶϢ�����õ���Ŀ¼�б������嵥���飬���ҿ���ѡ����Ŀ¼����Ч�Ĵŵ���Ҳ����������

SendMessage (hwndList, LB_DIR, iAttr, (LPARAM) szFileSpec) ;

ʹ�õ���������
��

iAttr�����ǵ������Դ��룬�����λԪ���ǵ������Դ��룬�ô�������DZ�9-6���ϵ���ϣ�

��9-6
iAttr ֵ ����
DDL_READWRITE 0x0000 ��ͨ����
DDL_READONLY 0x0001 ������
DDL_HIDDEN 0x0002 ���ص���
DDL_SYSTEM 0x0004 ϵͳ����
DDL_DIRECTORY 0x0010 ��Ŀ¼
DDL_ARCHIVE 0x0020 �鵵λԪ�����ĵ���

��λԪ���ṩ��һЩ����Ҫ����Ŀ�ĸ��ӿ��ƣ�

��9-7
iAttr ֵ ����
DDL_DRIVES 0x4000 �����ŵ�������
DDL_EXCLUSIVE 0x8000 ��������

����DDL��ʾ���Ի�Ŀ¼�б�����

��LB_DIRѶϢ��iAttrֵΪDDL_READWRITEʱ���嵥�����г���ͨ������Ψ�������͹鵵λԪ�����ĵ�������ֵΪDDL_DIRECTORYʱ���嵥��������г���������֮�⣬���г���Ŀ¼��Ŀ¼λ�������֮�ڡ���ֵΪDDL_DRIVES | DDL_DIRECTORYʱ����ô�б�����չ������������Ч�Ĵŵ��������ŵ���������ʾ������֮�䡣

��iAttr�����λԪ�����Ϳ���ֻ�г����������ĵ��������������������������磬��Windows�ĵ������ݳ�ʽ��Ҳ����ֻ���г�����һ�α������޸Ĺ��ĵ��������ֵ����Ĺ鵵λԪ���������������ʹ��DDL_EXCLUSIVE | DDL_ARCHIVE��

�����������
��

lParam������ָ�򵵰�ָ���ִ��硸*.*����ָ�꣬�������ָ���ִ���Ӱ���嵥�����е���Ŀ¼��

��Ҳ��ϣ�������е����嵥���嵥����ʹ��LBS_SORTѶϢ���嵥���������г����ϵ���ָ��Ҫ��ĵ������٣���ѡ���г���Ŀ¼�����г��ĵ�һ����Ŀ¼������������ĸ�ʽ��

[..]

��һ���������㡹����Ŀ¼������ʹ�������Ŀ¼����һ�㣨�ڸ�Ŀ¼���г�������ʱ����Ŀ������֣������ᣬ�������Ŀ¼���Ʋ����������ʽ��

[SUBDIR]

��������������ʽ�г�����Ч�ŵ�����Ҳ�ǿ�ѡ��ģ���

[-A-]

Windows��head��ʽ
��

UNIX����һ��������ʵ�ó�ʽ����head������ʾ������ʼ�ļ��С�������ʹ���嵥����ΪWindows��дһ�����Ƶij�ʽ�����ʽ9-6��ʾ��HEAD�����е�������Ŀ¼�����嵥�����С���������ѡij����ѡ��ĵ�������ʾ���������ڸõ�����ʹ�û���˫������ʹ��Enter������Ҫѡ�ĵ�������Ҳ����ʹ�������ַ���֮һ���ı���Ŀ¼�������ʽ��HEAD�Ӵ���ʾ������ұߣ��ӵ����Ŀ�ͷ��ʼ��ʾ��������ܹ���ʾ8 KB�����ݡ�

 ï¿½ï¿½Ê½9-6  HEAD
HEAD.C
/*-------------------------------------------------------------------------
   	HEAD.C -- Displays beginning (head) of file
  				(c) Charles Petzold, 1998
--------------------------------------------------------------------------*/

#include <windows.h>
#define ID_LIST     1
#define ID_TEXT     2

#define MAXREAD     8192
#define DIRATTR     (DDL_READWRITE | DDL_READONLY | DDL_HIDDEN | DDL_SYSTEM | \
                    DDL_DIRECTORY | DDL_ARCHIVE  | DDL_DRIVES)
#define DTFLAGS     (DT_WORDBREAK | DT_EXPANDTABS | DT_NOCLIP |DT_NOPREFIX)
LRESULT CALLBACK WndProc  (HWND, UINT, WPARAM, LPARAM) ;
LRESULT CALLBACK ListProc (HWND, UINT, WPARAM, LPARAM) ;

WNDPROC OldList ;

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                    						PSTR szCmdLine, int iCmdShow)
{
     	static TCHAR 		szAppName[] = TEXT ("head") ;
     	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 		= (HBRUSH) (COLOR_BTNFACE + 1) ;
     	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 ("head"),
                        WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN,
                        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 BOOL                 bValidFile ;
    	static BYTE     			buffer[MAXREAD] ;
     	static HWND     			hwndList, hwndText ;
     	static RECT     			rect ;
     	static TCHAR    			szFile[MAX_PATH + 1] ;
     	HANDLE          			hFile ;
     	HDC             			hdc ;
     	int             			i, cxChar, cyChar ;
     	PAINTSTRUCT     			ps ;
     	TCHAR           			szBuffer[MAX_PATH + 1] ;
     	switch (message)
     {
     	case 	WM_CREATE :
          		cxChar = LOWORD (GetDialogBaseUnits ()) ;
          		cyChar = HIWORD (GetDialogBaseUnits ()) ;
          
          		rect.left = 20 * cxChar ;
          		rect.top  =  3 * cyChar ;
          
          		hwndList = CreateWindow (TEXT ("listbox"), NULL,
                           WS_CHILDWINDOW | WS_VISIBLE | LBS_STANDARD,
                           cxChar, cyChar * 3,
                           cxChar * 13 + GetSystemMetrics (SM_CXVSCROLL),
                           cyChar * 10,
                           hwnd, (HMENU) ID_LIST,
                           (HINSTANCE) GetWindowLong (hwnd, GWL_HINSTANCE),
                              							NULL) ;

          		GetCurrentDirectory (MAX_PATH + 1, szBuffer) ;
          
          		hwndText = 	CreateWindow (TEXT ("static"), szBuffer,
                           WS_CHILDWINDOW | WS_VISIBLE | SS_LEFT,
                           cxChar, cyChar, cxChar * MAX_PATH, cyChar,
                           hwnd, (HMENU) ID_TEXT,
                           (HINSTANCE) GetWindowLong (hwnd, GWL_HINSTANCE),
                              						NULL) ;
          
 		OldList = (WNDPROC) SetWindowLong	(hwndList, GWL_WNDPROC,
                  (LPARAM) ListProc) ;
          
          	SendMessage (hwndList, LB_DIR, DIRATTR, (LPARAM) TEXT ("*.*")) ;
	return 0 ;
          
case	WM_SIZE :
          	rect.right  	= LOWORD (lParam) ;
   	rect.bottom 			= HIWORD (lParam) ;
  	return 0 ;
case 	WM_SETFOCUS :
	SetFocus (hwndList) ;
	return 0 ;
          
case 	WM_COMMAND :
	if (LOWORD (wParam) == ID_LIST && HIWORD (wParam) == LBN_DBLCLK)
	{
		if (LB_ERR == (i = SendMessage (hwndList, LB_GETCURSEL, 0, 0)))
				break ;
               
		SendMessage (hwndList, LB_GETTEXT, i, (LPARAM) szBuffer) ;
               
		if (INVALID_HANDLE_VALUE != (hFile = CreateFile (szBuffer, 
				GENERIC_READ, FILE_SHARE_READ, NULL, 
      				OPEN_EXISTING, 0, NULL)))
		{
				CloseHandle (hFile) ;
				bValidFile = TRUE ;
				lstrcpy (szFile, szBuffer) ;
				GetCurrentDirectory (MAX_PATH + 1, szBuffer) ;

		if (szBuffer [lstrlen (szBuffer) - 1] != '\\')
				lstrcat (szBuffer, TEXT ("\\")) ;
		SetWindowText (hwndText, lstrcat (szBuffer, szFile)) ;
		}
		else
		{
			bValidFile = FALSE ;
			szBuffer [lstrlen (szBuffer) - 1] = '\0' ;

				// If setting the directory doesn't work, maybe it's
				// a drive change, so try that.

		if (!SetCurrentDirectory (szBuffer + 1))
			{
				szBuffer [3] = ':' ;
                         				szBuffer [4] = '\0' ;
                         				SetCurrentDirectory (szBuffer + 2) ;
                    			}

                         		// Get the new directory name and fill the list box.

                    			GetCurrentDirectory (MAX_PATH + 1, szBuffer) ;
                    			SetWindowText (hwndText, szBuffer) ;
                    			SendMessage (hwndList, LB_RESETCONTENT, 0, 0) ;
                    			SendMessage (hwndList, LB_DIR, DIRATTR, 
                                (LPARAM) TEXT ("*.*")) ;
               			}
               		InvalidateRect (hwnd, NULL, TRUE) ;
          		}
          		return 0 ;
     	case 	WM_PAINT :
          		if (!bValidFile)
               				break ;

          		if (INVALID_HANDLE_VALUE == (hFile = CreateFile (szFile, 
                   GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL)))
          		{
               			bValidFile = FALSE ;
               			break ;
          		}

          		ReadFile (hFile, buffer, MAXREAD, &i, NULL) ;
          		CloseHandle (hFile) ;

               			// i now equals the number of bytes in buffer.
               			// Commence getting a device context for displaying text.

          		hdc = BeginPaint (hwnd, &ps) ;
          		SelectObject (hdc, GetStockObject (SYSTEM_FIXED_FONT)) ;
          		SetTextColor (hdc, GetSysColor (COLOR_BTNTEXT)) ;
          		SetBkColor   (hdc, GetSysColor (COLOR_BTNFACE)) ;

               			// Assume the file is ASCII

          		DrawTextA (hdc, buffer, i, &rect, DTFLAGS) ;

          		EndPaint (hwnd, &ps) ;
          		return 0 ;
          
     	case 	WM_DESTROY :
          		PostQuitMessage (0) ;
          		return 0 ;
     	}
     	return DefWindowProc (hwnd, message, wParam, lParam) ;
}
     
LRESULT CALLBACK ListProc (HWND hwnd, UINT message, 
                 WPARAM wParam, LPARAM lParam)
{
     	if (message == WM_KEYDOWN && wParam == VK_RETURN)
          		SendMessage (GetParent (hwnd), WM_COMMAND, 
                 MAKELONG (1, LBN_DBLCLK), (LPARAM) hwnd) ;
     	return CallWindowProc (OldList, hwnd, message, wParam, lParam) ;
}

��ENVIRON�У�������ѡ��һ����������ʱ��������ʹ�û����Ǽ��̣���ʽ������ʾһ�������ִ������ǣ����������HEAD��ʹ������ѡ����ʾ��������ô��ʽ��Ӧ�������������Ϊ���嵥�������ƶ�ѡ��ʱ����ʽ��ȻҪ���ϵش򿪺͹رյ�����Ȼ����HEADҪ�󵵰�������Ŀ¼��˫�����Ӷ�����һЩ���⣬������Ϊ�嵥���������û�л���˫�����Զ����̽��档ǰ�潲����������ܣ�Ӧ�þ����ṩ���̽��档

����ķ�����ʲô�أ���Ȼ���Ӵ�����𻯡�HEAD�е��嵥����������ʽ����ListProc����Ѱ��wParam�������VK_RETURN��WM_KEYDOWNѶϢ�������丸�Ӵ�����һ������LBN_DBLCLK֪ͨ���WM_COMMANDѶϢ����WndProc�У���WM_COMMAND�Ĵ���ʹ����Windows��ʽ��CreateFile������嵥�����е�ѡ�����CreateFile����һ��������Ѷ�����ʾ��ѡ���ǵ�������������һ����Ŀ¼��Ȼ��HEADʹ��SetCurrentDirectory���ı������Ŀ¼�����SetCurrentDirectory����ִ�У���ʽ���ٶ�ʹ�����Ѿ�ѡ����һ���ŵ������š��ı�ŵ���Ҳ��Ҫ����SetCurrentDirectory����Ϊ�ú�ʽ�������ִ���Ϊ��ѡ���ִ����õ���ͷ��б�ߣ�������һ��ð�š������嵥���鷢��һ��LB_RESETCONTENTѶϢ��������е����ݣ��ٷ���һ��LB_DIRѶϢ��ʹ������Ŀ¼�еĵ����������嵥���顣

WndProc�е�WM_PAINTѶϢ����Windows��CreateFile��ʽ���򿪵����ģ��⽫����һ���������ţ��ô��ſ��Դ��ݸ�Windows��ReadFile��CloseHandle��ʽ��

���ڣ��ڱ����У����ǵ�һ������������⣺Unicode��������ϣ���������ķ�ʽ��ž�������ҵϵͳ�������ֵ��������࣬ʹReadFile�ܽ�ASCII����ת����Unicode���֣����߽�Unicode����ת����ASCII���֡�����ʵ�������������ReadFile�Ĺ���ֻ�Ƕ�ȡ������δ��ת����λԪ�飬Ҳ����˵��DrawTextA���ڱ���õĿ�ִ�е���û�ж���UNICODEʶ���֣�������ֽ���ΪASCII����DrawTextW��Unicode�棩�����������Unicode�ġ�

��˳�ʽ����Ӧ��������ȥ�б𵵰�����������ASCII���ֻ���Unicode���֣�Ȼ����ǡ���غ���DrawTextA����DrawTextW��ʵ���ϣ�HEAD����һ���Ƚϼ򵥵ķ�ʽ����ֻ������DrawTextA��