为什么创建window没有反应?
Why create the window does not respond?
当我用CreateWindow函数创建名为'A'的window时,window'A'变得没有响应,但可以在它没有响应之前绘制它。
当我点击 'Sign In' 按钮时
unsigned __stdcall ThreadFunc(void *lParam) {
pMsgHead pmsgHead = new MsgHead;
while (RecvMsg(ConnectSocket,pmsgHead,sizeof(MsgHead))) {
switch (pmsgHead->dwCmd) {
case WM_SIGN_IN:
g_hMain=CreateWindow(szMainClass, L"A", WS_OVERLAPPEDWINDOW,
200, 200, 250, 500, 0, 0, hInst, nullptr);
ShowWindow(g_hMain, SW_SHOW);
UpdateWindow(g_hMain);
break;
case WM_BROADCAST:
//DrawText()
break;
}
}
_endthreadex(0);
return 0;
}
但是当我点击 'Sign Up' 按钮时,它会起作用。
case IDB_SIGN_UP:
g_hSignUp = CreateWindow(szSignUpClass, L"Sign Up", WS_OVERLAPPEDWINDOW,
800, 200, 300, 300, 0, 0, hInst, nullptr);
ShowWindow(g_hSignUp, SW_SHOW);
UpdateWindow(g_hSignUp);
break;
case IDB_SIGN_IN:
{
TCHAR uname[20], psd[20];
GetWindowText(g_hSignInuname, uname, 20);
GetWindowText(g_hSignInpsd, psd, 20);
pMsgHead pmsgHead = new MsgHead;
pmsgHead->dwCmd = WM_SIGN_IN;
wcscpy_s(pmsgHead->tszbuf, uname);
wcscat_s(pmsgHead->tszbuf, L",");
wcscat_s(pmsgHead->tszbuf, psd);
SendMsg(ConnectSocket, pmsgHead, sizeof(MsgHead));
break;
}
我只是在主线程的GetMessage函数和上面的RecvMsg中使用while循环,我使用单步调试程序,一个线程会等待
while(RecvMsg())
主线程会运行 case IDB_SIGN_IN:
中的'break'然后return0,如果我还是用单步调试,会提示没有加载'wuser32.pdb'
您正在线程中创建 window。这意味着 window 与该线程具有亲和力。消息被发送到该线程消息队列。线程中没有消息循环,因此无法响应消息。
解决方法是在主线程中创建所有 windows。您应该向主 window 发送一条消息,要求创建您的另一个 window。这样您将确保所有 windows 都是由主 UI 线程创建的。
当我用CreateWindow函数创建名为'A'的window时,window'A'变得没有响应,但可以在它没有响应之前绘制它。
当我点击 'Sign In' 按钮时
unsigned __stdcall ThreadFunc(void *lParam) {
pMsgHead pmsgHead = new MsgHead;
while (RecvMsg(ConnectSocket,pmsgHead,sizeof(MsgHead))) {
switch (pmsgHead->dwCmd) {
case WM_SIGN_IN:
g_hMain=CreateWindow(szMainClass, L"A", WS_OVERLAPPEDWINDOW,
200, 200, 250, 500, 0, 0, hInst, nullptr);
ShowWindow(g_hMain, SW_SHOW);
UpdateWindow(g_hMain);
break;
case WM_BROADCAST:
//DrawText()
break;
}
}
_endthreadex(0);
return 0;
}
但是当我点击 'Sign Up' 按钮时,它会起作用。
case IDB_SIGN_UP:
g_hSignUp = CreateWindow(szSignUpClass, L"Sign Up", WS_OVERLAPPEDWINDOW,
800, 200, 300, 300, 0, 0, hInst, nullptr);
ShowWindow(g_hSignUp, SW_SHOW);
UpdateWindow(g_hSignUp);
break;
case IDB_SIGN_IN:
{
TCHAR uname[20], psd[20];
GetWindowText(g_hSignInuname, uname, 20);
GetWindowText(g_hSignInpsd, psd, 20);
pMsgHead pmsgHead = new MsgHead;
pmsgHead->dwCmd = WM_SIGN_IN;
wcscpy_s(pmsgHead->tszbuf, uname);
wcscat_s(pmsgHead->tszbuf, L",");
wcscat_s(pmsgHead->tszbuf, psd);
SendMsg(ConnectSocket, pmsgHead, sizeof(MsgHead));
break;
}
我只是在主线程的GetMessage函数和上面的RecvMsg中使用while循环,我使用单步调试程序,一个线程会等待
while(RecvMsg())主线程会运行
case IDB_SIGN_IN:中的'break'然后return0,如果我还是用单步调试,会提示没有加载'wuser32.pdb'
您正在线程中创建 window。这意味着 window 与该线程具有亲和力。消息被发送到该线程消息队列。线程中没有消息循环,因此无法响应消息。
解决方法是在主线程中创建所有 windows。您应该向主 window 发送一条消息,要求创建您的另一个 window。这样您将确保所有 windows 都是由主 UI 线程创建的。