在win32 dll文件中添加了对话框,对话框实现有一个组合框,一个edit,一个OK按钮和一个取消按钮,焦点在edit控件,不同的下拉选项用户输入不同值,但在此选择相同的下拉选项时,edit显示上次用户输入的值。按ok按钮保存输出用户输入的所有数据,按取消按钮就不保存。但是在函数编写的时候对话框调用不显示,到我目前搜索到的资料,一个方法是创建一个MFC的线程,一个是用api编写对话框,但是两个我都不会,请大侠指教一下。如果是创建线程的方法,应该创建什么样的线程?该如何创建?怎么循环线程?如果是用api编写怎么响应失去焦点,或者下拉选项改变的消息事件?如果能发个模版给我就更好了,谢啦

解决方案 »

  1.   

    到我目前搜索到的资料,一个方法是创建一个MFC的线程,一个是用api编写对话框,但是两个我都不会那你的资料都讲点啥内容啊?另外, 你win32 DLL,又玩MFC,你到底想怎么玩?1.线程的建立AfxBeginThread.(MFC)  CreateThread(API)
    2.
    在win32程序的消息循环函数中  while (GetMessage (&msg, NULL, 0, 0))
      {   
      TranslateMessage (&msg) ;   
      DispatchMessage (&msg) ;   
      }3.API失去焦点,都用SendMessage事件触发。楼主缺的知识比较多,得慢慢补,慢慢学
      

  2.   

    1.是在编写的DLL文件里要调用对话框,但是在我创建对话框的地方就出错,别人告诉我要创建一个消息队列,我用AfxBeginThread创建了一个工作者线程,但是还是在创建对话框的时候出错
    2.我用API时,用了peekmessage和sendmessage,但是下拉框不能选择,能不能给我一句sendmessage的例子,我用的edit控件失去焦点的消息EN_KILLFOCUS,不知道可选对了?还有为什么组合框的下拉选项选择不上?
      

  3.   

    要在线程中显示对话框,那就创建个UI线程,如果是模态对话框就比较好处理,非模态对话框的话,在窗口显示后,添加消息循环MSG msg;
    memset(&msg,0,sizeof(MSG)); while (::PeekMessage(&msg,pLoadingDlg->m_hWnd,WM_ACTIVATE,WM_ACTIVATE,PM_REMOVE))
    {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
    }
    最好记得关闭窗口时,让线程退出.
      

  4.   

    static HANDLE g_hModule = NULL;
    BOOL APIENTRY DllMain( HANDLE hModule, 
                           DWORD  ul_reason_for_call, 
                           LPVOID lpReserved
     )
    {
    g_hModule = hModule;
        switch (ul_reason_for_call)
    {
        case DLL_PROCESS_ATTACH:
        case DLL_THREAD_ATTACH:
         case DLL_THREAD_DETACH:
        case DLL_PROCESS_DETACH:
        break;
        }
        return TRUE;
    }
    int DLG_IO_API GetUserInputStringFromDialog(const char *pszCaption, const char **pszLabels, int nLabelCnt, char **pszUserInputStrings)
    {
    string szstr;
    HWND hDlg = ::CreateDialog((HINSTANCE)g_hModule,  
            MAKEINTRESOURCE(IDD_DIALOG_USERINPUTCTRL), NULL, NULL);     if (hDlg !=NULL)   
        {   
            // show dialog 
    HWND hInput = ::GetDlgItem(hDlg, IDC_EDIT_INPUT);
    if (hInput == NULL)
    {
    printf("获取edit控件句柄失败!");
    return -1;
    }
    ::SetFocus(hInput);
    HWND hLabel = ::GetDlgItem(hDlg, IDC_COMBO_LABEL);
    if (hInput == NULL)
    {
    printf("获取combobox控件句柄失败!");
    return -1;
    }
    HWND hOK = ::GetDlgItem(hDlg, IDC_BTN_OK);
    if (hOK == NULL)
    {
    printf("获取OK按钮句柄失败!");
    return -1;
    }
    HWND hCancle = ::GetDlgItem(hDlg, IDC_BTN_CANCLE); 
    if (hCancle == NULL)
    {
    printf("获取cancle按钮句柄失败!");
    return -1;
    }

    ::SetWindowText(hDlg, pszCaption);
    for (int i = 0; i < nLabelCnt; i++)
    {
    ComboBox_AddString(hLabel, pszLabels[i]);//DC_COMBO_LABEL, 
    mapLabInput.insert(make_pair(pszLabels[i], szstr));
    } map<string, string>::iterator iter;
    for (iter = mapLabInput.begin(); iter != mapLabInput.end(); iter++)
    {
    TRACE("标签和用户输入 %s  %s\n", (iter->first).c_str(), iter->second.c_str());
    }  ComboBox_SetCurSel(hLabel,0);

            ::ShowWindow(hDlg,SW_SHOW);   
        }   
        else   
        {   
            //printf("Failed to create dialog/n");    
            return -1;   
        }  

    MSG msg;   
        while(1)   
        {   
            if ( ::PeekMessage(&msg, hDlg, 0, 0, PM_REMOVE) )   
            { 
    UpdateWindow(hDlg);
    HWND hInput = ::GetDlgItem(hDlg, IDC_EDIT_INPUT);
    if (hInput == NULL)
    {
    printf("获取edit控件句柄失败!");
    return -1;
    }

    HWND hLabel = ::GetDlgItem(hDlg, IDC_COMBO_LABEL);
    if (hInput == NULL)
    {
    printf("获取combobox控件句柄失败!");
    return -1;
    }  HWND hOK = ::GetDlgItem(hDlg, IDC_BTN_OK);
    if (hOK == NULL)
    {
    printf("获取OK按钮句柄失败!");
    return -1;
    }  HWND hCancle = ::GetDlgItem(hDlg, IDC_BTN_CANCLE);
    if (hCancle == NULL)
    {
    printf("获取cancle按钮句柄失败!");
    return -1;


    string szLabel;
    string szInput;
    string szLa;
    string szInp;
    int index;
    map<string, string>::iterator it;

    if (msg.message == CBN_SELCHANGE)
    {
    index = ComboBox_GetCurSel(hLabel);
    ComboBox_GetLBText(hLabel, index, szLabel.c_str());
    it = mapLabInput.find(szLabel);
    if (it != mapLabInput.end())

    szInput = _T(it->second.c_str());
    ::SetWindowText(hInput, szInput.c_str());
    }
    else
    {
    TRACE("没有找到标签\n");

    }

    if (msg.message == EN_KILLFOCUS)
    {
    ::GetDlgItemText(hDlg, IDC_COMBO_LABEL, (char*)szLa.c_str(), strlen(szLabel.c_str()));
    ::GetDlgItemText(hDlg, IDC_EDIT_INPUT, (char*)szInp.c_str(), strlen(szInput.c_str()));
    mapLabInput.erase(szLabel);
        mapLabInput.insert(make_pair(szLa, szInp));//(char*)(LPCTSTR)

    if (msg.message == BN_CLICKED)
    {
    int ID = (int)msg.wParam;
    maptype::iterator iter;
    switch(ID)
    {
    case IDC_BTN_OK:
    iter = mapLabInput.begin();
    for (; iter != mapLabInput.end(); iter++)
    {
    string szInput = iter->second;
    int len = strlen(szInput.c_str()) + 1;
    *pszUserInputStrings = new char[len];
    strcpy(*pszUserInputStrings, szInput.c_str());
    delete [] *pszUserInputStrings;
    printf("用户输入队列为:%s\n", *pszUserInputStrings);
    }
    ::DestroyWindow(hDlg);
    break;
    case IDC_BTN_CANCLE:
    ::DestroyWindow(hDlg);
    break;
    }
    }
      ::TranslateMessage(&msg);   
    ::DispatchMessage(&msg);//该函数分发一个消息给窗口程序
            }   
            else   
            {   
                // if there is no message to process,   
                // then sleep for a while to avoid burning   
                // too much CPU cycles   
                ::Sleep(100);   
            }   
        }   
    }
    弹出的窗口没反应,大侠们指教一下哪些地方错了啊
      

  5.   

    msg.messege是鼠标左击的消息,如果鼠标点击的是combobox,怎么处理接下来的组合框消息啊
      

  6.   

    BOOL CALLBACK DlgProc(HWND hwnd,UINT umsg,WPARAM wParam,LPARAM lParam)
    { switch(umsg)
    {
    case WM_INITDIALOG:
    return TRUE;

    case WM_COMMAND:
    switch(wnotifID)
    {
    case EN_KILLFOCUS :
    。你没有走消息队列,要在在这里面处理消息。在你的外联函数创建对话框时
    HWND hDlg = CreateDialog((HINSTANCE)g_hModule,  
            MAKEINTRESOURCE(IDD_DIALOG_USERINPUTCTRL), NULL, DlgProc);