“TextOutW”: 不能将参数 4 从“char [100]”转换为“LPCWSTR”,然后我用的平台是VS2005下的WIN32控制台应用程序,TextOut(hdc,pt.x,pt.y,cCharBuf,nNumChar);
cCharBuf的类型是static char,请高手指点,谢谢啦。
cCharBuf的类型是static char,请高手指点,谢谢啦。
解决方案 »
- 如何判断鼠标操作是真实操作引发的,还是模拟鼠标操作引发的?
- 疯了,用wmi,wua,添加删除程序以及360安全卫士显示出来的补丁数差好多
- 换头像了,散100分
- 怎样才能选中绘制出来的文本内容?
- MFC listctrl的item选中状态下的背景如何变成半透明?
- win2000 adv server里面的两种集群方式(服务器集群和网络负载均衡(NLB))中:我感觉NLB用途更为广泛,可以替代服务器集群方式,是吗?
- 我现在想转换基类的数据类型,怎么可以实现?
- 从一个子对话框中,怎么样得到父窗口中控件的内容,详情请进!!
- 告急!!!!!!
- 如何实现获得客户区中某一区域在整个屏幕中的绝对坐标???
- (MFC42D.DLL): 0xC0000005: Access Violation.
- 请问对话框关闭时为什么没有预期的效果,求高手帮忙看看这个源码
{
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;
}
很明显:楼主的工程是UNICODE工程,字符串需要都是UNICODE的,可你现在使用 char * ,这明显是不对的。
把 char * 改为 TCHAR * 。===============================================另外,从这个问题,也可以看出来,楼主对UNICODE还不了解,『Windows 程序设计』第二章认真看一下:下载地址:http://blog.csdn.net/zaodt/archive/2007/11/25/1901332.aspx
static WCHAR cCharBuf[BufSize] = L"";我不用各种聊天工具,有问题再发贴吧。
可以这样设置编译器,使用多字节
项目属性--常规--UNICODE改为多字节