`
jgsj
  • 浏览: 951560 次
文章分类
社区版块
存档分类
最新评论

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

分享到:
评论

相关推荐

    MFC调用win32窗口显示调试信息

    这个函数有5个参数:第一个是console的句柄,第二个是写出内容的地址,第三个参数是预计写出长度,第四个参数是实际写出长度,可为NULL,但不建议,若使用NULL,boundchecker会在这提示错误用法,第五参数系统保留,...

    C语言上机问题解答

    为了更加方便读者的使用本软件和节约读者宝贵的时间,特将读者使用软件后给我们反馈的问题处理办法总结如下,望读者能够从中找到解决方案。 1、上机抽题后,无法打开考生文件夹中的做题文件,系统总是提示我没有...

    Tcl_TK编程权威指南pdf

    内容简介回到顶部↑Tcl/Tk是第一种能通过Windows、Macintosh和Solaris等主要平台处理企业级任务的脚本语言。本书共分为55章,依次详细讲述了Tcl基础、Tcl高级特性、TK基础、TK组件、TK详解、C语言编程、各版本之间的...

    代码语法错误分析工具pclint8.0

    和前面第一步中的方法基本一样,不过这里我们需要用到unix中的find等命令来查找当前目录下的C和C++文件,然后再将它们送给lint程序处理,所以得先从http://www.weihenstephan.de/~syring/win32/UnxUtils.zip下载...

    VC++6.0核心编程源码.rar

    第一章 对程序错误的处理 在我们开始介绍Microsoft Windows应该提供的许多特性之前,我们首先必须了解Windows的各个函数是如何进行错误处理的。 当你调用一个Windows函数时,它首先要检验你传递给它的的各个参数的...

    中文API支持库(1.0-0

    _寻找窗口() 寻找窗口列表中第一个符合指定条件的顶级窗口(在vb里使用:FindWindow最常见的一个用途是获得ThunderRTMain类的隐藏窗口的句柄;该类是所有运行中vb执行程序的一部分。获得句柄后,可用api函数...

    Qt Creator 的安装和hello world 程序+其他程序的编写--不是一般的好

    所以只有用第一种方法,将该语句也放到if 语句中,而在else 语句中用else return 0; ,这样如果enterBtn 没有被按下,那么程序就会结 束执行了。 到这里,我们就实现了一个界面结束执行,然后弹出另一个 界面的程序...

    Access 2000中文版高级编程(part1)

    第一部分 编程基础 1 第1章 宏与代码 3 1.1 何时使用代码代替宏 4 1.1.1 何时用宏 4 1.1.2 何时用代码 4 1.2 宏到代码的转换 5 1.2.1 使用DoCmd对象 5 1.2.2 与宏命令等价的代码 7 1.3 将现有宏转换为代码 8...

    Access+2000中文版高级编程

    第一部分 编程基础 1 第1章 宏与代码 3 1.1 何时使用代码代替宏 4 1.1.1 何时用宏 4 1.1.2 何时用代码 4 1.2 宏到代码的转换 5 1.2.1 使用DoCmd对象 5 1.2.2 与宏命令等价的代码 7 1.3 将现有宏转换...

    基于SIP开发软件电话的一些资源(转自YOUTOO)

    在VC里创建win32控制台程序工程,将libosip源码包的SRC目录下的Test目录内的C源程序随便拷一个到工程时,直接编译(工程设置里照前文方法在link选项里增加osip2.lib,osipparser2.lib引用我们之前成功编译得到的静态...

    网管教程 从入门到精通软件篇.txt

    INT:中间代码,当一个源程序经过语法检查后编译产生一个可执行代码 IOF:Findit文档 IQY:Microsoft Internet查询文件 ISO:根据ISD 9660有关CD-ROM文件系统标准列出CD-ROM上的文件 ISP:X-Internet签字文件 ...

    grub4dos-V0.4.6a-2017-02-04更新

    执行时可以不用输入扩展名,比如输入test如果当前路径下有一个test.g4b就会自动使用。 2013-10-17 1.修改代码支持新版HOTKEY。 2013-07-10 1.insmod现在支持长文件名(以前最多11个字符,现在没有限制). 2....

    Window 消息大全

    WM_NCCREATE = $0081 //当某个窗口第一次被创建时,此消息在WM_CREATE消息发送前发送; WM_NCDESTROY= $0082 //此消息通知某个窗口,非客户区正在销毁 WM_NCCALCSIZE = $0083 //当某个窗口的客户区域必须被核算时...

    jquery插件使用方法大全

    第一个参数是异步请求的url,第二个为参数,第三个回调方法。 (4)的方法会在指定的Dom对象上绑定响应ajax执行的事件。 (5)同步加载数据。发送请求时锁住浏览器。需要锁定用户交互操作时使用同步方式。 var ...

    计算机应用技术(实用手册)

    这里的IDE设备包括了IDE硬盘和IDE光驱,第一、第二组设备是指主板上的第一、第二根IDE数据线,一般来说靠近芯片的是第一组IDE设备,而主设备、从设备是指在一条IDE数据线上接的两个设备,大家知道每根数据线上可以接...

    svn-1.4.3-setup.exe.7z

    如果你使用 SVNParentPath 指示,你就不必在每次添加新 Subversion 版本库时修改 Apache 的配置文件,只需要在第一个版本库所在的位置建立新的版本库就可以了。在我的公司,我可以使用 SMB(普通的 windows 文件访问)...

    HGE_系列教材(1-9)

    首先建立一个空的Win32 工程,然后选择Project-&gt;Settings...-&gt;Link 按图所示,输入hge.lib 和hgehelp.lib 当然,也可以使用预编译器指令pragram 来打到同样的目的。 HGE 系列教材(3) --- 初试 HGE 当HGE 安装完成...

    SVN与CVSpdf格式详细说明书

    第一次不存在passwd文件时用参数c,以后用户的创建就可以用m或者是p了。 htpasswd用法(htpasswd -?): -c Create a new file. -n Don't update file; display results on stdout. -m Force MD5 encryption of ...

    Ghost 8.3 Enterprise

    选择菜单Local→Disk→To Disk,在弹出的窗口中选择源硬盘(第一个硬盘),然后选择要复制到的目标硬盘(第二个硬盘)。注意,可以设置目标硬盘各个分区的大小,Ghost 可以自动对目标硬盘按设定的分区数值进行分区和...

    Ghost 8.3 系统备份软件

    选择菜单Local→Disk→To Disk,在弹出的窗口中选择源硬盘(第一个硬盘),然后选择要复制到的目标硬盘(第二个硬盘)。注意,可以设置目标硬盘各个分区的大小,Ghost 可以自动对目标硬盘按设定的分区数值进行分区和...

Global site tag (gtag.js) - Google Analytics