在win32 dll文件中添加了对话框,对话框实现有一个组合框,一个edit,一个OK按钮和一个取消按钮,焦点在edit控件,不同的下拉选项用户输入不同值,但在此选择相同的下拉选项时,edit显示上次用户输入的值。按ok按钮保存输出用户输入的所有数据,按取消按钮就不保存。但是在函数编写的时候对话框调用不显示,到我目前搜索到的资料,一个方法是创建一个MFC的线程,一个是用api编写对话框,但是两个我都不会,请大侠指教一下。如果是创建线程的方法,应该创建什么样的线程?该如何创建?怎么循环线程?如果是用api编写怎么响应失去焦点,或者下拉选项改变的消息事件?如果能发个模版给我就更好了,谢啦
解决方案 »
- 如何实现4个按钮分别按下时,给同一个响应函数传递不同的参数
- 为什么对话框DoModal返回-1
- 哪位大侠能用汇编帮我改一段程序呀,只有6行代码
- CPropertySheet中的更新问题
- 我想给SDI程序窗口的四周贴图,该如何实现?
- 在一个Document/View中,怎样让左边的树选中一个节点(一个驱动器符如C:)时,右边的ListView出东西(C:下的目录及文件),就像Explore一
- <<神经网络模式识别及其实现>>配套代码,谁有,谢谢 100分
- 请问要学好网络编程要具备那个知识呀?需要看那些参考书籍?
- 哪里下载bcgcb.h
- 用Sheet Dialog 怎么老死!
- 内存重叠的奇怪问题
- MFC 会话框上控件事件传递
2.
在win32程序的消息循环函数中 while (GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage (&msg) ;
DispatchMessage (&msg) ;
}3.API失去焦点,都用SendMessage事件触发。楼主缺的知识比较多,得慢慢补,慢慢学
2.我用API时,用了peekmessage和sendmessage,但是下拉框不能选择,能不能给我一句sendmessage的例子,我用的edit控件失去焦点的消息EN_KILLFOCUS,不知道可选对了?还有为什么组合框的下拉选项选择不上?
memset(&msg,0,sizeof(MSG)); while (::PeekMessage(&msg,pLoadingDlg->m_hWnd,WM_ACTIVATE,WM_ACTIVATE,PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
最好记得关闭窗口时,让线程退出.
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);
}
}
}
弹出的窗口没反应,大侠们指教一下哪些地方错了啊
{ 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);