By default, when the user TABs to an edit control in a dialog box,
the entire contents of the edit control are autoselected.
This occurs because the edit control responds with the
DLGC_HASSETSEL
flag in response to the
WM_GETDLGCODE
message.
To prevent it from happening, remove that flag.
LRESULT CALLBACK RemoveHasSetSelSubclassProc (HWND hwnd, UINT uiMsg, WPARAM wParam, LPARAM lParam, UINT_PTR uIdSubclass, DWORD_PTR dwRefData) { switch (uiMsg) { case WM_NCDESTROY: RemoveWindowSubclass(hwnd, RemoveHasSetSelSubclassProc, uIdSubclass); break; case WM_GETDLGCODE: return DefSubclassProc(hwnd, uiMsg, wParam, lParam) & ~DLGC_HASSETSEL; } return DefSubclassProc(hwnd, uiMsg, wParam, lParam); }
All this subclass procedure does is remove the
DLGC_HASSETSEL
flag from the return value
of the WM_GETDLGCODE
message.
INT_PTR CALLBACK DlgProc(HWND hdlg, UINT uiMsg, WPARAM wParam, LPARAM lParam) { switch (uiMsg) { case WM_INITDIALOG: SetWindowSubclass(GetDlgItem(hdlg, 100), RemoveHasSetSelSubclassProc, 0, 0); break; case WM_COMMAND: switch (GET_WM_COMMAND_ID(wParam, lParam)) { case IDCANCEL: EndDialog(hdlg, 1); break; } } return FALSE; }
The subclass procedure is installed when the dialog box is initialized.
int WINAPI WinMain(HINSTANCE hinst, HINSTANCE hinstPrev, LPSTR lpCmdLine, int nShowCmd) { DialogBox(hinst, MAKEINTRESOURCE(1), NULL, DlgProc); return 0; } 1 DIALOGEX DISCARDABLE 0, 0, 200,200 STYLE DS_SHELLFONT | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU CAPTION "sample" FONT 8, "MS Shell Dlg" BEGIN CONTROL "Blah blah",100,"Edit",WS_TABSTOP,7,4,100,10 DEFPUSHBUTTON "&Bye", IDCANCEL, 7,24,50,14, WS_TABSTOP END
And here is the dialog box that we display.
There really isn’t much to it, but I figured a complete sample
program might help somebody out. Plus it lets me show off the
SetWindowSubclass
function.
0 comments