C 如何使用Win32 API从现有对话框创建列表框中包含文本的对话框?

C 如何使用Win32 API从现有对话框创建列表框中包含文本的对话框?,c,winapi,C,Winapi,我想从对话框(dialog1)中创建一个模式对话框(dialog2),这样对话框2中的列表框(listbox2)就会有对话框1中列表框(listbox1)中的字符串 我试过: 1) 从对话框1中的listbox1获取字符串,并将其设置为dlgproc1中的listbox2 2) 将listbox1中的字符串保存到全局变量中,并在WM_INITDIALOG case下的dlgproc2中将该字符串设置为listbox2 3) 从dialog2 proc函数Dlg2Proc从dialog1 list

我想从对话框(dialog1)中创建一个模式对话框(dialog2),这样对话框2中的列表框(listbox2)就会有对话框1中列表框(listbox1)中的字符串

我试过: 1) 从对话框1中的listbox1获取字符串,并将其设置为dlgproc1中的listbox2 2) 将listbox1中的字符串保存到全局变量中,并在WM_INITDIALOG case下的dlgproc2中将该字符串设置为listbox2 3) 从dialog2 proc函数Dlg2Proc从dialog1 listbox1获取字符串,然后将其设置为listbox2

以下是最后一次尝试的示例:

static wchar_t* buf;
HINSTANCE hInstGl;
int nCmdShow;

BOOL CALLBACK Dlg2Proc(HWND hwndlg2, UINT Message, WPARAM wParam, LPARAM lParam) {
    switch (Message) {
    case WM_INITDIALOG:{
        int len = SendDlgItemMessage((HWND)lParam, IDC_LIST1, LB_GETTEXTLEN, (WPARAM)0, 0);
        if (len > 0) {
            buf = (wchar_t*)malloc((len + 1) * sizeof(TCHAR));
            SendDlgItemMessage((HWND)lParam, IDC_LIST1, LB_GETTEXT, (WPARAM)0, (LPARAM)buf);
            SetDlgItemText(hwndlg2, IDC_LIST2, buf);
            free(buf);
        }
    }
        break;
    case WM_CLOSE:
        EndDialog(hwndlg2, 0);
        break;
    default:
        return FALSE;
    }
    return TRUE;
}

BOOL CALLBACK DlgProc(HWND hwndlg1, UINT Message, WPARAM wParam, LPARAM lParam) {
    switch (Message) {
        case WM_INITDIALOG:
            break;
        case WM_COMMAND:
            switch (LOWORD(wParam)) {
                case IDC_ADD:{
                    int len = GetWindowTextLength(GetDlgItem(hwndlg1, IDC_TEXT));
                if (len > 0) {
                    buf = (wchar_t*)malloc(len + 1);
                    GetDlgItemText(hwndlg1, IDC_TEXT, buf, len + 1);
                    SendDlgItemMessage(hwndlg1, IDC_LIST1, LB_ADDSTRING, 0, (LPARAM)buf);
                    free(buf);
                }
            }
                break;
            case IDC_VIEW:
                    DialogBoxParam(hInstGl, MAKEINTRESOURCE(IDD_DIALOG2), hwndlg1, Dlg2Proc, (LPARAM)hwndlg1);
                break;
        }
        break;
    case WM_CLOSE:
        EndDialog(hwndlg1, 0);
        break;
    default:
        return FALSE;
    }
return TRUE;
}

int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR pszCmdLine, int iCmdShow)
{
    nCmdShow = iCmdShow;
    hInstGl = hInst;
    return DialogBox(hInstGl, MAKEINTRESOURCE(IDD_DIALOG1), NULL, DlgProc);
}
以下是资源脚本文件中的控件属性:

IDD_DIALOG1 DIALOGEX 0, 0, 309, 176
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Dialog"
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
    DEFPUSHBUTTON   "View",IDC_VIEW,198,155,50,14
    LISTBOX         IDC_LIST1,7,46,295,101,LBS_NOINTEGRALHEIGHT | LBS_EXTENDEDSEL | WS_VSCROLL | WS_TABSTOP
    EDITTEXT        IDC_TEXT,7,14,295,26,ES_AUTOHSCROLL
    PUSHBUTTON      "Add",IDC_ADD,254,156,48,13
END

IDD_DIALOG2 DIALOGEX 0, 0, 309, 156
 STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Dialog"
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
    LISTBOX         IDC_LIST2,7,7,295,142,LBS_NOINTEGRALHEIGHT | LBS_EXTENDEDSEL | WS_VSCROLL | WS_TABSTOP
END
我希望listbox2中有一个字符串,但所有方法的结果都是dialog2中有空listbox2

我是编程新手,但对这个问题做了几天的研究,但没有找到确切的答案。 任何帮助都将不胜感激

更新: 在线路附近进行调试后:
SetDlgItemText(hwndlg2,IDC_列表2,buf)
我看到与
hwndlg2
变量对应的“无法读取内存”消息

已解决: 需要更换
SetDlgItemText(hwndlg2,IDC_列表2,buf)
具有

SendDlgItemMessage(hwndlg2,IDC_列表2,LB_ADDSTRING,0,(LPARAM)buf)

一些人认为这看起来很奇怪:1。为什么
ShowWindow(hwndlg2,SW_隐藏)?2. <代码>SetDlgItemText(hwndlg1,IDC_列表2,buf)LB_GETTEXTLEN
的返回是一个
TCHAR
计数,并且您似乎正在使用
UNICODE
编译,因此您必须使用
malloc((len+1)*sizeof(TCHAR)
@rodrigo 1.和3.进行分配。-我的错,您是对的,但对于2.:我应该在SetDlgItemText()中向第一个参数添加什么?我尝试了GetDlgItem(hwdlg1,IDD\u对话框2)但结果是一样的。如果我尝试GetDlgItem(hwndlg2,IDD_DIALOG2),我会得到错误原因hwndlg2尚未定义。如果列表2位于dlg2中,则必须编写
SetDlgItemText(hwndlg2,IDC_list2
,任何其他组合都不会起作用。但在调用
DialogBox(…IDD_DIALOG2)之前,您无法访问dlg2
因为它根本不存在。您可以做的是从dlg2访问dlg1。无论如何,向对话框传递参数的标准方法是使用
DialogBoxParam()
有一个额外的
LPARAM
参数,您可以指向参数:此值作为
WM_INIT_DIALOG
中的
LPARAM
接收。@rodrigo应该向
DialogBoxParam()的最后一个参数传递什么确切的实体
在这种情况下?你可以传递你想要的任何东西。你可以传递
buf
指针,一个指向具有多个值的本地结构的指针,dlg1的句柄…一些人认为这看起来很奇怪:1.为什么
ShowWindow(hwndlg2,SW_HIDE);
?2.
SetDlgItemText(hwndlg1,IDC清单2,buf)
但我猜dlg1中没有列表2,是吗?3.
LB_GETTEXTLEN
的返回是一个
TCHAR
计数,您似乎在使用
UNICODE
编译,因此必须使用
malloc((len+1)*sizeof(TCHAR)进行分配
@rodrigo 1.和3.-我的错,你是对的,但是对于2.:我应该在setdGitemText()中的第一个参数中添加什么?我尝试了GetdGitem(hwndlg1,IDD_DIALOG2),但结果相同。另外,如果我尝试GetdGitem(hwndlg2,IDD_DIALOG2),我会得到错误原因,因为hwndlg2尚未定义。如果列表2在dlg2中,那么你必须编写
SetdGitemText(hwndlg2,IDC_LIST2
,任何其他组合都不起作用。但在调用
对话框(…IDD_DIALOG2)
之前,您无法访问dlg2,因为它根本不存在。您可以做的是从dlg2访问dlg1。无论如何,向对话框传递参数的标准方法是使用
DialogBoxParam()
有一个额外的
LPARAM
参数,您可以指向参数:此值作为
WM_INIT_DIALOG
中的
LPARAM
接收。@rodrigo应该向
DialogBoxParam()的最后一个参数传递什么确切的实体
在这种情况下?你可以传递你想要的任何东西。你可以传递
buf
指针,一个指向具有多个值的本地结构的指针,dlg1的句柄。。。