0
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になります。

4

2 に答える 2

1
  1. GetDlgItem(hPort、...)は、子コントロールハンドルを取得するためのGetDlgItem(hDlg、...)である必要があります。

  2. メモリを正しく割り当てます。

  3. ダイアログプロシージャを使用しているときにメッセージを処理しない場合にのみFALSEを返します。これにより、呼び出し側はDefDlgProc()に転送するように指示されるため、転送する必要はありません。この点で、ダイアログコールバックはウィンドウコールバックとは異なります。

  4. この中のほとんど/すべてのローカル変数は静的である必要はありません。そこには何も保存していません。皮肉なことに、子コントロールハンドルは、実際には静的なものとして適切な候補であり、そもそも問題の核心であるという意味で皮肉なことです。

于 2012-09-04T01:13:00.400 に答える
1

差し迫ったエラーは次の行にあります。

hPort = GetDlgItem(hPort, IDC_EDIT2);

これは次のようになります。

hPort = GetDlgItem(hDlg, IDC_EDIT2);
于 2012-09-04T01:10:57.017 に答える