在处理WM_INITDIALOG消息时初始化对话框及其内容。最常见的任务是初始化控件以反映当前的对话框设置。另一个常见的任务是在屏幕上或其所有者窗口内居中对话框。一些对话框的一个有用的任务是将输入焦点设置为给定的控件,而不是接受默认输入焦点。
在以下示例中,对话框过程居中对话框,并在处理WM_INITDIALOG消息时设置输入焦点。要使对话框居中,该过程将检索对话框和所有者窗口的窗口矩形,并计算对话框的新位置。要设置输入焦点,过程将检查【wParam中】参数以确定默认输入焦点的标识符:
HWND hwndOwner;
RECT rc, rcDlg, rcOwner;
case WM_INITDIALOG:
//获取所有者窗口和对话框矩形。
if ((hwndOwner = GetParent(hwndDlg)) == NULL)
hwndOwner = GetDesktopWindow();
GetWindowRect(hwndOwner, &rcOwner);
GetWindowRect(hwndDlg, &rcDlg);
CopyRect(&rc, &rcOwner);
//偏移所有者和对话框矩形
//右下值表示宽度和
// height,然后再次偏移所有者丢弃
//由对话框占用的空间。
OffsetRect(&rcDlg, -rcDlg.left, -rcDlg.top);
OffsetRect(&rc, -rc.left, -rc.top);
OffsetRect(&rc, -rcDlg.right, -rcDlg.bottom);
//新的位置是剩下的一半的总和
//空间和所有者的原始位置。
SetWindowPos(hwndDlg,
HWND_TOP,
rcOwner.left +(rc.right / 2),
rcOwner.top +(rc.bottom / 2),
0, 0, //忽略大小参数
SWP_NOSIZE);
if (GetDlgCtrlID((HWND) wParam) != ID_ITEMNAME) {
SetFocus(GetDlgItem(hwndDlg, ID_ITEMNAME));
return FALSE;
}
return TRUE;
在上述语句中,该过程使用GetParent函数来检索对话框的所有者窗口句柄。该函数返回对话框的所有者窗口句柄,以及子窗口的父窗口句柄。因为应用程序可以创建一个没有所有者的对话框,所以过程会检查返回的句柄,如果需要,使用GetDesktopWindow函数检索桌面窗口句柄。计算新位置后,该过程使用SetWindowPos函数移动对话框,指定HWND_TOP值,以确保对话框保留在所有者窗口的顶部。
在设置输入焦点之前,过程将检查默认输入焦点的控制标识符。Windows将默认输入焦点的窗口句柄传递给【wParam中】参数。GetDlgCtrlID函数返回由窗口句柄标识的控件的标识符。如果标识符与正确的标识符不符,则该过程使用SetFocus功能设置输入焦点。需要GetDlgItem函数来检索所需控件的窗口句柄。