C++ win32应用程序打开新窗口的方法

简介: ////maindlg.h #ifndef _MAIN_H #define _MAIN_H #include BOOL WINAPI Main_Proc(HWND hWnd, UINT uMsg, WPARAM wParam, LPAR...

////maindlg.h

#ifndef _MAIN_H
#define _MAIN_H

#include <windows.h>

BOOL WINAPI Main_Proc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
BOOL Main_OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam);
void Main_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify);
void Main_OnClose(HWND hwnd);

#endif



////maindlg.cpp

#include "stdafx.h"
#include <windows.h>
#include <windowsx.h>
#include "resource.h"
#include "MainDlg.h"
#include "LoginDialog.h"

BOOL WINAPI Main_Proc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch(uMsg)
    {
        HANDLE_MSG(hWnd, WM_INITDIALOG, Main_OnInitDialog);
        HANDLE_MSG(hWnd, WM_COMMAND, Main_OnCommand);
        HANDLE_MSG(hWnd,WM_CLOSE, Main_OnClose);
    }

    return FALSE;
}

BOOL Main_OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam)
{
    return TRUE;
}

void Main_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)
{
    switch(id)
    {
        /* 打开新窗口,并传值到新窗口 */
        case IDC_OK:
        {
            HINSTANCE hInstance=(HINSTANCE)GetWindowLong(hwnd,GWL_HINSTANCE);
            //DialogBox(hInstance, MAKEINTRESOURCE(IDD_LoginDialog), NULL, LoginDialog_Proc);
            TCHAR buff[256]="pukuimin";
            LoginData ld;
            ld.username="pkm";
            ld.pwd="123456";
            //模式窗口,主窗口会等待子窗口关闭才执行下面的代码
            int result=DialogBoxParam(hInstance, MAKEINTRESOURCE(IDD_LoginDialog), NULL, LoginDialog_Proc,(LPARAM)&ld);
            //result 为子窗口EndDialog的返回值
            MessageBox(hwnd,ld.username,"",MB_OK);
            //这里参数可以是任何数据的地址,再转成(LPARAM)传过去
        }
        break;
        default:
        break;
    }
}

void Main_OnClose(HWND hwnd)
{
    EndDialog(hwnd, 0);
}



////logindialog.h

#ifndef _LoginDialog_H
#define _LoginDialog_H

#include <windows.h>

BOOL WINAPI LoginDialog_Proc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
BOOL LoginDialog_OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam);
void LoginDialog_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify);
void LoginDialog_OnClose(HWND hwnd);
typedef struct LoginData
{
    TCHAR *username;
    TCHAR *pwd;
};
#endif



////logindialog.cpp

#include "stdafx.h"
#include <windows.h>
#include <windowsx.h>
#include "resource.h"
#include "LoginDialog.h"
BOOL WINAPI LoginDialog_Proc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch(uMsg)
    {
        HANDLE_MSG(hWnd, WM_INITDIALOG, LoginDialog_OnInitDialog);
        HANDLE_MSG(hWnd, WM_COMMAND, LoginDialog_OnCommand);
        HANDLE_MSG(hWnd,WM_CLOSE, LoginDialog_OnClose);
    }
    
    return FALSE;
}

BOOL LoginDialog_OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam)
{
    LoginData *para=(LoginData *) lParam;//从前一个窗口传过来的参数
    SetDlgItemText(hwnd,IDC_EDITUserName,para->username);//显示到本窗口的控件上
    SetDlgItemText(hwnd,IDC_EDITPwd,para->pwd);
    //para->username="pkm1";//本窗口修改这个值,父窗口能接收到
    SetWindowLong(hwnd,GWL_USERDATA,(LONG)para);//把数据与窗口关联
    return TRUE;
}

void LoginDialog_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)
{
    switch(id)
    {
    case IDLoginOk:
        {
            TCHAR username[255]={0},pwd[255]={0};
            GetDlgItemText(hwnd,IDC_EDITUserName,username,255);
            GetDlgItemText(hwnd,IDC_EDITPwd,pwd,255);
            LoginData* ld=(LoginData*) GetWindowLong(hwnd,GWL_USERDATA);//取出并修改关联窗口的数据
            //ld->username=username;
            //ld->pwd=pwd;
            //ld->username=(TCHAR*)username;//局部变量,没值。
            //lstrcpy(ld->username,username);
            //lstrcpy(ld->pwd,pwd);
            ld->username="test01";//可以
            EndDialog(hwnd,0);//0为返回值

        }
        break;
    case IDLoginCancel:
        {
            EndDialog(hwnd,1);//1为返回值
        }
        break;
    default:
        break;
    }
}

void LoginDialog_OnClose(HWND hwnd)
{
    EndDialog(hwnd, 0);
}




相关文章
|
3月前
|
C++
C++ 根据程序运行的时间和cpu频率来计算在另外的cpu上运行所花的时间
C++ 根据程序运行的时间和cpu频率来计算在另外的cpu上运行所花的时间
44 0
|
24天前
|
存储 并行计算 安全
C++多线程应用
【10月更文挑战第29天】C++ 中的多线程应用广泛,常见场景包括并行计算、网络编程中的并发服务器和图形用户界面(GUI)应用。通过多线程可以显著提升计算速度和响应能力。示例代码展示了如何使用 `pthread` 库创建和管理线程。注意事项包括数据同步与互斥、线程间通信和线程安全的类设计,以确保程序的正确性和稳定性。
|
1月前
|
存储 程序员 编译器
简述 C、C++程序编译的内存分配情况
在C和C++程序编译过程中,内存被划分为几个区域进行分配:代码区存储常量和执行指令;全局/静态变量区存放全局变量及静态变量;栈区管理函数参数、局部变量等;堆区则用于动态分配内存,由程序员控制释放,共同支撑着程序运行时的数据存储与处理需求。
103 21
|
1月前
|
存储 编译器 C++
【C++篇】揭开 C++ STL list 容器的神秘面纱:从底层设计到高效应用的全景解析(附源码)
【C++篇】揭开 C++ STL list 容器的神秘面纱:从底层设计到高效应用的全景解析(附源码)
54 2
|
2月前
|
编译器 API C语言
超级好用的C++实用库之跨平台实用方法
超级好用的C++实用库之跨平台实用方法
39 6
|
2月前
|
编译器 C++
【C++核心】函数的应用和提高详解
这篇文章详细讲解了C++函数的定义、调用、值传递、常见样式、声明、分文件编写以及函数提高的内容,包括函数默认参数、占位参数、重载等高级用法。
22 3
|
2月前
|
C++
【C++基础】程序流程结构详解
这篇文章详细介绍了C++中程序流程的三种基本结构:顺序结构、选择结构和循环结构,包括if语句、三目运算符、switch语句、while循环、do…while循环、for循环以及跳转语句break、continue和goto的使用和示例。
45 2
|
3月前
|
存储 算法 C++
C++ STL应用宝典:高效处理数据的艺术与实战技巧大揭秘!
【8月更文挑战第22天】C++ STL(标准模板库)是一组高效的数据结构与算法集合,极大提升编程效率与代码可读性。它包括容器、迭代器、算法等组件。例如,统计文本中单词频率可用`std::map`和`std::ifstream`实现;对数据排序及找极值则可通过`std::vector`结合`std::sort`、`std::min/max_element`完成;而快速查找字符串则适合使用`std::set`配合其内置的`find`方法。这些示例展示了STL的强大功能,有助于编写简洁高效的代码。
50 2
|
2月前
|
JavaScript 前端开发 Java
通过Gtest访问C++静态、私有、保护变量和方法
通过Gtest访问C++静态、私有、保护变量和方法
70 0
|
3月前
|
存储 搜索推荐 Serverless
【C++航海王:追寻罗杰的编程之路】哈希的应用——位图 | 布隆过滤器
【C++航海王:追寻罗杰的编程之路】哈希的应用——位图 | 布隆过滤器
37 1