用vs2005创建第一个win32程序(附解决error c2731 c2440方法)

我是学习DirectX编程的初学者,对于新安装的vs2005,有一些不熟悉。所以自己在网络上东找找西找找,终于编译成功了自己第一个win32程序。

首先自己选用的DirectX教材是《Beginning DirectX9》,就是这本书。

 

在确保自己具有c++基础上,可以开始进行windows编程了。在28页,我们可以看到怎么编辑win32项目的。

首先新建->项目,打开对话框,选择win32项目,然后可以键入项目名,点击确定,在向导(wizard)里选择“应用程序设置”(Application Settings),勾选空项目,再点完成(finish)。

在菜单->项目->添加新项,选中c++文件输入名称,然后添加,这样就可以添加了。

值得注意的是,由于我安装的是vs中文版,编译器是中文的,它使用的是unicode,所以英文原版的程序会在编译的时候出现error c2440,c2731,我找了网上的资料,发现就是因为和编译器的unicode相冲突。现在阐述一下解决方法。

c2731的解决方法:在凡是有""时,比如"DirectXExample",都要改成_T("DirectXExample"),然后添加代码:#include <TCHAR.h>

添加头文件,然后就可以解决问题了。

这样就可以解决这样的问题了。

c2440的解决方法:WinMain无法重载,这样解决。通过添加如下代码:

#ifdef UNICODE
#define _tWinMain wWinMain
#else
#define _tWinMain WinMain
#endif //!UNICODE

让编译器自动检测UNICODE,就可以将书上的源代码拷入,就可以完完全全地编译成功了。
修改后编译的源代码如下:

//对unicode的定义,在预编译的时候,会自动判断是否是使用UNICODE的编译器,还是ANSI的编译器。
#ifdef UNICODE
#define _tWinMain wWinMain
#else
#define _tWinMain WinMain
#endif //!UNICODE

// Include the Windows header file that’s needed for all Windows applications
#include <TCHAR.h>
#include <windows.h>
HINSTANCE hInst;            // global handle to hold the application instance
HWND wndHandle;           // global variable to hold the window handle
// forward declarations
bool initWindow( HINSTANCE hInstance );
LRESULT CALLBACK WndProc( HWND, UINT, WPARAM, LPARAM );
// This is winmain, the main entry point for Windows applications
int WINAPI _tWinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
                      LPTSTR lpCmdLine, int nCmdShow )
{
  // Initialize the window
  if ( !initWindow( hInstance ) )
      return false;
  // main message loop:

  MSG msg;

  ZeroMemory( &msg, sizeof( msg ) );

  while( msg.message!=WM_QUIT )

  {

      // Check the message queue
      while (GetMessage(&msg, wndHandle, 0, 0) )
      {
           TranslateMessage( &msg );

           DispatchMessage( &msg );

      }

  }

  return (int) msg.wParam;

}
/******************************************************************************
* bool initWindow( HINSTANCE hInstance )
* initWindow registers the window class for the application, creates the window
******************************************************************************/

bool initWindow( HINSTANCE hInstance )

{

    WNDCLASSEX wcex;
    // Fill in the WNDCLASSEX structure. This describes how the window
    // will look to the system
    wcex.cbSize               = sizeof(WNDCLASSEX); // the size of the structure
    wcex.style                = CS_HREDRAW | CS_VREDRAW; // the class style
    wcex.lpfnWndProc          = (WNDPROC)WndProc;    // the window procedure callback
    wcex.cbClsExtra           = 0;       // extra bytes to allocate for this class
    wcex.cbWndExtra           = 0;       // extra bytes to allocate for this instance
    wcex.hInstance            = hInstance;    // handle to the application instance
    wcex.hIcon                = 0; // icon to associate with the application
    wcex.hCursor              = LoadCursor(NULL, IDC_ARROW);// the default cursor
wcex.hbrBackground         = (HBRUSH)(COLOR_WINDOW+1);     // the background color
wcex.lpszMenuName          = NULL;     // the resource name for the menu
wcex.lpszClassName         = _T("DirectXExample"); // the class name being created
wcex.hIconSm               = 0;        // the handle to the small icon
RegisterClassEx(&wcex);
// Create the window
wndHandle = CreateWindow(
                                           // the window class to use
             _T("DirectXExample"),
                                           // the title bar text
             _T("DirectXExample"),
                                           // the window style
             WS_OVERLAPPEDWINDOW,
            CW_USEDEFAULT,     // the starting x coordinate
            CW_USEDEFAULT,     // the starting y coordinate
            640,               // the pixel width of the window
            480,               // the pixel height of the window
            NULL,              // the parent window; NULL for desktop
            NULL,              // the menu for the application; NULL for
                               // none
            hInstance,         // the handle to the application instance
            NULL);             // no values passed to the window
// Make sure that the window handle that is created is valid

if (!wndHandle)

    return false;

  // Display the window on the screen
  ShowWindow(wndHandle, SW_SHOW);
  UpdateWindow(wndHandle);
  return true;
}
/******************************************************************************
* LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam,
*                                                                LPARAM lParam)
* The window procedure
******************************************************************************/
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    // Check any available messages from the queue

    switch (message)

    {

         case WM_DESTROY:

             PostQuitMessage(0);

         break;

    }

  // Always return the message to the default window

  // procedure for further processing

  return DefWindowProc(hWnd, message, wParam, lParam);

}
 

当然,我们也可以完全不顾这么繁杂的修改。我在百度知道上看到了一个很好的方法,可以使我们在vc6上编译的成功完完全全地复制到我们现在的vs2005上。很简单,项目->XXX属性,或者在解决方案资源管理器上有这样一个按钮,这样我们就可以进入一个属性页面。在左边树状图上,配置属性->常规,右边有个字符集选项。在上面可以看到默认是使用unicode字符集,我们只要把它改成使用多字节字符集就可以了。这招真的比_T(),或者定义宏的方法好得多!微软还是考虑得很周全的!

你可能感兴趣的:(用vs2005创建第一个win32程序(附解决error c2731 c2440方法))