11.2.1 模态与非模态对话框的区别
区别 |
模态 |
非模态 |
默认风格 |
WS_POPUP|DS_MODALFRAME |
WS_POPUP|WS_CAPTION|WS_SYSMENU|WS_VISIBLE |
创建函数 |
DialogBox 创建后要等结束对话框后才返回。 |
CreateDialog 创建后立即返回 |
可见性 |
默认是可见的 |
得指定WS_VISIBLE,否则创建完后得调用ShowWindow |
消息处理 |
有自己的消息循环 |
消息进入程序的消息队列(处理见下面) |
销毁对话框 |
EndDialog |
①DestroyWindow(hDlgModeless); hDlgModeless =NULL; ②WM_CLOSE消息的处理(对话框窗口过程内部并不处理,得自己处理,如下) DestroyWindow(hDlgModeless) hDlgModeless =NULL; |
(2)将消息传递给对话框的窗口过程
①保存全局变量hDlgModeless (=CreateDialog…)
②消息循环的更改
while (GetMessage(&msg,NULL,0,0)) { //IsDialogMessage主要是处理对话框键盘导航(如Tab键转移焦点),注意是键盘消息,而不是鼠标消息 //鼠标消息时返回False,仍然会进入下列的转换和分派过程中去 if (hDlgModeless ==0 || !IsDialogMessage(hDlgModeless,&msg)) { if (!TranslateAccelerator(hwnd,hAccel,&msg)) { TranslateMessage(&msg); DispatchMessage(&msg); } } }
11.2.2 新的COLORS程序
(1)滚动条ID分别为10、11、12,对应的当前值的静态文本字段ID分别为13、14、15
(2)主窗口样式包含WS_CLIPCHILDREN,表示不擦除对话框的情况下重绘主窗口
(3)设置颜色值:SetDlgItemInt(hDlg,nIDDlgItem,uValue, bSigned);
(4)一次CreateDialog会同时创建对话框上的子窗口控件
(5)IsDialogMessage主要处理对话框中的键盘导航消息
【COLORS2程序】
效果图:
/*------------------------------------------------------------ COLORS2.C -- Version using Modeless Dialog Box (c) Charles Petzold, 1998 ------------------------------------------------------------*/ #include <windows.h> LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); BOOL CALLBACK ColorSrcDlg(HWND, UINT, WPARAM, LPARAM); int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { static TCHAR szAppName[] = TEXT("Colors2"); HWND hwnd; MSG msg; WNDCLASSEX wndclass; HWND hDlgModeless; wndclass.style = CS_HREDRAW | CS_VREDRAW; wndclass.cbSize = sizeof(WNDCLASSEX); wndclass.lpfnWndProc = WndProc; wndclass.cbClsExtra = 0; wndclass.cbWndExtra = 0; wndclass.hInstance = hInstance; wndclass.hIcon = NULL;// LoadIcon(hInstance, szAppName); wndclass.hIconSm = NULL;// LoadIcon(hInstance, szAppName); wndclass.hCursor = LoadCursor(NULL, IDC_ARROW); wndclass.hbrBackground = CreateSolidBrush(0L); //黑色背景 wndclass.lpszMenuName = NULL; wndclass.lpszClassName = szAppName; if (!RegisterClassEx(&wndclass)) { MessageBox(NULL, TEXT("This program requires Windows NT!"), szAppName, MB_ICONERROR); return 0; } hwnd = CreateWindow(szAppName, // window class name TEXT("Color Scroll"), // window caption WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN, // window style CW_USEDEFAULT, // initial x position CW_USEDEFAULT, // initial y position CW_USEDEFAULT, // initial x size CW_USEDEFAULT, // initial y size NULL, // parent window handle NULL, // window menu handle hInstance, // program instance handle NULL); // creation parameters hDlgModeless = CreateDialog(hInstance, TEXT("COLORSCRDLG"), hwnd, ColorSrcDlg); ShowWindow(hwnd, iCmdShow); UpdateWindow(hwnd); while (GetMessage(&msg, NULL, 0, 0)) { //IsDialogMessage主要是处理对话框键盘导航(如Tab键转移焦点),注意是键盘消息,而不是鼠标消息 if (!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 ColorSrcDlg(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { static int iColor[3]; //用来记录各滚动条当前颜色值 HWND hCtrl, hwndParent; 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; //滚动条句柄 hwndParent = GetParent(hDlg); iCtrlID = GetWindowLong(hCtrl, GWL_ID); iIndex = iCtrlID - 10; switch (LOWORD(wParam)) //通知码 { case SB_PAGEDOWN: iColor[iIndex] += 16; break; case SB_LINEDOWN: iColor[iIndex] += 1; break; case SB_PAGEUP: iColor[iIndex] -= 16; break; case SB_LINEUP: iColor[iIndex] -= 1; break; case SB_TOP: iColor[iIndex] = 0; case SB_BOTTOM: iColor[iIndex] = 255; case SB_THUMBPOSITION: case SB_THUMBTRACK: iColor[iIndex] = HIWORD(wParam); break; default: return FALSE; } iColor[iIndex] = max(0, min(255, iColor[iIndex])); 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; case WM_COMMAND: break; } return FALSE; }
//resource.h
//{{NO_DEPENDENCIES}} // Microsoft Visual C++ 生成的包含文件。 // 供 Colors2.rc 使用 // // Next default values for new objects // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 102 #define _APS_NEXT_COMMAND_VALUE 40001 #define _APS_NEXT_CONTROL_VALUE 1004 #define _APS_NEXT_SYMED_VALUE 101 #endif #endif
//Colors2.rc
// Microsoft Visual C++ generated resource script. // #include "resource.h" #define APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// // // Generated from the TEXTINCLUDE 2 resource. // #include "winres.h" ///////////////////////////////////////////////////////////////////////////// #undef APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// // 中文(简体,中国) resources #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS) LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED #ifdef APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // TEXTINCLUDE // 1 TEXTINCLUDE BEGIN "resource.h " END 2 TEXTINCLUDE BEGIN "#include ""winres.h"" " "