You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 22:35:27