按 Tab 键浏览编辑框不起作用C++
Tab through Edit boxes doesn't work C++
你好,
我有一个问题,我没有通过搜索找到任何解决方案;基本上,我想做一个简单的登录,您可以通过选项卡切换控件(用户名、密码、登录按钮)。
按TAB键时唯一会发生的事情是,它只是从当前编辑框中完全选择文本。
这是我的代码:
HWND g_hLogin1, g_hLogin2, g_hLogin3;
#define ID_BUTTON_LOGIN 201
LRESULT CALLBACK LoginProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
switch( uMsg )
{
case WM_CREATE:
{
g_hLogin1 = CreateWindow( "EDIT", "", WS_CHILD | WS_VISIBLE | WS_BORDER, 50, 40, 200, 20, hWnd, 0, 0, 0 );
g_hLogin2 = CreateWindow( "EDIT", "", WS_CHILD | WS_VISIBLE | WS_BORDER | ES_PASSWORD, 50, 80, 200, 20, hWnd, 0, 0, 0 );
g_hLogin3 = CreateWindow( "BUTTON", "Login", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 100, 120, 100, 22, hWnd, (HMENU)ID_BUTTON_LOGIN, 0, 0 );
HFONT font = CreateFont( 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "Arial" );
SendMessage( g_hLogin1, WM_SETFONT, (WPARAM)font, 0 );
SendMessage( g_hLogin2, WM_SETFONT, (WPARAM)font, 0 );
SendMessage( g_hLogin3, WM_SETFONT, (WPARAM)font, 0 );
break;
}
case WM_DESTROY:
{
PostQuitMessage( 0 );
return 0;
}
case WM_KEYDOWN:
{
if( wParam == VK_TAB )
{
HWND hNext = GetWindow( hWnd, GW_HWNDNEXT );
if( !hNext )
hNext = GetWindow( hWnd, GW_HWNDLAST );
SendMessage( hNext, EM_SETSEL, (WPARAM)0, (LPARAM)-1 );
SetFocus( hNext );
}
break;
}
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hDC = BeginPaint( hWnd, &ps );
HFONT font = CreateFont( 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "Arial" );
SelectObject( hDC, font );
RECT rc[] =
{
{ 50, 22, 0, 0 },
{ 50, 62, 0, 0 }
};
DrawText( hDC, "Username:", -1, &rc[ 0 ], DT_NOCLIP );
DrawText( hDC, "Password:", -1, &rc[ 1 ], DT_NOCLIP );
EndPaint( hWnd, &ps );
break;
}
case WM_COMMAND:
{
if( LOWORD( wParam ) == ID_BUTTON_LOGIN )
{
int len1 = GetWindowTextLength( g_hLogin1 );
int len2 = GetWindowTextLength( g_hLogin2 );
char* username = new char[ len1 + 1 ];
char* password = new char[ len2 + 1 ];
GetWindowText( g_hLogin1, username, len1 + 1 );
GetWindowText( g_hLogin2, password, len2 + 1 );
if( g_pServer->Login( username, password ) )
{
ShowWindow( g_hLogin, SW_HIDE );
ShowWindow( g_hMainWnd, SW_SHOW );
}
}
break;
}
default:
return DefWindowProc( hWnd, uMsg, wParam, lParam );
}
return DefWindowProc( hWnd, uMsg, wParam, lParam );
}
bool SetupClass( HINSTANCE hInstance, char* szClassName, WNDPROC wndProc )
{
WNDCLASSEX wc = { 0 };
wc.cbClsExtra = 0;
wc.cbSize = sizeof( WNDCLASSEX );
wc.cbWndExtra = 0;
wc.hbrBackground = (HBRUSH)GetStockObject( WHITE_BRUSH );
wc.hCursor = LoadCursor( 0, IDC_ARROW );
wc.hIcon = LoadIcon( hInstance, MAKEINTRESOURCE( IDI_ICON1 ) );
wc.hIconSm = LoadIcon( hInstance, MAKEINTRESOURCE( IDI_ICON1 ) );
wc.hInstance = hInstance;
wc.lpfnWndProc = wndProc;
wc.lpszClassName = szClassName;
wc.lpszMenuName = "";
wc.style = CS_HREDRAW | CS_VREDRAW;
return RegisterClassEx( &wc );
}
int APIENTRY WinMain( HINSTANCE hThis, HINSTANCE hPrev, LPSTR lpCmd, int iCmd )
{
if( !SetupClass( hThis, "zcfw001", LoginProc ) )
return 1;
g_hLogin = CreateWindowEx( WS_EX_CONTROLPARENT, "zcfw001", "Login", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 300, 200, 0, 0, hThis, 0 );
if( !g_hLogin )
return 1;
ShowWindow( g_hLogin, SW_SHOW );
MSG msg;
while( 1 )
{
if( PeekMessage( &msg, 0, 0, 0, PM_REMOVE ) )
{
if( msg.message == WM_QUIT )
break;
if( !IsDialogMessage( g_hLogin, &msg ) )
{
TranslateMessage( &msg );
DispatchMessage( &msg );
}
}
}
return msg.wParam;
}
您应该使用WS_TABSTOP
样式使选项卡停止工作。
相关文章:
- 我的神经网络不起作用 [XOR 问题]
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- C++为什么尽管我调用了void函数,它却不起作用
- 为什么在保护模式下继承升级不起作用
- 循环在计数器中不起作用
- 在其他文件中创建类时在 c++ 项目中不起作用
- Visual studio代码重构似乎不起作用(例如,重命名符号-f2)
- 为什么二进制搜索在我的测试中不起作用
- 我的代码中有错误吗?使用BGI图形的C++代码对我不起作用
- 为什么 const std::p air<K,V>& 在 std::map 上基于范围的 for 循环不起作用?
- 带有指定长度字符* 参数的 std::regex_search 在 VS2017 中不起作用?
- Bjarne Stroustrup Book - std_lib_facilities.h - 不起作用(未知类型名称)
- 为什么简单的算术减法在"if"条件下不起作用?
- 为什么Stroustup书中的has_f不起作用
- 你能检查一下为什么在这个代码中从链接列表中删除项目不起作用吗
- 嵌套While循环不起作用(C++问题)
- C++Matching Brackets 2解决方案不起作用
- 为什么这段代码不起作用,我该如何解决?
- 我正在开发服务器,ip作为参数传递不起作用