我是学习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(),或者定义宏的方法好得多!微软还是考虑得很周全的!