自己动手在vs2010中创建一个简单win32应用程序:创建一个完整的窗口需要经过下面四个操作步骤:
02 #include <stdio.h>
03 #include <stdlib.h>
04
05 //消息回调函数
06 LRESULT CALLBACK MyWindowProc(
07 HWND hwnd,
08 UINT uMsg,
09 WPARAM wParam,
10 LPARAM lParam
11 );
12 //主函数入口
13 int WINAPI WinMain(HINSTANCE hInstance,
14 HINSTANCE hPrevInstance,
15 LPSTR lpCmdLine,
16 int nCmdShow)
17 {
18 WNDCLASS wndclass; //窗体类
19 wndclass.cbClsExtra = 0;
20 wndclass.cbWndExtra = 0;
21 wndclass.hbrBackground = (HBRUSH)GetStockObject( WHITE_BRUSH );
22 wndclass.hCursor = LoadCursor( 0, IDC_HAND );
23 wndclass.hIcon = LoadIcon( 0, IDI_ERROR );
24 wndclass.hInstance = hInstance;
25 wndclass.lpfnWndProc = MyWindowProc;
26 wndclass.lpszClassName = TEXT("hg");
27 wndclass.lpszMenuName = NULL;
28 wndclass.style = CS_HREDRAW | CS_VREDRAW;
29 //注册类
30 if (!RegisterClass( &wndclass ) )
31 {
32 MessageBox( 0, TEXT("reg err"), TEXT("reg err"), 0 );
33 }
34 //创建窗体
35 HWND hwnd = CreateWindow( TEXT("hg"), TEXT("myhg"), WS_OVERLAPPEDWINDOW, 0, 0, 600, 400, NULL,NULL,hInstance, NULL );
36 if ( !hwnd)
37 {
38 MessageBox( hwnd, TEXT("create windows err"), TEXT("create windows err"), 0 );
39 }
40 //显示窗体
41 ShowWindow( hwnd, SW_SHOW );
42 UpdateWindow( hwnd );
43
44 MSG msg;
45 //消息处理
46 while ( GetMessage( &msg, 0, 0, 0 ) )
47 {
48 TranslateMessage( &msg );
49 DispatchMessage( &msg );
50 }
51
52 return 0;
53 }
54
55 LRESULT CALLBACK MyWindowProc(
56 HWND hwnd,
57 UINT uMsg,
58 WPARAM wParam,
59 LPARAM lParam
60 )
61 {
62 switch ( uMsg )
63 {
64 case WM_DESTROY:
65 PostQuitMessage( 0 );
66 break;
67 default:
68 return DefWindowProc( hwnd, uMsg, wParam, lParam );
69 }
70 return 0;
71 }
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow )
照抄下来,在VS2005或VS2008编译的时候总会说error C2731: “WinMain”: 无法重载函数。
其实因为WinMain函数的原始定义中lpCmdLine的类型是char *,但在中文系统的环境下因为启用了Unicode支持,LPTSTR代表的是WCHAR *。所以上述函数我们就应该这样来写:
// This is winmain, the main entry point for Windows applications
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow )
二、error C2664: “MessageBoxW”: 不能将参数 2 从“const char [17]”转换为“LPCWSTR”
这个问题太普遍了,几乎所有的初学者都会遇到而且感到难以应付,因为按照提示使用(LPCWSTR)强制转型貌似并不能帮助我们解决问题,而且这个程序在VC6 下面应该是没有任何问题的,那问题出现在哪里呢?
用两个宏TEXT 或者_T 都可以解决这个问题,它们两个并没有太大区别,也许区别在于前者是通过windows.h 头文件引入的,而_T 是通过tchar.h 引入的,我推荐大家使用_T和tchar.h,因为tchar.h 还帮助我们引入了其它一些很有用的宏,比如_tcscpy_s,这个宏在使用UNICODE 字符集的时候被替换成wcscpy_s,在使用多字节字符集的使用被替换成strcpy_s。
_T 在UNICODE 下面最终会被替换成L ## x。 ##是一个编译预处理指令,意味着让L和x 贴在一起,比如L ## "Hello"最终就是L"Hello",因此它可以把"Hello"转换成UNICODE字符串。那为什么上面的程序不行呢?让我们看看_T("pStr")会被替换成什么:L ## pStr ->LpStr,哦,LpStr 是一个新的标识符,如果你没有定义过它,你当然不能通过编译啦。







嗯,初学MFC,谢谢LZ分享~