现在的位置: 首页WinSDK & MFC>正文
自己动手在vs2010中创建一个简单win32应用程序
2011年03月07日 WinSDK & MFC 评论数 1 ⁄ 被围观 1,091+

    自己动手在vs2010中创建一个简单win32应用程序:创建一个完整的窗口需要经过下面四个操作步骤:

1.设计一个窗口类;
2.注册窗口类;
3.创建窗口;
4.显示及更新窗口。
首先打开VS2010,创建一个空的win32应用程序,向里面添加一个如:WinMain.Cpp的文件,输入如下代码:
 
C++语言: Codee#17503
01 #include <windows.h>
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 }
 
    在此过程中可能会遇到的问题及处理办法:
一、error C2731:"WinMain"无法重载函数
 
 
 
// This is winmain, the main entry point for Windows applications

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 是一个新的标识符,如果你没有定义过它,你当然不能通过编译啦。

目前有 1 条留言 其中:访客:1 条, 博主:0 条

  1. renyouyin : 2012年03月15日16:16:23  -49楼 @回复 回复

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

Wopus问答

给我留言

留言无头像?


×
腾讯微博