初始化对话框

【勇芳软件工作室】汉化HomePreviousNext

在处理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函数来检索所需控件的窗口句柄。