標籤:對話方塊
1 對話方塊的分類
2 對話方塊的基本使用方式
3 對話方塊資源
4 有強制回應對話方塊的使用
int DialogBox( HINSTANCE hInstance, LPCTSTR lpTemplate, HWND hWndParent, DLGPROC lpDialogFunc);
5 無強制回應對話方塊的使用
5.1 添加對話方塊資源
5.2 定義視窗處理函數
BOOL CALLBACK DialogProc( HWND hwndDlg, // handle to dialog box UINT uMsg, // message WPARAM wParam, // first message parameter LPARAM lParam ); // second message parameter
5.3 建立對話方塊
HWND CreateDialog( HINSTANCE hInstance,//應用程式執行個體控制代碼 LPCTSTR lpTemplate,//對話方塊的資源ID HWND hWndParent,//父視窗 DLGPROC lpDialogFunc );//對話方塊的視窗處理函數
傳回值是建立好的對話方塊的視窗控制代碼。
5.4 顯示對話方塊
ShowWindow
5.5 關閉對話方塊
EndDialog
5.6 與有強制回應對話方塊對比
建立函數: 有強制回應對話方塊 DialogBox
無強制回應對話方塊 CreateDialog
程式執行方式:
有強制回應對話方塊會阻塞,禁止其他視窗的輸入
無強制回應對話方塊會讓主程式,不影響其它視窗的輸入
6 對話方塊中的訊息
WM_INITDIALOG訊息,用途類似於WM_CREATE訊息
可以在對話方塊建立完成後,進行資料初始化.
它與WM_CREATE不同之處是,WM_INITDIALOG訊息
會在對話方塊資源模板上的所有子控制項(按鈕等)
建立完成後,再發送給對話方塊視窗.
wParam - 當前接受輸入焦點子控制項視窗控制代碼
lParam - 建立時附帶的參數
7 對話方塊和普通視窗的對比
7.1 建立方式
普通視窗: CreateWindow/Ex
對話方塊: DialogBox/CreateDialog
7.2 訊息
普通視窗: 會收到WM_CREATE
對話方塊: WM_INITDIALOG
7.3 關閉方式:
普通視窗: DestoryWindow等
對話方塊: EndDialog
// windialog.cpp : 定義應用程式的進入點。//#include "stdafx.h"#include "windialog.h"#define MAX_LOADSTRING 100// 全域變數:HINSTANCE hInst;// 當前執行個體TCHAR szTitle[MAX_LOADSTRING];// 標題列文本TCHAR szWindowClass[MAX_LOADSTRING];// 主視窗類名// 此代碼模組中包含的函數的前向聲明:ATOMMyRegisterClass(HINSTANCE hInstance);BOOLInitInstance(HINSTANCE, int);LRESULT CALLBACKWndProc(HWND, UINT, WPARAM, LPARAM);INT_PTR CALLBACKAbout(HWND, UINT, WPARAM, LPARAM);int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow){UNREFERENCED_PARAMETER(hPrevInstance);UNREFERENCED_PARAMETER(lpCmdLine); // TODO: 在此放置代碼。MSG msg;HACCEL hAccelTable;// 初始化全域字串LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);LoadString(hInstance, IDC_WINDIALOG, szWindowClass, MAX_LOADSTRING);MyRegisterClass(hInstance);// 執行應用程式初始化:if (!InitInstance (hInstance, nCmdShow)){return FALSE;}hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_WINDIALOG));// 主訊息迴圈:while (GetMessage(&msg, NULL, 0, 0)){if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)){TranslateMessage(&msg);DispatchMessage(&msg);}}return (int) msg.wParam;}//// 函數: MyRegisterClass()//// 目的: 註冊視窗類別。//// 注釋://// 僅當希望// 此代碼與添加到 Windows 95 中的“RegisterClassEx”// 函數之前的 Win32 系統相容時,才需要此函數及其用法。調用此函數十分重要,// 這樣應用程式就可以獲得關聯的// “格式正確的”小表徵圖。//ATOM MyRegisterClass(HINSTANCE hInstance){WNDCLASSEX wcex;wcex.cbSize = sizeof(WNDCLASSEX);wcex.style= CS_HREDRAW | CS_VREDRAW;wcex.lpfnWndProc= WndProc;wcex.cbClsExtra= 0;wcex.cbWndExtra= 0;wcex.hInstance= hInstance;wcex.hIcon= LoadIcon(hInstance, MAKEINTRESOURCE(IDI_WINDIALOG));wcex.hCursor= LoadCursor(NULL, IDC_ARROW);wcex.hbrBackground= (HBRUSH)(COLOR_WINDOW+1);wcex.lpszMenuName= MAKEINTRESOURCE(IDC_WINDIALOG);wcex.lpszClassName= szWindowClass;wcex.hIconSm= LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));return RegisterClassEx(&wcex);}//// 函數: InitInstance(HINSTANCE, int)//// 目的: 儲存執行個體控制代碼並建立主視窗//// 注釋://// 在此函數中,我們在全域變數中儲存執行個體控制代碼並// 建立和顯示主程式視窗。//BOOL InitInstance(HINSTANCE hInstance, int nCmdShow){ HWND hWnd; hInst = hInstance; // 將執行個體控制代碼儲存在全域變數中 hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL); if (!hWnd) { return FALSE; } ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); return TRUE;}BOOL CALLBACK SettingDlgProc_1(HWND hwndDlg, UINT message, WPARAM wParam, LPARAM lParam){ switch(message){case WM_CREATE: //不會發生 MessageBox( NULL, "WM_CREATE", "WinDlg", MB_OK ); break;case WM_INITDIALOG:/*類似於 WM_CREATE 訊息,可以在對話方塊常見完成後,進行資料初始化*不同的是:WM_INITDIALOG 會在對話方塊資源莫班上所有的空間建立完成後發送給對話方塊視窗* wParam :當前接受輸入焦點子控制項視窗控制代碼* lParam :建立時附帶的參數*/ MessageBox( NULL, "WM_INITDIALOG","WinDlg", MB_OK ); break;case WM_SYSCOMMAND:switch(wParam){case SC_CLOSE:EndDialog(hwndDlg,1);break;default://EndDialog(hwndDlg,0);break;}break;default:break;}//預設對話方塊處理函數//return DefDlgProc(hwndDlg, message, wParam, lParam);return 0;}//// 函數: WndProc(HWND, UINT, WPARAM, LPARAM)//// 目的: 處理主視窗的訊息。//// WM_COMMAND- 處理應用程式菜單// WM_PAINT- 繪製主視窗// WM_DESTROY- 發送退出訊息並返回////LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam){int wmId, wmEvent;PAINTSTRUCT ps;HDC hdc;HWND hdlg;switch (message){case WM_CREATE: //會發生 MessageBox( NULL, "WM_CREATE", "WinDlg", MB_OK ); break;case WM_COMMAND:wmId = LOWORD(wParam);wmEvent = HIWORD(wParam);int ret;// 分析菜單選擇:switch (wmId){case ID_32771://有強制回應對話方塊會阻塞,禁止其他視窗的輸入 ret = DialogBox(hInst,MAKEINTRESOURCE(ID_SETTING),hWnd,SettingDlgProc_1);if(ret != 2){MessageBox(NULL,"取消配置","windialog",MB_OK);}else{MessageBox(NULL,"確定配置","windialog",MB_OK);}break;case ID_32772://無強制回應對話方塊會讓主程式,不影響其它視窗的輸入hdlg = CreateDialog(hInst,MAKEINTRESOURCE(ID_SETTING),hWnd,SettingDlgProc_1);//顯示對話方塊ShowWindow(hdlg,SW_SHOW);break;case IDM_ABOUT:DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);break;case IDM_EXIT:DestroyWindow(hWnd);break;default:return DefWindowProc(hWnd, message, wParam, lParam);}break;case WM_PAINT:hdc = BeginPaint(hWnd, &ps);// TODO: 在此添加任意繪圖代碼...EndPaint(hWnd, &ps);break;case WM_DESTROY:PostQuitMessage(0);break;default:return DefWindowProc(hWnd, message, wParam, lParam);}return 0;}// “關於”框的訊息處理常式。INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam){UNREFERENCED_PARAMETER(lParam);switch (message){case WM_INITDIALOG:return (INT_PTR)TRUE;case WM_COMMAND:if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL){EndDialog(hDlg, LOWORD(wParam));return (INT_PTR)TRUE;}break;}return (INT_PTR)FALSE;}
走進windows編程的世界-----對話方塊