第十一章 对话框part1

模态对话框

对话框的资源信息

//第一行给出了对话框的名称 //前两个数字是对话框左上角的x、y坐标 //后两个数字是对话框的宽度和高度。 ABOUTBOX DIALOG DISCARDABLE 32, 32, 180, 100 //模板中的STYLE叙述类似于CreateWindow呼叫中的style字段 //对于模态对话框,通常使用WS_POPUP和DS_MODALFRAME 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文字居中 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

在BEGIN和END叙述(或者是左右大括号,手工设计对话框模板时,您可能会使用)之间,定义出现在对话框中的子窗口控件。

DEFPUSHBUTTON、ICON和CTEXT等标识符只可以在对话框中使用,它们是某种特定窗口类别和窗口样式的缩写。例如,CTEXT指示这个子窗口控件类别是「静态的」 ,其样式为: WS_CHILD | SS_CENTER | WS_VISIBLE | WS_GROUP。

对话框程序

对话框程序都必须定义为一个CALLBACK(callback)函数。尽管我使用了hDlg作为对话框窗口的句柄,但是您也可以按照您自己的意思使用hwnd。窗口消息处理程序传回一个LRESULT。对话框传回一个BOOL,它在Windows表头文件中定义为int型态。

 #include #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 ; } HMENU hMenu = LoadMenu(hInstance, MAKEINTRESOURCE(ABOUT1)); hwnd = CreateWindow(szAppName, TEXT("About Box Demo Program"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, hMenu, hInstance, NULL ); ShowWindow(hwnd, iCmdShow); UpdateWindow(hwnd); while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg) ; DispatchMessage(&msg) ; } return msg.wParam; } //对话框程序都必须定义为一个CALLBACK(callback)函数。 //尽管我使用了hDlg作为对话框窗口的句柄, //但是也可以按照您自己的意思使用hwnd //窗口消息处理程序传回一个LRESULT。对话框传回一个BOOL, //它在Windows表头文件中定义为int型态。 LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { static HINSTANCE hInstance; switch (message) { case WM_CREATE: //在WndProc中处理WM_CREATE消息时, //ABOUT1取得程序的执行实体句柄并将它放在静态变量中 //当它获得这样一个消息时,程序呼叫DialogBox hInstance =((LPCREATESTRUCT)lParam)->hInstance; return 0 ; case WM_COMMAND: //菜单有一个选项,它产生一条ID名为IDM_APP_ABOUT的WM_COMMAND switch (LOWORD(wParam)) { case IDM_APP_ABOUT: //即使在显示对话框时,WndProc也可以继续接收消息。 //所以AboutDlgProc中的SendMessage呼叫可以使用如下叙述来开始 //SendMessage(GetParent (hDlg), . . . ); DialogBox(hInstance, MAKEINTRESOURCE(IDD_ABOUTBOX), hwnd, AboutDlgProc) ; break; } return 0; case WM_DESTROY: PostQuitMessage(0); return 0 ; } return DefWindowProc(hwnd, message, wParam, lParam) ; } //直到对话框结束之后,用来显示对话框的DialogBox才将控制权传回给WndProc 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 ; }

激活对话框

在WndProc中处理WM_CREATE消息时,ABOUT1取得程序的执行实体句柄并将它放在静态变量中:hInstance =((LPCREATESTRUCT) lParam)->hInstance ; 当它获得这样一个消息时,程序呼叫DialogBox: DialogBox (hInstance, TEXT ("AboutBox"), hwnd, AboutDlgProc) ;

不同的主题

对于这些控件型态,除了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

你可能感兴趣的:(Windows程序设计)