c/c++ windows程序设计

char lpClassName[]="窗口";

hwnd=CreateWindow(lpClassName,"windows",WS_MAXIMIZEBOX,10,10,300,400,NULL,NULL,hInstance,NULL);

CreateWindow函数这里总有错,为什么呢??
提示说实参与形参不相符 ,why???请教高手

下面是MSDN上CreateWindows的原型:
HWND CreateWindow( LPCTSTR lpClassName,
LPCTSTR lpWindowName,
DWORD dwStyle,
int x,
int y,
int nWidth,
int nHeight,
HWND hWndParent,
HMENU hMenu,
HINSTANCE hInstance,
LPVOID lpParam
);
你的调用中,除了前两个参数,后面的参数均没有问题。
前两个参数类型是LPCTSTR即const的LPTSTR,MSDN中的定义是
#ifdef UNICODE
typedef LPWSTR LPTSTR;
#else
typedef LPSTR LPTSTR;
#endif
而LPWSTR和LPSTR分别是:
typedef WCHAR *LPWSTR;
typedef CHAR *LPSTR;
所以说,根据你是按UNICODE方式编译程序还是按ANSI方式编译程序,这两个参数代表不同类型的字符串,你的代码说参数类型不符,这说明编译器试图按UNICODE方式编译程序,但是你传入了普通的ANSI字符串。解决办法是写一段自动识别字符串类型的代码:
#include <tchar.h> //用于自动识别字符串类型
TCHAR lpClassName[] = TEXT("窗口");
hwnd = CreateWindow(lpClassName,TEXT("windows"),
WS_MAXIMIZEBOX,10,10,300,400,NULL,NULL,hInstance,NULL);

如果有不清楚的地方可以HI我追问

咋个知道它按哪种编码方式呢??我用的是 Visual Studio 2010。。。。
我用了你的方式,可以编译和连接,但是运行时有内存错误,该内存不能read。。。

为什么会有两种编码呢??我们学C/C++时都没有区分这个,用到字符 串时直接用char [ ];
LPCTSTR lpClassName中LPCTSTR是什么类型哦???可以先把字符串改成LPCTSTR类型么??

追答

现在ANSI字符串快要被淘汰了,为了国际化目的基本都是用UNICODE编码来写程序了,我的VS2008查看编码的地方在这,2010应该差不多:

温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-06-05
第一个参数需要一个CString指针,你传的实参是是个char的指针
第2个回答  2011-06-05
你在lpClassName前面加一个L或者LP试试
第3个回答  2011-06-11
应该这样做:
在WndProc先要声明一个PAINTSTRUCT ps;
之后case WM_PAINT:
hdc = BeginPaint(hWnd,&ps);
TextOut(hdc,0,0,"abcdefg",strlen("abcdefg"));
EndPaint(hWnd,&ps);
break;
这样就不会闪了。
至于原因,这里就有点窗口更新的东西要理解。
为了提高窗口生绘效率,并不是每次的窗口的重绘都是整个窗口,而且需要改变的每一小块,不以整个窗口为单位。同时是隔一定时间更新,就是说当有一小块需要生绘的时候,可能并不立即响应,如果这个小时候有另一个区域需要更新了,可能这个时候,window检查到可更新区域不为空,然后这两个区域一起得到更新。这样就提高效率了。
注意这里有个概念“可更新区域”。如果可更新区域不为空,就会产生WM_PAINT消息。上面你的代码会产生闪烁的原因就在这里了,你TextOut到的区域需要重绘一块区域,这时可更新区域就不为空了,于是产生WM_PAINT,这里显示字符串。可是这个更新区域并没有被清空,于是它继续存在,它的存在导致不断产生WM_PAINT,这样就闪烁了。
BeginPaint就会把可更新区域设置为空,保证了只产生一个WM_PAINT.需要注意的是调用它之后,要调用EndPaint.
明白了吧?
相似回答
大家正在搜