“TextOutW”: 不能将参数 4 从“char [100]”转换为“LPCWSTR”,然后我用的平台是VS2005下的WIN32控制台应用程序,TextOut(hdc,pt.x,pt.y,cCharBuf,nNumChar);
cCharBuf的类型是static char,请高手指点,谢谢啦。

解决方案 »

  1.   

    cCharBuf是在哪里定义,如何赋值的?
      

  2.   

    LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
     {
    int wmId, wmEvent ,t;
    static int nArrayPos=0;
    PAINTSTRUCT ps;
    static int nCharWidth;
    static int nLnHeight;
    HDC hdc;
    TEXTMETRIC tm;
    WORD   x,y;
    POINT pt;
    HCURSOR hCursor;
    static int nNumChar=0;
    WCHAR cCharBuf[BufSize];
    static int cx=2,cy=15; switch (message)
    {
       case WM_CHAR:
    {
    if(wParam==VK_BACK)
    {
    if(nArrayPos==0)
    MessageBox(hWnd,L"当前位置是本页的起始,不能后退!", NULL,MB_OK);
    else
    {
    nArrayPos=nArrayPos-1;
    nNumChar=nNumChar-1;
        InvalidateRect(hWnd,NULL,TRUE);
    }
    break;
    }
    if(wParam==VK_ESCAPE)
    {
    MessageBox(hWnd,L" 你现在不能按ESCAPE键!",NULL,MB_OK);
    break;
    }
    if(nNumChar>=BufSize)
    {
    MessageBox(hWnd,L"缓冲区已满,不能再输入" , NULL,MB_OK);
    break;
    }
    for(t=nNumChar;t>nArrayPos;t=t-1)
    cCharBuf[t]=cCharBuf [t-1];
    cCharBuf[nArrayPos]=(unsigned char)wParam;
    nArrayPos=nArrayPos+1;
    nNumChar=nNumChar+1;
    InvalidateRect(hWnd,NULL,TRUE);
    }
    break;
    case WM_COMMAND:
    wmId    = LOWORD(wParam);
    wmEvent = HIWORD(wParam);
    // 分析菜单选择:
    switch (wmId)
    {
    case IDM_ABOUT:
    DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
    break;
    case IDM_EXIT:
    DestroyWindow(hWnd);
    break;
    default:
    return DefWindowProc(hWnd, message, wParam, lParam);
    }
    break;
    case WM_PAINT:
    hdc = BeginPaint(hWnd, &ps);
    GetCursorPos(&pt);
    ScreenToClient(hWnd,&pt); 
    nArrayPos=pt.x;
    TextOut(hdc,pt.x,pt.y,cCharBuf,nNumChar);// TODO: 在此添加任意绘图代码...
    EndPaint(hWnd, &ps);
    break;
    case WM_CREATE:
    {
    hdc = GetDC(hWnd);
    GetTextMetrics(hdc, &tm);
    nLnHeight=tm.tmHeight+tm.tmExternalLeading;
    nCharWidth=tm.tmAveCharWidth;
    ReleaseDC(hWnd,hdc);
    CreateCaret (hWnd, NULL, cx/*光标宽*/, cy/*光标高*/) ;
    //SetCaretPos (-cx,-cy) ; 不要这个也能显示坐标。而且窗体的开头还有个坐标
    // 你点鼠标后,闪动的光标会在你点的位置出现。
    ShowCaret (hWnd) ;
    }
    break; case WM_KEYDOWN:
    {
    switch(wParam)
    {
    case VK_LEFT:
    //if(nArrayPos<0)
    {
    nArrayPos=nArrayPos+1;
    MessageBox(hWnd,L" Left",NULL,MB_OK);
    break;
    }

    case VK_RIGHT:
    //if(nArrayPos<0)
    {
    nArrayPos=nArrayPos+1;
    MessageBox(hWnd,L"Right",NULL,MB_OK);

    break;
    }
    case VK_UP:
    {
    MessageBox(hWnd,L"Up",NULL,MB_OK);
    }
    default:
    break;
    }
    }
    break;
    case WM_MOUSEMOVE:
     x=LOWORD(lParam);
     y=HIWORD(lParam);
     hCursor=LoadCursor(NULL,IDC_CROSS);
     SetCursor(hCursor);
     break;
    case WM_LBUTTONDOWN:
     x=LOWORD(lParam);
     y=HIWORD(lParam);
     hCursor=LoadCursor(NULL,IDC_NO);
     SetCursor(hCursor);
     SetCaretPos (LOWORD(lParam), HIWORD(lParam)) ;
     break;
    case WM_DESTROY:
    PostQuitMessage(0);
    break;
    default:
    return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
    }
      

  3.   


    很明显:楼主的工程是UNICODE工程,字符串需要都是UNICODE的,可你现在使用 char * ,这明显是不对的。
    把 char * 改为 TCHAR * 。===============================================另外,从这个问题,也可以看出来,楼主对UNICODE还不了解,『Windows 程序设计』第二章认真看一下:下载地址:http://blog.csdn.net/zaodt/archive/2007/11/25/1901332.aspx
      

  4.   

    把WCHAR cCharBuf[BufSize];定义为static变量并赋初始值,例如:
    static WCHAR cCharBuf[BufSize] = L"";我不用各种聊天工具,有问题再发贴吧。
      

  5.   

    UNICODE的问题
    可以这样设置编译器,使用多字节
    项目属性--常规--UNICODE改为多字节