�������� Linux Tags
9. ���Ӵ�������
����б�Ҫ�����۾����Ƿ�ѡ�У������Ը�ChildProc����һ�����丸�Ӵ�ѶϢ������ʽ(WndProc)����ѶϢ���ֶΡ�ͨ������GetParent�����Ӵ�ѶϢ������ʽ��ȷ���丸�Ӵ����Ӵ����ţ�
hwndParent = GetParent (hwnd) ;
���У�hwnd�����Ӵ����Ӵ����š����������丸�Ӵ�ѶϢ������ʽ����ѶϢ��
SendMessage (hwndParent, message, wParam, lParam) ;
��ômessageӦ���趨Ϊʲô�أ�������������趨����ֵ��С������WM_USER��ͬ�������Щ���ִ�����Ԥ�ȶ����WM_ ѶϢ����ͻ��ѶϢ��Ҳ�������ѶϢ�����Ӵ����Խ�wParam�趨Ϊ�������Ӵ�ID������ڸ����Ӵ���������ôlParam���Ա���Ϊ1�����δ�ڸ����Ӵ��ϵ�������ôlParam������Ϊ0�����Ǵ�����ʽ��һ��ѡ��
��ʵ�ϣ������ڽ���һ�������Ӵ�������������Ӵ���״̬�ı�ʱ�����Ӵ���������ͼ���ѶϢ��֪ͨ���Ӵ���ʹ�����ַ��������Ӵ��ͱ�����丸�Ӵ��ĸ߽�����װ�á��������Լ���өĻ�ϵ�ͼ�������Ӧ�Ĵ�������ʹ��������Ļ�Ӧ�Լ��ڷ�����Ҫ�������¼�ʱ֪ͨ��һ���Ӵ��ķ�������װ������
��Ȼ�����Խ����Լ������Ӵ����������Ҳ��������һЩԤ�ȶ�����Ӵ���𣨺��Ӵ�ѶϢ������ʽ����������׼�����Ӵ��������һ���ڱ��Windows��ʽ�п�������Щ�������Щ��������õ���ʽ�У���ť����ȡ���顢�à¼ï¿½ï¿½ï¿½é¡¢ï¿½åµ¥ï¿½ï¿½ï¿½é¡¢ï¿½ï¿½ï¿½ï¿½Ê½ï¿½åµ¥ï¿½ï¿½ï¿½é¡¢ï¿½Ö´ï¿½ï¿½ï¿½Ç©ï¿½Í¾ï¿½ï¿½ï¿½ï¿½Ð¡ï¿½ï¿½ï¿½ï¿½ç£¬ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ê½ï¿½ï¿½Ä³ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ò»ï¿½ï¿½ï¿½ï¿½ï¿½Ð¡ï¿½Recalculate���İ�ť����ô������ͨ������CreateWindow�����������ť�������ص��Ļ����������ť��ʾ�������¸ð�ťʱ���Զ���˸��������Щ����Windows�ڲ���ɵġ�����Ҫ����ֻ������WM_COMMANDѶϢ������ť������ʱ����ͨ����һѶϢ֪ͨ�����Ӵ�ѶϢ������ʽ��������������ǵģ�һ��Ҳû����
���Ӵ��������ڶԻ���������á��ڵ�ʮһ���������ῴ�������Ӵ��������λ�úͳߴ磬���ڷ�����ʽ����Դ���������еĶԻ�����ģ���ﶨ��ġ����ǣ���Ҳ����ʹ��Ԥ�ȶ���ģ�����ͨ�Ӵ���ʾ����������Ӵ�����������Ժ���һ��CreateWindow������һ�����Ӵ�����ͨ������MoveWindow���������Ӵ���λ�úͳߴ硣���Ӵ�ѶϢ������ʽ�����Ӵ��������ѶϢ�����Ӵ����������Ӵ�ѶϢ������ʽ����ѶϢ��
�ڽ�����ͨ�Ӵ�ʱ�����ȶ����Ӵ���𣬲�ʹ��RegisterClass����ע�ᵽWindows�У�Ȼ����CreateWindow�������ݸ��Ӵ������һ����ͨ�Ӵ����ӵ����¿�ʼ�����Ǿ�����ô���ġ����ǣ�����ʹ��Ԥ�ȶ����ij��������ʱ������Ϊ���Ӵ�ע���Ӵ�����Ӵ�����Ѿ������Windows֮�У�������һ��Ԥ�ȶ�������֡���ֻ����CreateWindow�а����������Ӵ���������CreateWindow�е��Ӵ���ʽ����׼ȷ�ض��������Ӵ�����������κ͹��ܡ�Windows�ڽ��˴������͸�������Щ�Ӵ�����������Ӵ�ѶϢ���Ӵ�ѶϢ������ʽ��
ֱ���������Ӵ���ʹ�����Ӵ����������ijЩ������Щ����IJ�ε���ڶԻ�������ʹ�����Ӵ���������Ҫ��IJ�Ρ�����Ի���������������ij�ʽ�Ϳ�����֮������һ������㡣ֵ��һ��ģ������ܻᷢ���������Ӵ��Ͻ��������Ӵ������û������Tab������������뽹���һ���������ƶ�����һ����������ڲ����ܡ����Ӵ��������ܹ�������뽹�㣬���ǻ���ᣬ�������ܰ����뽹�㴫�ظ����Ӵ�������DZ���Ҫ��������⡣
Windows��ʽ��Ƶ��ļ��������ط����������Ӵ�����������ǣ��òµ¥µÄ³ï¿½ï¿½Ã¿ï¿½ï¿½ï¿½ï¿½î£¬ï¿½ï¿½ï¿½Ç¿ï¿½ï¿½ï¿½ï¿½ï¿½/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ѶϢʱ�������������������������
�����ϣ����Ӵ�ʹ�øû�ˢ����ɫ��������������Ҫ�����ˢʱ����Ӧ�ø����������
������ʹ��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������������ϵ����֡�
�à¼ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½òµ¥µï¿½Ó¦ï¿½ï¿½Ö®Ò»ï¿½ï¿½ï¿½ï¿½Îªï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ò¡£µï¿½ï¿½Ç±à¼ï¿½ï¿½ï¿½ï¿½ï¿½î²¢ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ì¶µï¿½ï¿½Ð£ï¿½ï¿½ï¿½Ò»ï¿½ï¿½ï¿½Ò½ï¿½ï¿½Ú³ï¿½Ê½9-4 POPPAD1��˵�������������Ȿ�����������ĸ�����������һ���� POPPAD��ʽ������ǿ��ʹ�ù��ܱ����Ի�����(�����봢�浵��)����ӡ������İ汾����һ���òµ¥¶ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ö±à¼ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ê½ï¿½ë½«ï¿½Ç³ï¿½ï¿½ï¿½à¡£
��ʽ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������û�������ٹ�����Ԥ�ȶ���ıà¼ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½à¹¤ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Öªï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ä³ï¿½Ê½Ê±ï¿½à¼ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ð©Ê²Ã´ï¿½ï¿½
�à¼ï¿½ï¿½ï¿½ï¿½ï¿½Ê½
��
��ǰ�����ᵽ�ģ���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������ġ��à¼ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ä³ß´ç±»ï¿½òµ¥µï¿½ï¿½è¶¨Îªï¿½ï¿½ï¿½Ó´ï¿½ï¿½Ä³ß´ç£º
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��ѡ������ݴӱà¼ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½É¾ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ç²ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ð·ï¿½ï¿½Í¡ï¿½
��Ҳ���Խ��������ϵ����ֲ��뵽�à¼ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ðµï¿½ï¿½Î±ï¿½Î»ï¿½Ã£ï¿½
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��