一个dlg销毁后界面驻留的怪问题

孟如庭 2014-09-29 06:18:28
工作需要,实现了一个dll,由其他公司的网页调用。在dll中会有弹出多个dlg显示某些信息。

现在的问题是,funca,funcb分别弹出一个对话框,按照funca调用之后调用funcb,funca弹出的对话框在界面上没有完全消失。
个人感觉是ie没有刷新那个区域,但是为什么会有这个问题,我实在不清楚,求教

funca 这么调用
if(IDOK!=DialogBoxParam(g_hInstDLL,MAKEINTRESOURCE(IDD_DLG_PIN),hwndParent,PinDlgProc,(LPARAM)&PinDlgParam))
return RESULT_USER_CANCELED;


相应的窗口函数。由于是模态的,点击ok或者cancel结束

// Pin Dlg Proc
INT_PTR CALLBACK PinDlgProc(
HWND hwndDlg,
UINT uMsg,
WPARAM wParam,
LPARAM lParam)
{
BOOL fRet;
HWND hWndEdit, hWndBtn;
PPINDLGPARAM pParam;
int index;
short capsKeyState;
BOOL bCapsChg;

switch(uMsg) {
case WM_INITDIALOG:

fRet=FALSE;
SetWindowLongPtr(hwndDlg,GWLP_USERDATA,(LONG_PTR)lParam);
CenterDlg(hwndDlg);

pParam=(PPINDLGPARAM)GetWindowLongPtr(hwndDlg,GWLP_USERDATA);
DisplayPINDlgWithKeyBoard(hwndDlg, 1, pParam->szCardId);

SetForegroundWindow(hwndDlg);
break;
case WM_COMMAND:
fRet=FALSE;

int nPinLen;
LPSTR pszPin;
HWND hwndControl;

if ( BN_CLICKED != HIWORD(wParam) )
break;

if ( IDOK == LOWORD(wParam) ) {
fRet=TRUE;

pParam=(PPINDLGPARAM)GetWindowLongPtr(hwndDlg,GWLP_USERDATA);

// Get pin edit control
hwndControl=GetDlgItem(hwndDlg,IDC_EDIT_PIN);
// Get pin length
nPinLen=GetWindowTextLengthA(hwndControl);
// Alloc memory for save pin
pszPin=new CHAR[nPinLen+1];
if(NULL==pszPin)
break;

ZeroMemory(pszPin,nPinLen+1);
// Get pin
GetWindowTextA(hwndControl,pszPin,nPinLen+1);

// Generate pin
GeneratePin(pszPin,lstrlenA(pszPin),pParam->szPin);

ZeroMemory(pszPin,lstrlenA(pszPin));
delete [] pszPin;

EndDialog(hwndDlg,IDOK);
}
else if(IDCANCEL==LOWORD(wParam)) {
fRet=TRUE;
EndDialog(hwndDlg,IDCANCEL);
}
else
{//其他具体处理}

break;
default:
fRet=FALSE;
break;
}

return fRet;
}




funcb以非模态调用
hWnd=CreateDialog(g_hInstDLL, MAKEINTRESOURCE(IDD_DLG_WAITING), hwndParent, WaitRSAGenDlgProc);
用完后主动销毁
if ( hWnd )
DestroyWindow(hWnd);


INT_PTR CALLBACK WaitRSAGenDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
BOOL fRet = FALSE;

switch ( uMsg ) {
case WM_INITDIALOG:
CenterDlg(hwndDlg);
HCURSOR hWaitCursor;
hWaitCursor = LoadCursor(NULL, IDC_WAIT);
wrgdp_holdcursor = ::SetCursor(hWaitCursor);
break;
case WM_DESTROY:
if ( wrgdp_holdcursor )
::SetCursor(wrgdp_holdcursor);
break;
case WM_COMMAND:
break;
}
return fRet;
}
...全文
341 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
孟如庭 2014-10-17
  • 打赏
  • 举报
回复
也没找到啥原因,先结贴了吧
孟如庭 2014-10-13
  • 打赏
  • 举报
回复
还得弄这个问题,已经快疯了,没有任何思路了
孟如庭 2014-10-11
  • 打赏
  • 举报
回复
引用 10 楼 u012514171 的回复:
hWnd=CreateDialog(g_hInstDLL, MAKEINTRESOURCE(IDD_DLG_WAITING), hwndParent, WaitRSAGenDlgProc); 用完后主动销毁 if ( hWnd ) DestroyWindow(hWnd); 把DestroyWindow(hWnd);换成PostQuitMessage();试试
怎么换。。。
lanlvy 2014-10-11
  • 打赏
  • 举报
回复
hWnd=CreateDialog(g_hInstDLL, MAKEINTRESOURCE(IDD_DLG_WAITING), hwndParent, WaitRSAGenDlgProc); 用完后主动销毁 if ( hWnd ) DestroyWindow(hWnd); 把DestroyWindow(hWnd);换成PostQuitMessage();试试
Saleayas 2014-10-11
  • 打赏
  • 举报
回复
EndDialog.
孟如庭 2014-10-11
  • 打赏
  • 举报
回复
引用 4 楼 lis2012 的回复:
如果仅是刷新问题的话,你可以把第二个非模态对话框 SetForegroundWindow(hwndDlg)放到前端试一下
无效。。。
孟如庭 2014-10-11
  • 打赏
  • 举报
回复
引用 5 楼 Y__Jason 的回复:
试试隐藏窗口
是指不关闭,隐藏吗?试验过,无效
lis2012 2014-10-10
  • 打赏
  • 举报
回复
如果仅是刷新问题的话,你可以把第二个非模态对话框 SetForegroundWindow(hwndDlg)放到前端试一下
孟如庭 2014-10-10
  • 打赏
  • 举报
回复
自己顶一下。。。
孟如庭 2014-10-10
  • 打赏
  • 举报
回复
换成非模式对话框,也有类似问题。搞了一天,搞不清了
隔壁打杂的 2014-10-10
  • 打赏
  • 举报
回复
试试隐藏窗口
ojc520520 2014-09-29
  • 打赏
  • 举报
回复
帮顶
孟如庭 2014-09-29
  • 打赏
  • 举报
回复
结果 外面的是funca产生的界面,窗口函数。中间红框显示的是funcb的界面

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧