如何在Win32程序代码中调用另一个注册界面?
问题分析与修复方案
你的代码点击「Cadastrar」按钮时仅弹出提示框,未实现创建注册界面的逻辑,同时Login按钮的窗口代码存在多处错误,以下是具体修复步骤:
1. 核心问题梳理
- 「Cadastrar」按钮(ID=2)的逻辑仅包含
MessageBox,无创建注册窗口的代码 - 原Login按钮中的窗口创建代码存在参数矛盾(用
WS_CHILDWINDOW却传NULL作为父窗口)、调用不存在的Window(hwnd)函数、未检查窗口创建结果等问题
2. 完整修复代码
#define UNICODE #define _UNICODE #include <windows.h> #include <tchar.h> const TCHAR CLSNAME[] = TEXT("helloworldWClass"); const TCHAR CLSNAME_CADASTRO[] = TEXT("CadastroWindowClass"); LRESULT CALLBACK winproc(HWND hwnd, UINT wm, WPARAM wp, LPARAM lp); LRESULT CALLBACK CadastroProc(HWND hwnd, UINT wm, WPARAM wp, LPARAM lp); void addControls(HWND); void addCadastroControls(HWND); int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hInstPrev, PSTR cmdline, int cmdshow) { WNDCLASSEX wc = { }; WNDCLASSEX wcCadastro = { }; MSG msg; HWND hwnd; // 注册主窗口类 wc.cbSize = sizeof (wc); wc.style = 0; wc.lpfnWndProc = winproc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInst; wc.hIcon = LoadIcon (NULL, IDI_APPLICATION); wc.hCursor = LoadCursor (NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); wc.lpszMenuName = NULL; wc.lpszClassName = CLSNAME; wc.hIconSm = LoadIcon (NULL, IDI_APPLICATION); if (!RegisterClassEx(&wc)) { MessageBox(NULL, TEXT("无法注册主窗口类"), NULL, MB_ICONERROR); return 0; } // 注册独立的注册窗口类 wcCadastro.cbSize = sizeof(wcCadastro); wcCadastro.style = 0; wcCadastro.lpfnWndProc = CadastroProc; wcCadastro.cbClsExtra = 0; wcCadastro.cbWndExtra = 0; wcCadastro.hInstance = hInst; wcCadastro.hIcon = LoadIcon(NULL, IDI_APPLICATION); wcCadastro.hCursor = LoadCursor(NULL, IDC_ARROW); wcCadastro.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); wcCadastro.lpszMenuName = NULL; wcCadastro.lpszClassName = CLSNAME_CADASTRO; wcCadastro.hIconSm = LoadIcon(NULL, IDI_APPLICATION); if (!RegisterClassEx(&wcCadastro)) { MessageBox(NULL, TEXT("无法注册注册窗口类"), NULL, MB_ICONERROR); return 0; } hwnd = CreateWindowEx(WS_EX_LEFT, CLSNAME, _T("Covid-19"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 800, 300, // 固定窗口大小,避免控件超出可视范围 NULL, NULL, hInst, NULL); if (!hwnd) { MessageBox(NULL, TEXT("无法创建主窗口"), NULL, MB_ICONERROR); return 0; } ShowWindow(hwnd, cmdshow); UpdateWindow(hwnd); while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; } void addControls(HWND hwnd) { CreateWindowW(L"Static", L"Login", WS_CHILD | WS_VISIBLE, 600, 0, 100, 18, hwnd, NULL, NULL, NULL); CreateWindowW(L"Edit", L"", WS_CHILD | WS_VISIBLE, 600, 40, 100, 18, hwnd, NULL, NULL, NULL); CreateWindowW(L"Static", L"Senha", WS_CHILD | WS_VISIBLE, 600, 80, 100, 18, hwnd, NULL, NULL, NULL); CreateWindowW(L"Edit", L"", WS_CHILD | WS_VISIBLE | ES_PASSWORD, 600, 120, 100, 18, hwnd, NULL, NULL, NULL); CreateWindowW(L"Button", L"Login", WS_CHILD | WS_VISIBLE, 600, 160, 100, 18, hwnd, (HMENU)1, NULL, NULL); CreateWindowW(L"Button", L"Cadastrar", WS_CHILD | WS_VISIBLE, 600, 200, 100, 18, hwnd, (HMENU)2, NULL, NULL); } void addCadastroControls(HWND hwnd) { // 注册界面控件示例 CreateWindowW(L"Static", L"Nome", WS_CHILD | WS_VISIBLE, 50, 20, 100, 18, hwnd, NULL, NULL, NULL); CreateWindowW(L"Edit", L"", WS_CHILD | WS_VISIBLE, 50, 40, 200, 18, hwnd, NULL, NULL, NULL); CreateWindowW(L"Static", L"Email", WS_CHILD | WS_VISIBLE, 50, 80, 100, 18, hwnd, NULL, NULL, NULL); CreateWindowW(L"Edit", L"", WS_CHILD | WS_VISIBLE, 50, 100, 200, 18, hwnd, NULL, NULL, NULL); CreateWindowW(L"Button", L"Salvar Cadastro", WS_CHILD | WS_VISIBLE, 50, 140, 120, 24, hwnd, (HMENU)101, NULL, NULL); } LRESULT CALLBACK winproc(HWND hwnd, UINT wm, WPARAM wp, LPARAM lp) { switch (wm) { case WM_CREATE: addControls(hwnd); break; case WM_CLOSE: DestroyWindow(hwnd); break; case WM_COMMAND: if (LOWORD(wp) == 1) { MessageBox(NULL, L"Login Efetuado Com Sucesso", L"Login", MB_OK); } else if (LOWORD(wp) == 2) { // 创建注册窗口 HWND hwndCadastrar = CreateWindowEx(WS_EX_LEFT, CLSNAME_CADASTRO, _T("Covid-19 - Cadastrar - Paciente"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 350, 200, NULL, NULL, (HINSTANCE)GetWindowLongPtr(hwnd, GWLP_HINSTANCE), NULL); if (hwndCadastrar) { ShowWindow(hwndCadastrar, SW_SHOW); SetForegroundWindow(hwndCadastrar); } else { MessageBox(NULL, L"无法创建注册窗口", L"Erro", MB_ICONERROR); } } break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hwnd, wm, wp, lp); } return 0; } LRESULT CALLBACK CadastroProc(HWND hwnd, UINT wm, WPARAM wp, LPARAM lp) { switch (wm) { case WM_CREATE: addCadastroControls(hwnd); break; case WM_COMMAND: if (LOWORD(wp) == 101) { MessageBox(NULL, L"Cadastro Efetuado Com Sucesso", L"Cadastrar", MB_OK); DestroyWindow(hwnd); } break; case WM_CLOSE: DestroyWindow(hwnd); break; default: return DefWindowProc(hwnd, wm, wp, lp); } return 0; }
关键修复说明
- 新增独立的注册窗口类和窗口过程
CadastroProc,实现注册界面的独立逻辑 - 主窗口固定大小,避免控件超出可视范围
- 密码输入框添加
ES_PASSWORD风格,符合登录场景需求 - 注册窗口创建时检查返回值,便于排查创建失败问题
- 移除原代码中不存在的
Window(hwnd)调用,修复编译错误
内容的提问来源于stack exchange,提问作者Ederson Coelho
相关产品推荐
相关产品推荐

