INT_PTR CALLBACK ConnectDlg(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hdc = GetDC(hDlg);
int wmId, wmEvent;
static HWND hIpControl;
static HWND hPort;
static LPWSTR lpIPAddress = (LPWSTR)malloc(sizeof(LPWSTR));
static LPWSTR lpPort = (LPWSTR)malloc(sizeof(LPWSTR));
static char* IPArgtoFn;
static size_t IPAddressLength;
static size_t PortLength;
static POINT pt;
hIpControl = GetDlgItem(hDlg, IDC_IPADDRESS1);
hPort = GetDlgItem(hPort, IDC_EDIT2);
switch (message)
{
case WM_INITDIALOG:
{
return (INT_PTR)TRUE;
break;
}
case WM_COMMAND:
{
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
switch (wmId)
{
case IDCANCEL:
EndDialog(hDlg, wmId);
break;
case IDCONNECT:
IPAddressLength = GetWindowTextLength(hIpControl) + 1;
PortLength = SendMessage(hPort, WM_GETTEXTLENGTH, 0, 0);
GetWindowText(hIpControl, lpIPAddress, IPAddressLength);
pt.x = 10; pt.y = 10;
wcstombs(IPArgtoFn, lpIPAddress, IPAddressLength);
//TextOut(hdc, 10, 10, lpIPAddress , IPAddressLength);
mySocket.ConnectToServer(IPArgtoFn, (int)lpPort, hdc, pt);
return (INT_PTR)FALSE;
break;
default:
return DefWindowProc(hDlg, message, wParam, lParam);
break;
}
}
}
return (INT_PTR)FALSE;
}
我知道我选择了正确的控件。它的标识符是IDC_EDIT2,我知道这是对的。但每当我尝试检索编辑控件的长度并将其保存到变量PortLength时,我调试时该值始终为0。我已经尝试过将GetWindowTextLength与IP控件配合使用,但是当我将它与编辑控件一起使用时,无论我在框中输入多长时间,长度始终为0。
答案 0 :(得分:1)
立即错误在这一行:
hPort = GetDlgItem(hPort, IDC_EDIT2);
这应该是:
hPort = GetDlgItem(hDlg, IDC_EDIT2);
答案 1 :(得分:1)
GetDlgItem(hPort,...)应该是GetDlgItem(hDlg,...),用于检索任何子控件句柄。
正确分配内存。
仅在使用对话框proc时不处理消息时返回FALSE。这告诉调用者转发到DefDlgProc()所以你不必这样做。在这方面,Dialog回调与Window回调不同。
几乎/所有本地变量都不需要静态。真的没有保存任何东西。具有讽刺意味的是,儿童控制手柄实际上是体面的候选者,具有讽刺意味,因为它们在某种程度上是问题的核心。