📄 dialog.c
字号:
DefDlgProcA( g_hwndTestDlg, WM_NEXTDLGCTL, 0, 0 );
ok ((GetFocus() == g_hwndTestDlgBut1), "Focus didn't move to first button\n");
/*
* Check whether the default button ID got changed by sending message "WM_NEXTDLGCTL"
*/
dwVal = DefDlgProcA(g_hwndTestDlg, DM_GETDEFID, 0, 0);
ok ( IDCANCEL == (LOWORD(dwVal)), "WM_NEXTDLGCTL changed default button\n");
/*
* Check whether the style of the button which got the focus, changed to BS_DEFPUSHBUTTON and
* the style of default button changed to BS_PUSHBUTTON.
*/
if ( IDCANCEL == (LOWORD(dwVal)) )
{
ok ( ((GetWindowLong( g_hwndTestDlgBut1, GWL_STYLE)) & BS_DEFPUSHBUTTON),
"Button1 style not set to BS_DEFPUSHBUTTON\n" );
ok ( !((GetWindowLong( g_hwndTestDlgBut2, GWL_STYLE)) & BS_DEFPUSHBUTTON),
"Button2's style not chaged to BS_PUSHBUTTON\n" );
}
/*
* Move focus to Button2 using "WM_NEXTDLGCTL"
*/
DefDlgProcA( g_hwndTestDlg, WM_NEXTDLGCTL, 0, 0 );
ok ((GetFocus() == g_hwndTestDlgBut2), "Focus didn't move to second button\n");
/*
* Check whether the default button ID got changed by sending message "WM_NEXTDLGCTL"
*/
dwVal = DefDlgProcA(g_hwndTestDlg, DM_GETDEFID, 0, 0);
ok ( IDCANCEL == (LOWORD(dwVal)), "WM_NEXTDLGCTL changed default button\n");
/*
* Check whether the style of the button which got the focus, changed to BS_DEFPUSHBUTTON and
* the style of button which lost the focus changed to BS_PUSHBUTTON.
*/
if ( IDCANCEL == (LOWORD(dwVal)) )
{
ok ( ((GetWindowLong( g_hwndTestDlgBut2, GWL_STYLE)) & BS_DEFPUSHBUTTON),
"Button2 style not set to BS_DEFPUSHBUTTON\n" );
ok ( !((GetWindowLong( g_hwndTestDlgBut1, GWL_STYLE)) & BS_DEFPUSHBUTTON),
"Button1's style not chaged to BS_PUSHBUTTON\n" );
}
/*
* Move focus to Edit control using "WM_NEXTDLGCTL"
*/
DefDlgProcA( g_hwndTestDlg, WM_NEXTDLGCTL, 0, 0 );
ok ((GetFocus() == g_hwndTestDlgEdit), "Focus didn't move to Edit control\n");
/*
* Check whether the default button ID got changed by sending message "WM_NEXTDLGCTL"
*/
dwVal = DefDlgProcA(g_hwndTestDlg, DM_GETDEFID, 0, 0);
ok ( IDCANCEL == (LOWORD(dwVal)), "WM_NEXTDLGCTL changed default button\n");
}
DestroyWindow(g_hwndTestDlg);
}
static void IsDialogMessageWTest (void)
{
MSG msg;
g_hwndMain = CreateWindow ("IsDialogMessageWindowClass", "IsDialogMessageWindowClass",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
NULL, NULL, g_hinst, 0);
assert (g_hwndMain);
assert (g_hwndButton1);
assert (g_hwndButtonCancel);
/* The focus should initially be nowhere. The first TAB should take it
* to the first button. The second TAB should take it to the Cancel
* button.
*/
FormTabMsg (&msg, g_hwndMain);
ok (IsDialogMessage (g_hwndMain, &msg), "Did not handle first TAB\n");
ok ((GetFocus() == g_hwndButton1), "Focus did not move to first button\n");
FormTabMsg (&msg, g_hwndButton1);
ok (IsDialogMessage (g_hwndMain, &msg), "Did not handle second TAB\n");
ok ((GetFocus() == g_hwndButtonCancel),
"Focus did not move to cancel button\n");
FormEnterMsg (&msg, g_hwndButtonCancel);
ok (IsDialogMessage (g_hwndMain, &msg), "Did not handle the ENTER\n");
ok (g_terminated, "ENTER did not terminate\n");
}
static LRESULT CALLBACK delayFocusDlgWinProc (HWND hDlg, UINT uiMsg, WPARAM wParam,
LPARAM lParam)
{
switch (uiMsg)
{
case WM_INITDIALOG:
g_hwndMain = hDlg;
g_hwndInitialFocusGroupBox = GetDlgItem(hDlg,100);
g_hwndButton1 = GetDlgItem(hDlg,200);
g_hwndButton2 = GetDlgItem(hDlg,201);
g_hwndButtonCancel = GetDlgItem(hDlg,IDCANCEL);
g_styleInitialFocusT1 = GetWindowLong(g_hwndInitialFocusGroupBox, GWL_STYLE);
/* Initially check the second radio button */
SendMessage(g_hwndButton1, BM_SETCHECK, BST_UNCHECKED, 0);
SendMessage(g_hwndButton2, BM_SETCHECK, BST_CHECKED , 0);
/* Continue testing after dialog initialization */
PostMessage(hDlg, WM_USER, 0, 0);
return g_bInitialFocusInitDlgResult;
case WM_COMMAND:
if (LOWORD(wParam) == IDCANCEL)
{
EndDialog(hDlg, LOWORD(wParam));
return TRUE;
}
return FALSE;
case WM_USER:
g_styleInitialFocusT2 = GetWindowLong(hDlg, GWL_STYLE);
g_hwndInitialFocusT1 = GetFocus();
SetFocus(hDlg);
g_hwndInitialFocusT2 = GetFocus();
PostMessage(hDlg, WM_COMMAND, IDCANCEL, 0);
return TRUE;
}
return FALSE;
}
static LRESULT CALLBACK focusDlgWinProc (HWND hDlg, UINT uiMsg, WPARAM wParam,
LPARAM lParam)
{
switch (uiMsg)
{
case WM_INITDIALOG:
return TRUE;
case WM_COMMAND:
if (LOWORD(wParam) == IDCANCEL)
{
EndDialog(hDlg, LOWORD(wParam));
return TRUE;
}
else if (LOWORD(wParam) == 200)
{
if (HIWORD(wParam) == EN_SETFOCUS)
g_hwndInitialFocusT1 = (HWND)lParam;
}
return FALSE;
}
return FALSE;
}
/* Helper for InitialFocusTest */
static const char * GetHwndString(HWND hw)
{
if (hw == NULL)
return "a null handle";
if (hw == g_hwndMain)
return "the dialog handle";
if (hw == g_hwndInitialFocusGroupBox)
return "the group box control";
if (hw == g_hwndButton1)
return "the first button";
if (hw == g_hwndButton2)
return "the second button";
if (hw == g_hwndButtonCancel)
return "the cancel button";
return "unknown handle";
}
static void InitialFocusTest (void)
{
/* Test 1:
* This test intentionally returns FALSE in response to WM_INITDIALOG
* without setting focus to a control. This is not allowed according to
* MSDN, but it is exactly what MFC's CFormView does.
*
* Since the WM_INITDIALOG handler returns FALSE without setting the focus,
* the focus should initially be NULL. Later, when we manually set focus to
* the dialog, the default handler should set focus to the first control that
* is "visible, not disabled, and has the WS_TABSTOP style" (MSDN). Because the
* second radio button has been checked, it should be the first control
* that meets these criteria and should receive the focus.
*/
g_bInitialFocusInitDlgResult = FALSE;
g_hwndInitialFocusT1 = (HWND) -1;
g_hwndInitialFocusT2 = (HWND) -1;
g_styleInitialFocusT1 = -1;
g_styleInitialFocusT2 = -1;
DialogBoxA(g_hinst, "RADIO_TEST_DIALOG", NULL, (DLGPROC)delayFocusDlgWinProc);
ok (((g_styleInitialFocusT1 & WS_TABSTOP) == 0),
"Error in wrc - Detected WS_TABSTOP as default style for GROUPBOX\n");
ok (((g_styleInitialFocusT2 & WS_VISIBLE) == 0),
"Modal dialogs should not be shown until the message queue first goes empty\n");
ok ((g_hwndInitialFocusT1 == NULL),
"Error in initial focus when WM_INITDIALOG returned FALSE: "
"Expected NULL focus, got %s (%p).\n",
GetHwndString(g_hwndInitialFocusT1), g_hwndInitialFocusT1);
ok ((g_hwndInitialFocusT2 == g_hwndButton2),
"Error after first SetFocus() when WM_INITDIALOG returned FALSE: "
"Expected the second button (%p), got %s (%p).\n",
g_hwndButton2, GetHwndString(g_hwndInitialFocusT2),
g_hwndInitialFocusT2);
/* Test 2:
* This is the same as above, except WM_INITDIALOG is made to return TRUE.
* This should cause the focus to go to the second radio button right away
* and stay there (until the user indicates otherwise).
*/
g_bInitialFocusInitDlgResult = TRUE;
g_hwndInitialFocusT1 = (HWND) -1;
g_hwndInitialFocusT2 = (HWND) -1;
g_styleInitialFocusT1 = -1;
g_styleInitialFocusT2 = -1;
DialogBoxA(g_hinst, "RADIO_TEST_DIALOG", NULL, (DLGPROC)delayFocusDlgWinProc);
ok ((g_hwndInitialFocusT1 == g_hwndButton2),
"Error in initial focus when WM_INITDIALOG returned TRUE: "
"Expected the second button (%p), got %s (%p).\n",
g_hwndButton2, GetHwndString(g_hwndInitialFocusT2),
g_hwndInitialFocusT2);
ok ((g_hwndInitialFocusT2 == g_hwndButton2),
"Error after first SetFocus() when WM_INITDIALOG returned TRUE: "
"Expected the second button (%p), got %s (%p).\n",
g_hwndButton2, GetHwndString(g_hwndInitialFocusT2),
g_hwndInitialFocusT2);
/* Test 3:
* If the dialog has DS_CONTROL and it's not visible then we shouldn't change focus */
{
HWND hDlg;
HRSRC hResource;
HANDLE hTemplate;
DLGTEMPLATE* pTemplate;
hResource = FindResourceA(g_hinst,"FOCUS_TEST_DIALOG", (LPSTR)RT_DIALOG);
hTemplate = LoadResource(g_hinst, hResource);
pTemplate = (LPDLGTEMPLATEA)LockResource(hTemplate);
g_hwndInitialFocusT1 = 0;
hDlg = CreateDialogIndirectParamW(g_hinst, pTemplate, NULL, (DLGPROC)focusDlgWinProc,0);
ok (hDlg != 0, "Failed to create test dialog.\n");
ok ((g_hwndInitialFocusT1 == 0),
"Focus should not be set for an invisible DS_CONTROL dialog %p.\n", g_hwndInitialFocusT1);
DestroyWindow(hDlg);
}
}
static void test_GetDlgItemText(void)
{
char string[64];
BOOL ret;
strcpy(string, "Overwrite Me");
ret = GetDlgItemTextA(NULL, 0, string, sizeof(string)/sizeof(string[0]));
ok(!ret, "GetDlgItemText(NULL) shouldn't have succeeded\n");
ok(string[0] == '\0', "string retrieved using GetDlgItemText should have been NULL terminated\n");
}
START_TEST(dialog)
{
g_hinst = GetModuleHandleA (0);
if (!RegisterWindowClasses()) assert(0);
GetNextDlgItemTest();
IsDialogMessageWTest();
WM_NEXTDLGCTLTest();
InitialFocusTest();
test_GetDlgItemText();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -