SDK回调函数实现双页面之间的切换

#define _CRT_SECURE_NO_WARNINGS
#include <windows.h>
#include <stdio.h>
#include "resource.h"
INT_PTR CALLBACK DialogProc(HWND hwndDlog, UINT uMsg, WPARAM wParam, LPARAM lparam)
{//消息回调函数
    switch (uMsg)
    {
    case WM_COMMAND:
        if (LOWORD(wParam) == IDOK)
        {
            float left1 = GetDlgItemInt(hwndDlog, IDC_LEFT1);
            float right1 = GetDlgItemInt(hwndDlog, IDC_RIGHT1);
            SetDlgItemInt(hwndDlog, IDC_RESULT1, left1 + right1);
        }if (LOWORD(wParam) == IDCANCEL)
        {
            EndDialog(hwndDlog, IDCANCEL); 
        }
        break;
    }
    return 0;
}
INT_PTR CALLBACK DialogProc1(HWND hwndDlog, UINT uMsg, WPARAM wParam, LPARAM lparam)
{
    switch (uMsg)
    {
    case WM_COMMAND:
        if (LOWORD(wParam) == IDOK)
        {
            EndDialog(hwndDlog, IDCANCEL);
            DialogBox(NULL, (LPCTSTR)IDD_D, NULL, DialogProc);
        }
        if (LOWORD(wParam) == IDCANCEL)
        {
            EndDialog(hwndDlog, IDCANCEL);
        }
        break;
    }
    return FALSE;
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
    DialogBox(hInstance, (LPCSTR)IDD_DIALOG1, NULL, DialogProc1);
    
    return 0;
}

 在这段代码中我已经事先新建了两个对话框控件,他们的ID分别为ID_D(这个是第二个页面), IDD_DIALOG1(第一个页面,登录页面);

当我们想要用第一个页面调用第二个页面的时候,我们必须要思考只有当第一个页面出现之后并点击第一个页面上面的按钮才能让第二个页面弹出来;

那怎么实现他呢?

我们要在第一个页面的一个触发ID上面绑定这个事件,即:当点击这个按钮,第二个弹窗就会弹出来,所以就有了这个回调函数;

INT_PTR CALLBACK DialogProc1(HWND hwndDlog, UINT uMsg, WPARAM wParam, LPARAM lparam)
{
    switch (uMsg)
    {
    case WM_COMMAND:
        if (LOWORD(wParam) == IDOK)
        {
       DialogBox(NULL, (LPCTSTR)IDD_D, NULL, DialogProc);
EndDialog(hwndDlog, IDCANCEL); }
if (LOWORD(wParam) == IDCANCEL) { EndDialog(hwndDlog, IDCANCEL); } break; } return FALSE; }

这是我们自然而然想到的,调出第二个对话框,销毁第一个对话框,但是当我们运行的时候会发现,这样做的时候,第一个对话框不会随着第二个对话框的出现而销毁;

只有在第二个对话框点击销毁按钮的时候,第一个对话框才随着第二个对话框一起销毁;

让我们改变一下代码

 case WM_COMMAND:
        if (LOWORD(wParam) == IDOK)
        {
       EndDialog(hwndDlog, IDCANCEL);

       DialogBox(NULL, (LPCTSTR)IDD_D, NULL, DialogProc);
            
        }

这时我们发现,在第二个弹出的时候,第一个也随之销毁;

这是怎么回事?

这是因为当运行到     

DialogBox(NULL, (LPCTSTR)IDD_D, NULL, DialogProc);

    的时候,代码会在这里停留, 等待执行第二个对话框的消息,所以   

EndDialog(hwndDlog, IDCANCEL);

   执行不到,当我们把两个的顺序改变, 也就变成了销毁之后弹出第二个对话框;



原文地址:https://www.cnblogs.com/jianmoxiansheng-Guo/p/11961661.html