�������� Linux Tags

11. �Ի�����

����кܶ����볬���˹��ܱ����Դ����ij̶ȣ���ô���ǿ���ʹ�öԻ�������ȡ��������Ѷ����ʽд���߿���ͨ����ijѡ���������ʡ�Ժţ���������ʾ�ù��ܱ������һ���Ի����顣

�Ի������һ����ʽ�ǰ����������Ӵ�������ĵ���ʽ�Ӵ�����Щ������Ĵ�С��λ���ڳ�ʽ��Դ�������ġ��Ի�����ģ�塹��ָ������Ȼ��ʽд�����ܹ����ֹ�������Ի�����ģ�壬��������ͨ������Visual C++ Developer Studio���Խ�̸ʽ�����ķ�ʽ��Ƶģ�Ȼ����Developer Studio�����Ի�����ģ�塣

����ʽ��������ģ�彨���ĶԻ�����ʱ��Microsoft Windows 98����������ʽ�Ի������Ӵ������Ӵ���������ṩ�����Ի�����ѶϢ���������м��̺ͻ������룩���Ӵ�ѶϢ������ʽ����ʱ��ƺ������Щ���ܵ�Windows�ڲ���ʽ��Ϊ���Ի��������������

Windows���ڲ��Ի������Ӵ�ѶϢ������ʽ������������ѶϢҲ���ݸ����Լ���ʽ�еĺ�ʽ�������ʽ������ν�ġ��Ի�������򡹻��ߡ��Ի����򡹡��Ի���������ͨ���Ӵ�ѶϢ������ʽ���ƣ�����Ҳ������һЩ��Ҫ����һ����˵�������ڽ����Ի�����ʱ��ʼ�����Ӵ�����������������Ӵ��������ѶϢ�Լ������Ի�����֮�⣬��ʽд���߲���Ҫ�ٸ��Ի�������������������ܡ��Ի�����ͨ��������WM_PAINTѶϢ��Ҳ��ֱ�Ӵ������̺ͻ������롣

�Ի������������ĺ���̫���ˣ���Ϊ�����������Ӵ��������ʹ�á������������Ѿ��ڵھ����о������Ӵ�����������ڶԻ�������ʹ�����Ӵ�������ʱ,�ھ������ᵽ�����๤����������Windows�ĶԻ��������������ɡ������ǣ��ڳ�ʽCOLORS1�������ھ�����֮���л����뽹�������Ҳ�����ڶԻ������г��֡�Windows�ᴦ���Ի������еĿ�����֮���л����뽹����������ɵ�ȫ��������

�������ڳ�ʽ�����ӶԻ�����Ҫ������ͼʾ���߹��ܱ����鷳һЩ�����ǽ���һ���򵥵ĶԻ����鿪ʼ�������Ը�����֮����໥��ϵ�����˽⡣

ģ̬�Ի�����
��

�Ի������Ϊ���ࣺ��ģ̬�ġ��͡���ģ̬�ġ�������ģ̬�Ի�������Ϊ�ձ顣�����ij�ʽ��ʾһ��ģ̬�Ի�����ʱ��ʹ���߲����ڶԻ�������ͬһ����ʽ�е���һ���Ӵ�֮������л���ʹ���߱������������öԻ����飬�����ͨ����һ�¡�OK�����ߡ�Cancel��������ɡ�����������ʾģ̬�Ի�����ʱ��ʹ����ͨ�����Դ�Ŀǰ�ij�ʽ�л�����һ����ʽ������Щ�Ի����飨��Ϊ��ϵͳģ̬�����������������л���ʽ����Ҳ����������Windows�У���ʾ��ϵͳģ̬�Ի�����֮�ᣬҪ��������κι������������Ƚ����öԻ����顣

������About���Ի�����
��

Windows��ʽ��ʹ����Ҫ����ʹ�������룬Ҳͨ�������ɹ��ܱ��ϵġ�About��ѡ�������ĶԻ����飬�öԻ�����������ʾ��ʽ�����֡�ͼʾ����Ȩ���ͱ��Ϊ��OK���İ�����Ҳ��������������Ѷ�����缼��֧Ԯ�ĵ绰���룩�����ǽ�Ҫ�����ĵ�һ����ʽ������ʾһ����About���Ի������⣬�������á����ABOUT1��ʽ���ʽ11-1��ʾ��

 ï¿½ï¿½Ê½11-1  ABOUT1
ABOUT1.C
/*------------------------------------------------------------------------
   	ABOUT1.C -- About Box Demo Program No. 1
               					(c) Charles Petzold, 1998
-------------------------------------------------------------------------*/
#include <windows.h>
#include "resource.h"
LRESULT 	CALLBACK WndProc      			(HWND, UINT, WPARAM, LPARAM) ;
BOOL    		CALLBACK AboutDlgProc 		(HWND, UINT, WPARAM, LPARAM) ;
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                    						PSTR szCmdLine, int iCmdShow)
{
     	static TCHAR 	szAppName[] = TEXT ("About1") ;
     	MSG          				msg ;
     	HWND         				hwnd ;
	WNDCLASS     				wndclass ;
     	
     	wndclass.style         			= CS_HREDRAW | CS_VREDRAW ;
     	wndclass.lpfnWndProc   			= WndProc ;
     	wndclass.cbClsExtra    			= 0 ;
     	wndclass.cbWndExtra    			= 0 ;
     	wndclass.hInstance     			= hInstance ;
     	wndclass.hIcon         			= LoadIcon (hInstance, szAppName) ;
     	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 ("About Box Demo Program"),
                          		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 HINSTANCE hInstance ;
     	switch (message)
     	{
     	case 	WM_CREATE :
          		hInstance = ((LPCREATESTRUCT) lParam)->hInstance ;
          		return 0 ;
          
     	case 	WM_COMMAND :
          		switch (LOWORD (wParam))
          		{
          		case IDM_APP_ABOUT :
               				DialogBox (hInstance, TEXT ("AboutBox"), hwnd, AboutDlgProc) ;
               				break ;
          		}
          		return 0 ;
          
     	case 	WM_DESTROY :
          		PostQuitMessage (0) ;
          		return 0 ;
     	}
     	return DefWindowProc (hwnd, message, wParam, lParam) ;
}
BOOL CALLBACK AboutDlgProc (HWND hDlg, UINT message,WPARAM wParam, LPARAM lParam)
{
     	switch (message)
     	{
     	case 	WM_INITDIALOG :
          		return TRUE ;
          
     	case 	WM_COMMAND :
          		switch (LOWORD (wParam))
          		{
          		case 	IDOK :
          		case 	IDCANCEL :
               				EndDialog (hDlg, 0) ;
               				return TRUE ;
          }
          		break ;
     }
  	return FALSE ;
}
 ABOUT1.RC ��ժ¼��
//Microsoft Developer Studio generated resource script.
#include "resource.h"
#include "afxres.h"
/////////////////////////////////////////////////////////////////////////////
// Dialog
ABOUTBOX DIALOG DISCARDABLE  32, 32, 180, 100
STYLE DS_MODALFRAME | WS_POPUP
FONT 8, "MS Sans Serif"
BEGIN
    	DEFPUSHBUTTON              "OK",IDOK,66,80,50,14
    	ICON            						"ABOUT1",IDC_STATIC,7,7,21,20
    	CTEXT           						"About1",IDC_STATIC,40,12,100,8
    	CTEXT           			"About Box Demo Program",IDC_STATIC,7,40,166,8
    	CTEXT           			"(c) Charles Petzold, 
1998",IDC_STATIC,7,52,166,8
END
/////////////////////////////////////////////////////////////////////////////
// Menu
ABOUT1	MENU DISCARDABLE 
BEGIN
    	POPUP "&Help"
   	BEGIN
        		MENUITEM "&About About1...",            			IDM_APP_ABOUT
  	END
END
/////////////////////////////////////////////////////////////////////////////
// Icon
ABOUT1 		ICON    DISCARDABLE     "About1.ico"
 RESOURCE.H ��ժ¼��
// Microsoft Developer Studio generated include file.
// Used by About1.rc
#define IDM_APP_ABOUT        40001
#define IDC_STATIC              -1
ABOUT1.ICO


��

���������½��н��ܵķ��������������ڳ�ʽ�н���ͼʾ�͹��ܱ���ͼʾ�͹��ܱ���ID����Ϊ��About1�������ܱ���һ��ѡ�������һ��ID��ΪIDM_APP_ABOUT��WM_COMMANDѶϢ����ʹ�ó�ʽ��ʾ��ͼ11-1��ʾ�ĶԻ����顣


��

ͼ11-1 ��ʽABOUT1�ĶԻ�����

�Ի����鼰��ģ��
��

Ҫ��һ���Ի��������ӵ�Visual C++ Developer Studio���е�Ӧ�ó�ʽ�ϣ������ȴ� Insert ï¿½ï¿½ï¿½Ü±ï¿½ï¿½ï¿½Ñ¡ï¿½ï¿½ Resource ï¿½ï¿½È»ï¿½ï¿½Ñ¡ï¿½ï¿½ Dialog Box ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ò»ï¿½ï¿½ï¿½Ô»ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ç°ï¿½ï¿½ï¿½Ã¶Ô»ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ð±ï¿½ï¿½ï¿½ï¿½Ð¡ï¿½ï¿½ï¿½ï¿½â£¨Dialog���Լ� OK ï¿½ï¿½ Cancel ï¿½ï¿½Å¥ï¿½ï¿½ Controls ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ú¶Ô»ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ð²ï¿½ï¿½ë²»Í¬ï¿½Ä¿ï¿½ï¿½ï¿½ï¿½î¡£

Developer Studio���Ի������ID��Ϊ��׼��IDD_DIALOG1���������ڴ������ϣ������ڶԻ����鱾���������Ҽ���Ȼ��ӹ��ܱ���ѡ�� Properties ï¿½ï¿½ï¿½Ú±ï¿½ï¿½ï¿½Ê½ï¿½Ð£ï¿½ï¿½ï¿½ID����AboutBox�����������ţ���Ϊ�����ҽ����ĶԻ����鱣��һ�£��뽫 X Pos ï¿½ï¿½ Y Pos ï¿½ï¿½Î»ï¿½ï¿½Îª32�����ʾ�Ի��������춳�ʽ�Ӵ���ʾ�������Ͻǵ���ʾλ�ô�����й�춶Ի������������ϸ���ۣ���

���ڣ������� Properties ï¿½Ô»ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ñ¡ï¿½ï¿½ Styles Ò³ï¿½ï¿½ï¿½Ç©ï¿½ï¿½ï¿½ï¿½Îªï¿½Ë¶Ô»ï¿½ï¿½ï¿½ï¿½ï¿½Ã»ï¿½Ð±ï¿½ï¿½ï¿½ï¿½Ð£ï¿½ï¿½ï¿½ï¿½Ô²ï¿½ÒªÑ¡È¡ Title Bar ï¿½ï¿½È¡ï¿½ï¿½ï¿½é¡£È»ï¿½ï¿½ï¿½ëµ¥ï¿½ï¿½ Properties ï¿½Ô»ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½Ø±ï¿½ ï¿½ï¿½Å¥ï¿½ï¿½

���ڿ�����ƶԻ������ˡ���Ϊ����Ҫ Cancel ï¿½ï¿½Å¥ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Èµï¿½ï¿½ï¿½ï¿½Ã°ï¿½Å¥ï¿½ï¿½È»ï¿½á°´ï¿½Â¼ï¿½ï¿½ï¿½ï¿½Ïµï¿½ Delete ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ OK ï¿½ï¿½Å¥ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Æ¶ï¿½ï¿½ï¿½ï¿½Ô»ï¿½ï¿½ï¿½ï¿½ï¿½Äµ×²ï¿½ï¿½ï¿½ï¿½ï¿½Developer Studio�Ӵ�����Ĺ���������һ��С����ͼ������ʹ���������Ӵ���ˮƽ���ж��룬�밴�´�ť��

�����Ҫ�ó�ʽ��ͼʾ�����ڶԻ������У����������������ڸ����� Controls ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ð°ï¿½ï¿½Â¡ï¿½ Pictures ï¿½ï¿½ï¿½ï¿½Å¥ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Æ¶ï¿½ï¿½ï¿½ï¿½Ô»ï¿½ï¿½ï¿½ï¿½ï¿½Ä±ï¿½ï¿½æ£¬ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½È»ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ò»ï¿½ï¿½ï¿½ï¿½ï¿½Î¡ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Í¼Ê¾ï¿½ï¿½ï¿½ï¿½ï¿½Öµï¿½Î»ï¿½Ã¡ï¿½È»ï¿½ï¿½ï¿½Ú´Î¾ï¿½ï¿½ï¿½ï¿½Ï°ï¿½ï¿½Â»ï¿½ï¿½ï¿½ï¿½Ò¼ï¿½ï¿½ï¿½ï¿½Ó¹ï¿½ï¿½Ü±ï¿½ï¿½ï¿½Ñ¡ï¿½ï¿½ Properties ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ID Îª IDC_STATIC ï¿½ï¿½ï¿½ï¿½Ê¶ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½RESOURCE.H�ж���Ϊ-1����춳�ʽ�в�ʹ�õ�����ID���� Type ï¿½ï¿½Îª Icon ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ Image ï¿½ï¿½Î»ï¿½ï¿½ï¿½ï¿½ï¿½Ê½Í¼Ê¾ï¿½ï¿½ï¿½ï¿½ï¿½Æ£ï¿½ï¿½ï¿½ï¿½ß£ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ñ¾ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ò»ï¿½ï¿½Í¼Ê¾ï¿½ï¿½ï¿½ï¿½Ã´ï¿½ï¿½Ò²ï¿½ï¿½ï¿½Ô´ï¿½ï¿½ï¿½ï¿½ï¿½Ê½ï¿½åµ¥ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ñ¡ï¿½ï¿½Ò»ï¿½ï¿½ï¿½ï¿½ï¿½Æ£ï¿½About1����

��춶Ի������е�������̬�ִ������Դ� Controls ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ñ¡ï¿½ï¿½ Static Text ï¿½ï¿½È»ï¿½ï¿½È·ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ú¶Ô»ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ðµï¿½Î»ï¿½Ã¡ï¿½ï¿½Ò¼ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½î£¬È»ï¿½ï¿½Ó¹ï¿½ï¿½Ü±ï¿½ï¿½ï¿½Ñ¡ï¿½ï¿½ Properties ï¿½ï¿½ï¿½ï¿½ Properties ï¿½ï¿½ï¿½ Caption ï¿½ï¿½Î»ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Òªï¿½ï¿½Ê¾ï¿½ï¿½ï¿½ï¿½ï¿½Ö¡ï¿½Ñ¡ï¿½ï¿½ Styles Ò³ï¿½ï¿½ï¿½Ç©ï¿½ï¿½ï¿½ï¿½ Align Text ï¿½ï¿½Î»Ñ¡ï¿½ï¿½ Center ï¿½ï¿½

��������Щ�ִ���ʱ����ϣ���Ի�������Ը���һЩ������ѡ�жԻ����飬Ȼ����ҷ�߿���Ҳ����ѡ�����ſ����ͨ���ü����ϵ��α��ƶ�����ɴ˲����������Щ����ͷ�������ƶ����������Shift���ᰴ��ͷ�������Ըı������Ĵ�С����ѡ�����������ʹ�С��ʾ��Developer Studio�Ӵ������½ǡ�

�����������һ��Ӧ�ó�ʽ����ô�����ڲ鿴��Դ������ABOUT1.RCʱ����������Developer Studio������ģ�塣������ƵĶԻ�����ģ�����£�

ABOUTBOX DIALOG DISCARDABLE  32, 32, 180, 100
STYLE DS_MODALFRAME | WS_POPUP
FONT 8, "MS Sans Serif"
BEGIN
  	DEFPUSHBUTTON   "OK",IDOK,66,80,50,14
    	ICON            					"ABOUT1",IDC_STATIC,7,7,21,20
    	CTEXT           					"About1",IDC_STATIC,40,12,100,8
    	CTEXT       "About Box Demo Program",IDC_STATIC,7,40,166,8
    	CTEXT       "(c) Charles Petzold, 1998",IDC_STATIC,7,52,166,8
END

��һ�и����˶Ի���������ƣ�����ΪABOUTBOX������ͬ������Դ����Ҳ����ʹ��������Ϊ�Ի���������ơ����������ǹؼ���DIALOG��DISCARDABLE�Լ��ĸ����֡�ǰ���������ǶԻ��������Ͻǵ�x��y���꣬�������ڳ�ʽ���жԻ�����ʱ�������춸��Ӵ���ʾ����ġ������������ǶԻ�����Ŀ��Ⱥ͸߶ȡ�

��Щ����ʹ�С�ĵ�λ������ͼ�ء�����ʵ��������һ�����������ϵͳ����ϵͳֻ��춶Ի�����ģ�塣�������ݶԻ�����ʹ������Ĵ�С������������8���MS Sans Serif���壩��x����Ϳ��ȵĵ�λ����Ԫƽ�����ȵ�1/4��y����͸߶ȵĵ�λ����Ԫ�߶ȵ�1/8����ˣ�������Ի�������˵���Ի��������ϽǾ������Ӵ���ʾ����������5����Ԫ�����붥����2-1/2����Ԫ���Ի����鱾����40����Ԫ����10����Ԫ��

����������ϵʹ�ó�ʽд���߿���ʹ������ʹ�С�����¹��նԻ�����ijߴ����ۣ���������Ѷ��ʾ���Ľ������Ƕ��١����ϵͳ������Ԫ�ĸ߶ȴ���Ϊ����ȵ����������ԣ�x���y������Ȳ����ȡ�

ģ���е�STYLE���������CreateWindow�����е�style��λ�����ģ̬�Ի����飬ͨ��ʹ��WS_POPUP��DS_MODALFRAME�����ǽ����������������ѡ�

��BEGIN��END���������������Ҵ��������ֹ���ƶԻ�����ģ��ʱ�������ܻ�ʹ�ã�֮�䣬��������ڶԻ������е����Ӵ����������Ի�����ʹ����������̬�����Ӵ���������Ƿֱ���DEFPUSHBUTTON���ڶ���������ICON��ͼʾ����CTEXT�����־��У�����Щ�����ĸ�ʽΪ��

control-type "text" id, xPos, yPos, xWidth, yHeight, iStyle

���У������iStyle���ǿ�ѡ�ģ���ʹ��Windows��ͷ�����ж����ʶ������ָ�������Ӵ���ʽ��

DEFPUSHBUTTON��ICON��CTEXT��ʶ����ֻ�����ڶԻ�������ʹ�ã�������ij���ض��Ӵ������Ӵ���ʽ����д�����磬CTEXTָʾ������Ӵ�����������ǡ���̬�ġ�������ʽΪ��

WS_CHILD | SS_CENTER | WS_VISIBLE | WS_GROUP

��Ȼǰ��û�г��ֹ�WS_GROUPʶ���֣������ڵھ��µ�COLORS1��ʽ���Ѿ����ֹ�WS_CHILD��SS_CENTER��WS_VISIBLE�Ӵ���ʽ�������ڽ�����̬���Ӵ����ֿ�����ʱ�Ѿ��õ������ǡ�

���ͼʾ��������λ�dz�ʽ��ͼʾ��Դ���ƣ���Ҳ��ABOUT1��Դ�������ж��塣��춰�����������λ�dz����ڰ���������֣����������ͬ��ڳ�ʽ�н������Ӵ�������ʱ����CreateWindow��ָ���ĵڶ���������

id��λ�����Ӵ������丸�Ӵ�����ѶϢ��ͨ��ΪWM_COMMMANDѶϢ��ʱ������ʾ��������ֵ����Щ���Ӵ�������ĸ��Ӵ����ǶԻ����鱾����������ЩѶϢ���͸�Windows��һ���Ӵ�ѶϢ������ʽ������������Ӵ�ѶϢ������ʽҲ����ЩѶϢ���͸����ڳ�ʽ�и����ĶԻ��������IDֵ��ͬ������ڵھ��½������Ӵ�ʱ����CreateWindow��ʽ��ʹ�õ����Ӵ�ID��������ֺ�ͼʾ��������Ӵ�����ѶϢ��������Щֵ���趨ΪIDC_STATIC������RESOURCE.H�ж���Ϊ-1��������IDֵΪIDOK������WINUSER.H�ж���Ϊ1��

���������ĸ������趨���Ӵ���λ�ã����춶Ի�������ʾ��������Ͻǣ��ʹ�С����������ϵͳ����ƽ�����ȵ�1/4��ƽ���߶ȵ�1/8Ϊ��λ����ʾ�ġ����ICON���������Ⱥ͸߶Ƚ������ԡ�

�Ի�����ģ���е�DEFPUSHBUTTON���������˰���DEFPUSHBUTTON�ؼ������������Ӵ���ʽ���������Ӵ���ʽWS_GROUP���������۸ó�ʽ�ĵڶ����汾ABOUT2ʱ��������ϸ˵��WS_GROUP���Լ���ص�WS_TABSTOP��ʽ����

�Ի��������
��

����ʽ�ڵĶԻ�������������͸��Ի������ѶϢ�����ܿ������������Ӵ�ѶϢ������ʽ����������������ʵ���Ӵ�ѶϢ������ʽ���Ի�������Ӵ�ѶϢ������ʽ��Windows�ڲ����壬����Ӵ������������д�ĶԻ�������򣬰��������յ�������ѶϢ��Ϊ������������ABOUT1�ĶԻ��������

BOOL 	CALLBACK AboutDlgProc (HWND hDlg, UINT message,WPARAM wParam, LPARAM lParam)
{
     	switch (message)
  	{
     	case 	WM_INITDIALOG :
          		return TRUE ;
          
     	case 	WM_COMMAND :
          		switch (LOWORD (wParam))
          		{
          		case 	IDOK :
          		case 	IDCANCEL :
               				EndDialog (hDlg, 0) ;
               				return TRUE ;
          		}
          		break ;
     	}
	return FALSE ;
}

�ú�ʽ�IJ����볣���Ӵ�ѶϢ������ʽ�IJ�����ͬ�����Ӵ�ѶϢ������ʽ���ƣ��Ի�������򶼱��붨��Ϊһ��CALLBACK��callback����ʽ��������ʹ����hDlg��Ϊ�Ի������Ӵ��Ĵ��ţ�������Ҳ���԰������Լ�����˼ʹ��hwnd�����ȣ�����������һ�������ʽ���Ӵ�ѶϢ������ʽ������

  • �Ӵ�ѶϢ������ʽ����һ��LRESULT���Ի����鴫��һ��BOOL������Windows��ͷ�����ж���Ϊint��̬��
    ��
  • ����Ӵ�ѶϢ������ʽ������ij���ض���ѶϢ����ô��������DefWindowProc������Ի����������һ��ѶϢ����ô������TRUE����0����������������ò´«»ï¿½FALSE��0����
    ��
  • �Ի����������Ҫ����WM_PAINT��WM_DESTROYѶϢ���Ի�������ò²»½ï¿½ï¿½ï¿½WM_CREATѶϢ�������������WM_INITDIALOGѶϢ�����ڼ䣬�Ի��������ִ�г�ʼ��������
    ��

WM_INITDIALOGѶϢ�ǶԻ�������յ��ĵ�һ��ѶϢ�����ѶϢֻ���͸��Ի������������Ի�������򴫻�TRUE����ôWindows�����뽹���趨���Ի������е�һ������WS_TABSTOP��ʽ�����ǽ���ABOUT2�������м��Խ��ͣ������Ӵ������������Ի������У���һ������WS_TABSTOP��ʽ�����Ӵ��������ǰ��������⣬�Ի��������Ҳ�����ڴ���WM_INITDIALOGʱʹ��SetFocus�������뽹���趨Ϊ�Ի������е�ij�����Ӵ������Ȼ�ᴫ��FALSE��

���⣬�Ի��������ֻ����WM_COMMANDѶϢ�����ǵ�������������У������ڰ�ť�������뽹�������°��¿հ׼�ʱ������������͸��丸�Ӵ���ѶϢ������������ID�������ڶԻ�����ģ���н����趨ΪIDOK����wParam�ĵ������С�������ѶϢ���Ի�����������EndDialog��������Windows����Ի����顣�����������ѶϢ���Ի�������򴫻�FALSE��������Windows�ڲ��ĶԻ������Ӵ�ѶϢ������ʽ�����ǵĶԻ�������򲻴�����ЩѶϢ��

ģ̬�Ի������ѶϢ��ͨ������ʽ��ѶϢ���У����Բ��ص��ĶԻ������м��̼��ټ���Ӱ�졣

�����Ի�����
��

��WndProc�д���WM_CREATEѶϢʱ��ABOUT1ȡ�ó�ʽ��ִ��ʵ����Ų��������ھ�̬�����У�

hInstance = ((LPCREATESTRUCT) lParam)->hInstance ;

ABOUT1���WM_COMMANDѶϢ����ȷ��ѶϢwParam�ĵ�λԪ�ֵ��IDM_APP_ABOUT�������������һ��ѶϢʱ����ʽ����DialogBox��

DialogBox (hInstance, TEXT ("AboutBox"), hwnd, AboutDlgProc) ;

�ú�ʽ��Ҫִ��ʵ����ţ��ڴ���WM_CREATEʱ����ģ����Ի��������ƣ�����Դ�������ж���ģ����Ի�����ĸ��Ӵ���Ҳ�dz�ʽ�����Ӵ����ͶԻ���������λַ�������ʹ��һ�����ֶ����ǶԻ�����ģ�����ƣ���ô������MAKEINTRESOURCE�޼�����ת��Ϊһ���ִ���

�ӹ��ܱ���ѡ��About About1��������ʾͼ11-2��ʾ�ĶԻ����顣������ʹ�û��󵥻���OK����ť�����հ׼����߰�Enter������������Ի����顣���κΰ����ڶ���ť�ĶԻ����飬�ڰ���Enter����հ׼�֮�ᣬWindows����һ��WM_COMMANDѶϢ���Ի����飬����wParam�ĵ��������ڶ�������ID����ʱ��IDΪIDOK������Escape��Ҳ���ԹرնԻ����飬��ʱWindows������һ��WM_COMMANDѶϢ������ID���IDCANCEL��

ֱ���Ի��������֮�ᣬ������ʾ�Ի������DialogBox�Ž�����Ȩ���ظ�WndProc��DialogBox�Ĵ���ֵ�ǶԻ���������ڲ����е�EndDialog��ʽ�ĵڶ������������ֵδ��ABOUT1��ʹ�ã�������ABOUT2��ʹ�ã���Ȼ�ᣬWndProc���Խ�����Ȩ���ظ�Windows��

��ʹ����ʾ�Ի�����ʱ��WndProcҲ���Լ�������ѶϢ��ʵ���ϣ������ԴӶԻ���������ڲ���WndProc����ѶϢ��ABOUT1�����Ӵ��ǵ���ʽ�Ի������Ӵ��ĸ��Ӵ�������AboutDlgProc�е�SendMessage���п���ʹ��������������ʼ��

SendMessage (GetParent (hDlg),  . . . ) ;

��ͬ������
��

��ȻVisual C++ Developer Studio�еĶԻ�����༭����������Դ�༭����ʹ���Ǽ������ÿ�����Դ������д�����⣬����ѧϰһЩ��Դ�������﷨�������õġ������춶Ի�����ģ����˵��֪�����﷨�����Ϳ��Խ�һ���˽�Ի�����ķ�Χ�����ơ�����������������������Ҫʱ�����������Լ�����һ���Ի�����ģ�壨�����������HEXCALC��ʽ������Դ����������Դ�����﷨���ļ�λ�/Platform SDK/Windows Programming Guidelines/Platform SDK Tools/Compiling/Using the Resource Compiler��

��Developer Studio�ġ�Properties���Ի�������ָ���˶Ի�������Ӵ���ʽ��������ɶԻ�����ģ���е�STYLE���������ABOUT1������ʹ��ģ̬�Ի�������õ���ʽ��

STYLE WS_POPUP | DS_MODALFRAME

Ȼ������Ҳ���Գ���������ʽ����Щ�Ի������б����У����������ָ���Ի��������;��������ʹ����ͨ����������ʾĻ���ƶ��Ի����顣����ʽΪWS_CAPTION�������ʹ��WS_CAPTION����ôDIALOG��������ָ����x�����y�����ǶԻ�������ʾ��������꣬�����춸��Ӵ���ʾ��������Ͻǡ������н���y����֮����ʾ��

���ʹ���˱����У���ô��������CAPTION���������ַ�������С��ڶԻ�����ģ���У�CAPTION������STYLE���������棺

CAPTION "Dialog Box Caption"

���⣬�ڶԻ����������WM_INITDIALOGѶϢ�����ڼ䣬�������Ժ��У�

SetWindowText (hDlg, TEXT ("Dialog Box Caption")) ;

�����ʹ��WS_CAPTION��ʽ��Ҳ��������һ��WS_SYSMENU��ʽ��ϵͳ���ܱ���ť������ʽ����ʹ���ߴ�ϵͳ���ܱ���ѡ�� Move ï¿½ï¿½ Close ï¿½ï¿½

�� Properties ï¿½Ô»ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ Border ï¿½åµ¥ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ñ¡ï¿½ï¿½ Resizing ï¿½ï¿½ï¿½ï¿½Í¬ï¿½ï¿½ï¿½Ê½WS_THICKFRAME��������ʹ�������ŶԻ����飬���ܴ˲����������á�����������������һ��Ļ�����������Ϊ�˶Ի�������ʽ������󻯷��顣

���������Ը��Ի���������һ�����ܱ�����ʱ�Ի�����ģ�彫���������������

MENU menu-name

��������ǹ��ܱ������ƣ�������Դ�����еĹ��ܱ��š�ģ̬�Ի��������ʹ�ù��ܱ������ʹ���˹��ܱ�����ô������ȷ�����ܱ��ͶԻ�����������е�����ID����Ψһ�ģ����߲���Ψһ�ģ�ȴ��������ͬ�����

FONT����ʹ�������趨��ϵͳ���壬�Թ��Ի���������ʹ�á����ڹ�ȥ�ĶԻ������в����ã�������ȴ�dz��ձ顣��ʵ�ϣ����ڶ�����£�Developer StudioΪ��������ÿһ���Ի����鶼ѡ��8���MS Sans Serif���塣һ��Windows��ʽ�ܰ��Լ���۴��÷dz����ڲ�ͬ����ֻ��Ϊ��ʽ�ĶԻ����鼰���������������׼��һ�����弴�ɡ�

���ܶԻ������Ӵ�ѶϢ������ʽͨ��λ�Windows�ڲ���������Ҳ����ʹ���Լ���д���Ӵ�ѶϢ������ʽ�������Ի�����ѶϢ��Ҫ���������������ڶԻ�����ģ����ָ��һ���Ӵ��������

CLASS "class-name"

�����÷����ټ��������ڱ���������ʾ��HEXCALC��ʽ�����ǽ��õ�����

����ʹ�öԻ�����ģ�������������DialogBoxʱ��Windowsͨ��������ͨ��CreateWindow��ʽ����ɽ�������ʽ�Ӵ�����Ҫ��ɵ�һ�в�����Windows�ӶԻ�����ģ����ȡ���Ӵ������ꡢ��С���Ӵ���ʽ������͹��ܱ�����DialogBox�IJ����л��ִ��ʵ����ź͸��Ӵ����š�������Ҫ��Ψһ������Ѷ��һ���Ӵ���𣨼���Ի�����ģ�岻ָ���Ӵ����Ļ�����WindowsΪ�Ի�����ע��һ��ר�õ��Ӵ��������Ӵ������Ӵ�ѶϢ������ʽ���Դ�ȡ�Ի��������λַ����λַ������DialogBox������ָ���ģ�������������ʹ��ʽ��øõ���ʽ�Ӵ������յ�ѶϢ����Ȼ��������ͨ���Լ���������ʽ�Ӵ���������ά���Լ��ĶԻ����顣������ʹ��DialogBox����򵥡�

Ҳ����ϣ�������Windows�Ի����������������ϣ���������ܹ�������Դ�����ж���Ի�����ģ�壬Ҳ������ϣ����ʽ��ִ��ʱ���Զ�̬�ؽ����Ի����顣��ʱ����������ֹ��ܵĺ�ʽ��DialogBoxIndirect���˺�ʽ�����Ͻṹ������ģ�塣

��ABOUT1.RC�ĶԻ�����ģ���У�����ʹ����дCTEXT��ICON��DEFPUSHBUTTON������Ի���������Ҫ��������̬�����Ӵ��������������ʹ��������̬��ÿ����̬������һ���ض���Ԥ�ȶ����Ӵ�����һ���Ӵ���ʽ���±���ʾ����һЩ��������̬��ͬ���Ӵ������Ӵ���ʽ��

��11-1
��������̬ �Ӵ���� �Ӵ���ʽ
PUSHBUTTON ��ť BS_PUSHBUTTON | WS_TABSTOP
DEFPUSHBUTTON ��ť BS_DEFPUSHBUTTON | WS_TABSTOP
CHECKBOX ��ť BS_CHECKBOX | WS_TABSTOP
RADIOBUTTON ��ť BS_RADIOBUTTON | WS_TABSTOP
GROUPBOX ��ť BS_GROUPBOX | WS_TABSTOP
LTEXT ��̬���� SS_LEFT | WS_GROUP
CTEXT ��̬���� SS_CENTER | WS_GROUP
RTEXT ��̬���� SS_RIGHT | WS_GROUP
ICON ��̬ͼʾ SS_ICON
EDITTEXT �༭ ES_LEFT | WS_BORDER | WS_TABSTOP
SCROLLBAR ������ SBS_HORZ
LISTBOX �嵥���� LBS_NOTIFY | WS_BORDER | WS_VSCROLL
COMBOBOX ����ʽ�嵥���� CBS_SIMPLE | WS_TABSTOP

��Դ��������Ψһ�ܹ�ʶ����Щ��д�ij�ʽ�����˱�����ʾ���Ӵ���ʽ�⣬ÿ������������������ʽ��

WS_CHILD | WS_VISIBLE

�����Щ��������̬������EDITTEXT��SCROLLBAR��LISTBOX��COMBOBOX֮�⣬�����������ĸ�ʽΪ��

control-type "text", id, xPos, yPos, xWidth, yHeight, iStyle

���EDITTEXT��SCROLLBAR��LISTBOX��COMBOBOX�����ʽΪ��

control-type id, xPos, yPos, xWidth, yHeight, iStyle

����û��������λ���������������У�iStyle��������ѡ���Եġ�

�ڵھ��£���������ȷ��Ԥ�ȶ������Ӵ��Ŀ��Ⱥ͸߶ȵĹ�����������Ҫ�ص��ھ���ȥ�ο���Щ������ʱ���ס���Ի�����ģ����ָ����С�ĵ�λΪƽ����Ԫ���ȵ�1/4����ƽ����Ԫ�߶ȵ�1/8��

������������ style ï¿½ï¿½Î»ï¿½Ç¿ï¿½Ñ¡ï¿½Ä¡ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ó´ï¿½ï¿½ï¿½Ê½Ê¶ï¿½ï¿½ï¿½Ö¡ï¿½ï¿½ï¿½ï¿½ç£¬ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ë½¨ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Î¿ï¿½ï¿½ï¿½ß°ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ÖµÄºï¿½È¡ï¿½ï¿½ï¿½é£¬ï¿½ï¿½Ã´ï¿½ï¿½ï¿½ï¿½Ê¹ï¿½Ã£ï¿½

CHECKBOX "text", id, xPos, yPos, xWidth, yHeight, BS_LEFTTEXT

ע�⣬��������̬EDITTEXT���Զ�����һ���߿�������뽨��һ��û�б߿�����Ӵ��༭�����������ʹ�ã�

EDITTEXT id, xPos, yPos, xWidth, yHeight, NOT WS_BORDER

��Դ������Ҳ�����������������Ƶ�ר�ÿ�����������

CONTROL "text", id, "class", iStyle, xPos, yPos, xWidth, yHeight

������������ͨ��ָ���Ӵ������������Ӵ���ʽ��������������̬�����Ӵ���������磬Ҫȡ����

PUSHBUTTON "OK", IDOK, 10, 20, 32, 14

������ʹ�ã�

CONTROL  "OK", IDOK, "button", WS_CHILD | WS_VISIBLE |
          		BS_PUSHBUTTON | WS_TABSTOP, 10, 20, 32, 14

��������Դ������ʱ��������������.RES��.EXE�����еı�������ͬ�ġ���Developer Studio�У�������ʹ�� Controls ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ðµï¿½ Custom Control Ñ¡ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ABOUT3��ʽ�У�������չʾ������ô�ѡ���һ��������������ij�ʽ���Ѷ����˸ÿ�������Ӵ����

�����ڶԻ�����ģ����ʹ��CONTROL����ʱ�����ذ���WS_CHILD��WS_VISIBLE��ʽ���ڽ������Ӵ�ʱ��Windows�Ѿ���������Щ�Ӵ���ʽ��CONTROL�����ĸ�ʽҲ˵��Windows�Ի�����������ڽ����Ի�����ʱ������˴�����������ȣ�������ǰ�������۵ģ�������һ������ʽ�Ӵ����丸�Ӵ�������DialogBox��ʽ���ṩ��Ȼ�ᣬ�Ի����������Ϊ�Ի�����ģ���е�ÿ���������һ�����Ӵ���������Щ������ĸ��Ӵ������������ʽ�Ի����顣���������CONTROL������ת����һ��CreateWindow���У���ʽ������ʾ��

hCtrl 	=CreateWindow 	(TEXT ("button"), TEXT ("OK"),
           					WS_CHILD | WS_VISIBLE | WS_TABSTOP | BS_PUSHBUTTON,
                      					10 * cxChar / 4, 20 * cyChar / 8,
                      					32 * cxChar / 4, 14 * cyChar / 8,
                      					hDlg, IDOK, hInstance, NULL) ;

���У�cxChar��cyChar��ϵͳ������Ԫ�Ŀ��Ⱥ͸߶ȣ���ͼ��Ϊ��λ��hDlg�����Ǵӽ����öԻ������Ӵ���CreateWindow���д��ص�ֵ��hInstance�����Ǵ�DialogBox���л�õġ�

�����ӵĶԻ�����
��

ABOUT1�еļ򵥶Ի�����չʾ����ƺ�ִ��һ���Ի������Ҫ�㣬��������������һ����΢���ӵ����ӡ���ʽ11-2������ABOUT2��ʽչʾ������ڶԻ���������й�������������õ�ѡ��ť���Լ�����ڶԻ��������ʾ�����л�ͼ��

 ï¿½ï¿½Ê½11-2  ABOUT2
ABOUT2.C
/*--------------------------------------------------------------------------
   ABOUT2.C -- 	About Box Demo Program No. 2
         					(c) Charles Petzold, 1998
---------------------------------------------------------------------------*/
#include <windows.h>
#include "resource.h"
LRESULT 	CALLBACK WndProc      			(HWND, UINT, WPARAM, LPARAM) ;
BOOL    		CALLBACK AboutDlgProc 		(HWND, UINT, WPARAM, LPARAM) ;
     
int 	iCurrentColor  		= IDC_BLACK,
    	iCurrentFigure 		= IDC_RECT ;
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                    					PSTR szCmdLine, int iCmdShow)
{
     	static TCHAR 		szAppName[] = TEXT ("About2") ;
     	MSG          					msg ;
     	HWND         					hwnd ;
     	WNDCLASS     				wndclass ;
     
     	wndclass.style         				= CS_HREDRAW | CS_VREDRAW ;
     	wndclass.lpfnWndProc   				= WndProc ;
     	wndclass.cbClsExtra    				= 0 ;
     	wndclass.cbWndExtra    				= 0 ;
     	wndclass.hInstance     				= hInstance ;
     	wndclass.hIcon         				= LoadIcon (hInstance, szAppName) ;
     	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 ("About Box Demo Program"),
                          		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 PaintWindow (HWND hwnd, int iColor, int iFigure)
{
     	static COLORREF crColor[8] = { RGB ( 0, 0, 0), RGB ( 0, 0, 255),
                        RGB ( 0, 255, 0), RGB ( 0, 255, 255),
     					RGB (255,   0, 0), RGB (255,   0, 255),
                        RGB (255, 255, 0), RGB (255, 255, 255)} ;
     	HBRUSH          				hBrush ;
     	HDC             				hdc ;
     	RECT            				rect ;
     
     	hdc = GetDC (hwnd) ;
     	GetClientRect (hwnd, &rect) ;
     	hBrush = CreateSolidBrush (crColor[iColor - IDC_BLACK]) ;
     	hBrush = (HBRUSH) SelectObject (hdc, hBrush) ;
     
     	if (iFigure == IDC_RECT)
          		Rectangle (hdc, rect.left, rect.top, rect.right, rect.bottom) ;
     	else
		Ellipse   (hdc, rect.left, rect.top, rect.right, rect.bottom) ;
     	DeleteObject (SelectObject (hdc, hBrush)) ;
     	ReleaseDC (hwnd, hdc) ;
}
void PaintTheBlock (HWND hCtrl, int iColor, int iFigure)
{
     	InvalidateRect (hCtrl, NULL, TRUE) ;
     	UpdateWindow (hCtrl) ;
     	PaintWindow (hCtrl, iColor, iFigure) ;
}
LRESULT CALLBACK WndProc (	HWND hwnd, UINT message, WPARAM wParam,LPARAM lParam)
{
     	static HINSTANCE 		hInstance ;
     	PAINTSTRUCT  				ps ;
     
     	switch (message)
     {
     	case 	WM_CREATE:
          		hInstance = ((LPCREATESTRUCT) lParam)->hInstance ;
          		return 0 ;
          
     	case 	WM_COMMAND:
          		switch (LOWORD (wParam))
          		{
          		case IDM_APP_ABOUT:
               				if (DialogBox (hInstance, TEXT ("AboutBox"), hwnd, AboutDlgProc))
                    					InvalidateRect (hwnd, NULL, TRUE) ;
               				return 0 ;
          		}
          		break ;
          
     	case 	WM_PAINT:
          		BeginPaint (hwnd, &ps) ;
          		EndPaint (hwnd, &ps) ;
               
          		PaintWindow (hwnd, iCurrentColor, iCurrentFigure) ;
          		return 0 ;
               
     	case 	WM_DESTROY:
          		PostQuitMessage (0) ;
          		return 0 ;
     	}
   	return DefWindowProc (hwnd, message, wParam, lParam) ;
}
BOOL CALLBACK AboutDlgProc (HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
     	static HWND 	hCtrlBlock ;
     	static int 		iColor, iFigure ;
     
     	switch (message)
     	{
     	case 	WM_INITDIALOG:
          		iColor  		= iCurrentColor ;
          		iFigure 		= iCurrentFigure ;
          		CheckRadioButton (hDlg, IDC_BLACK, IDC_WHITE,   iColor) ;
          		CheckRadioButton (hDlg, IDC_RECT,  IDC_ELLIPSE, iFigure) ;
          
          		hCtrlBlock = GetDlgItem (hDlg, IDC_PAINT) ;
          
          		SetFocus (GetDlgItem (hDlg, iColor)) ;
          		return FALSE ;
          
     	case 	WM_COMMAND:
          		switch (LOWORD (wParam))
          		{
          		case 	IDOK:
               				iCurrentColor  		= iColor ;
               				iCurrentFigure 		= iFigure ;
               				EndDialog (hDlg, TRUE) ;
               				return TRUE ;
               
          		case 	IDCANCEL:
               				EndDialog (hDlg, FALSE) ;
               				return TRUE ;
               
          		case	IDC_BLACK:
          		case 	IDC_RED:
          		case 	IDC_GREEN:
          		case 	IDC_YELLOW:
          		case 	IDC_BLUE:
          		case 	IDC_MAGENTA:
          		case 	IDC_CYAN:
          		case 	IDC_WHITE:
               				iColor = LOWORD (wParam) ;
               				CheckRadioButton (hDlg, IDC_BLACK, IDC_WHITE, LOWORD (wParam)) ;
               				PaintTheBlock (hCtrlBlock, iColor, iFigure) ;
               				return TRUE ;
               
          		case 	IDC_RECT:
          		case 	IDC_ELLIPSE:
               				iFigure = LOWORD (wParam) ;
               				CheckRadioButton (hDlg, IDC_RECT, IDC_ELLIPSE, LOWORD (wParam)) ;
               				PaintTheBlock (hCtrlBlock, iColor, iFigure) ;
               				return TRUE ;
          		}
          		break ;
          
     	case 	WM_PAINT:
          		PaintTheBlock (hCtrlBlock, iColor, iFigure) ;
          		break ;
     	}
     	return FALSE ;
}
 ABOUT2.RC ��ժ¼��
//Microsoft Developer Studio generated resource script.
#include "resource.h"
#include "afxres.h"
/////////////////////////////////////////////////////////////////////////////
// Dialog
ABOUTBOX DIALOG DISCARDABLE  32, 32, 200, 234
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION
FONT 8, "MS Sans Serif"
BEGIN
	ICON            						"ABOUT2",IDC_STATIC,7,7,20,20
	CTEXT         "About2",IDC_STATIC,57,12,86,8
	CTEXT         "About Box Demo Program",IDC_STATIC,7,40,186,8
	LTEXT         "",IDC_PAINT,114,67,74,72
	GROUPBOX        				"&Color",IDC_STATIC,7,60,84,143
	RADIOBUTTON     			"&Black",IDC_BLACK,16,76,64,8,WS_GROUP | WS_TABSTOP
	RADIOBUTTON     	"B&lue",IDC_BLUE,16,92,64,8
	RADIOBUTTON     	"&Green",IDC_GREEN,16,108,64,8
	RADIOBUTTON     	"Cya&n",IDC_CYAN,16,124,64,8
	RADIOBUTTON     	"&Red",IDC_RED,16,140,64,8
	RADIOBUTTON     	"&Magenta",IDC_MAGENTA,16,156,64,8
	RADIOBUTTON     	"&Yellow",IDC_YELLOW,16,172,64,8
	RADIOBUTTON     	"&White",IDC_WHITE,16,188,64,8
 	GROUPBOX        				"&Figure",IDC_STATIC,109,156,84,46,WS_GROUP
	RADIOBUTTON     			"Rec&tangle",IDC_RECT,116,172,65,8,WS_GROUP | WS_TABSTOP
	RADIOBUTTON     			"&Ellipse",IDC_ELLIPSE,116,188,64,8
	DEFPUSHBUTTON   			"OK",IDOK,35,212,50,14,WS_GROUP
	PUSHBUTTON      				"Cancel",IDCANCEL,113,212,50,14,WS_GROUP
END
/////////////////////////////////////////////////////////////////////////////
// Icon
ABOUT2        ICON   	  DISCARDABLE         "About2.ico"
/////////////////////////////////////////////////////////////////////////////
// Menu
ABOUT2 	MENU DISCARDABLE 
BEGIN
    	POPUP "&Help"
    	BEGIN
        		MENUITEM "&About",    			IDM_APP_ABOUT
    	END
END
 RESOURCE.H ��ժ¼��
// Microsoft Developer Studio generated include file.
// Used by About2.rc
#define IDC_BLACK           1000
#define IDC_BLUE            1001
#define IDC_GREEN           1002
#define IDC_CYAN            1003
#define IDC_RED             1004
#define IDC_MAGENTA         1005
#define IDC_YELLOW          1006
#define IDC_WHITE           1007
#define IDC_RECT            1008
#define IDC_ELLIPSE         1009
#define IDC_PAINT           1010
#define IDM_APP_ABOUT       40001
#define IDC_STATIC          -1
ABOUT2.ICO


��

ABOUT2�е�About�������鵥ѡ��ť��һ������ѡ����ɫ����һ������ѡ���Ǿ��λ�����Բ�Ρ���ѡ�ľ��λ�����Բ��ʾ�ڶԻ������ڣ����ڲ���Ŀǰѡ�����ɫ��ɫ��ʹ���߰��¡�OK����ť�ᣬ�Ի��������ֹ����ʽ���Ӵ�ѶϢ������ʽ�����Լ�����ʾ�����ڻ����ѡͼ�Ρ���������¡�Cancel���������Ӵ�����ʾ����ᱣ��ԭ�����Ի�������ͼ11-2��ʾ������ABOUT2ʹ��Ԥ�ȶ����ʶ����IDOK��IDCANCEL��Ϊ��������������ÿ����ѡ��ť�����Լ���ʶ���֣�����������IDC��ͷ����춿������ID������Щʶ������RESOURCE.H�ж��塣


��

ͼ11-2 ABOUT2��ʽ�ĶԻ�����

������ABOUT2�Ի������н�����ѡ��ťʱ���밴��ʾ˳���������ܱ�֤Developer Studio����˳����ʶ���ֵ�ֵ����ʽ��ʹ����Щֵ�����⣬ÿ����ѡ��ť����Ҫѡ�С�Auto��ѡ���Auto Radio Button����Ҫ�ij�ʽ����٣��������ϴ������������Щ��Ȼ��������ABOUT2.RC�еĶ������趨���ǵ�ʶ���֡�

ѡ�С�Properties���Ի���������������ġ�Group��ѡ���OK���͡�Cancel����ť����Figure�����鷽�顢ÿ�����鷽���еĵ�һ����ѡ��ť����Black���͡�Rectangle������ѡ����������ѡ��ť�ġ�Tab Stop����ȡ���顣

������ȫ���������ڶԻ������еĽ���λ�úʹ�Сʱ���Ϳ��Դӡ�Layout�����ܱ�ѡ��Tab Order��ѡ���ABOUT2.RC��Դ��������ʾ��˳�򵥻�ÿһ�������

ʹ�öԻ����������
��

�ڵھ����У����ᷢ�ִ�������Ӵ��������WM_COMMANDѶϢ���丸�Ӵ���Ψһ������Ǿ����п�������������������ɷ���ѶϢ�����Ӵ���������Ӵ����Ըı����Ӵ��������״̬�����磬ѡ���ѡ��ѡ��ť����ȡ���飩����Ҳ���������Ʒ����ڶԻ���������иı��������磬����������һϵ�е�ѡ��ť���Ϳ��Է���ѶϢ�����ǣ���ѡ����߲�ѡ����Щ��ť��������WindowsҲ�ṩ�˼���ʹ�öԻ����������ļ򵥰취����������һ���Ի�������������Ӵ��������໥ͨ�ŵķ�ʽ��

ABOUT2�ĶԻ�����ģ����ʾ�ڳ�ʽ11-2��ABOUT2.RC��Դ�������С�GROUPBOX������ֻ��һ�������⣨����Ϊ��Color�����ߡ�Figure�����ķ��鷽�飬ÿ�鵥ѡ��ť���������ķ��鷽���Χ��ǰһ��İ˸���ѡ��ť�ǻ���ģ��ڶ����������ѡ��ťҲ����ˡ�

���û��󵥻�����һ����ѡ��ťʱ�����ߵ���ѡ��ťӵ�����뽹��ʱ���հ׼��������Ӵ����丸�Ӵ�����һ��WM_COMMANDѶϢ��ѶϢ��wParam�ĵ����鱻��Ϊ�������ID��wParam�ĸ�������һ��֪ͨ�룬lParamֵ�ǿ�������Ӵ����š���춵�ѡ��ť�����֪ͨ����BN_CLICKED����0��Ȼ��Windows�еĶԻ������Ӵ�ѶϢ������ʽ�����WM_COMMANDѶϢ���͸�ABOUT2.C�ڵĶԻ�������򡣵��Ի���������յ�һ����ѡ��ť��WM_COMMANDѶϢʱ����Ϊ�˰�ť�趨ѡ�б�ǣ���Ϊ����������ť���ѡ�б�ǡ�

�����ܻ��ǵ��ڵھ������Ѿ������ѡ�кͲ�ѡ�а�ť����Ҫ�����Ӵ��������BM_CHECKѶϢ��Ҫ�趨һ����ťѡ�б�ǣ�������ʹ�ã�

SendMessage (hwndCtrl, BM_SETCHECK, 1, 0) ;

Ҫ����ѡ�б�ǣ�������ʹ�ã�

SendMessage (hwndCtrl, BM_SETCHECK, 0, 0) ;

����hwndCtrl���������Ӵ���ť��������Ӵ����š�

�����ڶԻ����������ʹ�����ַ�����ʱ�е�����ģ���Ϊ����֪�����е�ѡ��ť���Ӵ����ţ�ֻ�Ǵ�����õ�ѶϢ��֪������һ�����š����˵��ǣ�WindowsΪ���ṩ��һ����ʽ�������öԻ�������źͿ�����ID��ȡ��һ���Ի������������Ӵ����ţ�

hwndCtrl = GetDlgItem (hDlg, id) ;

����Ҳ����ʹ�����º�ʽ�����Ӵ�������ȡ�ÿ������IDֵ��

id = GetWindowLong (hwndCtrl, GWL_ID) ;

�����ڴ������������Dz���Ҫ�ġ���

����ע�⵽���ڳ�ʽ11-2��ʾ�ı�ͷ����ABOUT2.H�У�������ɫ��IDֵ�Ǵ�IDC_BLACK��IDC_WHITE�����仯�ģ����ְ����ڴ������Ե�ѡ��ť��WM_COMMANDѶϢʱ��������á��ڵ�һ�γ���ѡ�л��߲�ѡ�е�ѡ��ťʱ�������ܻ��ڶԻ���������б�д���µij�ʽ��

static int iColor ;
�����г�ʽ
case 	WM_COMMAND:
     	switch (LOWORD (wParam))
     	{
    	�����г�ʽ
     	case 	IDC_BLACK:
     	case 	IDC_RED:
     	case 	IDC_GREEN:
     	case 	IDC_YELLOW:
     	case 	IDC_BLUE:
     	case 	IDC_MAGENTA:
     	case 	IDC_CYAN:
     	case 	IDC_WHITE:
          		iColor = LOWORD (wParam) ;
 
          		for (i = IDC_BLACK, i <= IDC_WHITE, i++)
               				SendMessage (GetDlgItem (hDlg, i),
                            BM_SETCHECK, i == LOWORD (wParam), 0) ;
          		return TRUE ;
    �����г�ʽ

���ַ��������������ִ�С������µ���ɫֵ������iColor�У����һ�������һ����Ȧ������ʹ�����а�����ɫ��IDֵ����ȡ��ÿ����ѡ��ť��������Ӵ����ţ�����SendMessage��ÿ�����ŷ���һ��BM_SETCHECKѶϢ��ֻ�ж����Ի������Ӵ�ѶϢ������ʽ����WM_COMMANDѶϢ�İ�ť�����ѶϢ��wParamֵ�ű��趨Ϊ1��

��һ�ּ򻯵ķ�����ʹ��ר�ŵĶԻ��������SendDlgItemMessage��

SendDlgItemMessage (hDlg, id, iMsg, wParam, lParam) ;

����ͬ춣�

SendMessage (GetDlgItem (hDlg, id), id, wParam, lParam) ;

���ڣ���Ȧ�����������

for (i = IDC_BLACK, i <= IDC_WHITE, i++)
     SendDlgItemMessage (hDlg, i, BM_SETCHECK, i == LWORD (wParam), 0) ;

��΢��Щ�Ľ��������������ش�ͻ��Ҫ�ȵ�ʹ����CheckRadioButton��ʽʱ�Ż���֣�

CheckRadioButton (hDlg, idFirst, idLast, idCheck) ;

�����ʽ��ID��idFirst��idLast֮������е�ѡ��ť��ѡ�б�Ƕ������������IDΪidCheck�ĵ�ѡ��ť����Ϊ���DZ�ѡ�еġ��������ID�����������ġ��Ӵ����ǿ�����ȫ���ѻ�Ȧ����ʹ�ã�

CheckRadioButton (hDlg, IDC_BLACK, IDC_WHITE, LOWORD (wParam)) ;

������ABOUT2�Ի�������������õķ�����

��ʹ�ú�ȡ����ʱ��Ҳ�ṩ�����Ƶļ򻯺�ʽ�������������һ����CHECKBOX���Ի������Ӵ��������ô����ʹ�����µĺ�ʽ���趨�����ѡ�б�ǣ�

CheckDlgButton (hDlg, idCheckbox, iCheck) ;

���iCheck�趨Ϊ1����ô��ť��ѡ�У�����趨Ϊ0����ô��ť����ѡ�С�������ʹ�����µķ�����ȡ�öԻ�������ij����ȡ�����״̬��

iCheck = IsDlgButtonChecked (hDlg, idCheckbox) ;

�ڶԻ���������У����ȿ��Խ�ѡ�б�ǵ�Ŀǰ״̬������һ����̬�����У��ֿ������յ�һ��WM_COMMANDѶϢ�ᣬʹ�����·���������ť��

CheckDlgButton (hDlg, idCheckbox,
     !IsDlgButtonChecked (hDlg, idCheckbox)) ;

�����������BS_AUTOCHECKBOX�������ô��ȫû�б�Ҫ����WM_COMMANDѶϢ������ֹ�Ի�����֮ǰ����ֻҪʹ��IsDlgButtonChecked�Ϳ���ȡ�ð�ťĿǰ��״̬�������������ʹ��BS_AUTORADIOBUTTON��ʽ����ôIsDlgButtonChecked�Ͳ������������ˣ���Ϊ��ҪΪÿ����ѡ��ť����������ֱ����ʽ����TRUE��ʵ���ϣ�����Ҫ����WM_COMMANDѶϢ��׷�ٰ��µİ�ť��

��OK���͡�Cancel����ť
��

ABOUT2�������������ֱ���Ϊ��OK���͡�Cancel������ABOUT2.RC�ĶԻ�����ģ���У���OK����ť��IDֵΪIDOK����WINUSER.H�б�����Ϊ1������Cancel����ť��IDֵΪIDCANCEL������Ϊ2������OK����ť���ڶ��ģ�

DEFPUSHBUTTON  		"OK",IDOK,35,212,50,14
  	PUSHBUTTON   			"Cancel",IDCANCEL,113,212,50,14

�ڶԻ������У�ͨ�����������š�OK���͡�Cancel����ť������OK����ť��Ϊ�ڶ���ť������ü��̽�����ֹ�Ի���һ������£���ͨ�������������󰴼�֮һ�����ߵ��������İ�ť�������뽹��ʱ����Spacebar����ֹ�Ի����顣���������ʹ���߰���Enter���Ի������Ӵ�ѶϢ������ʽҲ������һ��WM_COMMANDѶϢ���������ĸ�������������뽹�㡣wParam�ĵ����鱻�趨Ϊ�Ի��������ڶ�������IDֵ��������һ������ӵ�����뽹�㡣����һ������£�wParam�ĵ����鱻�趨Ϊ�������뽹��֮������IDֵ������Ի�������û���ڶ���������ôWindows��Ի����������һ��WM_COMMANDѶϢ��ѶϢ��wParam�ĵ����鱻�趨ΪIDOK�����ʹ���߰���Esc������Ctrl-Break������ôWindows��wParam���IDCANCEL�������Ի����������һ��WM_COMMANDѶϢ�����ԣ��������ڶԻ���������м��뵥���Ĵ������̲�������Ϊͨ����ֹ�Ի�����İ�������Windows����������������ת��ΪWM_COMMANDѶϢ��

AboutDlgProc��ʽͨ������EndDialog������������WM_COMMANDѶϢ��

switch (LWORD (wParam))
{
case IDOK:
     iCurrentColor  = iColor ;
     iCurrentFigure = iFigure ;
     EndDialog (hDlg, TRUE) ;
     return TRUE ;
case IDCANCEL :
     EndDialog (hDlg, FALSE) ;
     return TRUE ;

ABOUT2���Ӵ�ѶϢ������ʽ�ڳ�ʽ����ʾ�����л��ƾ��λ���Բʱ��ʹ�����������iCurrentColor��iCurrentFigure��AboutDlgProc�ڶԻ������л�ͼʱʹ���˾�̬�������iColor��iFigure��

ע��EndDialog�ĵڶ���������ֵ��ͬ�����ֵ����WndProc����ΪԭDialogBox��ʽ�Ĵ���ֵ���صģ�

case 	IDM_ABOUT:
     	if (DialogBox (hInstance, TEXT ("AboutBox"), hwnd, AboutDlgProc))
          		InvalidateRect (hwnd, NULL, TRUE) ;
     	return 0 ;

���DialogBox����TRUE����0��������ζ�������ˡ�OK����ť��Ȼ����Ҫʹ���µ���ɫ������WndProc��ʾ���򡣵�AboutDlgProc�յ�һ��WM_COMMANDѶϢ����ѶϢ��wParam�ĵ�������IDOKʱ��AboutDlgProc��ͼ�κ���ɫ�������������iCurrentColor��iCurrentFigure�С����DialogBox����FALSE�������Ӵ�����ʹ��iCurrentColor��iCurrentFigure��ԭʼ�趨��

TRUE��FALSEͨ�����EndDialog�����У��Ը�֪���Ӵ�ѶϢ������ʽʹ�������á�OK�������á�Cancel������ֹ�Ի�����ġ�������EndDialog�IJ���ʵ������һ��intֵ����DialogBoxҲ����һ��intֵ�����ԣ������ַ����ܱȽ���TRUE����FALSE���ظ������Ѷ��

����ʹ���������
��

��ABOUT2��ʹ������������ܻᡢҲ���ܲ���Ӱ������һЩ��ʽд���ߣ��������Լ�����ϲ���������������ABOUT2�е��������iCurrentColor��iCurrentFigure����ʹ�õ���ȫ�Ϸ�����Ϊ���DZ���ͬʱ���Ӵ�ѶϢ������ʽ�ͶԻ����������ʹ�á���������һ����һ��ѶԻ�����ij�ʽ�У�ÿ���Ի����鶼���ܸı�һ�ѱ�����ֵ��ʹ������������������õù��ࡣ

�����ܸ�ϲ������ʽ�еĶԻ����������Ͻṹ����ϵ�������Ͻṹ���жԻ�������Ըı�����б�����������typedef�����ж�����Щ�ṹ�����磬��ABOUT2�У����Զ����롸About����������ϵ�Ľṹ��

typedef struct
{
     	int iColor, iFigure ;
}
ABOUTBOX_DATA ;

��WndProc�У����������ݴ˽ṹ�����岢��ʼ��һ����̬������

static ABOUTBOX_DATA ad = { IDC_BLACK, IDC_RECT } ;

��WndProc��Ҳ����������ad.iColor��ad.iFigure�滻�����е�iCurrentColor��iCurrentFigure�����жԻ�����ʱ��ʹ��DialogBoxParam������DialogBox���˺�ʽ�ĵ�������������������32λԪֵ��һ����˵����ֵ�趨Ϊָ��һ���ṹ��ָ�꣬��������WndProc�е�ABOUTBOX_DATA�ṹ��

case 	IDM_ABOUT:
     	if (DialogBoxParam (hInstance, TEXT ("AboutBox"), 
                         hwnd, AboutDlgProc, &ad))
          		InvalidateRect (hwnd, NULL, TRUE) ;
     	return 0 ;

���ǹؼ���DialogBoxParam������һ����������ΪWM_INITDIALOGѶϢ�е�lParam���ݸ��Ի��������ġ�

�Ի��������������ABOUTBOX_DATA�ṹ��̬�ľ�̬������һ���ṹ��һ��ָ��ṹ��ָ�꣩��

static ABOUTBOX_DATA ad, * pad ;

��AboutDlgProc�У��˶��������iColor��iFigure�Ķ��塣��WM_INITDIALOGѶϢ�Ŀ�ʼ���֣��Ի�����������lParam�趨��������������ֵ��

pad = (ABOUTBOX_DATA *) lParam ;
ad = * pad ;

��һ�������У�pad�趨ΪlParam��ָ�ꡣ�༴��padʵ����ָ����WndProc�����ABOUTBOX_DATA�ṹ���ڶ�����������˴�WndProc�еĽṹ����DlgProc�е�����ṹ����λ����λ���ݸ��ơ�

���ڣ�����ʹ���߰��¡�OK����ťʱ���õij�ʽ����֮�⣬���е�AboutDlgProc����ad.iColor��ad.iFigure�滻��iFigure��iColor����ʱ��������ṹ�����ݸ��ƻ�WndProc�еĽṹ��

case 	IDOK:
     	* pad = ad ;
     	EndDialog (hDlg, TRUE) ;
     	return TRUE ;

Tabͣ���ͷ���
��

�ڵھ��£����������Ӵ������ΪCOLORS1���ӹ��ܣ�ʹ�����ܹ�����Tab����һ��������ת�Ƶ���һ�������С��ڶԻ������У��Ӵ�������Dz���Ҫ�ģ���ΪWindows����˽����뽹���һ���������ƶ�����һ������������й�����������ˣ��������ڶԻ�����ģ����ʹ��WS_TABSTOP��WS_GROUP�Ӵ���ʽ�ﵽ��Ŀ�ġ����������Ҫʹ��Tab����ȡ�Ŀ������Ҫ�����Ӵ���ʽ��ָ��WS_TABSTOP��

������ı�11-1�����ͻ�ע�⵽��������WS_TABSTOP����Ϊ�ڶ���ʽ������һЩ��û�н�����Ϊ�ڶ���ʽ��һ����ԣ�������WS_TABSTOP��ʽ�Ŀ�����ر��Ǿ�̬�������Ӧ��ȡ�����뽹�㣬��Ϊ��ʹ�������뽹�㣬����Ҳ������ɲ����������ڴ���WM_INITDIALOGѶϢʱ�������뽹���趨��һ���ض��Ŀ��������ѶϢ�д���FALSE������Windows�����뽹���趨Ϊ�Ի������ڵ�һ������WS_TABSTOP��ʽ�Ŀ����

Windows���Ի��������ӵĵڶ������̽�������α��ƶ��������ֽ����춵�ѡ��ť���������Ҫ�ԡ������ʹ��Tab���ƶ���ijһ����Ŀǰѡ�еĵ�ѡ��ť����ô������Ҫʹ���α��ƶ����������뽹��Ӹõ�ѡ��ť�ƶ�������������ѡ��ť�ϡ�ʹ��WS_GROUP�Ӵ���ʽ���ɻ��������ܡ���춶Ի�����ģ���е��ض����������У�Windows��ʹ���α��ƶ��������뽹��ӵ�һ������WS_GROUP��ʽ�Ŀ���Ȩ�л�����һ������WS_GROUP��ʽ�Ŀ������С�����б�Ҫ��Windows���ӶԻ����������һ���������Ȧ����һ��������Ա��ҵ�����Ľ�β��

���ڶ��趨�£�������LTEXT��CTEXT��RTEXT��ICON������WS_GROUP��ʽ��������ʽ����ر���˷���Ľ�β�������뾭����WS_GROUP��ʽ�ӵ�������̬�Ŀ������С�

����������һ��ABOUT2.RC�еĶԻ�����ģ�塣�ĸ�����WS_TABSTOP��ʽ�Ŀ�������ÿ����ĵ�һ����ѡ��ť�����Եذ������������������ڶ��趨�����ڵ�һ�������Ի�����ʱ��������ʹ��Tab�������ĸ�������֮���ƶ���

��ÿ�鵥ѡ��ť�У�������ʹ���α��ƶ����л����뽹�㲢�ı�ѡ�б�ǡ����磬 Color ï¿½ï¿½ï¿½ï¿½Ê½ï¿½åµ¥ï¿½ï¿½ï¿½ï¿½Äµï¿½Ò»ï¿½ï¿½ï¿½ï¿½Ñ¡ï¿½ï¿½Å¥ï¿½ï¿½ Black ï¿½ï¿½ï¿½ï¿½ Figure ï¿½ï¿½ï¿½ï¿½Ê½ï¿½åµ¥ï¿½ï¿½ï¿½é¶¼ï¿½ï¿½ï¿½ï¿½WS_GROUP��ʽ������ζ�����������α��ƶ���������ӡ�Black����ѡ��ť�ƶ��� Figure ï¿½ï¿½ï¿½é·½ï¿½ï¿½ï¿½Ð¡ï¿½ï¿½ï¿½ï¿½Æµï¿½ï¿½ï¿½ï¿½Î£ï¿½ Figure ï¿½ï¿½ï¿½é·½ï¿½ï¿½Äµï¿½Ò»ï¿½ï¿½ï¿½ï¿½Ñ¡ï¿½ï¿½Å¥ï¿½ï¿½ Rectangle ï¿½ï¿½ï¿½ï¿½DEFPUSHBUTTON������WS_GROUP��ʽ������������ʹ���α��ƶ���������������ѡ��ť�� Rectangle ï¿½ï¿½ Ellipse Ö®ï¿½ï¿½ï¿½Æ¶ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½WS_GROUP��ʽ������ֹ�α��ƶ����ڰ����������뽹��ʱ�����á�

ʹ��ABOUT2ʱ��Windows�ĶԻ���������������鵥ѡ��ť�����һЩ�൱���ӵĴ�����������Ԥ�ڵ���������춵�ѡ��ť����ʱ���α��ƶ����л����뽹�㣬�����Ի����������WM_COMMANDѶϢ�����ǣ������ı�������ѡ�еĵ�ѡ��ťʱ��WindowsҲ����ѡ�еĵ�ѡ��ť�趨��WS_TABSTOP��ʽ��������һ��ʹ��Tab�л�����һ���ᣬWindows��������뽹���趨Ϊѡ�еĵ�ѡ��ť��

������λ�еġ����������½����������ĸ�Ե�����ʾ�������������һ�ּ��̽��棬������ͨ����������ĸ�������뽹���ƶ������ⵥѡ��ť�ϡ�͸������C������ Color ï¿½ï¿½ï¿½ï¿½Ê½ï¿½åµ¥ï¿½ï¿½ï¿½é£©ï¿½ï¿½ï¿½ï¿½F������ Figure ï¿½ï¿½ï¿½ï¿½Ê½ï¿½åµ¥ï¿½ï¿½ï¿½é£©ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ô½ï¿½ï¿½ï¿½ï¿½ë½¹ï¿½ï¿½ï¿½Æ¶ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ó¦ï¿½ï¿½ï¿½ï¿½Ä¿Ç°Ñ¡ï¿½ÐµÄµï¿½Ñ¡ï¿½ï¿½Å¥ï¿½Ï¡ï¿½

���ܳ�ʽд����ͨ���öԻ�����������������Щ����������Windows�ṩ��������ʽ���Ա��ʽд������Ѱ��һ������ǰһ��Tab��ͣ������������Щ��ʽΪ��

hwndCtrl = GetNextDlgTabItem (hDlg, hwndCtrl, bPrevious) ;

��

hwndCtrl = GetNextDlgGroupItem (hDlg, hwndCtrl, bPrevious) ;

���bPreviousΪTRUE����ô��ʽ����ǰһ��Tab��ͣ�����������ΪFALSE���򴫻���һ��Tab��ͣ����������

�ڶԻ������ϻ�ͼ
��

ABOUT2�������һЩ���˵�����ر�����飬�༴�ڶԻ������ϻ�ͼ������������һ�������������ġ���ABOUT2.RC�ĶԻ�����ģ���ڣ�ʹ��λ�úʹ�СΪ������Ҫ��ͼ����������һ��հ����ֿ����

LTEXT  ""  IDC_PAINT, 114, 67, 72, 72

�������Ϊ18����Ԫ����9����Ԫ�ߡ�������������û�����֣������Ӵ�ѶϢ������ʽΪ����̬����������Ĺ�����ֻ���ڱ����ػ�������Ӵ�������ʱ����䱳����

��Ŀǰ��ɫ��ͼ��ѡ�����ı䣬���߶Ի������������һ��WM_PAINTѶϢʱ���Ի�����������PaintTheBlock�������ʽ��ABOUT2.C�У�

PaintTheBlock (hCtrlBlock, iColor, iFigure) ;

��AboutDlgProc�У��Ӵ�����hCtrlBlock�Ѿ��ڴ���WM_INITDIALOGѶϢʱ���趨��

hCtrlBlock = GetDlgItem (hDlg, IDD_PAINT) ;

������PaintTheBlock��ʽ��

void PaintTheBlock (HWND hCtrl, int iColor, int iFigure)
{
     	InvalidateRect (hCtrl, NULL, TRUE) ;
     	UpdateWindow (hCtrl) ;
     	PaintWindow (hCtrl, iColor, iFigure) ;
}

�����ʽʹ�����Ӵ���������Ч����Ϊ�������Ӵ�ѶϢ������ʽ����һ��WM_PAINTѶϢ��Ȼ�����ABOUT2�е���һ����ʽPaintWindow ��

PaintWindow��ʽȡ��һ��װ�����ݴ��ţ�������ŵ�hCtrl�У�������ѡͼ�Σ�������ѡ��ɫ��һ����ɫ��ˢ����ͼ�Ρ����Ӵ�������Ĵ�С��GetClientRect��á����ܶԻ�����ģ������ԪΪ��λ�����˿�����Ĵ�С����GetClientRectȡ����ͼ��Ϊ��λ�ijߴ硣��Ҳ����ʹ�ú�ʽMapDialogRect���Ի������е���Ԫ����ת��Ϊ��ʾ�����е�ͼ�����ꡣ

���Dz�����Ļ����˶Ի��������ʾ����ʵ�ʻ��Ƶ������Ӵ����������ʾ����ÿ���Ի�����õ�һ��WM_PAINTѶϢʱ���������Ӵ����������ʾ����ʧЧ������������ʹ��ȷ����������ʾ��������Ч�ˣ�Ȼ�������ϻ�ͼ��

��������ʽ��춶Ի�����
��

����������������Ӵ��ĺ�ʽҲ������춶Ի������еĿ�������磬������뵷�ҵĻ�����ô����ʹ��MoveWindow�ڶԻ��������ƶ������ǿ��ʹ�����û�����׷�����ǡ�

��ʱ������Ҫ����������������趨����̬�����û��߽���ijЩ���������Ҫ���У�

EnableWindow (hwndCtrl, bEnable) ;

��bEnableΪTRUE����0��ʱ�������ÿ������bEnableΪFALSE��0��ʱ�������ÿ�����ڿ��������ʱ�������ٽ��ռ��̻��߻������롣�����ܽ���һ��ӵ�����뽹��Ŀ����

�����Լ��Ŀ�����
��

����Windows����������ά���Ի���������Ӵ�������Ĺ�������ͬʱҲΪ���ṩ�˸��ּ����ʽ��ķ�����ǰ�������Ѿ��������ڶԻ������ϻ�ͼ�ķ�������Ҳ����ʹ�õھ��������۵��Ӵ���������ı����Ӵ�������IJ�����

�������Զ����Լ������Ӵ���������������õ��Ի������С����磬�ٶ����ر�ϲ����ͨ�ľ��ΰ�����������춽�����Բ�ΰ�������ô������ͨ��ע��һ���Ӵ���𣬲�ʹ���Լ���д���Ӵ�ѶϢ������ʽ�����������������Ӵ���ѶϢ���Ӷ�������Բ�ΰ�������Developer Studio�У������������Զ�����������ϵ�ġ�Properties���Ի�������ָ������Ӵ�����⽫ת���ɶԻ�����ģ���е�CONTROL��������ʽ11-3��ʾ��ABOUT3��ʽ�����������ġ�

 ï¿½ï¿½Ê½11-3  ABOUT3
ABOUT3.C
/*-----------------------------------------------------------------------------
   	ABOUT3.C -- About Box Demo Program No. 3
               					(c) Charles Petzold, 1998
----------------------------------------------------------------------------*/
#include 	<windows.h>
#include 	"resource.h"
LRESULT 	CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
BOOL  		CALLBACK AboutDlgProc (HWND, UINT, WPARAM, LPARAM) ;
LRESULT 	CALLBACK EllipPushWndProc (HWND, UINT, WPARAM, LPARAM) ;
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                    PSTR szCmdLine, int iCmdShow)
{
     	static TCHAR 	szAppName[] = TEXT ("About3") ;
     	MSG          				msg ;
     	HWND         				hwnd ;
     	WNDCLASS     			wndclass ;
     	wndclass.style         				= CS_HREDRAW | CS_VREDRAW ;
     	wndclass.lpfnWndProc   				= WndProc ;
     	wndclass.cbClsExtra    				= 0 ;
     	wndclass.cbWndExtra    				= 0 ;
     	wndclass.hInstance     				= hInstance ;
     	wndclass.hIcon         				= LoadIcon (hInstance, szAppName) ;
     	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 ;
   	}
     
     	wndclass.style         			= CS_HREDRAW | CS_VREDRAW ;
     	wndclass.lpfnWndProc   			= EllipPushWndProc ;
     	wndclass.cbClsExtra    			= 0 ;
     	wndclass.cbWndExtra    			= 0 ;
     	wndclass.hInstance     			= hInstance ;
     	wndclass.hIcon         			= NULL ;
     	wndclass.hCursor       			= LoadCursor (NULL, IDC_ARROW) ;
     	wndclass.hbrBackground 		= (HBRUSH) (COLOR_BTNFACE + 1) ;
     	wndclass.lpszMenuName  		= NULL ;
     	wndclass.lpszClassName 		= TEXT ("EllipPush") ;
     	RegisterClass (&wndclass) ;
     	hwnd = CreateWindow (	szAppName, TEXT ("About Box Demo Program"),
                          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 HINSTANCE hInstance ;
     	switch (message)
     	{
     	case 	WM_CREATE :
          		hInstance = ((LPCREATESTRUCT) lParam)->hInstance ;
          		return 0 ;
          
   	case WM_COMMAND :
          		switch (LOWORD (wParam))
          {
          		case 	IDM_APP_ABOUT :
               				DialogBox (hInstance, TEXT ("AboutBox"), hwnd, AboutDlgProc) ;
               				return 0 ;
          		}
          		break ;
          
     	case 	WM_DESTROY :
          		PostQuitMessage (0) ;
          		return 0 ;
     	}
     	return DefWindowProc (hwnd, message, wParam, lParam) ;
}
BOOL CALLBACK AboutDlgProc (HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
     	switch (message)
     	{
     	case 	WM_INITDIALOG :
          		return TRUE ;
          
     	case 	WM_COMMAND :
          		switch (LOWORD (wParam))
          		{
          		case 	IDOK :
               				EndDialog (hDlg, 0) ;
               				return TRUE ;
          		}
          		break ;
     }
 	return FALSE ;
}
LRESULT CALLBACK EllipPushWndProc (	HWND hwnd, UINT message,WPARAM wParam, LPARAM lParam)
{
     	TCHAR       			szText[40] ;
     	HBRUSH      			hBrush ;
     	HDC         			hdc ;
     	PAINTSTRUCT 			ps ;
     	RECT        					rect ;
     
     	switch (message)
     	{
     	case 	WM_PAINT :
          		GetClientRect (hwnd, &rect) ;
          		GetWindowText (hwnd, szText, sizeof (szText)) ;
          
          		hdc = BeginPaint (hwnd, &ps) ;
          
          		hBrush = CreateSolidBrush (GetSysColor (COLOR_WINDOW)) ;
          		hBrush = (HBRUSH) SelectObject (hdc, hBrush) ;
          		SetBkColor (hdc, GetSysColor (COLOR_WINDOW)) ;
          		SetTextColor (hdc, GetSysColor (COLOR_WINDOWTEXT)) ;
          
          		Ellipse (hdc, rect.left, rect.top, rect.right, rect.bottom) ;
          		DrawText (hdc, szText, -1, &rect,
                DT_SINGLELINE | DT_CENTER | DT_VCENTER) ;
          
          		DeleteObject (SelectObject (hdc, hBrush)) ;
          
          		EndPaint (hwnd, &ps) ;
          		return 0 ;
     	case 	WM_KEYUP :
          		if (wParam != VK_SPACE)
               				break ;// fall through
     	case 	WM_LBUTTONUP :
          		SendMessage (GetParent (hwnd), WM_COMMAND,
               			GetWindowLong (hwnd, GWL_ID), (LPARAM) hwnd) ;
          		return 0 ;
     }
     	return DefWindowProc (hwnd, message, wParam, lParam) ;
}
 ABOUT3.RC ��ժ¼��
//Microsoft Developer Studio generated resource script.
#include "resource.h"
#include "afxres.h"
/////////////////////////////////////////////////////////////////////////////
// Dialog
ABOUTBOX DIALOG DISCARDABLE  32, 32, 180, 100
STYLE DS_MODALFRAME | WS_POPUP
FONT 8, "MS Sans Serif"
BEGIN
    	CONTROL         		"OK",IDOK,"EllipPush",WS_GROUP | WS_TABSTOP,73,79,32,14
    	ICON       "ABOUT3",IDC_STATIC,7,7,20,20
    	CTEXT      "About3",IDC_STATIC,40,12,100,8
    	CTEXT      "About Box Demo Program",IDC_STATIC,7,40,166,8
    	CTEXT           			"(c) Charles Petzold, 1998",IDC_STATIC,7,52,166,8
END
/////////////////////////////////////////////////////////////////////////////
// Menu
ABOUT3 MENU DISCARDABLE 
BEGIN
    	POPUP "&Help"
    	BEGIN
        		MENUITEM "&About About3...",            				IDM_APP_ABOUT
    	END
END
/////////////////////////////////////////////////////////////////////////////
// Icon
ABOUT3  	ICON    DISCARDABLE    "icon1.ico"
 RESOURCE.H ��ժ¼��
// Microsoft Developer Studio generated include file.
// Used by About3.rc
#define IDM_APP_ABOUT           40001
#define IDC_STATIC              -1
ABOUT3.ICO


��

������ע����Ӵ���������EllipPush������Բ�ΰ���������Developer Studio�ĶԻ�����༭���У�ɾ����Cancel���͡�OK����ť��Ҫ�������ݴ��Ӵ����Ŀ������ӡ� Controls ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ñ¡ï¿½ï¿½ Custom Control ï¿½ï¿½ï¿½ï¿½ï¿½Ú´Ë¿ï¿½ï¿½ï¿½ï¿½ï¿½Ä¡ï¿½ Properties ï¿½ï¿½ï¿½Ô»ï¿½ï¿½ï¿½ï¿½ï¿½Ä¡ï¿½ Class ï¿½ï¿½ï¿½ï¿½Î»ï¿½ï¿½ï¿½ë¡¸ EllipPush ï¿½ï¿½ï¿½ï¿½ï¿½Ú¶Ô»ï¿½ï¿½ï¿½ï¿½ï¿½Ä£ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ã»ï¿½ï¿½Ê¹ï¿½ï¿½DEFPUSHBUTTON������������CONTROL������ָ�����Ӵ����

CONTROL "OK" IDOK, "EllipPush", TABGRP, 64, 60, 32, 14

���ڶԻ������н������Ӵ�������ʱ���Ի����������������Ӵ�������CreateWindow�����С�

ABOUT3.C��ʽ��WinMain��ע����EllipPush�Ӵ����

wndclass.style     			= CS_HREDRAW | CS_VREDRAW ;
wndclass.lpfnWndProc  		= EllipPushWndProc ;
wndclass.cbClsExtra 		= 0 ;
wndclass.cbWndExtra 		= 0 ;
wndclass.hInstance     		= hInstance ;
wndclass.hIcon         		= NULL ;
wndclass.hCursor       		= LoadCursor (NULL, IDC_ARROW) ;
wndclass.hbrBackground 		= (HBRUSH) (COLOR_WINDOW + 1) ;
wndclass.lpszMenuName  		= NULL ;
wndclass.lpszClassName 		= TEXT ("EllipPush") ;
RegisterClass (&wndclass) ;

���Ӵ����ָ���Ӵ�ѶϢ������ʽΪEllipPushWndProc����ABOUT3.C������������

EllipPushWndProc�Ӵ�ѶϢ������ʽֻ��������ѶϢ��WM_PAINT��WM_KEYUP��WM_LBUTTONUP���ڴ���WM_PAINTѶϢʱ������GetClientRect��ȡ���Ӵ��Ĵ�С����GetWindowText��ȡ����ʾ�ڰ����ϵ����֣���Windows��ʽEllipse��DrawText�������Բ�����֡�

WM_KEYUP��WM_LBUTTONUPѶϢ�Ĵ����dz��򵥣�

case 	WM_KEYUP :
     	if (wParam != VK_SPACE)
          		break ;     // fall through
case WM_LBUTTONUP :
     	SendMessage (GetParent (hwnd), WM_COMMAND,
          		GetWindowLong (hwnd, GWL_ID), (LPARAM) hwnd) ;
     	return 0 ;

�Ӵ�ѶϢ������ʽʹ��GetParent��ȡ���丸�Ӵ������Ի����飩�Ĵ��ţ�������һ��WM_COMMANDѶϢ��ѶϢ��wParam��춿������ID�����ID����GetWindowLongȡ�õġ�Ȼ�ᣬ�Ի������Ӵ�ѶϢ������ʽ�����ѶϢ����ABOUT3�ڵĶԻ�������򣬽���õ�һ��ʹ�����Զ��İ�������ͼ11-3��ʾ����������ͬ���ķ��������������Զ��Ի���������


��

ͼ11-3 ABOUT3�������Զ�����

�����ȫ��Ҫ��������ʵ��Ȼ��ͨ�������ά�����Ӵ�����������Ҫ�Ĵ������ԣ�EllipPushWndProcֻ��һ���ռ��ӡ����磬��ť��������ͨ�İ���������˸��Ҫ��ת�����ڵ���ɫ���Ӵ�ѶϢ������ʽ���봦��WM_KEYDOWN�����Կհ׼�����WM_LBUTTONDOWNѶϢ���Ӵ�ѶϢ������ʽ���������յ�WM_LBUTTONDOWNѶϢʱ���ػ��󣬲��ң��������ť����춰���״̬���������Ƶ������Ӵ�����ʾ����֮�⣬��ô��Ҫ�ͷŻ������أ�������ť���ڲ���ɫ�ظ�Ϊ����״̬����ֻ���ڻ�������ʱ�ɿ��ð�ť�����Ӵ��Ż���丸�Ӵ��ͻ�һ��WM_COMMANDѶϢ��

EllipPushWndProcҲ������WM_ENABLEѶϢ�������������Ի�����������ʹ��EnableWindow��ʽ������ij�Ӵ�����ǣ����Ӵ�����ʾ��ɫ���֣��������Ǻ�ɫ���֣��Ա�ʾ���Ѿ������ã����Ҳ����ٽ����κ�ѶϢ�ˡ�

������Ӵ���������Ӵ�ѶϢ������ʽ��ҪΪ��������ÿ���Ӵ���Ÿ��Բ�ͬ�����ϣ���ô������ͨ��ʹ���Ӵ����ṹ�е�cbWndExtraֵ�����������������ڲ��Ӵ��ṹ�б����˿ռ䣬��������SetWindowLong��GetWindowLong����ȡ�����ϡ�

��ģ̬�Ի�����
��

�ڱ��µĿ�ʼ��������˵���Ի������Ϊ��ģ̬�ġ��͡���ģ̬�ġ����֡����������Ѿ��о��������ֶԻ������������һ�֣�ģ̬�Ի����顣ģ̬�Ի����飨������ϵͳģ̬�Ի����飩������ʹ�����ڶԻ�������������ʽ֮������л������ǣ�ʹ���߲����л���ͬһ��ʽ����һ���Ӵ���ֱ��ģ̬�Ի����鱻���Ϊֹ����ģ̬�Ի���������ʹ�����ڶԻ�������������ʽ֮������л����ֿ����ڶԻ������뽨���Ի�������Ӵ�֮������л�����ˣ���ģ̬�Ի�������ʹ���߳�ʽ��������ͨ����ʽ�Ӵ����ܸ�Ϊ���ơ�

��ʹ���߾����öԻ����鱣��Ƭ�̻���ӷ���ʱ��ʹ�÷�ģ̬�Ի������Ǻ��ʵġ����磬���鴦����ʽ����ʹ�÷�ģ̬�Ի����������С�Find���͡�Change�������������Find���Ի�������ģ̬�ģ���ôʹ���߱���ӹ��ܱ���ѡ��Find����Ȼ������ҪѰ�ҵ��ִ��������Ի����飬���ص������У��������ظ�����������Ѱ��ͬһ�ִ�����һ�γ��֡�����ʹ�����ڵ�����Ի�����֮������л���᷽��öࡣ

���Ѿ�������ģ̬�Ի���������DialogBox�������ġ�ֻ��������Ի�����֮�ᣬ��ʽ�Żᴫ��ֵ���ڶԻ����������ʹ��EndDialog��������ֹ�Ի����飬DialogBox���ص��Ǹú��еĵڶ���������ֵ����ģ̬�Ի�������ʹ��CreateDialog�������ģ��ú�ʽ��ʹ�õIJ�����DialogBox��ͬ��

hDlgModeless = CreateDialog (	hInstance, szTemplate, 
                             	hwndParent, DialogProc) ;

������CreateDialog��ʽ�������ضԻ�������Ӵ����ţ���ͨ��������Ӵ����Ŵ�ŵ���������С�

���ܽ�DialogBox��һ�������ģ̬�Ի������CreateDialog��춷�ģ̬�Ի�����������ģ�����������ͨ����ģ̬�Ի���������ͨ�Ӵ�������һ������ס��������ʽ������CreateDialog������������CreateWindow��ʽ���������߽���������ͨ�Ӵ���

ģ̬�Ի��������ģ̬�Ի����������
��

ʹ�÷�ģ̬�Ի�������ʹ��ģ̬�Ի��������ƣ�����Ҳ��һЩ��Ҫ������

���ȣ���ģ̬�Ի�����ͨ������һ�������к�һ��ϵͳ���ܱ���ť��������Developer Studio�н����Ի�����ʱ����Щ���ڶ�ѡ���춷�ģ̬�Ի�����ĶԻ�����ģ���е�STYLE�������磺

STYLE WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE

�����к�ϵͳ���ܱ�����ʹ���ߣ�ʹ�û�����߼��̽���ģ̬�Ի������ƶ�����һ����ʾ���򡣶��ģ̬�Ի����飬��ͨ�������ṩ�����к�ϵͳ���ܱ�����Ϊʹ���߲�������������Ӵ������κ����������顣

�ڶ�����Ҫ�������ǣ�ע�⣬�����ǵķ���STYLE���������WS_VISIBLE��ʽ���� Developer Studio ï¿½Ð£ï¿½ï¿½Ó¡ï¿½ Dialog Properties ï¿½ï¿½ï¿½Ô»ï¿½ï¿½ï¿½ï¿½ï¿½Ä¡ï¿½ More Styles ï¿½ï¿½Ò³ï¿½ï¿½ï¿½Ç©ï¿½ï¿½Ñ¡ï¿½ï¿½ï¿½Ñ¡ï¿½î¡£ï¿½ï¿½ï¿½Ê¡ï¿½ï¿½ï¿½ï¿½WS_VISIBLE����������CreateDialog����֮�����ShowWindow��

hDlgModeless = CreateDialog (  . . .  ) ;
     ShowWindow (hDlgModeless, SW_SHOW) ;

�������û�а���WS_VISIBLE��ʽ����û�к���ShowWindow����ô��ģ̬�Ի����齫���ᱻ��ʾ��������������ʵ����ôϰ���ģ̬�Ի�����ij�ʽд�����ڵ�һ����ͼ������ģ̬�Ի�����ʱ��������������⡣

������������ģ̬�Ի������ѶϢ�����ѶϢ��ͬ����ģ̬�Ի������ѶϢҪ��������ʽ��ѶϢ���С�Ҫ����ЩѶϢ���͸��Ի������Ӵ�ѶϢ������ʽ�������ı�ѶϢ���С��������£�����ʹ��CreateDialog������ģ̬�Ի�����ʱ��Ӧ�ý��Ӻ����д��صĶԻ�������Ŵ�����һ�������������hDlgModeless���У�����ѶϢ��Ȧ�ı�Ϊ��

while (GetMessage (&msg, NULL, 0, 0))
{
     	if (hDlgModeless == 0 || !IsDialogMessage (hDlgModeless, &msg))
     {
          		TranslateMessage (&msg) ;
         	 	DispatchMessage  (&msg) ;
     }
}

���ѶϢ�Ƿ��͸���ģ̬�Ի�����ģ���ôIsDialogMessage�������͸��Ի��������Ӵ�ѶϢ������ʽ��������TRUE����0����������������FALSE��0����ֻ��hDlgModelessΪ0����ѶϢ���ǸöԻ������ѶϢʱ���ű������TranslateMessage��DispatchMessage��ʽ������������̼��ټ�������ij�ʽ�Ӵ�����ôѶϢ��Ȧ��������ʾ��

while (GetMessage (&msg, NULL, 0, 0))
{
     	if (hDlgModeless == 0 || !IsDialogMessage (hDlgModeless, &msg))
     	{
          		if (!TranslateAccelerator (hwnd, hAccel, &msg))
          		{
               				TranslateMessage (&msg) ;
               				DispatchMessage  (&msg) ;
          		}
	}
}

��������������ʼ��Ϊ0������hDlgModeless��Ϊ0��ֱ�������Ի�����Ϊֹ���Ӷ���֤����ʹ����Ч���Ӵ�����������IsDialogMessage���������ģ̬�Ի�����ʱ����Ҳ����ע����һ�㣬��������һ����˵���ġ�

hDlgModeless����Ҳ�����ɳ�ʽ����������ʹ�ã��Ա�Է�ģ̬�Ի������Ƿ���ڼ�����֤�����磬��ʽ�е������Ӵ�������hDlgModeless�����0ʱ���Ի����鷢��ѶϢ��

����һ����Ҫ������ʹ��DestroyWindow������EndDialog��������ģ̬�Ի����顣��������DestroyWindow�ᣬ��hDlgModeless��������趨Ϊ0��

ʹ����ϰ��춴�ϵͳ���ܱ���ѡ��Close����������ģ̬�Ի����顣���������ˡ�Close��ѡ�Windows�ڵĶԻ������Ӵ�ѶϢ������ʽ��������WM_CLOSEѶϢ���������Լ��ڶԻ���������д�������

case 	WM_CLOSE :
     	DestroyWindow (hDlg) ;
     	hDlgModeless = NULL ;
     	break ;

ע���������Ӵ�����֮�������DestroyWindow��hDlg�����Ǵ��ݸ��Ի��������IJ�����hDlgModeless�Ǵ�CreateDialog���ص������������ʽ��ѶϢ��Ȧ�ڼ�������

��Ҳ��������ʹ����ʹ�ð������رշ�ģ̬�Ի����飬������ʽ�봦��WM_CLOSEѶϢһ�����Ի�������봫�ظ����������Ӵ�֮�κ����϶����Դ�������������С������ϲ��ʹ�������������ô��Ҳ������CreateDialogParam��������ģ̬�Ի����飬����ǰ����ܵķ�����������һ���ṹָ�ꡣ

�µ�COLORS��ʽ
��

�ھ�������������COLORS1��ʽ�����˾Ÿ����Ӵ����Ա���ʾ���������к������������ʱ�������ʽ����������д���ij�ʽ���൱���ӵ�һ���������COLORS1ת��Ϊʹ�÷�ģ̬�Ի��������ʹ��ʽ���ر���WndProc��ʽ����������������ŵļ򵥣��������COLORS2��ʽ���ʽ11-4��ʾ��

 ï¿½ï¿½Ê½11-4  COLORS2
COLORS2.C
/*----------------------------------------------------------------------------
   	COLORS2.C -- Version using Modeless Dialog Box
                					(c) Charles Petzold, 1998
----------------------------------------------------------------------------*/
#include <windows.h>
LRESULT 	CALLBACK WndProc     		(HWND, UINT, WPARAM, LPARAM) ;
BOOL  		CALLBACK ColorScrDlg 		(HWND, UINT, WPARAM, LPARAM) ;
HWND hDlgModeless ;
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                    					PSTR szCmdLine, int iCmdShow)
{
     	static TCHAR 		szAppName[] = TEXT ("Colors2") ;
     	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 (0L) ;
     	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 | WS_CLIPCHILDREN,
                          	CW_USEDEFAULT, CW_USEDEFAULT,
                          	CW_USEDEFAULT, CW_USEDEFAULT,
                          	NULL, NULL, hInstance, NULL) ;
     
     	ShowWindow (hwnd, iCmdShow) ;
     	UpdateWindow (hwnd) ;
     
     	hDlgModeless = CreateDialog (	hInstance, TEXT ("ColorScrDlg"), 
               hwnd, ColorScrDlg) ;
     	while (GetMessage (&msg, NULL, 0, 0))
     	{
          		if (hDlgModeless == 0 || !IsDialogMessage (hDlgModeless, &msg))
          		{
               			TranslateMessage (&msg) ;
               			DispatchMessage  (&msg) ;
          		}
     	}
     	return msg.wParam ;
}
LRESULT CALLBACK WndProc (	HWND hwnd, UINT message, WPARAM wParam,LPARAM lParam)
{
     	switch (message)
     	{
     	case 	WM_DESTROY :
          		DeleteObject ((HGDIOBJ) SetClassLong (hwnd, GCL_HBRBACKGROUND,
                (LONG) GetStockObject (WHITE_BRUSH))) ;
          		PostQuitMessage (0) ;
          		return 0 ;
     	}
     	return DefWindowProc (hwnd, message, wParam, lParam) ;
}
BOOL CALLBACK ColorScrDlg (	HWND hDlg, UINT message,WPARAM wParam, LPARAM lParam)
{
     	static int 		iColor[3] ;
     	HWND       				hwndParent, hCtrl ;
     	int        				iCtrlID, iIndex ;
     
     	switch (message)
     	{
     	case 	WM_INITDIALOG :
          		for (iCtrlID = 10 ; iCtrlID < 13 ; iCtrlID++)
          		{
               				hCtrl = GetDlgItem (hDlg, iCtrlID) ;
               				SetScrollRange (hCtrl, SB_CTL, 0, 255, FALSE) ;
               				SetScrollPos   (hCtrl, SB_CTL, 0, FALSE) ;
          		}
          		return TRUE ;
          
     	case 	WM_VSCROLL :
          		hCtrl   		= (HWND) lParam ;
          		iCtrlID 		= GetWindowLong (hCtrl, GWL_ID) ;
          		iIndex  		= iCtrlID - 10 ;
          		hwndParent 		= GetParent (hDlg) ;
          
          		switch (LOWORD (wParam))
          			{
          		case	SB_PAGEDOWN :
              	 			iColor[iIndex] += 15 ;		// fall through
         				case SB_LINEDOWN :
               				iColor[iIndex] = min (255, iColor[iIndex] + 1) ;
               				break ;
          		case 	SB_PAGEUP :
               				iColor[iIndex] -= 15 ;     // fall through
         				case SB_LINEUP :
               				iColor[iIndex] = max (0, iColor[iIndex] - 1) ;
               				break ;
          		case 	SB_TOP :
               				iColor[iIndex] = 0 ;
               				break ;
          		case 	SB_BOTTOM :
               				iColor[iIndex] = 255 ;
               				break ;
          			case 	SB_THUMBPOSITION :
          			case 	SB_THUMBTRACK :
               					iColor[iIndex] = HIWORD (wParam) ;
               					break ;
          			default :
               				return FALSE ;
          		}
          			SetScrollPos  	(hCtrl, SB_CTL,		iColor[iIndex], TRUE) ;
      			SetDlgItemInt 	(hDlg,  iCtrlID + 3, iColor[iIndex], FALSE) ;
          
          			DeleteObject ((HGDIOBJ) SetClassLong (hwndParent, GCL_HBRBACKGROUND,
                              	 (LONG) CreateSolidBrush (
                                 RGB (iColor[0], iColor[1], iColor[2])))) ;
          
          		InvalidateRect (hwndParent, NULL, TRUE) ;
          		return TRUE ;
	}
     	return FALSE ;
}
 COLORS2.RC ��ժ¼��
//Microsoft Developer Studio generated resource script.
#include "resource.h"
#include "afxres.h"
/////////////////////////////////////////////////////////////////////////////
// Dialog
COLORSCRDLG DIALOG DISCARDABLE  16, 16, 120, 141
STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION
CAPTION "Color Scroll Scrollbars"
FONT 8, "MS Sans Serif"
BEGIN
    	CTEXT           					"&Red",IDC_STATIC,8,8,24,8,NOT WS_GROUP
    	SCROLLBAR       			10,8,20,24,100,SBS_VERT | WS_TABSTOP
    	CTEXT           			"0",13,8,124,24,8,NOT WS_GROUP
    	CTEXT           					"&Green",IDC_STATIC,48,8,24,8,NOT WS_GROUP
    	SCROLLBAR       			11,48,20,24,100,SBS_VERT | WS_TABSTOP
    	CTEXT           			"0",14,48,124,24,8,NOT WS_GROUP
    	CTEXT           					"&Blue",IDC_STATIC,89,8,24,8,NOT WS_GROUP
    	SCROLLBAR       			12,89,20,24,100,SBS_VERT | WS_TABSTOP
    	CTEXT           			"0",15,89,124,24,8,NOT WS_GROUP
END
 RESOURCE.H ��ժ¼��
// Microsoft Developer Studio generated include file.
// Used by Colors2.rc
#define IDC_STATIC      -1

ԭ����COLORS1��ʽ����ʾ�ľ����д�С�������Ӵ���С�����ģ����³�ʽ�ڷ�ģ̬�Ի��������Թ̶��ijߴ�����ʾ���ǣ���ͼ11-4��ʾ��

���������Ի�����ģ��ʱ��ֱ�ӽ����������е�ID�ֱ���Ϊ10��11��12������ʾ������Ŀǰֵ��������̬������λ��ID�ֱ���Ϊ13��14��15����ÿ�������ж��趨ΪTab Stop��ʽ���������е�������̬������λ��ɾ��Group��ʽ��


��

ͼ11-4 COLORS2��өĻ��ʾ

��COLORS2�У���ģ̬�Ի���������WinMain��ʽ�ィ���ģ������ڳ�ʽ���Ӵ���ShowWindow����֮�ᡣע�⣬���Ӵ����Ӵ���ʽ����WS_CLIPCHILDREN����������ʽ��������Ի�������ܹ��ػ����Ӵ���

������������CreateDialog���صĶԻ������Ӵ����Ŵ�����������hDlgModeless�У�����ѶϢ��Ȧ�б����ԡ��������������ʽ�У�����Ҫ�����Ŵ������������У�Ҳ����Ҫ�ں���IsDialogMessage֮ǰ�������ֵ��ѶϢ��Ȧ���Ա�д���£�

while	(GetMessage (&msg, NULL, 0, 0))
{
     	if (!IsDialogMessage (hDlgModeless, &msg))
     {
          		TranslateMessage 	(&msg) ;
        		DispatchMessage  	(&msg) ;
     }
}

��춶Ի��������ڳ�ʽ����ѶϢ��Ȧǰ����������ֱ����ʽ����ʱ�Żᱻ���������hDlgModeless��ֵ��������Ч�ġ��Ҽ��������µĴ�����ʽ���Ա������ܻ����Ի�������Ӵ�ѶϢ������ʽ�м���һ������Ի�����ij�ʽ�룺

case 	WM_CLOSE :
     	DestroyWindow (hDlg) ;
     	hDlgModeless = NULL ;
     	break ;

��ԭ����COLORS1��ʽ�У�SetWindowText��ʹ��wsprintf��������ֵ��ǩת��Ϊ����֮����趨���ǵ�ֵ������Ϊ��

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

i��ֵΪĿǰ�����ľ����е�ID��hwndValue��һ�����У���������ɫ��ֵ��������̬�������Ӵ����Ӵ����š�

�°汾ʹ��SetDlgItemIntΪÿ�����Ӵ���ÿ��������λ�趨һ�����룺

SetDlgItemInt (hDlg, iCtrlID + 3, color [iCtrlID], FALSE) ;

����SetDlgItemInt�������Ӧ��GetDlgItemInt�ڱ༭���������õ���࣬����Ҳ���������趨�����������������λ���羲̬���ֿ�����ȡ�iCtrlID�����Ǿ����е�ID����ID����3ʹ֮��ɶ�Ӧ���ֱ�ǩ��ID����������������ɫֵ��ͨ�������ĸ�������ʾ������������ֵ�ǽ���Ϊ�������ŵģ����ĸ�����ΪTRUE�������������ŵģ����ĸ�����ΪFALSE�������ǣ���������ʽ��ֵ�ķ�Χ�Ǵ�0��256�������������û�����塣

�ڽ�COLORS1ת��ΪCOLORS2�ij����У����ǰ�Խ��Խ��Ĺ���������Windows���ɰ汾������CreateWindow 10�Σ����°汾ֻ������CreateWindow��CreateDialog��һ�Ρ����ǣ��������Ϊ�����Ѿ��Ѻ���CreateWindow�Ĵ����������٣���ô���ʹ��ˣ��뿴��һ����ʽ��

HEXCALC���Ӵ����ǶԻ����飿
��

HEXCALC��ʽ������д��ʽ͵���ľ���֮�������ʽ11-5��ʾ�������ʽ��ȫ������CreateWindow��Ҳ������WM_PAINTѶϢ����ȡ��װ�����ݣ�Ҳ����������ѶϢ��������ֻ���˲���150�е�ԭʼ�룬�͹�����һ�������������̺ͻ�������Լ�10�������ʮ����λ��������������ͼ11-5��ʾ��

 ï¿½ï¿½Ê½11-5  HEXCALC
HEXCALC.C
/*------------------------------------------------------------------------
   	HEXCALC.C -- Hexadecimal Calculator
 					(c) Charles Petzold, 1998
-------------------------------------------------------------------------*/
#include <windows.h>
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                    						PSTR szCmdLine, int iCmdShow)
{
     	static TCHAR 	szAppName[] = TEXT ("HexCalc") ;
     	HWND         			hwnd ;
     	MSG          			msg ;
     	WNDCLASS     			wndclass ;
     
     	wndclass.style         			= CS_HREDRAW | CS_VREDRAW;
     	wndclass.lpfnWndProc   			= WndProc ;
     	wndclass.cbClsExtra    			= 0 ;
     	wndclass.cbWndExtra    			= DLGWINDOWEXTRA ;    			// Note!
     	wndclass.hInstance     			= hInstance ;
     	wndclass.hIcon         			= LoadIcon (hInstance, szAppName) ;
     	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 = CreateDialog (hInstance, szAppName, 0, NULL) ;
     	ShowWindow (hwnd, iCmdShow) ;
     	while (GetMessage (&msg, NULL, 0, 0))
     	{
          			TranslateMessage (&msg) ;
          			DispatchMessage (&msg) ;
     }
     	return msg.wParam ;
}
void ShowNumber (HWND hwnd, UINT iNumber)
{
     	TCHAR szBuffer[20] ;
     	wsprintf (szBuffer, TEXT ("%X"), iNumber) ;
     	SetDlgItemText (hwnd, VK_ESCAPE, szBuffer) ;
}
DWORD CalcIt (UINT iFirstNum, int iOperation, UINT iNum)
{
	switch (iOperation)
     	{
     	case '=': return iNum ;
     	case '+': return iFirstNum +  iNum ;
     	case '-': return iFirstNum -  iNum ;
     	case '*': return iFirstNum *  iNum ;
     	case '&': return iFirstNum &  iNum ;
     	case '|': return iFirstNum |  iNum ;
     	case '^': return iFirstNum ^  iNum ;
     	case '<': return iFirstNum << iNum ;
     	case '>': return iFirstNum >> iNum ;
     	case '/': return iNum ? iFirstNum / iNum: MAXDWORD ;
     	case '%': return iNum ? iFirstNum % iNum: MAXDWORD ;
     	default : return 0 ;
     	}
}
LRESULT CALLBACK WndProc (	HWND hwnd, UINT message, WPARAM wParam,LPARAM lParam)
{
     	static BOOL  	bNewNumber = TRUE ;
     	static int   	iOperation = '=' ;
     	static UINT 	iNumber, iFirstNum ;
     	HWND    				hButton ;
     
     	switch (message)
     	{
     	case WM_KEYDOWN:                   // left arrow --> backspace
          		if (wParam != VK_LEFT)
               				break ;
          		wParam = VK_BACK ;
             // fall through
  	case	WM_CHAR:
          		if 	((wParam = (WPARAM) CharUpper ((TCHAR *) wParam)) == VK_RETURN)
               				wParam = '=' ;
          
          		if 	(hButton = GetDlgItem (hwnd, wParam))
          		{
               			SendMessage (hButton, BM_SETSTATE, 1, 0) ;
               			Sleep (100) ;
               			SendMessage (hButton, BM_SETSTATE, 0, 0) ;
          		}
          		else
          		{
               			MessageBeep (0) ;
               			break ;
          		}
                // fall through
     	case 	WM_COMMAND:
          		SetFocus (hwnd) ;
          
          		if (LOWORD (wParam) == VK_BACK)                 //backspace
               				ShowNumber (hwnd, iNumber /= 16) ;
          
          		else if (LOWORD (wParam) == VK_ESCAPE)  		// escape
               				ShowNumber (hwnd, iNumber = 0) ;
          
          		else if (isxdigit (LOWORD (wParam)))    		// hex digit
          {
               				if (bNewNumber)
               				{
                    					iFirstNum = iNumber ;
                    					iNumber = 0 ;
               			}
               			bNewNumber = FALSE ;
               		if 	(iNumber <= MAXDWORD >> 4)
                    				ShowNumber (hwnd, iNumber = 16 * iNumber + wParam -
                    				(isdigit (wParam) ? '0': 'A' - 10)) ;
               		else
                    				MessageBeep (0) ;
          		}
          		else    // operation
          {
               			if (!bNewNumber)
                    	ShowNumber (hwnd, iNumber =
                        CalcIt (iFirstNum, iOperation, iNumber)) ;
               			bNewNumber = TRUE ;
               			iOperation = LOWORD (wParam) ;
          		}
          		return 0 ;
     	case 	WM_DESTROY:
          		PostQuitMessage (0) ;
          		return 0 ;
  	}
     	return DefWindowProc (hwnd, message, wParam, lParam) ;
}
 HEXCALC.RC ��ժ¼��
//Microsoft Developer Studio generated resource script.
#include "resource.h"
#include "afxres.h"
/////////////////////////////////////////////////////////////////////////////
// Icon
HEXCALC                 			ICON    DISCARDABLE     			"HexCalc.ico"
/////////////////////////////////////////////////////////////////////////////
#include "hexcalc.dlg"
 HEXCALC.DLG
/*--------------------------------
   HEXCALC.DLG dialog script
----------------------------------*/
HexCalc DIALOG -1, -1, 102, 122
STYLE WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX
CLASS "HexCalc"
CAPTION "Hex Calculator"
{
    	PUSHBUTTON "D",         68,  8,  24, 14, 14
     	PUSHBUTTON "A",         65,  8,  40, 14, 14
 	    PUSHBUTTON "7",         55,  8,  56, 14, 14
     	PUSHBUTTON "4",    	  52,  8,  72, 14, 14
     	PUSHBUTTON "1", 		  49,  8,  88, 14, 14
     	PUSHBUTTON "0",         48,  8,  104,14, 14
     	PUSHBUTTON "0",		  27,  26, 4,  50, 14	
     	PUSHBUTTON "E",   	  69,  26, 24, 14, 14
     	PUSHBUTTON "B",    	  66,  26, 40, 14, 14
     	PUSHBUTTON "8",  		  56,  26, 56, 14, 14
     	PUSHBUTTON "5",    	  53,  26, 72, 14, 14
     	PUSHBUTTON "2",    	  50,  26, 88, 14, 14
     	PUSHBUTTON "Back", 	  8,   26, 104,32, 14
     	PUSHBUTTON "C",		  67,  44, 40, 14, 14
     	PUSHBUTTON "F",		  70,  44, 24, 14, 14
     	PUSHBUTTON "9",         57,  44, 56, 14, 14
     	PUSHBUTTON "6",         54,  44, 72, 14, 14
     	PUSHBUTTON "3",         51,  44, 88, 14, 14
     	PUSHBUTTON "+",         43,  62, 24, 14, 14
     	PUSHBUTTON "-",         45,  62, 40, 14, 14
     	PUSHBUTTON "*",         42,  62, 56, 14, 14
     	PUSHBUTTON "/",         47,  62, 72, 14, 14
     	PUSHBUTTON "%",         37,  62, 88, 14, 14
     	PUSHBUTTON "Equals",    61,  62, 104,32, 14
     	PUSHBUTTON "&&",38,  80, 24, 14, 14
     	PUSHBUTTON "|",      	  124, 80, 40, 14, 14
     	PUSHBUTTON "^",         94,  80, 56, 14, 14
     	PUSHBUTTON "<",      60,  80, 72, 14, 14
     	PUSHBUTTON ">",      62,  80, 88, 14, 14
}
HEXCALC.ICO

��


��


��

ͼ11-5 HEXCALC��өĻ��ʾ

HEXCALC��һ����ͨ����������ʽ�������ʹ��C���Եķ��ű�ʾ��ʽ���м��㡣������������32λԪ�������ӡ������ˡ�����ȡ�������㣬λԪAND, OR, exclusive-OR���㣬��������λ�����㡣��0�������½�����趨ΪFFFFFFFF��

��HEXCALC�мȿ���ʹ�û����ֿ���ʹ�ü��̡����Ӱ������롹���������һ���������8λԪʮ����λ��λ����ʼ��Ȼ�����������ӣ�Ȼ���ǵڶ�������������������͸��������Equals����ť���߰��µȺż���Enter���������ʾ��������Ϊ�˸������룬������ʹ�á�Back����ť��Backspace�������ͷ����������display��������߰���Esc���������Ŀǰ�����롣

HEXCALC�Ƚ���ֵ�һ���ǣ�өĻ����ʾ���Ӵ��ƺ�����ͨ���ص�ʽ�Ӵ����ģ̬�Ի�����Ļ���塣һ���棬HEXCALC������ѶϢ���ں�ʽ��WndProc�д����������ʽ��ͨ�����Ӵ�ѶϢ������ʽ���ƣ��ú�ʽ����һ����������������WM_DESTROYѶϢ������DefWindowProc��������ͨ���Ӵ�ѶϢ������ʽһ������һ���棬�Ӵ�����WinMain�к���CreateDialog��ʹ��HEXCALC.DLG�еĶԻ�����ģ�彨���ġ���ô��HEXCALC������һ����ͨ�Ŀ��ص��Ӵ�������һ����ģ̬�Ի������أ�

�򵥵Ļش��ǣ��Ի���������Ӵ���ͨ����Windowsʹ�����Լ��ڲ����Ӵ�ѶϢ������ʽ�����Ի������Ӵ���ѶϢ��Ȼ�ᣬWindows����ЩѶϢ���͸������Ի�����ij�ʽ�ڵĶԻ����������HEXCALC�У�������Windowsʹ�öԻ�����ģ�彨��һ���Ӵ��������Լ�д��ʽ��������Ӵ���ѶϢ��

���ҵ��ǣ���Developer Studio��Dialog Editor�У��Ի�����ģ����ҪһЩ���Dz������ӵĶ�������ˣ��Ի�����ģ�������HEXCALC.DLG�����У�������Ҫ�ֹ����롣��������ķ����������Խ�һ�����ֵ������ӵ��κ�ר���У��ӡ� File ï¿½ï¿½ï¿½ï¿½ï¿½Ü±ï¿½Ñ¡ï¿½ï¿½ New ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ñ¡ï¿½ï¿½ Files ï¿½ï¿½Ò³ï¿½ï¿½ï¿½Ç©ï¿½ï¿½È»ï¿½ï¿½Óµï¿½ï¿½ï¿½ï¿½ï¿½Ì¬ï¿½Ð±ï¿½ï¿½ï¿½Ñ¡ï¿½ï¿½ Text File ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Äµï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ô´ï¿½ï¿½ï¿½å£­ï¿½ï¿½Òªï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ô´ï¿½ï¿½ï¿½ï¿½ï¿½Ð¡ï¿½ï¿½Ó¡ï¿½ View ï¿½ï¿½ï¿½ï¿½ï¿½Ü±ï¿½Ñ¡ï¿½ï¿½ Resource Includes ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ê¾Ò»ï¿½ï¿½ï¿½Ô»ï¿½ï¿½ï¿½ï¿½é¡£ï¿½Ú¡ï¿½Compile-time Directives���༭������

#include "hexcalc.dlg"

��һ�н����뵽HEXCALC.RC��Դ�����У�����������ʾ��һ����

��ϸ��һ��HEXCALC.DLG�����еĶԻ�����ģ�壬��������HEXCALC���Ϊ�Ի�����ʹ�����Լ����Ӵ�ѶϢ������ʽ���Ի�����ģ����Ϸ����£�

HexCalc DIALOG -1, -1, 102, 122
STYLE WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX
CLASS "HexCalc"
CAPTION "Hex Calculator"

ע������WS_OVERLAPPED��WS_MINIMIZEBOX��ʶ���֣����ǿ��Խ���������CreateWindow�������Խ�����ͨ���Ӵ���CLASS����������Ի������������������ĶԻ�����֮������Ҫ�����𣨶�����Ҳ��Developer Studio�е�Dialog Editor����������ָ���ģ������Ի�����ģ��ʡ�����������ʱ��WindowsΪ�Ի�����ע��һ���Ӵ���𣬲�ʹ�����Լ����Ӵ�ѶϢ������ʽ�����Ի�����ѶϢ���������CLASS�����͸���Windows��ѶϢ���͵������ĵط��������˵�����Ƿ��͵���HexCalc�Ӵ������ָ�����Ӵ�ѶϢ������ʽ��

HexCalc�Ӵ��������HEXCALC��WinMain��ʽ��ע��ģ�������ͨ�Ӵ����Ӵ����һ�������ǣ���ע���и�ʮ����Ҫ������WNDCLASS�ṹ��cbWndExtra��λ�趨ΪDLGWINDOWEXTRA��������Լ�ע��ĶԻ�����������DZ���ġ�

��ע���Ӵ����֮�ᣬWinMain����CreateDialog��

hwnd = CreateDialog (hInstance, szAppName, 0, NULL) ;

�ڶ����������ִ���HexCaEc�����ǶԻ�����ģ������֡�����������ͨ���Ǹ��Ӵ����Ӵ����ţ������趨Ϊ0����Ϊ�Ӵ�û�и��Ӵ�������һ��������ͨ���ǶԻ���������λַ�����ﲻ��Ҫ����ΪWindows���ᴦ����ЩѶϢ�����Ҳ���ὫѶϢ���͸��Ի��������

���CreateDialog������Ի�����ģ��һ�𣬱�Windows��Ч��ת��Ϊһ��CreateWindow���С���CreateWindow���еĹ���������ĺ�����ͬ��

hwnd = 	CreateWindow (TEXT ("HexCalc"), TEXT ("Hex Calculator"),
          		WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX,
          		CW_USEDEFAULT, CW_USEDEFAULT,
          		102 * 4 / cxChar, 122 * 8 / cyChar,
          		NULL, NULL, hInstance, NULL) ;

���У�cxChar��cyChar�����ֱ���ϵͳ������Ԫ�Ŀ��Ⱥ͸߶ȡ�

����ͨ����Windows������CreateWindow���ж��ջ����᣺Windows�����ڽ�������ʽ�Ӵ�1���ֹͣ��������Ϊ�Ի�����ģ���ж��������29�����Ӵ��������������CreateWindow��������Щ����������Ӵ����Ӵ�ѶϢ������ʽ����WM_COMMANDѶϢ���ó�������WndProc����춽���һ�������������Ӵ����Ӵ���˵������һ���ܺõļ��ɡ�

������ʹHEXCALC�ij�ʽ�����½������ٵ���һ�ַ�������������ע�⵽HEXCALCû�б�ͷ��������ͷ������ͨ�������Ի�����ģ���У���ҪΪ�������Ӵ���������ʶ���֡�����֮���Կ��Բ�Ҫ�������������Ϊÿ�������������ID�趨Ϊ�����ڿ������ϵ����ֵ�ASCII�롣����ζ����WndProc������ȫ��ͬ�ضԴ�WM_COMMANDѶϢ��WM_CHARѶϢ����ÿ������£�wParam�ĵ����鶼�ǰ�ť��ASCII�롣

��Ȼ���Լ���ѶϢ����һЩ�����DZ�Ҫ�ġ�WndProc����WM_KEYDOWNѶϢ�������ͷ��ת��ΪBackspace�����ڴ���WM_CHARѶϢʱ��WndProc����Ԫ����ת��Ϊ��д��Enter��ת��Ϊ�Ⱥż���ASCII�롣

WM_CHARѶϢ����Ч����ͨ������GetDlgItem������ġ����GetDlgItem��ʽ����0����ô������Ԫ���ǶԻ�����ģ���ж����ID֮һ�������Ԫ��ID֮һ����ͨ������Ӧ�İ�ť����һ��BM_SETSTATEѶϢ����ʹ֮��˸��

if (hButton = GetDlgItem (hwnd, wParam))
{
     	SendMessage (hButton, BM_SETSTATE, 1, 0) ;
     	Sleep (100) ;  
     	SendMessage (hButton, BM_SETSTATE, 0, 0) ;
}

������������С�Ĵ��ۣ�ȴΪHEXCALC�ļ��̽�����ɫ���١�Sleep��ʽ����ʽ��ͣ100���롣����ֹ��ť������̫�������ע�ⲻ����

��WndProc����WM_COMMANDѶϢʱ�������ǽ����뽹���趨�����Ӵ���

case 	WM_COMMAND :
     	SetFocus (hwnd) ;

����һ��ʹ�û��󵥻�ij��ť�����뽹��ͻ��л����ð�ť�ϡ�

ͨ�öԻ�����
��

Windows��һ����ҪĿ�����ƶ���׼��ʹ���߽��档�����ೣ�õĹ��ܱ�����˵�������еúܿ죬�����������峧�̶�����Alt-File-Openѡ������һ��������Ȼ����ʵ�ʵĵ��������Ի�����ȴ����������ͬ��

��Windows 3.1��ʼ���������������һ�����еĽ������������һ�ֽ�����ͨ�öԻ������ʽ�⡹����ǿ�������ʽ���ɼ�����ʽ��ɣ���Щ��ʽ������׼�Ի����������д򿪺ʹ��浵�����������滻��ѡ����ɫ��ѡ�����壨�ҽ��ڱ����������ϵ���Щ���ݣ��Լ���ӡ���ҽ��ڵ�ʮ�������ۣ���

Ϊ��ʹ����Щ��ʽ���������϶�Ҫ��ʼ��ijһ�ṹ�ĸ�����λ�������ýṹ��ָ�괫�͸�ͨ�öԻ������ʽ���ij����ʽ���ú�ʽ�Ὠ������ʾ�Ի����顣��ʹ���߹رնԻ�����ʱ�������еĺ�ʽ������Ȩ���ظ���ʽ�������ԴӴ��͸����Ľṹ�л����Ѷ��

��ʹ��ͨ�öԻ������ʽ����κ�Cԭʼ�뵵��ʱ��������Ҫ����COMMDLG.H��ͷ������ͨ�öԻ�������ļ���/Platform SDK/User Interface Services/User Input/Common Dialog Box Library�С�

��ǿPOPPAD
��

����������ʮ�µ�POPPAD�����ӹ��ܱ�ʱ�����м�����׼���ܱ���û��ʵ�������������Ѿ�׼������POPPAD�м���򿪵��������뵵���Լ��ڴ�Ƭ�ϴ���༭�������Ĺ��ܡ��ڴ����У����ǻ�����POPPAD�м�������ѡ��������滻���ܡ�

ʵ��POPPAD3��ʽ�ĵ������ʽ11-6��ʾ��

 ï¿½ï¿½Ê½11-6  POPPAD3
POPPAD.C
/*------------------------------------------------------------------------
   POPPAD.C -- Popup Editor
               					(c) Charles Petzold, 1998
-------------------------------------------------------------------------*/
#include <windows.h>
#include <commdlg.h>
#include "resource.h"
#define 	EDITID   1
#define 	UNTITLED TEXT ("(untitled)")
LRESULT 	CALLBACK WndProc      	(HWND, UINT, WPARAM, LPARAM) ;
BOOL  		CALLBACK AboutDlgProc 	(HWND, UINT, WPARAM, LPARAM) ;
     		// Functions in POPFILE.C
void 	PopFileInitialize 			 (HWND) ;
BOOL 	PopFileOpenDlg    			 (HWND, PTSTR, PTSTR) ;
BOOL 	PopFileSaveDlg    			 (HWND, PTSTR, PTSTR) ;
BOOL 	PopFileRead       			 (HWND, PTSTR) ;
BOOL 	PopFileWrite      			 (HWND, PTSTR) ;
     		// Functions in POPFIND.C
HWND 	PopFindFindDlg     			 (HWND) ;
HWND 	PopFindReplaceDlg  			 (HWND) ;
BOOL 	PopFindFindText    			 (HWND, int *, LPFINDREPLACE) ;
BOOL 	PopFindReplaceText 			 (HWND, int *, LPFINDREPLACE) ;
BOOL 	PopFindNextText    			 (HWND, int *) ;
BOOL 	PopFindValidFind   			 (void) ;
     		// Functions in POPFONT.C
void 	PopFontInitialize   		 (HWND) ;
BOOL 	PopFontChooseFont   		 (HWND) ;
void 	PopFontSetFont      		 (HWND) ;
void PopFontDeinitialize (void) ;
     			// Functions in POPPRNT.C
BOOL PopPrntPrintFile (HINSTANCE, HWND, HWND, PTSTR) ;
     			// Global variables
static HWND  hDlgModeless ;
static TCHAR szAppName[] = TEXT ("PopPad") ;
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                    		PSTR szCmdLine, int iCmdShow)
{
     	MSG       msg ;
     	HWND      hwnd ;
     	HACCEL    hAccel ;
     	WNDCLASS  wndclass ;
     
     	wndclass.style         				= CS_HREDRAW | CS_VREDRAW ;
     	wndclass.lpfnWndProc   				= WndProc ;
     	wndclass.cbClsExtra    				= 0 ;
     	wndclass.cbWndExtra    				= 0 ;
     	wndclass.hInstance     				= hInstance ;
     	wndclass.hIcon         				= LoadIcon (hInstance, szAppName) ;
     	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, NULL,
                          		WS_OVERLAPPEDWINDOW,
                          		CW_USEDEFAULT, CW_USEDEFAULT,
                          		CW_USEDEFAULT, CW_USEDEFAULT,
                          		NULL, NULL, hInstance, szCmdLine) ;
     
     	ShowWindow (hwnd, iCmdShow) ;
     	UpdateWindow (hwnd) ;
     	hAccel = LoadAccelerators (hInstance, szAppName) ;
     	while (GetMessage (&msg, NULL, 0, 0))
     	{
          		if (hDlgModeless == NULL || !IsDialogMessage (hDlgModeless, &msg))
          		{
               			if (!TranslateAccelerator (hwnd, hAccel, &msg))
               {
                    				TranslateMessage (&msg) ;
                    				DispatchMessage (&msg) ;
               			}
          		}
  	}
     	return msg.wParam ;
}
void DoCaption (HWND hwnd, TCHAR * szTitleName)
{
     	TCHAR szCaption[64 + MAX_PATH] ;
     	wsprintf (szCaption, TEXT ("%s - %s"), szAppName,
               				szTitleName[0] ? szTitleName : UNTITLED) ;
     	SetWindowText (hwnd, szCaption) ;
}
void OkMessage (HWND hwnd, TCHAR * szMessage, TCHAR * szTitleName)
{
     	TCHAR szBuffer[64 + MAX_PATH] ;
     	wsprintf (szBuffer, szMessage, szTitleName[0] ? szTitleName : UNTITLED) ;
     	MessageBox (hwnd, szBuffer, szAppName, MB_OK | MB_ICONEXCLAMATION) ;
}
short AskAboutSave (HWND hwnd, TCHAR * szTitleName)
{
     	TCHAR 		szBuffer[64 + MAX_PATH] ;
     	int   iReturn ;
     
     	wsprintf (szBuffer, TEXT ("Save current changes in %s?"),
               				szTitleName[0] ? szTitleName : UNTITLED) ;
     
     	iReturn = MessageBox (hwnd, szBuffer, szAppName,
                           MB_YESNOCANCEL | MB_ICONQUESTION) ;
     	if (iReturn == IDYES)
          		if (!SendMessage (hwnd, WM_COMMAND, IDM_FILE_SAVE, 0))
               				iReturn = IDCANCEL ;
          
     	return iReturn ;
}
LRESULT CALLBACK WndProc (	HWND hwnd, UINT message, WPARAM wParam,LPARAM lParam)
{
     	static BOOL      			bNeedSave = FALSE ;
     	static HINSTANCE hInst ;
     	static HWND      			hwndEdit ;
     	static int       			iOffset ;
     	static TCHAR     			szFileName[MAX_PATH], szTitleName[MAX_PATH] ;
     	static UINT      			messageFindReplace ;
     	int              			iSelBeg, iSelEnd, iEnable ;
     	LPFINDREPLACE    			pfr ;
     
     	switch (message)
     	{
     	case WM_CREATE:
          		hInst = ((LPCREATESTRUCT) lParam) -> hInstance ;
               				// Create the edit control child window
          		hwndEdit = CreateWindow (TEXT ("edit"), NULL,
                         WS_CHILD | WS_VISIBLE | WS_HSCROLL | WS_VSCROLL |
                         WS_BORDER | ES_LEFT | ES_MULTILINE |
                         ES_NOHIDESEL | ES_AUTOHSCROLL | ES_AUTOVSCROLL,
                         0, 0, 0, 0,
                         hwnd, (HMENU) EDITID, hInst, NULL) ;
          
          		SendMessage (hwndEdit, EM_LIMITTEXT, 32000, 0L) ;
               			// Initialize common dialog box stuff
          		PopFileInitialize (hwnd) ;
          		PopFontInitialize (hwndEdit) ;
          
          		messageFindReplace = RegisterWindowMessage (FINDMSGSTRING) ;
          		DoCaption (hwnd, szTitleName) ;
          		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_INITMENUPOPUP:
          		switch (lParam)
          		{
          		case 1:             	// Edit menu
               
                    					// Enable Undo if edit control can do it
               
               				EnableMenuItem ((HMENU) wParam, IDM_EDIT_UNDO,
                    		SendMessage (hwndEdit, EM_CANUNDO, 0, 0L) ?
                                         MF_ENABLED : MF_GRAYED) ;
               
                    					// Enable Paste if text is in the clipboard
               
               				EnableMenuItem ((HMENU) wParam, IDM_EDIT_PASTE,
                   	 		IsClipboardFormatAvailable (CF_TEXT) ?
                                             MF_ENABLED : MF_GRAYED) ;
               
                    				// Enable Cut, Copy, and Del if text is selected
               
               		SendMessage (hwndEdit, EM_GETSEL,	(WPARAM) &iSelBeg,
                                (LPARAM) &iSelEnd) ;
               
               		iEnable = iSelBeg != iSelEnd ? MF_ENABLED : MF_GRAYED ;
               
               		EnableMenuItem ((HMENU) wParam, IDM_EDIT_CUT,   iEnable) ;
               		EnableMenuItem ((HMENU) wParam, IDM_EDIT_COPY,  iEnable) ;
               		EnableMenuItem ((HMENU) wParam, IDM_EDIT_CLEAR, iEnable) ;
               				break ;
               
          		case 2:             			// Search menu
               
               				// Enable Find, Next, and Replace if modeless
             				//   dialogs are not already active
               
               				iEnable = hDlgModeless == NULL ?
                            MF_ENABLED : MF_GRAYED ;
                            EnableMenuItem ((HMENU) wParam, IDM_SEARCH_FIND,    		iEnable) ;
               				EnableMenuItem ((HMENU) wParam, IDM_SEARCH_NEXT,   		iEnable) ;
               				EnableMenuItem ((HMENU) wParam, IDM_SEARCH_REPLACE, iEnable) ;
               				break ;
         		}
          		return 0 ;
     
     	case 	WM_COMMAND:
               						// Messages from edit control
          
          		if (lParam && LOWORD (wParam) == EDITID)
          		{
               				switch (HIWORD (wParam))
               		{
               		case 	EN_UPDATE :
                    				bNeedSave = TRUE ;
                    				return 0 ;
		case 	EN_ERRSPACE :
               		case 	EN_MAXTEXT :
                    		MessageBox (hwnd, TEXT ("Edit control out of space."),
                            szAppName, MB_OK | MB_ICONSTOP) ;
                    				return 0 ;
               			}
               		break ;
          		}
          
	switch (LOWORD (wParam))
          		{
               			// Messages from File menu
          		case 	IDM_FILE_NEW:
               				if (bNeedSave && IDCANCEL == AskAboutSave (hwnd, szTitleName))
                    						return 0 ;
               
               				SetWindowText (hwndEdit, TEXT ("\0")) ;
               				szFileName[0]  = '\0' ;
               				szTitleName[0] = '\0' ;
               				DoCaption (hwnd, szTitleName) ;
               				bNeedSave = FALSE ;
               				return 0 ;
               
          		case 	IDM_FILE_OPEN:
             if (bNeedSave && IDCANCEL == AskAboutSave (hwnd, szTitleName))
                return 0 ;
             if (PopFileOpenDlg (hwnd, szFileName, szTitleName))
               	{
                if (!PopFileRead (hwndEdit, szFileName))
                    						{
                 OkMessage (hwnd, TEXT ("Could not read file %s!"),
                            szTitleName) ;
                         	szFileName[0]  = '\0' ;
                         	szTitleName[0] = '\0' ;
                    						}
               				}
               
               				DoCaption (hwnd, szTitleName) ;
		bNeedSave = FALSE ;
		return 0 ;
               
	case	IDM_FILE_SAVE:
 		if	(szFileName[0])
		{
			if (PopFileWrite (hwndEdit, szFileName))
			{
					bNeedSave = FALSE ;
  					return 1 ;
			}
			else
			{
					OkMessage (hwnd, TEXT ("Could not write file %s"),
                                    		szTitleName) ;
                         					return 0 ;
                    			}
               		}
                    //fall through
          	case 	IDM_FILE_SAVE_AS:
               		if (PopFileSaveDlg (hwnd, szFileName, szTitleName))
		{
                    					DoCaption (hwnd, szTitleName) ;
                    
                    					if (PopFileWrite (hwndEdit, szFileName))
                    					{
                         								bNeedSave = FALSE ;
                         								return 1 ;
                    					}
                    						else
                    					{
                       OkMessage (hwnd, TEXT ("Could not write file %s"),
                                  szTitleName) ;
                         							return 0 ;
                    					}
               					}
               				return 0 ;
	case 	IDM_FILE_PRINT:
               		if (!PopPrntPrintFile (hInst, hwnd, hwndEdit, szTitleName))
                    OkMessage (	hwnd, TEXT ("Could not print file %s"),
                                szTitleName) ;
               		return 0 ;
               
          	case 	IDM_APP_EXIT:
               		SendMessage (hwnd, WM_CLOSE, 0, 0) ;
               		return 0 ;
               
                    							// Messages from Edit menu
               
          	case 	IDM_EDIT_UNDO:
               		SendMessage (hwndEdit, WM_UNDO, 0, 0) ;
               		return 0 ;
               
          	case 	IDM_EDIT_CUT:
               		SendMessage (hwndEdit, WM_CUT, 0, 0) ;
               		return 0 ;
               
          	case 	IDM_EDIT_COPY:
               		SendMessage (hwndEdit, WM_COPY, 0, 0) ;
               		return 0 ;
               
          	case 	IDM_EDIT_PASTE:
               		SendMessage (hwndEdit, WM_PASTE, 0, 0) ;
               		return 0 ;
               
          	case 	IDM_EDIT_CLEAR:
               		SendMessage (hwndEdit, WM_CLEAR, 0, 0) ;
               		return 0 ;
               
          	case 	IDM_EDIT_SELECT_ALL:
               		SendMessage (hwndEdit, EM_SETSEL, 0, -1) ;
               		return 0 ;
               
                    						// Messages from Search menu
	case 	IDM_SEARCH_FIND:
               		SendMessage (hwndEdit, EM_GETSEL, 0, (LPARAM) &iOffset) ;
               		hDlgModeless = PopFindFindDlg (hwnd) ;
               		return 0 ;
               
          	case 	IDM_SEARCH_NEXT:
               		SendMessage (hwndEdit, EM_GETSEL, 0, (LPARAM) &iOffset) ;
               
               		if (PopFindValidFind ())
                    				PopFindNextText (hwndEdit, &iOffset) ;
               		else
                    				hDlgModeless = PopFindFindDlg (hwnd) ;
               
               		return 0 ;
               
          	case 	IDM_SEARCH_REPLACE:
               		SendMessage (hwndEdit, EM_GETSEL, 0, (LPARAM) &iOffset) ;
               		hDlgModeless = PopFindReplaceDlg (hwnd) ;
               		return 0 ;
               
          	case 	IDM_FORMAT_FONT:
               		if (PopFontChooseFont (hwnd))
                    				PopFontSetFont (hwndEdit) ;
               
               		return 0 ;
               
                    						// Messages from Help menu
               
    	case 	IDM_HELP:
               		OkMessage (hwnd, 	TEXT ("Help not yet implemented!"), 
                    TEXT ("\0")) ;
               		return 0 ;
               
          	case 	IDM_APP_ABOUT:
               		DialogBox (hInst, TEXT ("AboutBox"), hwnd, AboutDlgProc) ;
               		return 0 ;
	}
          	break ;
case 	WM_CLOSE:
          	if (!bNeedSave || IDCANCEL != AskAboutSave (hwnd, szTitleName))
               		DestroyWindow (hwnd) ;
          
          		return 0 ;
     	case 	WM_QUERYENDSESSION :
          		if (!bNeedSave || IDCANCEL != AskAboutSave (hwnd, szTitleName))
 				return 1 ;
          
          		return 0 ;
          
     	case 	WM_DESTROY:
          		PopFontDeinitialize () ;
          		PostQuitMessage (0) ;
          		return 0 ;
          
     	default:
               				// Process "Find-Replace" messages
          		if (message == messageFindReplace)
          		{
               			pfr = (LPFINDREPLACE) lParam ;
               			if 	 (pfr->Flags & FR_DIALOGTERM)
                    					hDlgModeless = NULL ;
               
               			if 	 (pfr->Flags & FR_FINDNEXT)
                    		if (!PopFindFindText (hwndEdit, &iOffset, pfr))
                         	OkMessage (hwnd, 	TEXT ("Text not found!"), 
                        TEXT ("\0")) ;
                    
               			if (pfr->Flags & FR_REPLACE || pfr->Flags & FR_REPLACEALL)
                    				if (!PopFindReplaceText (hwndEdit, &iOffset, pfr))
                         			OkMessage (hwnd, 	TEXT ("Text not found!"), 
                        TEXT ("\0")) ;
                         
               			if (pfr->Flags & FR_REPLACEALL)
                    					while (PopFindReplaceText (hwndEdit, &iOffset, pfr)) ;
                              
               			return 0 ;
		}
		break ;
	}
	return DefWindowProc (hwnd, message, wParam, lParam) ;
}
BOOL CALLBACK AboutDlgProc (HWND hDlg, UINT message,WPARAM wParam, LPARAM lParam)
{
     	switch (message)
     	{
     	case 	WM_INITDIALOG:
          		return TRUE ;
          
     	case 	WM_COMMAND:
          		switch (LOWORD (wParam))
          		{
          		case IDOK:
               				EndDialog (hDlg, 0) ;
               				return TRUE ;
          		}
        	  break ;
     	}
     	return FALSE ;
}
 POPFILE.C
/*--------------------------------------------------------------------------
   	POPFILE.C -- Popup Editor File Functions
  ------------------------------------------------------------------------*/
#include <windows.h>
#include <commdlg.h>
static OPENFILENAME ofn ;
void PopFileInitialize (HWND hwnd)
{
     	static TCHAR szFilter[] = 	TEXT ("Text Files (*.TXT)\0*.txt\0")  \
                               		TEXT ("ASCII Files (*.ASC)\0*.asc\0") \
                               		TEXT ("All Files (*.*)\0*.*\0\0") ;
     
     	ofn.lStructSize       			= sizeof (OPENFILENAME) ;
     	ofn.hwndOwner         			= hwnd ;
     	ofn.hInstance         			= NULL ;
     	ofn.lpstrFilter       			= szFilter ;
     	ofn.lpstrCustomFilter 	= NULL ;
     	ofn.nMaxCustFilter    	= 0 ;
     	ofn.nFilterIndex      	= 0 ;
     	ofn.lpstrFile         	= NULL ;          	// Set in Open and Close functions
     	ofn.nMaxFile          		= MAX_PATH ;
     	ofn.lpstrFileTitle    		= NULL ;          	// Set in Open and Close functions
     	ofn.nMaxFileTitle     		= MAX_PATH ;
     	ofn.lpstrInitialDir   		= NULL ;
     	ofn.lpstrTitle        		= NULL ;
     	ofn.Flags             		= 0 ;             		// Set in Open and Close functions
     	ofn.nFileOffset       		= 0 ;
     	ofn.nFileExtension    		= 0 ;
     	ofn.lpstrDefExt       		= TEXT ("txt") ;
     	ofn.lCustData         		= 0L ;
     	ofn.lpfnHook          		= NULL ;
     	ofn.lpTemplateName    		= NULL ;
}
BOOL PopFileOpenDlg (HWND hwnd, PTSTR pstrFileName, PTSTR pstrTitleName)
{
     	ofn.hwndOwner         		= hwnd ;
     	ofn.lpstrFile         		= pstrFileName ;
     	ofn.lpstrFileTitle    		= pstrTitleName ;
     	ofn.Flags             		= OFN_HIDEREADONLY | OFN_CREATEPROMPT ;
     
     	return GetOpenFileName (&ofn) ;
}
BOOL PopFileSaveDlg (HWND hwnd, PTSTR pstrFileName, PTSTR pstrTitleName)
{
     	ofn.hwndOwner         		= hwnd ;
     	ofn.lpstrFile         		= pstrFileName ;
     	ofn.lpstrFileTitle    		= pstrTitleName ;
     	ofn.Flags             		= OFN_OVERWRITEPROMPT ;
     
     	return GetSaveFileName (&ofn) ;
}
BOOL PopFileRead (HWND hwndEdit, PTSTR pstrFileName)
{
     	BYTE   			bySwap ;
     	DWORD  			dwBytesRead ;
     	HANDLE 		    hFile ;
     	int    			i, iFileLength, iUniTest ;
     	PBYTE  			pBuffer, pText, pConv ;
          				// Open the file.
     	if (INVALID_HANDLE_VALUE == 
               		(hFile = CreateFile (pstrFileName, GENERIC_READ, FILE_SHARE_READ,
                         NULL, OPEN_EXISTING, 0, NULL)))
		return FALSE ;
          		// Get file size in bytes and allocate memory for read.
          		// Add an extra two bytes for zero termination.
                    
     	iFileLength = GetFileSize (hFile, NULL) ; 
     	pBuffer = malloc (iFileLength + 2) ;
          		// Read file and put terminating zeros at end.
     	ReadFile (hFile, pBuffer, iFileLength, &dwBytesRead, NULL) ;
     	CloseHandle (hFile) ;
     	pBuffer[iFileLength] = '\0' ;
     	pBuffer[iFileLength + 1] = '\0' ;
          		// Test to see if the text is Unicode
	iUniTest = IS_TEXT_UNICODE_SIGNATURE | IS_TEXT_UNICODE_REVERSE_SIGNATURE ;
	if (IsTextUnicode (pBuffer, iFileLength, &iUniTest))
 {
          		pText = pBuffer + 2 ;
          		iFileLength -= 2 ;
          	if (iUniTest & IS_TEXT_UNICODE_REVERSE_SIGNATURE)
	  {
               		for (i = 0 ; i < iFileLength / 2 ; i++)
               		{
                    			bySwap = ((BYTE *) pText) [2 * i] ;
                    	 ((BYTE *) pText) [2 * i] = ((BYTE *) pText) [2 * i + 1] ;
                    	 ((BYTE *) pText) [2 * i + 1] = bySwap ;
               		}
	  }
               			// Allocate memory for possibly converted string
          		pConv = malloc (iFileLength + 2) ;
               			// If the edit control is not Unicode, convert Unicode text to 
               			// non-Unicode (i.e., in general, wide character).
#ifndef UNICODE
          		WideCharToMultiByte (CP_ACP, 0, (PWSTR) pText, -1, pConv, 
                       iFileLength + 2, NULL, NULL) ;
               			// If the edit control is Unicode, just copy the string
#else
          	lstrcpy ((PTSTR) pConv, (PTSTR) pText) ;
#endif
     }
     	else      		// the file is not Unicode
      {
		pText = pBuffer ;
               			// Allocate memory for possibly converted string.
          		pConv = malloc (2 * iFileLength + 2) ;
               			// If the edit control is Unicode, convert ASCII text.
#ifdef UNICODE
          	MultiByteToWideChar (CP_ACP, 0, pText, -1, (PTSTR) pConv, 
                               		iFileLength + 1) ;
               					// If not, just copy buffer
#else
          		lstrcpy ((PTSTR) pConv, (PTSTR) pText) ;
#endif
     	}
     
     	SetWindowText (hwndEdit, (PTSTR) pConv) ;
     	free (pBuffer) ;
     	free (pConv) ;
   
     	return TRUE ;
}
BOOL PopFileWrite (HWND hwndEdit, PTSTR pstrFileName)
{
     	DWORD  		dwBytesWritten ;
     	HANDLE 	    hFile ;
     	int    		iLength ;
     	PTSTR  		pstrBuffer ;
     	WORD   		wByteOrderMark = 0xFEFF ;
          			// Open the file, creating it if necessary
     
     	if (INVALID_HANDLE_VALUE == 
               		(hFile = CreateFile (pstrFileName, GENERIC_WRITE, 0, 
                NULL, CREATE_ALWAYS, 0, NULL)))
          		return FALSE ;
          		// Get the number of characters in the edit control and allocate
          		// memory for them.
     
     	iLength = GetWindowTextLength (hwndEdit) ;
     	pstrBuffer = (PTSTR) malloc ((iLength + 1) * sizeof (TCHAR)) ;
     
     	if (!pstrBuffer)
     	{
          		CloseHandle (hFile) ;
          		return FALSE ;
     	}
          		// If the edit control will return Unicode text, write the
          		// byte order mark to the file.
#ifdef UNICODE
     	WriteFile (hFile, &wByteOrderMark, 2, &dwBytesWritten, NULL) ;
#endif
          		// Get the edit buffer and write that out to the file.
     	GetWindowText (hwndEdit, pstrBuffer, iLength + 1) ;
     	WriteFile (hFile, pstrBuffer, iLength * sizeof (TCHAR), 
                				&dwBytesWritten, NULL) ;
     	if ((iLength * sizeof (TCHAR)) != (int) dwBytesWritten)
     {
          		CloseHandle (hFile) ;
          		free (pstrBuffer) ;
          		return FALSE ;
     	}
     
     	CloseHandle (hFile) ;
     	free (pstrBuffer) ;
     
     	return TRUE ;
}
 POPFIND.C
/*--------------------------------------------------------------------------
   POPFIND.C -- Popup Editor Search and Replace Functions
  ------------------------------------------------------------------------*/
#include <windows.h>
#include <commdlg.h>
#include <tchar.h>            		// for _tcsstr (strstr for Unicode & non-Unicode)
#define MAX_STRING_LEN   256
static TCHAR szFindText [MAX_STRING_LEN] ;
static TCHAR szReplText [MAX_STRING_LEN] ;
HWND PopFindFindDlg (HWND hwnd)
{
     	static FINDREPLACE fr ;	// must be static for modeless dialog!!!
     
     	fr.lStructSize      		= sizeof (FINDREPLACE) ;
     	fr.hwndOwner        		= hwnd ;
     	fr.hInstance        		= NULL ;
     	fr.Flags            		= FR_HIDEUPDOWN | FR_HIDEMATCHCASE | FR_HIDEWHOLEWORD ;
     	fr.lpstrFindWhat    		= szFindText ;
     	fr.lpstrReplaceWith 		= NULL ;
     	fr.wFindWhatLen     		= MAX_STRING_LEN ;
     	fr.wReplaceWithLen  		= 0 ;
     	fr.lCustData        		= 0 ;
     	fr.lpfnHook         		= NULL ;
     	fr.lpTemplateName   		= NULL ;
     
     	return FindText (&fr) ;
}
HWND PopFindReplaceDlg (HWND hwnd)
{
     	static FINDREPLACE fr ;	// must be static for modeless dialog!!!
     
     	fr.lStructSize      		= sizeof (FINDREPLACE) ;
     	fr.hwndOwner        		= hwnd ;
     	fr.hInstance        		= NULL ;
     	fr.Flags            		= FR_HIDEUPDOWN | FR_HIDEMATCHCASE | FR_HIDEWHOLEWORD ;
     	fr.lpstrFindWhat    		= szFindText ;
     	fr.lpstrReplaceWith 		= szReplText ;
     	fr.wFindWhatLen     		= MAX_STRING_LEN ;
     	fr.wReplaceWithLen  		= MAX_STRING_LEN ;
     	fr.lCustData        		= 0 ;
     	fr.lpfnHook         		= NULL ;
     	fr.lpTemplateName   		= NULL ;
     
     	return ReplaceText (&fr) ;
}
BOOL PopFindFindText (HWND hwndEdit, int * piSearchOffset, LPFINDREPLACE pfr)
{
     	int    iLength, iPos ;
     	PTSTR  pstrDoc, pstrPos ;
     
          			// Read in the edit document
     
     	iLength = GetWindowTextLength (hwndEdit) ;
     
     	if (NULL == (pstrDoc = (PTSTR) malloc ((iLength + 1) * sizeof (TCHAR))))
          		return FALSE ;
     
     	GetWindowText (hwndEdit, pstrDoc, iLength + 1) ;
     
          			// Search the document for the find string
     
     	pstrPos = _tcsstr (pstrDoc + * piSearchOffset, pfr->lpstrFindWhat) ;
	free (pstrDoc) ;
     
          			// Return an error code if the string cannot be found
     
     	if (pstrPos == NULL)
          		return FALSE ;
     
          			// Find the position in the document and the new start offset
     
     	iPos = pstrPos - pstrDoc ;
     	* piSearchOffset = iPos + lstrlen (pfr->lpstrFindWhat) ;
     
          			// Select the found text
     	SendMessage (hwndEdit, EM_SETSEL, iPos, * piSearchOffset) ;
     	SendMessage (hwndEdit, EM_SCROLLCARET, 0, 0) ;
     
     	return TRUE ;
}
BOOL PopFindNextText (HWND hwndEdit, int * piSearchOffset)
{
     	FINDREPLACE fr ;
     fr.lpstrFindWhat = szFindText ;
     return PopFindFindText (hwndEdit, piSearchOffset, &fr) ;
}
BOOL PopFindReplaceText (HWND hwndEdit, int * piSearchOffset, LPFIND,REPLACE pfr)
{
          // Find the text
     if (!PopFindFindText (hwndEdit, piSearchOffset, pfr))
          return FALSE ;
     
          // Replace it
     SendMessage (	hwndEdit, EM_REPLACESEL, 0, (LPARAM) pfr->
lpstrReplaceWith) ;
     return TRUE ;
}
BOOL PopFindValidFind (void)
{
     return * szFindText != '\0' ;
}
 POPFONT.C
/*----------------------------------------------------
   POPFONT.C -- Popup Editor Font Functions
------------------------------------------------------*/
#include <windows.h>
#include <commdlg.h>
static LOGFONT logfont ;
static HFONT   hFont ;
BOOL PopFontChooseFont (HWND hwnd)
{
     CHOOSEFONT cf ;
     	cf.lStructSize    		= sizeof (CHOOSEFONT) ;
     	cf.hwndOwner   			= hwnd ;
     	cf.hDC            		= NULL ;
     	cf.lpLogFont   			= &logfont ;
     	cf.iPointSize     		= 0 ;
     	cf.Flags          			= CF_INITTOLOGFONTSTRUCT | CF_SCREENFONTS | CF_EFFECTS ;
     	cf.rgbColors      			= 0 ;
     	cf.lCustData      			= 0 ;
     	cf.lpfnHook       			= NULL ;
     	cf.lpTemplateName 		    = NULL ;
     	cf.hInstance      			= NULL ;
     	cf.lpszStyle      			= NULL ;
     	cf.nFontType      			= 0 ;               		// Returned from ChooseFont
     	cf.nSizeMin       				= 0 ;
     	cf.nSizeMax       				= 0 ;
     
     	return ChooseFont (&cf) ;
}
void PopFontInitialize (HWND hwndEdit)
{
     	GetObject (GetStockObject (SYSTEM_FONT), sizeof (LOGFONT), 
                				(PTSTR) &logfont) ;
     	hFont = CreateFontIndirect (&logfont) ;
     	SendMessage (hwndEdit, WM_SETFONT, (WPARAM) hFont, 0) ;
}
void PopFontSetFont (HWND hwndEdit)
{
   	HFONT hFontNew ;
 	RECT  rect ;
     
     	hFontNew = CreateFontIndirect (&logfont) ;
     	SendMessage (hwndEdit, WM_SETFONT, (WPARAM) hFontNew, 0) ;
     	DeleteObject (hFont) ;
     	hFont = hFontNew ;
     	GetClientRect (hwndEdit, &rect) ;
     	InvalidateRect (hwndEdit, &rect, TRUE) ;
}
void 	PopFontDeinitialize (void)
{
     	DeleteObject (hFont) ;
}
 POPPRNT0.C
/*------------------------------------------------------------------------
   POPPRNT0.C -- Popup Editor Printing Functions (dummy version)
--------------------------------------------------------------------------*/
#include <windows.h>
BOOL PopPrntPrintFile (	HINSTANCE hInst, HWND hwnd, HWND hwndEdit,
                       							PTSTR pstrTitleName)
{
     	return FALSE ;
}
 POPPAD.RC ��ժ¼��
//Microsoft Developer Studio generated resource script.
#include "resource.h"
#include "afxres.h"
/////////////////////////////////////////////////////////////////////////////
// Dialog
ABOUTBOX DIALOG DISCARDABLE  32, 32, 180, 100
STYLE DS_MODALFRAME | WS_POPUP
FONT 8, "MS Sans Serif"
BEGIN
    	DEFPUSHBUTTON "OK",IDOK,66,80,50,14
    	ICON            						"POPPAD",IDC_STATIC,7,7,20,20
    	CTEXT           						"PopPad",IDC_STATIC,40,12,100,8
    	CTEXT         "Popup Editor for Windows",IDC_STATIC,7,40,166,8
    	CTEXT         "(c) Charles Petzold, 1998",IDC_STATIC,7,52,166,8
END
PRINTDLGBOX DIALOG DISCARDABLE  32, 32, 186, 95
STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
CAPTION "PopPad"
FONT 8, "MS Sans Serif"
BEGIN
    	PUSHBUTTON    "Cancel",IDCANCEL,67,74,50,14
    	CTEXT           					"Sending",IDC_STATIC,8,8,172,8
    	CTEXT         "",IDC_FILENAME,8,28,172,8
    	CTEXT         "to print spooler.",IDC_STATIC,8,48,172,8
END
/////////////////////////////////////////////////////////////////////////////
// Menu
POPPAD MENU DISCARDABLE 
BEGIN
	POPUP           "&File"
	BEGIN
	MENUITEM 	"&New\tCtrl+N",    IDM_FILE_NEW
    MENUITEM 	"&Open...\tCtrl+O",IDM_FILE_OPEN
  	MENUITEM 	"&Save\tCtrl+S",   IDM_FILE_SAVE
   	MENUITEM 	"Save &As...",     IDM_FILE_SAVE_AS
   	MENUITEM 	SEPARATOR
   	MENUITEM 	"&Print\tCtrl+P",  IDM_FILE_PRINT
   	MENUITEM 	SEPARATOR
   	MENUITEM 	"E&xit",           IDM_APP_EXIT
END
   	POPUP "&Edit"
BEGIN
   	MENUITEM 	"&Undo\tCtrl+Z",   IDM_EDIT_UNDO
   	MENUITEM 	SEPARATOR
   	MENUITEM 	"Cu&t\tCtrl+X",    IDM_EDIT_CUT
   	MENUITEM 	"&Copy\tCtrl+C",   IDM_EDIT_COPY
   	MENUITEM 	"&Paste\tCtrl+V",  IDM_EDIT_PASTE
   	MENUITEM 	"De&lete\tDel",    IDM_EDIT_CLEAR
   	MENUITEM 	SEPARATOR
   	MENUITEM 	"&Select All",     IDM_EDIT_SELECT_ALL
END
	POPUP	    "&Search"
BEGIN	
   	MENUITEM 	"&Find...\tCtrl+F",IDM_SEARCH_FIND
   	MENUITEM 	"Find &Next\tF3",  IDM_SEARCH_NEXT
   	MENUITEM 	"&Replace...\tCtrl+R", IDM_SEARCH_REPLACE
END
	POPUP 	    "F&ormat"
BEGIN
   	MENUITEM 	"&Font...",             
END
	POPUP 	"&Help"
 	BEGIN
 	MENUITEM 	 "&Help",	            IDM_HELP
   	MENUITEM 	 "&About PopPad...",  IDM_APP_ABOUT
	END
END
/////////////////////////////////////////////////////////////////////////////
// Accelerator
POPPAD ACCELERATORS DISCARDABLE 
BEGIN
   	VK_BACK, 	IDM_EDIT_UNDO,   VIRTKEY, 	ALT,     NOINVERT
   	VK_DELETE,  IDM_EDIT_CLEAR,  VIRTKEY, 	NOINVERT
   	VK_DELETE,  IDM_EDIT_CUT,    VIRTKEY, 	SHIFT,   NOINVERT
   	VK_F1,      IDM_HELP,        VIRTKEY, 	NOINVERT
   	VK_F3,      IDM_SEARCH_NEXT, VIRTKEY, 	NOINVERT
   	VK_INSERT,  IDM_EDIT_COPY,   VIRTKEY, 	CONTROL,  NOINVERT
   	VK_INSERT,      		IDM_EDIT_PASTE,        VIRTKEY, 	SHIFT, NOINVERT
   	"^C",         IDM_EDIT_COPY,         ASCII,  	NOINVERT
  	"^F",        	IDM_SEARCH_FIND,       ASCII,  	NOINVERT
 	"^N",        	IDM_FILE_NEW,          ASCII,  	NOINVERT
	"^O",        	IDM_FILE_OPEN,         ASCII,  	NOINVERT
	"^P",         IDM_FILE_PRINT,        ASCII,  	NOINVERT
	"^R",         IDM_SEARCH_REPLACE,    ASCII,  	NOINVERT
	"^S",         IDM_FILE_SAVE,         ASCII,  	NOINVERT
	"^V",         IDM_EDIT_PASTE,        ASCII,  	NOINVERT
	"^X",         IDM_EDIT_CUT,          ASCII,  	NOINVERT
	"^Z",         IDM_EDIT_UNDO,         ASCII,  	NOINVERT
END
/////////////////////////////////////////////////////////////////////////////
// Icon
POPPAD                  					ICON    DISCARDABLE     "poppad.ico"
 RESOURCE.H ��ժ¼��
// Microsoft Developer Studio generated include file.
// Used by poppad.rc
#define IDC_FILENAME          1000
#define IDM_FILE_NEW          40001
#define IDM_FILE_OPEN         40002
#define IDM_FILE_SAVE         40003
#define IDM_FILE_SAVE_AS      40004
#define IDM_FILE_PRINT        40005
#define IDM_APP_EXIT          40006
#define IDM_EDIT_UNDO         40007
#define IDM_EDIT_CUT          40008
#define IDM_EDIT_COPY         40009
#define IDM_EDIT_PASTE        40010
#define IDM_EDIT_CLEAR        40011
#define IDM_EDIT_SELECT_ALL   40012
#define IDM_SEARCH_FIND       40013
#define IDM_SEARCH_NEXT       40014
#define IDM_SEARCH_REPLACE    40015
#define IDM_FORMAT_FONT       40016
#define IDM_HELP              40017
#define IDM_APP_ABOUT         40018
POPPAD.ICO

��


��

Ϊ�˱����ڵ�ʮ�������ظ�ԭʼ�룬����POPPAD.RC�Ĺ��ܱ��м�������ӡר����һЩ������֧Ԯ��

POPPAD.C�����˳�ʽ�����еĻ���ԭʼ�롣POPFILE.C��������File Open��File Save�Ի�����ij�ʽ�룬������������I/O��ʽ��POPFIND.C�а�������Ѱ���滻���ֹ��ܡ�POPFONT.C����������ѡ���ܡ�POPPRNT0.C�����ʲô�������ڵ�ʮ�����н�ʹ��POPPRNT.C�滻POPPRNT0.C�Խ������յ�POPPAD��ʽ��

������������һ��POPPAD.C��POPPAD.C���������������ִ�����һ����������WndProc������ΪszFileName��������ϸ�����������ơ�·�����ƺ͵������ƣ��ڶ���������ΪszTitleName���dz�ʽ�����ĵ������ơ�������POPPAD3��DoCaption��ʽ�У��Ա㽫����������ʾ���Ӵ��ı������ϣ�Ҳ����OKMessage��ʽ��AskAboutSave��ʽ�У��Ա���ʹ������ʾѶϢ���顣

POPFILE.C�����˼�����ʾ��File Open���͡�File Save���Ի������Լ�ʵ��ִ�е���I/O�ĺ�ʽ���Ի�������ʹ�ú�ʽGetOpenFileName��GetSaveFileName����ʾ�ġ���������ʽ��ʹ��һ����̬ΪOPENFILENAME�Ľṹ������ṹ��COMMDLG.H�ж��塣��POPFILE.C�У�ʹ����һ���ýṹ��̬�����������ȡ��Ϊofn��ofn�Ĵ������λ��PopFileInitialize��ʽ�б���ʼ����POPPAD.C��WndProc�д���WM_CREATEѶϢʱ���иú�ʽ��

��ofn��Ϊ��̬����ṹ������ȽϷ��㣬��ΪGetOpenFileName��GetSaveFileName���ýṹ���ص�һЩ��Ѷ�����������������Щ��ʽʱ�õ���

����ͨ�öԻ������������ѡ������趨�Լ��ĶԻ�����ģ�壬�Լ�Ϊ�Ի�����������ӡ��ҹ���hook������POPFILE.C��ʹ�õġ�File Open���͡�File Save���Ի�������������ġ�OPENFILENAME�ṹ�б��趨����λֻ��lStructSize���ṹ�ij��ȣ���hwndOwner���Ի�����ӵ���ߣ���lpstrFilter�����潫��Ҫ���ۣ���lpstrFile��nMaxFile��ָ����������������ƵĻ�����ָ��͸û������Ĵ�С����lpstrFileTitle��nMaxFileTitle���������ƻ����������С����Flags���趨�Ի������ѡ���lpstrDefExt�����ʹ�����ڶԻ����������뵵����ʱ��ָ����������������ô�������ڶ��ĵ�������������

��ʹ�����ڡ�File�����ܱ���ѡ��Open��ʱ��POPPAD3����POPFILE��PopFileOpenDlg��ʽ�����Ӵ����š�һ��ָ�򵵰����ƻ�������ָ���һ��ָ�򵵰����⻺������ָ�괫������PopFileOpenDlgǡ�����趨OPENFILENAME�ṹ��hwndOwner��lpstrFile��lpstrFileTitle��λ����Flags�趨ΪOFN_ CREATEPROMPT��Ȼ�����GetOpenFileName����ʾ��ͼ11-6��ʾ����ͨ�Ի����顣


��

ͼ11-6 ��File Open���Ի�����

��ʹ���߽�������Ի�����ʱ��GetOpenFileName��ʽ���ء�OFN_CREATEPROMPT���ָʾGetOpenFileName��ʾһ��ѶϢ���飬ѯ��ʹ���������ѡ���������ڣ��Ƿ�Ҫ�����õ�����

���½ǵ�����ʽ�嵥�����г��˽�Ҫ��ʾ�ڵ����б��еĵ�����̬�����嵥���鱻��Ϊ��ɸѡ�嵥����ʹ���߿���ͨ��������ʽ�嵥�����б���ѡ����һ�ֵ�����̬�����ı�ɸѡ��������POPFILE.C��PopFileInitialize��ʽ�У����ڱ���szFilter��һ���ִ����У���Ϊ������̬�ĵ���������һ��ɸ���嵥������.TXT�����������ֵ���������.ASC��������ASCII���������е�����OPENFILENAME�ṹ��lpstrFilter��λ����ָ������е�һ���ִ���ָ�ꡣ

���ʹ�����ڶԻ����鴦춻״̬ʱ�ı���ɸѡ��������ôOPENFILENAME��nFilterIndex��λ��ӳ��ʹ���ߵ�ѡ����춸ýṹ�Ǿ�̬�������´������Ի�����ʱ��ɸѡ���������趨Ϊѡ�еĵ�����̬��

POPFILE.C�е�PopFileSaveDlg��ʽ������ƣ�����Flags�����趨ΪOFN_OVERWRITEPROMPT��������GetSaveFileName������File Save���Ի����顣OFN_OVERWRITEPROMPT��굼����ʾһ��ѶϢ���飬�����ѡ�����Ѿ����ڣ���ô��ѯ��ʹ�����Ƿ񸲸Ǹõ�����

Unicode����I/O
��

��춱����еĴ������ʽ����������ע��Unicode�ͷ�Unicode����������磬��POPPAD3��Unicode�У��༭���������Unicode���ֺ�ʹ��Unicode�ִ�������ͨ�öԻ����顣���磬����ʽ��Ҫ�������滻ʱ�����еIJ������ᴦ��Unicode�ִ���������Ҫת����

������POPPAD3�ô�������I/O��Ҳ����˵����ʽ���ܱ����쳵�����Unicode���POPPAD3����˱༭�����������ݲ�����д���Ƭ����������ʹ��Unicode��ŵġ������Unicode���POPPAD3��ȡ�˸õ�����������д��༭����������������һ��������Unicode���ȡ�ɷ�Unicode�洢��ĵ���ʱҲ��������

����İ취��춱���ת�������ȣ���POPFILE.C��PopFileWrite��ʽ�У���������Unicode��ij�ʽ���ڵ����Ŀ�ʼλ��д��0xFEFF���ⶨ��ΪλԪ��˳���ǣ��Ա�ʾ���ֵ�������Unicode���֡�

��Σ���PopFileRead��ʽ�У���ʽ��IsTextUnicode��ʽ�����������Ƿ���λԪ��˳���ǡ��˺�ʽ�������λԪ��˳�����Ƿ����ˣ��༴Unicode���ֵ�����Macintosh��������ʹ����Intel�������෴��λԪ��˳��Ļ����Ͻ����ġ���ʱ��λԪ���˳�򶼾�����ת�����������Unicode�棬���DZ���Unicode���POPPAD3��ȡ����ʱ�����ֽ���WideCharToMultiCharת����WideCharToMultiCharʵ������һ������ԪANSI��ʽ��������ִ��Զ�����Windows����ֻ����ʱ���ֲ��ܷ���༭��������

ͬ���أ���������Ƿ�Unicode���ֵ�������ִ�е���Unicode��ij�ʽ����ô���ֱ�����MultiCharToWideCharת����

�ı�����
��

���ǽ��ڵ�ʮ������ϸ�������壬����Щ�����ܴ���ͨ�öԻ����麯ʽ��ѡ�����塣

��WM_CREATEѶϢ�����ڼ䣬POPFONT.C�е�POPPAD����PopFontInitialize�������ʽȡ��һ������ϵͳ���彨����LOGFONT�ṹ���ɴ˽���һ�����壬����༭�������һ��WM_SETFONTѶϢ���趨һ���µ����壨�ڶ��༭������������ϵͳ���壬��PopFontInitializeΪ�༭�������һ���µ����壬��Ϊ���ո����彫��ɾ������ɾ������ϵͳ�����Dz����ǵģ���

��POPPAD�յ����Գ�ʽ������ѡ���WM_COMMANDѶϢʱ��������PopFontChooseFont�������ʽ��ʼ��һ��CHOOSEFONT�ṹ��Ȼ�����ChooseFont��ʾ����ѡ��Ի����顣���ʹ���߰��¡�OK����ť����ôChooseFont������TRUE�����ᣬPOPPAD����PopFontSetFont���趨�༭�������е������壬�����彫��ɾ����

���ᣬ��WM_DESTROYѶϢ�����ڼ䣬POPPAD����PopFontDeinitialize��ɾ�����һ����PopFontSetFont���������塣

��Ѱ���滻
��

ͨ�öԻ������ʽ��Ҳ�ṩ�������������Ѱ���滻��ʽ�ĶԻ����飬��������ʽ��FindText��ReplaceText��ʹ��һ����̬ΪFINDREPLACE�Ľṹ��ͼ10-11����ʾ��POPFIND.C������������ʽ��PopFindFindDlg��PopFindReplaceDlg��������Щ��ʽ������������ʽ�ڱ༭����������Ѱ���滻���֡�

ʹ����Ѱ���滻��ʽ��һЩ���ǡ����ȣ����������ĶԻ������Ƿ�ģ̬�Ի����飬����ζ�������дѶϢ��Ȧ���Ա��ڶԻ�����ʱ����IsDialogMessage���ڶ������͸�FindText��ReplaceText��FINDREPLACE�ṹ������һ����̬��������Ϊ�Ի�������ģ̬�ģ���ʽ�ڶԻ�������ʾ֮�ᴫ�أ��������ڶԻ��������֮�ᴫ�أ����Ի�������������Ȼ�ܹ���ȡ�ýṹ��

����������ʾFindText��ReplaceText�Ի�����ʱ������ͨ��һ������ѶϢ��ӵ�����Ӵ����磬ѶϢ��ſ���ͨ����FINDMSGSTRINGΪ��������RegisterWindowMessage��ʽ����á�������WndProc�д���WM_CREATEѶϢʱ��ɵģ�ѶϢ�Ŵ���ھ�̬�����С�

�ڴ����ڶ�ѶϢʱ��WndProc��ѶϢ������RegisterWindowMessage���ص�ֵ��Ƚϡ�lParamѶϢ������һ��ָ��FINDREPLACE�ṹ��ָ�꣬Flags��λָʾʹ����ʹ�öԻ�������Ϊ����Ѱ���ֻ����滻���֣��Լ��Ƿ�Ҫ��ֹ�Ի����顣POPPAD3�Ǻ���POPFIND.C�е�PopFindFindText��PopFindReplaceText��ʽ��ִ����Ѱ���滻���ܵġ�

ֻ����һ����ʽ��Windows��ʽ
��

������Ϊֹ�������Ѿ�˵����������ʽ���������ѡ����ɫ����������ʽ�ֱ��ǵھ����е�COLORS1�ͱ����е�COLORS2�������ǽ���COLORS3��ʱ���ˣ������ʽֻ��һ��Windows��ʽ���С�COLORS3��ԭʼ�����ʽ11-7��ʾ��

COLORS3�����е�ΨһWindows��ʽ��ChooseColor����Ҳ��ͨ�öԻ������ʽ���еĺ�ʽ������ʾ��ͼ11-7��ʾ�ĶԻ����顣��ɫѡ�������COLORS1��COLORS2����������ʹ���߽�̸����������ǿ��

 ï¿½ï¿½Ê½11-7  COLORS3
COLORS3.C
/*-------------------------------------------------------------------------
   	COLORS3.C -- Version using Common Dialog Box
                					(c) Charles Petzold, 1998
--------------------------------------------------------------------------*/
#include <windows.h>
#include <commdlg.h>
int WINAPI WinMain (	HINSTANCE hInstance, HINSTANCE hPrevInstance,
          							PSTR szCmdLine, int iCmdShow)
{
     	static CHOOSECOLOR	cc ;
     	static COLORREF 			crCustColors[16] ;
     	cc.lStructSize    			= sizeof (CHOOSECOLOR) ;
     	cc.hwndOwner      			= NULL ;
     	cc.hInstance      			= NULL ;
     	cc.rgbResult      			= RGB (0x80, 0x80, 0x80) ;
     	cc.lpCustColors   			= crCustColors ;
     	cc.Flags          			= CC_RGBINIT | CC_FULLOPEN ;
     	cc.lCustData      			= 0 ;
     	cc.lpfnHook       			= NULL ;
	cc.lpTemplateName = NULL ;
     	return ChooseColor (&cc) ;
}


��

ͼ11-7 COLORS3��өĻ��ʾ

ChooseColor��ʽʹ��һ��CHOOSECOLOR��̬�Ľṹ�ͺ���16��DWORD����������ų�����ɫ��ʹ���߽��ӶԻ�������ѡ����Щ��ɫ֮һ��rgbResult��λ���Գ�ʼ��Ϊһ����ɫֵ�����Flags��λ��CC_RGBINIT��걻����������ʾ����ɫ��ͨ����ʹ�������ʽʱ��rgbResult�����趨Ϊʹ����ѡ�����ɫ��

��ע�⣬Color�Ի������hwndOwner��λ���趨ΪNULL����ChooseColor��ʽ����DialogBox����ʾ�Ի�����ʱ��DialogBox�ĵ���������Ҳ���趨ΪNULL��������ȫ�Ϸ��ģ��京���ǶԻ����鲻Ϊ��һ���Ӵ���ӵ�С��Ի�����ı��⽫��ʾ�ڹ������У����Ի��������һ����ͨ���Ӵ�����ִ�С�

��Ҳ�������Լ���ʽ�ĶԻ�������ʹ�����ּ��ɡ�ʹWindows��ʽֻ�����Ի����飬�������鶼�ڶԻ������������ɣ����ǿ��ܵġ�