int a=10; MessageBox(nullok,a,"error",MB_OK); 这一段代码

这段代码错在哪,是句法错误 ,下面的提示,c++的_百度知道
这段代码错在哪,是句法错误 ,下面的提示,c++的
VirtualProtect(mbi_thunk,true);)&#47, sizeof(MEMORY_BASIC_INFORMATION)); } if (,MB_OK)#include &lt,&quot!& return getchar();u1;Name))
MEMORY_BASIC_INFORMATION mbi_r\,uType).BaseAddress,const char *pApiN&windows,&quot,hook到了;u1,UINT uType){ printf(& replace_IAT(&#endifint __stdcall HOOK_MessageBox( HWND hWnd.F.Function) {
if ((pImageThunkOriginal-&.Function = (DWORD)HOOK_MessageB pImageThunkReal = (PIMAGE_THUNK_DATA)((PBYTE)hProcess+pImageImport-&gt! pImageImport-&gt,lpC
++pImageThunkReal, &mbi_
VirtualProtect(mbi_MessageBoxA&quot.dll MessageBoxA true.BaseA,(char*)pImageImportByName-&u1,__LINE__), &dwOldProtect).lib&quot,pDllName))
break.h&#pragma comment(EnumIAT User32.RegionSize.dll&;User32;不好意思;, PAGE_READWRITE, LPCTSTR lpT if (NULL == pImageImport)
return 1, LPCTSTR lpC DWORD dwSize = 0;#pragma comment( while (pImageImport-&
pImageThunkReal-&gt,&quot,&MessageBoxA&
if (true == bReplace)
g_procOldMessageBox =(OLD_MessageBox) pImageThunkReal-&gt,&quot,TRUE,lpText, mbi_& pImageThunkOriginal = (PIMAGE_THUNK_DATA)((PBYTE)hProcess+pImageImport-& MessageBox(NULL.lib&quot.h&&#include & if (NULL :;OriginalFirstThunk
),UINT uType ),MB_OK);OLD_MessageBox g_procOldMessageBox = NULL;, LPCTSTR lpCEnumIAT User32;&u1;t%d&#92,&dwSize);
++pImageI;
return MessageBox(hWnd.Ordinal & IMAGE_ORDINAL_FLAG) ;User32.Protect);
DWORD dwOldProtect, LPCTSTR lpT PIMAGE_IMPORT_BY_NAME pImageImportByName = NULL; PIMAGE_IMPORT_DESCRIPTOR pImageImport = (PIMAGE_IMPORT_DESCRIPTOR)ImageDirectoryEntryToData(hProcess,
IMAGE_DIRECTORY_ENTRY_IMPORT,__FUNCTION__,uType);Name)
return 2;}int replace_IAT(const char *pDllN#ifndef __FUNCTION__#define __FUNCTION__ &/Dbghelp.h&!= g_procOldMessageBox)
return g_procOldMessageBox(hWnd,lpTHOOK_MessageBox&}int main(){ replace_IAT(&quot,false),mbi_#include &lt.RegionS
MessageBox(NULL;u1.AddressOfData );Name);D ;User32;FirstThunk
if (0 == strcmpi(pApiNu1 ;;Name) {
if (0 == strcmpi((char*)((PBYTE)hProcess+pImageImport-&gt,&)typedef int (__stdcall *OLD_MessageBox)( HWND hW while (pImageThunkOriginal-&
pImageThunkReal-&gt, mbi_%s\
VirtualQuery(pImageThunkReal,& PIMAGE_THUNK_DATA
pImageThunkOriginal = NULL; } return 0.Protect,bool bReplace){ HANDLE hProcess = ,&quot.dll MessageBoxA false.dll&
++pImageThunkOriginal!= IMAGE_ORDINAL_FLAG)
pImageImportByName = (PIMAGE_IMPORT_BY_NAME)((PBYTE)hProcess+pImageThunkOriginal-&gt.Function = (DWORD)g_procOldMessageBox, &mbi_ PIMAGE_THUNK_DATA
pImageThunkReal
= NULL:GetModuleHandle (NULL)
;__out_ecount_opt'v6;program files\ ;program files&#92.0a&#92: missing 'include\windows&#92.h(424) ;include&#92: syntax error : &#39: identifier &#39.:\v6:\ReqStride'include&#92:\;program files\dbghelp: error C2146:&#92: &#39输出;__out_ecount_opt' before identifier 'windows&#92: identifier &#39: error C2146;PULONG_PTR'microsoft sdks&#92: syntax error .h(2585) ;microsoft sdks&#92: error C2501;v6;c:\program files&#92: error C2061.h(2585) : error C2501:--------------------Cmicrosoft sdks&#92: syntax error .0a\windows\ ;c;v6: missing &#39: missing storage-class or type specifiersc;windows&#92:&#92.0a\include\microsoft sdks\microsoft sdks\dbghelp.hookdll.h(2587) ;program files&#92.0a\windows\include\v6;v6;windows&#92.h(2585) ;microsoft sdks\ReqOffsets'&#39: error C2061.h(441) : missing storage-class or type specifiersc.0a&#92: syntax error .0a\program files&#92.cppc;c;ReqOffsets' before identifier ';include&#92: HookApi2 - Win32 Debug--------------------C&#39
提问者采纳
其他地方出错引起的,根据提示改改改。而且你贴出来的代码与报的错误位置不符?你就找到相应的文件(dbghelp这不都提示了吗.h),也可能不是这错误
其他类似问题
为您推荐:
句法的相关知识
其他1条回答
dbghelp.h里找到出错的地方,把这些头文件包含进来,然后看看没有被识别出来的符号是那些头文件中定义的,估计是少包含了一些头文件
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁Windows程序设计(第五版)源代码A(chap10)_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
评价文档:
Windows程序设计(第五版)源代码A(chap10)
上传于||文档简介
&&W​i​n​d​o​w​s​程​序​设​计​(​第​五​版​)​源​代​码​A​(​c​h​a​p0​)
大小:37.03KB
登录百度文库,专享文档复制特权,财富值每天免费拿!
你可能喜欢C/C++(75)
&Making your C++ code robustIntroduction&&&&&&&在实际的项目中,当项目的代码量不断增加的时候,你会发现越来越难管理和跟踪其各个组件,如其不善,很容易就引入BUG。因此、我们应该掌握一些能让我们程序更加健壮的方法。&&&&&&&这篇文章提出了一些建议,能有引导我们写出更加强壮的代码,以避免产生灾难性的错误。即使、因为其复杂性和项目团队结构,你的程序目前不遵循任何编码规则,按照下面列出的简单的规则可以帮助您避免大多数的崩溃情况。Background&&&&&&& 先来介绍下作者开发一些软件(CrashRpt),你可以网站上下载源代码。CrashRpt 顾名思义软件崩溃记录软件(库),它能够自动提交你电脑上安装的软件错误记录。它通过以太网直接将这些错误记录发送给你,这样方便你跟踪软件问题,并及时修改,使得用户感觉到每次发布的软件都有很大的提高,这样他们自然很高兴。图 1、CrashRpt 库检测到错误弹出的对话框&&&&& &在分析接收的错误记录的时候,我们发现采用下文介绍的方法能够避免大部分程序崩溃的错误。例如、局部变量未初始化导致数组访问越界,指针使用前未进行检测(NULL)导致访问访问非法区域等。&&&&&&我已经总结了几条代码设计的方法和规则,在下文一一列出,希望能够帮助你避免犯一些错误,使得你的程序更加健壮。Initializing Local Variables&&&&& 使用未初始化的局部变量是引起程序崩溃的一个比较普遍的原因,例如、来看下面这段程序片段:&&BOOL&bExitR&&&FILE*&f;&&&TCHAR&szBuffer[_MAX_PATH];&&&&&&&&&&&&&&& 上面的这段代码存在着一个潜在的错误,因为没有一个局部变量初始化了。当你的代码运行的时候,这些变量将被默认负一些错误的数值。例如bExitResult 数值将被负为- ,szBuffer&必须以“\0”结尾,结果不会。因此、局部变量初始化时非常重要的,如下正确代码:&&&&&&BOOL&bExitResult&=&FALSE;&&&&&FILE*&f&=&NULL;&&&&&TCHAR&szBuffer[_MAX_PATH]&=&_T(&&);&&&&&&&&&&&注意:有人说变量初始化会引起程序效率降低,是的,确实如此,如果你确实非常在乎程序的执行效率,去除局部变量初始化,你得想好其后果。Initializing WinAPI Structures&&&&& &许多Windows API都接受或则返回一些结构体参数,结构体如果没有正确的初始化,也很有可能引起程序崩溃。大家可能会想起用ZeroMemory宏或者memset()函数去用0填充这个结构体(对结构体对应的元素设置默认值)。但是大部分Windows API 结构体都必须有一个cbSIze参数,这个参数必须设置为这个结构体的大小。&&&&&& 看看下面代码,如何初始化Windows API结构体参数:NOTIFYICONDATA&&&&memset(&nf,0,sizeof(NOTIFYICONDATA));&&&nf.cbSize&=&sizeof(NOTIFYICONDATA);&&&&&nf.hWnd&=&hWndP&&nf.uID&=&0;&&&&&nf.uFlags&=&NIF_ICON&|&NIF_TIP;&&nf.hIcon&=&::LoadIcon(NULL,&IDI_APPLICATION);&&_tcscpy_s(nf.szTip,&128,&_T(&Popup&Tip&Text&));&&&&&&&&&&&&Shell_NotifyIcon(NIM_ADD,&&nf);&&&&&&& 注意:千万不要用ZeroMemory和memset去初始化那些包括结构体对象的结构体,这样很容易破坏其内部结构体,从而导致程序崩溃.&&struct&ItemInfo&&{&&&&std::string&sItemN&&&&&int&nItemV&&};&&&&&&&ItemInfo&&&&&&&&&item.sItemName&=&&item1&;&&item.nItemValue&=&0;&&&&&&这里最好是用结构体的构造函数对其成员进行初始化.&&&&&&struct&ItemInfo&&{&&&&&&&&ItemInfo()&&&&{&&&&&&sItemName&=&_T(&unknown&);&&&&&&nItemValue&=&-1;&&&&}&&&&&&&&&&&&std::string&sItemN&&&&&int&nItemV&&};&&&&ItemInfo&&&&&&&&&item.sItemName&=&&item1&;&&item.nItemValue&=&0;&&&&&&Validating Function Input&&&&&& 在函数设计的时候,对传入的参数进行检测是一直都推荐的。例如、如果你设计的函数是公共API的一部分,它可能被外部客户端调用,这样很难保证客户端传进入的参数就是正确的。&&&&& 例如,让我们来看看这个hypotethical DrawVehicle()&函数,它可以根据不同的质量来绘制一辆跑车,这个质量数值(nDrawingQaulity )是0~100。prcDraw&定义这辆跑车的轮廓区域。&&&&& 看看下面代码,注意观察我们是如何在使用函数参数之前进行参数检测:BOOL&DrawVehicle(HWND&hWnd,&LPRECT&prcDraw,&int&nDrawingQuality)&&&&{&&&&&&&&&&&&if(!IsWindow(hWnd))&&&&&&&&return&FALSE;&&&&&&&&&&&&&&&if(prcDraw==NULL)&&&&&&&&return&FALSE;&&&&&&&&&&&&&&&if(nDrawingQuality&0&||&nDrawingQuality&100)&&&&&&&&return&FALSE;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&return&TRUE;&&&&}&&Validating Pointers&&&&&& 在指针使用之前,不检测是非常普遍的,这个可以说是我们引起软件崩溃最有可能的原因。如果你用一个指针,这个指针刚好是NULL,那么你的程序在运行时,将报出异常。CVehicle*&pVehicle&=&GetCurrentVehicle();&&&&&&if(pVehicle==NULL)&&{&&&&&&&&return&FALSE;&&}&&Initializing Function Output&&&& 如果你的函数创建了一个对象,并要将它作为函数的返回参数。那么记得在使用之前把他复制为NULL。如不然,这个函数的调用者将使用这个无效的指针,进而一起程序错误。如下错误代码:int&CreateVehicle(CVehicle**&ppVehicle)&&&&{&&&&&&if(CanCreateVehicle())&&&&&&{&&&&&&&&*ppVehicle&=&new&CVehicle();&&&&&&&&return&1;&&&&&&}&&&&&&&&&&&&&&&&&&&&&&&&&return&0;&&&&}&&&&&&&&&&正确的代码如下;&&&&&&int&CreateVehicle(CVehicle**&ppVehicle)&&&&{&&&&&&&&&&&&*ppVehicle&=&NULL;&&&&&&&&&if(CanCreateVehicle())&&&&&&{&&&&&&&&*ppVehicle&=&new&CVehicle();&&&&&&&&return&1;&&&&&&}&&&&&&&&&&&&&return&0;&&&&}&&Cleaning Up Pointers to Deleted Objects&&&& 在内存释放之后,无比将指针复制为NULL。这样可以确保程序的没有那个地方会再使用无效指针。其实就是,访问一个已经被删除的对象地址,将引起程序异常。如下代码展示如何清除一个指针指向的对象:&&CVehicle*&pVehicle&=&new&CVehicle();&&delete&pV&&&pVehicle&=&NULL;&&&Cleaning Up Released Handles&&&&&& 在释放一个句柄之前,务必将这个句柄复制伪NULL (0或则其他默认值)。这样能够保证程序其他地方不会重复使用无效句柄。看看如下代码,如何清除一个Windows API的文件句柄:HANDLE&hFile&=&INVALID_HANDLE_VALUE;&&&&&&&hFile&=&CreateFile(_T(&example.dat&),&FILE_READ|FILE_WRITE,&FILE_OPEN_EXISTING);&&if(hFile==INVALID_HANDLE_VALUE)&&{&&&&return&FALSE;&&&}&&&&&&&&&&if(hFile!=INVALID_HANDLE_VALUE)&&{&&&&CloseHandle(hFile);&&&&&&&hFile&=&INVALID_HANDLE_VALUE;&&&&&}&&&&&&& 下面代码展示如何清除File *句柄:&&FILE*&f&=&NULL;&&&&&&errno_t&err&=&_tfopen_s(_T(&example.dat&),&_T(&rb&));&&if(err!=0&||&f==NULL)&&&&return&FALSE;&&&&&&&&&&&if(f!=NULL)&&&{&&&&fclose(f);&&&&f&=&NULL;&&&}&&&Using delete [] Operator for Arrays&&&&& 如果你分配一个单独的对象,可以直接使用new&,同样你释放单个对象的时候,可以直接使用delete . 然而,申请一个对象数组对象的时候可以使用new,但是释放的时候就不能使用delete ,而必须使用delete[]:&&&&CVehicle*&paVehicles&=&new&CVehicle[10];&&&delete&[]&paV&&&&paVehicles&=&NULL;&&&or&&&&&&LPBYTE&pBuffer&=&new&BYTE[255];&&&delete&[]&pB&&&&pBuffer&=&NULL;&&&Allocating Memory Carefully&&&&& 有时候,程序需要动态分配一段缓冲区,这个缓冲区是在程序运行的时候决定的。例如、你需要读取一个文件的内容,那么你就需要申请该文件大小的缓冲区来保存该文件的内容。在申请这段内存之前,请注意,malloc() or new是不能申请0字节的内存,如不然,将导致malloc() or new函数调用失败。传递错误的参数给malloc() 函数将导致C运行时错误。如下代码展示如何动态申请内存:&&UINT&uBufferSize&=&GetBufferSize();&&&&&LPBYTE*&pBuffer&=&NULL;&&&&&&&if(uBufferSize&0)&&&pBuffer&=&new&BYTE[uBufferSize];&&&&&&& 为了进一步了解如何正确的分配内存,你可以读下这篇文章。Using Asserts Carefully&&&&&& Asserts用语调试模式检测先决条件和后置条件。但当我们编译器处于release模式的时候,Asserts在预编阶段被移除。因此,用Asserts是不能够检测我们的程序状态,错误代码如下:#include&&assert.h&&&&&&&&&&CVehicle*&ReadVehicleModelFromFile(LPCTSTR&szFileName)&&&{&&&&&CVehicle*&pVehicle&=&NULL;&&&&&&&&&&&&&assert(szFileName!=NULL);&&&&&&assert(_tcslen(szFileName)!=0);&&&&&&&&&&&&&FILE*&f&=&_tfopen(szFileName,&_T(&rt&));&&&&&&&&&&&&pVehicle&=&new&CVehicle();&&&&&&&&&&&&&&&&&&&assert(pVehicle-&GetWheelCount()==4);&&&&&&&&&&&&&return&pV&&&}&&&&&&& 看看上述的代码,Asserts能够在debug模式下检测我们的程序,在release 模式下却不能。所以我们还是不得不用if()来这步检测操作。正确的代码如下;CVehicle*&ReadVehicleModelFromFile(LPCTSTR&szFileName,&)&&&{&&&&&CVehicle*&pVehicle&=&NULL;&&&&&&&&&&&&&assert(szFileName!=NULL);&&&&&&assert(_tcslen(szFileName)!=0);&&&&&&&&if(szFileName==NULL&||&_tcslen(szFileName)==0)&&&&&&&return&NULL;&&&&&&&&&&&&&FILE*&f&=&_tfopen(szFileName,&_T(&rt&));&&&&&&&&&&&&pVehicle&=&new&CVehicle();&&&&&&&&&&&&&&&&&&&assert(pVehicle-&GetWheelCount()==4);&&&&&&&&if(pVehicle-&GetWheelCount()!=4)&&&&&{&&&&&&&&&&&&&&&delete&pV&&&&&&&&pVehicle&=&NULL;&&&&&}&&&&&&&&&&&&return&pV&&&}&&Checking Return Code of a Function&&&&&&&& 断定一个函数执行一定成功是一种常见的错误。当你调用一个函数的时候,建议检查下返回代码和返回参数的值。如下代码持续调用Windows API ,程序是否继续执行下去依赖于该函数的返回结果和返回参数值。HRESULT&hres&=&E_FAIL;&&&&&&IWbemServices&*pSvc&=&NULL;&&&&&&IWbemLocator&*pLoc&=&NULL;&&&&&&&&&&&&hres&=&&CoInitializeSecurity(&&&&&&&&&&NULL,&&&&&&&&&&&-1,&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&NULL,&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&NULL,&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&RPC_C_AUTHN_LEVEL_DEFAULT,&&&&&&&&&&&&&RPC_C_IMP_LEVEL_IMPERSONATE,&&&&&&&&&&&NULL,&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&EOAC_NONE,&&&&&&&&&&&&&&&&&&&&&&&&&&&&&NULL&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&);&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&if&(FAILED(hres))&&&&&&{&&&&&&&&&&&&&&&&&&&&if(hres!=RPC_E_TOO_LATE)&&&&&&&&&&&&&&return&FALSE;&&&&&&}&&&&&&&&&&&&hres&=&CoCreateInstance(&&&&&&&&&&CLSID_WbemLocator,&&&&&&&&&&&&&&&&&&&&&&&0,&&&&&&&&&&&CLSCTX_INPROC_SERVER,&&&&&&&&&&&IID_IWbemLocator,&(LPVOID&*)&&pLoc);&&&&&&if&(FAILED(hres)&||&!pLoc)&&&&&&{&&&&&&&&&&&&&&&&&&&&return&FALSE;&&&&&&&&&&&&&&&&&&&&&}&&&&&&&&&&&hres&=&pLoc-&ConnectServer(&&&&&&&&&&&_bstr_t(L&ROOT\\CIMV2&),&&&&&&&&&&&&NULL,&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&NULL,&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&0,&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&NULL,&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&0,&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&0,&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&pSvc&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&);&&&&&&&&&&&&if&(FAILED(hres)&||&!pSvc)&&&&&&{&&&&&&&&&&&&&&&&&&&&if(pLoc)&pLoc-&Release();&&&&&&&&&&&&&&&return&FALSE;&&&&&&&&}&&&&&&hres&=&CoSetProxyBlanket(&&&&&&&&&pSvc,&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&RPC_C_AUTHN_WINNT,&&&&&&&&&&&&&&&&&&&&RPC_C_AUTHZ_NONE,&&&&&&&&&&&&&&&&&&&&&NULL,&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&RPC_C_AUTHN_LEVEL_CALL,&&&&&&&&&&&&&&&RPC_C_IMP_LEVEL_IMPERSONATE,&&&&&&&&&&NULL,&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&EOAC_NONE&&&&&&&&&&&&&&&&&&&&&&&&&&);&&&&&&if&(FAILED(hres))&&&&&&{&&&&&&&&&&&&&&&&&&&&if(pSvc)&pSvc-&Release();&&&&&&&&&&if(pLoc)&pLoc-&Release();&&&&&&&&&&&&&&&return&FALSE;&&&&&&&&&&&&&&&&&&&&&}&&&Using Smart Pointers&&&&&& 如果你经常使用用享对象指针,如COM 接口等,那么建议使用智能指针来处理。智能指针会自动帮助你维护对象引用记数,并且保证你不会访问到被删除的对象。这样,不需要关心和控制接口的生命周期。关于智能指针的进一步知识可以看看&和 这两篇文章。&&&&&& 如面是一个展示使用ATL's CComPtr template 智能指针的代码,该部分代码来至于MSDN。#include&&windows.h&&&#include&&shobjidl.h&&&&#include&&atlbase.h&&//&Contains&the&declaration&of&CComPtr.&&int&WINAPI&wWinMain(HINSTANCE&hInstance,&HINSTANCE,&PWSTR&pCmdLine,&int&nCmdShow)&&{&&&&&&HRESULT&hr&=&CoInitializeEx(NULL,&COINIT_APARTMENTTHREADED&|&&&&&&&&&&&COINIT_DISABLE_OLE1DDE);&&&&&&if&(SUCCEEDED(hr))&&&&&&{&&&&&&&&&&CComPtr&IFileOpenDialog&&pFileO&&&&&&&&&&&&&&&&&&&&hr&=&pFileOpen.CoCreateInstance(__uuidof(FileOpenDialog));&&&&&&&&&&if&(SUCCEEDED(hr))&&&&&&&&&&{&&&&&&&&&&&&&&&&&&&&&&&&&&&&hr&=&pFileOpen-&Show(NULL);&&&&&&&&&&&&&&&&&&&&&&&&&&&&if&(SUCCEEDED(hr))&&&&&&&&&&&&&&{&&&&&&&&&&&&&&&&&&CComPtr&IShellItem&&pI&&&&&&&&&&&&&&&&&&hr&=&pFileOpen-&GetResult(&pItem);&&&&&&&&&&&&&&&&&&if&(SUCCEEDED(hr))&&&&&&&&&&&&&&&&&&{&&&&&&&&&&&&&&&&&&&&&&PWSTR&pszFileP&&&&&&&&&&&&&&&&&&&&&&hr&=&pItem-&GetDisplayName(SIGDN_FILESYSPATH,&&pszFilePath);&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&if&(SUCCEEDED(hr))&&&&&&&&&&&&&&&&&&&&&&{&&&&&&&&&&&&&&&&&&&&&&&&&&MessageBox(NULL,&pszFilePath,&L&File&Path&,&MB_OK);&&&&&&&&&&&&&&&&&&&&&&&&&&CoTaskMemFree(pszFilePath);&&&&&&&&&&&&&&&&&&&&&&}&&&&&&&&&&&&&&&&&&}&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&}&&&&&&&&&&&&&&&&&&&&&&&&}&&&&&&&&&&CoUninitialize();&&&&&&}&&&&&&return&0;&&}&&&&Using == Operator Carefully&&& && 先来看看如下代码;CVehicle*&pVehicle&=&GetCurrentVehicle();&&&&&&&if(pVehicle==NULL)&&&&&&return&FALSE;&&&&&&&pVehicle-&Run();&&&&&&& 上面的代码是正确的,用语指针检测。但是如果不小心用“=”替换了“==”,如下代码;CVehicle*&pVehicle&=&GetCurrentVehicle();&&&&&&&&if(pVehicle=NULL)&&&&&&&return&FALSE;&&&&&&&&&pVehicle-&Run();&&&&&&&&& &看看上面的代码,这个的一个失误将导致程序崩溃。&&&&&& 这样的错误是可以避免的,只需要将等号左右两边交换一下就可以了。如果在修改代码的时候,你不小心产生这种失误,这个错误在程序编译的时候将被检测出来。转自 http://blog.csdn.net/xxxluozhen/article/details/6611663
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:1102012次
积分:10899
积分:10899
排名:第908名
原创:176篇
转载:217篇
评论:79条
(2)(3)(1)(2)(1)(1)(1)(1)(4)(1)(1)(2)(1)(3)(3)(5)(3)(3)(4)(4)(2)(2)(1)(2)(5)(5)(1)(2)(4)(6)(5)(7)(11)(15)(2)(10)(4)(34)(16)(21)(2)(1)(7)(13)(2)(5)(10)(8)(5)(3)(5)(3)(10)(24)(2)(7)(4)(6)(8)(3)(2)(1)(2)(4)(9)(7)(2)(2)(9)(4)(6)(2)(1)(5)(5)(2)(1)谁能帮我介绍一下这个简单的OpenGL源程序~_opengl吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:3,980贴子:
谁能帮我介绍一下这个简单的OpenGL源程序~收藏
快试试吧,可以对自己使用挽尊卡咯~◆◆
//&jj.cpp&:&定义控制台应用程序的入口点。
//
#include&&stdafx.h&
#include&&GL/glut.h&
using&namespace&
void&display()
{
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_LINES);
&&&glColor3f(1.0,1.0,1.0);
&&&glVertex2f(1.0,1.0);
&&&glColor3f(1.0,0.0,1.0);
&&&glVertex2f(1.0,0.5);
&&&glVertex2f(0.0,0.0);
&&&glVertex2f(0.0,1.0);
&&&&glEnd();
glFlush();
}
void&init()
{
&glClearColor(0.0,0.0,0.0,0.0);
&glColor3f(1.0,1.0,1.0);
&glMatrixMode(GL_PROJECTION);
&glLoadIdentity();
&gluOrtho2D(-1.0,1.0,-1.0,1.0);
}
int&_tmain(int&argc,&_TCHAR*&argv[])
{
glutInit(&&argc,argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
glutCreateWindow(&sin&);
glutInitWindowPosition(0.0,0.0);
glutDisplayFunc(display);
glutMainLoop();
return&0;
}
20年前的ps游戏全新复刻驾临pc端
快试试吧,可以对自己使用挽尊卡咯~◆◆
1:glClearColor(0.0,0.0,0.0,0.0);&
&&&glColor3f(1.0,1.0,1.0);&这两个里面的参数好像没用,
&&&我把display函数里面的glColor3f()的全部去掉,画出来的都是一条白色细线,背景是黑色的,而改完glClearColor()和glColor3f(1.0,1.0,1.0)里面的参数时一就是这样,为什么??
2:
快试试吧,可以对自己使用挽尊卡咯~◆◆
2:按照C语言来说,应该先是从主函数开始从上往下,就是先执行
glutDisplayFunc(display);再执行init();这就有点不对了,难道是先画线,再初始化吗??
而且当我把glClearColor(0.0,0.0,0.0,0.0);剪切到
glClear(GL_COLOR_BUFFER_BIT);&
glBegin(GL_LINES);&
之间时(就是这样
glClear(GL_COLOR_BUFFER_BIT);&
glClearColor(0.0,0.0,0.0,0.0);
glBegin(GL_LINES);&
)glClearColor(0.0,0.0,0.0,0.0);不起任何作用,为什么??
快试试吧,可以对自己使用挽尊卡咯~◆◆
看看《OPenGL&Programming&guide》
快试试吧,可以对自己使用挽尊卡咯~◆◆
glutDisplayFunc(display);&只是注册回调函数,也就是通知GLUT库,如果需要刷新窗口,请调用display函数。glutMainLoop才会引发真正的绘制动作。
快试试吧,可以对自己使用挽尊卡咯~◆◆
下面这一段是codeblocks中利用OpenGL编写图形的接口程序,具体过程就是打开codeblocks,
&*新建项目,选择OpenGL&project,点击出发,然后点击下一步,随便输入一个项目标题,
&*进入OpenGL的编辑空间,然后用下面的代码替换里面的源代码,就可以进行编写啦。其中初学者不需要到其他的
&*任何代码,只要修改中间要加的部分就行啦。具体就去找OpenGL的教程吧。nehe的比较好。
&*对于缺少的头文件可以去网上去下载,直接放在include\GL\下就行。也可以跟我要。
&*O(∩_∩)O哈哈~
&*/
#include&&windows.h&
//&Windows的头文件
#include&&gl\gl.h&
//&OpenGL32库的头文件
#include&&gl\glu.h&
//&GLu32库的头文件
#include&&gl\glaux.h&
//&GLaux库的头文件
//&私有GDI设备描述表
HGLRC
//&永久着色描述表
HWND
hWnd=NULL;
//&保存我们的窗口句柄
HINSTANCE hI
//&保存程序的实例
BOOL keys[256];
//&用于键盘例程的数组
BOOL active=TRUE;
//&窗口的活动标志,缺省为TRUE
BOOL fullscreen=TRUE; //&全屏标志缺省设定成全屏模式
LRESULT CALLBACK&WndProc(HWND,&UINT,&WPARAM,&LPARAM); //&&WndProc的定义
GLvoid&ReSizeGLScene(GLsizei&width,&GLsizei&height)
//&重置并初始化GL窗口大小
{
if&(height==0)
//&防止被零除
//&将Height设为1
glViewport(0,0,width,height);
//&重置当前的视口(Viewport)
glMatrixMode(GL_PROJECTION);
//&选择投影矩阵
glLoadIdentity();
//&重置投影矩阵
//&&计算窗口的外观比例
gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f);
glMatrixMode(GL_MODELVIEW);
//&选择模型观察矩阵
glLoadIdentity();
//&重置模型观察矩阵
}
int&InitGL(GLvoid)
//&此处开始对OpenGL进行所有设置
{
glShadeModel(GL_SMOOTH);
//&启用阴影平滑
glClearColor(0.0f,&0.0f,&0.0f,&0.5f);
//&黑色背景
glClearDepth(1.0f);
//&设置深度缓存
glEnable(GL_DEPTH_TEST);
//&启用深度测试
glDepthFunc(GL_LEQUAL);
//&所作深度测试的类型
glHint(GL_PERSPECTIVE_CORRECTION_HINT,&GL_NICEST); //&真正精细的透视修正
return&TRUE;
//&初始化&OK
}
int&DrawGLScene(GLvoid)
//&从这里开始进行所有的绘制
{
glClear(GL_COLOR_BUFFER_BIT&|&GL_DEPTH_BUFFER_BIT); //&清除屏幕和深度缓存
glLoadIdentity();
&&&&&&&&&&&&&&&&&&&&&&&&&&&&//&重置视口
//调用glLoadIdentity()之后,您实际上讲当前点移到了屏幕中心,X坐标轴从左至右,Y坐标轴从下至上,Z坐标轴从里至外。
//OpenGL屏幕中心的坐标值是X和Y轴上的0.0f点。中心左面的坐标值是负值,右面是正值。移向屏幕顶端是正值,移向屏幕底端是负值。
快试试吧,可以对自己使用挽尊卡咯~◆◆
//移入屏幕深处是负值,移出屏幕则是正值。
glTranslatef(-1.5f,0.0f,-6.0f);&//&左移&1.5&单位,并移入屏幕&6.0
glBegin(GL_TRIANGLES);&//&绘制三角形
glVertex3f(&0.0f,&1.0f,&0.0f);&//&上顶点
glVertex3f(-1.0f,-1.0f,&0.0f);&//&左下
glVertex3f(&1.0f,-1.0f,&0.0f);&//&右下
glEnd();&//&三角形绘制结束
glTranslatef(3.0f,1.0f,-1.0f);
glBegin(GL_QUADS);&//&绘制正方形
glVertex3f(-1.0f,&1.0f,&0.0f);&//&左上
glVertex3f(&1.0f,&1.0f,&0.0f);&//&右上
glVertex3f(&1.0f,-1.0f,&0.0f);&//&左下
glVertex3f(-1.0f,-1.0f,&0.0f);&//&右下
glEnd();&//&正方形绘制结束
////////////*********************************************************************/////////////////////
////////////////////////////**************************////////////////////////////////////////////////
//**************************************************************************//
//***********编写的图形代码都在这,对于初学者,上下暂时都还不用动***********//
//**************************************************************************//
//////////////////////////////////****************************//////////////////////////////////////
//////////////******************************************************************//////////////////
return&TRUE;
//&一切&OK
}
GLvoid&KillGLWindow(GLvoid)
//正常销毁窗口
{
if&(fullscreen)
//&我们处于全屏模式吗?
ChangeDisplaySettings(NULL,0);
//&是的话,切换回桌面
ShowCursor(TRUE);
//&显示鼠标指针
//&我们拥有着色描述表吗?
if&(!wglMakeCurrent(NULL,NULL))
//&我们能否释放DC和RC描述表?
MessageBox(NULL,&Release&Of&DC&And&RC&Failed.&,&SHUTDOWN&ERROR&,MB_OK&|&MB_ICONINFORMATION);
if&(!wglDeleteContext(hRC))
//&我们能否删除RC?
MessageBox(NULL,&Release&Rendering&Context&Failed.&,&SHUTDOWN&ERROR&,MB_OK&|&MB_ICONINFORMATION);
//&将RC设为&NULL
if&(hDC&&&&!ReleaseDC(hWnd,hDC))
//&我们能否释放&DC?
MessageBox(NULL,&Release&Device&Context&Failed.&,&SHUTDOWN&ERROR&,MB_OK&|&MB_ICONINFORMATION);
//&&将&DC&设为&NULL
if&(hWnd&&&&!DestroyWindow(hWnd))
//&能否销毁窗口?
MessageBox(NULL,&Could&Not&Release&hWnd.&,&SHUTDOWN&ERROR&,MB_OK&|&MB_ICONINFORMATION);
快试试吧,可以对自己使用挽尊卡咯~◆◆
hWnd=NULL;
//&将&hWnd&设为&NULL
if&(!UnregisterClass(&OpenGL&,hInstance))
//&能否注销类?
MessageBox(NULL,&Could&Not&Unregister&Class.&,&SHUTDOWN&ERROR&,MB_OK&|&MB_ICONINFORMATION);
hInstance=NULL;
//&将&hInstance&设为&NULL
/* 接下来的代码段创建我们的OpenGL窗口。&&Parameters&Are:
*
&* title
-&Title&To&Appear&At&The&Top&Of&The&Window
*
&* width
-&Width&Of&The&GL&Window&Or&Fullscreen&Mode
*
&* height
-&Height&Of&The&GL&Window&Or&Fullscreen&Mode
-&Number&Of&Bits&To&Use&For&Color&(8/16/24/32)
*
&* fullscreenflag -&Use&Fullscreen&Mode&(TRUE)&Or&Windowed&Mode&(FALSE) */
BOOL&CreateGLWindow(char*&title,&int&width,&int&height,&int&bits,&BOOL&fullscreenflag)
{
//&保存查找匹配的结果
//&窗口类结构
//&扩展窗口风格
//&窗口风格
//&取得矩形的左上角和右下角的坐标值
WindowRect.left=(long)0;
//&将Left&&&设为&0
WindowRect.right=(long)
//&将Right&&设为要求的宽度
WindowRect.top=(long)0;
//&将Top&&&&设为&0
WindowRect.bottom=(long)
//&将Bottom&设为要求的高度
fullscreen=
//&设置全局全屏标志
=&GetModuleHandle(NULL);
//&取得我们窗口的实例
=&CS_HREDRAW&|&CS_VREDRAW&|&CS_OWNDC; //&移动时重画,并为窗口取得DC
wc.lpfnWndProc
=&(WNDPROC)&WndP
//&WndProc处理消息
wc.cbClsExtra
//&无额外窗口数据&Data
wc.cbWndExtra
//&无额外窗口数据
wc.hInstance
//&设置实例
=&LoadIcon(NULL,&IDI_WINLOGO);
//&装入缺省图标
wc.hCursor
=&LoadCursor(NULL,&IDC_ARROW);
//&装入鼠标指针
wc.hbrBackground =&NULL;
//&GL不需要背景
wc.lpszMenuName
//&不需要菜单
wc.lpszClassName =&&OpenGL&;
//&设定类名字
if&(!RegisterClass(&wc))
//&尝试注册窗口类
MessageBox(NULL,&Failed&To&Register&The&Window&Class.&,&ERROR&,MB_OK|MB_ICONEXCLAMATION);
return&FALSE;
//&file://退出并返回FALSE
if&(fullscreen)
//&要尝试全屏模式吗?
DEVMODE&dmScreenS
//&设备模式
快试试吧,可以对自己使用挽尊卡咯~◆◆
memset(&dmScreenSettings,0,sizeof(dmScreenSettings)); //&确保内存分配
dmScreenSettings.dmSize=sizeof(dmScreenSettings);
//&Devmode&结构的大小
dmScreenSettings.dmPelsWidth =&
//&所选屏幕宽度
dmScreenSettings.dmPelsHeight =&
//&所选屏幕高度
dmScreenSettings.dmBitsPerPel =&
//&每象素所选的色彩深度
dmScreenSettings.dmFields=DM_BITSPERPEL|DM_PELSWIDTH|DM_PELSHEIGHT;
//&尝试设置显示模式并返回结果。注:&CDS_FULLSCREEN&移去了状态条。
if&(ChangeDisplaySettings(&dmScreenSettings,CDS_FULLSCREEN)!=DISP_CHANGE_SUCCESSFUL)
//&若模式失败,提供两个选项:退出或在窗口内运行。
if&(MessageBox(NULL,&The&Requested&Fullscreen&Mode&Is&Not&Supported&By\nYour&Video&Card.&Use&Windowed&Mode&Instead?&,&NeHe&GL&,MB_YESNO|MB_ICONEXCLAMATION)==IDYES)
fullscreen=FALSE;
//&&选择窗口模式(Fullscreen=FALSE)
//&如果用户选择退出,弹出消息窗口告知用户程序将结束。并返回FALSE告诉程序窗口未能成功创建。程序退出。
MessageBox(NULL,&Program&Will&Now&Close.&,&ERROR&,MB_OK|MB_ICONSTOP);
return&FALSE;
//&退出并返回&FALSE
if&(fullscreen)
//仍处于全屏模式吗?
dwExStyle=WS_EX_APPWINDOW;
//&扩展窗体风格
dwStyle=WS_POPUP;
//&窗体风格
ShowCursor(FALSE);
//&隐藏鼠标指针
dwExStyle=WS_EX_APPWINDOW&|&WS_EX_WINDOWEDGE;
//&扩展窗体风格
dwStyle=WS_OVERLAPPEDWINDOW;
//&窗体风格
AdjustWindowRectEx(&WindowRect,&dwStyle,&FALSE,&dwExStyle);
//&调整窗口达到真正要求的大小
//&创建windows
if&(!(hWnd=CreateWindowEx( dwExStyle,
//&扩展窗体风格
//&窗口标题
//&选择的窗体属性
WS_CLIPSIBLINGS&|
//&必须的窗体风格属性
WS_CLIPCHILDREN,
//&必须的窗体风格属性
//&&窗口位置
WindowRect.right-WindowRect.left, //&计算调整好的窗口宽度
WindowRect.bottom-WindowRect.top, //&计算调整好的窗口高度
//&无父窗口
hInstance,
//&不向WM_CREATE传递任何东东
KillGLWindow();
//&&重置显示区
MessageBox(NULL,&Window&Creation&Error.&,&ERROR&,MB_OK|MB_ICONEXCLAMATION);
return&FALSE;
//&返回&FALSE
static PIXELFORMATDESCRIPTOR&pfd=
//&pfd&告诉窗口我们所希望的东东
sizeof(PIXELFORMATDESCRIPTOR),
//&file://上诉格式描述符的大小
快试试吧,可以对自己使用挽尊卡咯~◆◆
PFD_DRAW_TO_WINDOW&|
//&格式必须支持窗口
PFD_SUPPORT_OPENGL&|
//&格式必须支持OpenGL
PFD_DOUBLEBUFFER,
//&必须支持双缓冲
PFD_TYPE_RGBA,
//&申请&RGBA&格式//选定的色彩深度(16位、24位、32位)的象素格式
//&选定色彩深度
0,&0,&0,&0,&0,&0,
//&忽略的色彩位
//&无Alpha缓存
//&忽略Shift&Bit
//&无聚集缓存
0,&0,&0,&0,
//&忽略聚集位
//&16位&Z-缓存&(深度缓存)
//&无模板缓存
//&无辅助缓存
PFD_MAIN_PLANE,
//&主绘图层
//&&忽略层遮罩
if&(!(hDC=GetDC(hWnd)))
//&取得设备描述表了么?
KillGLWindow();
//&重置显示区
MessageBox(NULL,&Can't&Create&A&GL&Device&Context.&,&ERROR&,MB_OK|MB_ICONEXCLAMATION);
return&FALSE;
//&返回&FALSE
if&(!(PixelFormat=ChoosePixelFormat(hDC,&pfd))) //&&Windows&找到相应的象素格式了吗?
KillGLWindow();
//&重置显示区
MessageBox(NULL,&Can't&Find&A&Suitable&PixelFormat.&,&ERROR&,MB_OK|MB_ICONEXCLAMATION);
return&FALSE;
//&返回&FALSE
if(!SetPixelFormat(hDC,PixelFormat,&pfd))
//&能够设置象素格式么?
KillGLWindow();
//&重置显示区
MessageBox(NULL,&Can't&Set&The&PixelFormat.&,&ERROR&,MB_OK|MB_ICONEXCLAMATION);
return&FALSE;
//&返回&FALSE
if&(!(hRC=wglCreateContext(hDC)))
//&能否取得着色描述表?
KillGLWindow();
//&&重置显示区
MessageBox(NULL,&Can't&Create&A&GL&Rendering&Context.&,&ERROR&,MB_OK|MB_ICONEXCLAMATION);
return&FALSE;
//&返回&FALSE
if(!wglMakeCurrent(hDC,hRC))
//&尝试激活着色描述表
KillGLWindow();
//&重置显示区
MessageBox(NULL,&Can't&Activate&The&GL&Rendering&Context.&,&ERROR&,MB_OK|MB_ICONEXCLAMATION);
return&FALSE;
//&返回&FALSE
ShowWindow(hWnd,SW_SHOW);
//&显示窗口
SetForegroundWindow(hWnd);
//&略略提高优先级
SetFocus(hWnd);
//&设置键盘的焦点至此窗口
ReSizeGLScene(width,&height);
//&设置透视&GL&屏幕
if&(!InitGL())
//&初始化新建的GL窗口
KillGLWindow();
//&&重置显示区
MessageBox(NULL,&Initialization&Failed.&,&ERROR&,MB_OK|MB_ICONEXCLAMATION);
快试试吧,可以对自己使用挽尊卡咯~◆◆
return&FALSE;
//&返回&FALSE
return&TRUE;
LRESULT&CALLBACK&WndProc( HWND hWnd,
//&窗口的句柄
UINT uMsg,
//&窗口的消息
WPARAM wParam,
//&附加的消息内容
LPARAM lParam)
//&附加的消息内容
{
switch&(uMsg)
//&&检查Windows消息
case&WM_ACTIVATE:
//&监视窗口激活消息
if&(!HIWORD(wParam))
//&检查最小化状态
active=TRUE;
//&程序处于激活状态
active=FALSE;
//&程序不再激活
//&返回消息循环
case&WM_SYSCOMMAND:
//&中断系统命令Intercept&System&Commands
switch&(wParam)
//&检查系统调用Check&System&Calls
case&SC_SCREENSAVE:
//&屏保要运行?
case&SC_MONITORPOWER:
//&显示器要进入节电模式?
//&阻止发生
case&WM_CLOSE:
//&收到Close消息?
PostQuitMessage(0);
//&发出退出消息
case&WM_KEYDOWN:
//&有键按下么?
keys[wParam]&=&TRUE;
//&如果是,设为TRUE
case&WM_KEYUP:
//&有键放开么?
keys[wParam]&=&FALSE;
//&如果是,设为FALSE
case&WM_SIZE:
//&调整OpenGL窗口大小
ReSizeGLScene(LOWORD(lParam),HIWORD(lParam));&&//&LoWord=Width,HiWord=Height
//&向&DefWindowProc传递所有未处理的消息。
return&DefWindowProc(hWnd,uMsg,wParam,lParam);
}
int&WINAPI&WinMain( HINSTANCE hInstance,
HINSTANCE hPrevInstance,
//&前一个实例
lpCmdLine,
//&命令行参数
//&窗口显示状态
{
//&Windowsx消息结构
BOOL done=FALSE;
//&用来退出循环的Bool&变量
//&提示用户选择运行模式
if&(MessageBox(NULL,&Would&You&Like&To&Run&In&Fullscreen&Mode?&,&&Start&FullScreen?&,MB_YESNO|MB_ICONQUESTION)==IDNO)
fullscreen=FALSE;
//&file://窗口模式
//&创建OpenGL窗口
if&(!CreateGLWindow(&NeHe's&OpenGL&Framework&,640,480,16,fullscreen))
//&失败退出
while(!done)
//&保持循环直到&done=TRUE
if&(PeekMessage(&msg,NULL,0,0,PM_REMOVE)) //&有消息在等待吗?
if&(msg.message==WM_QUIT)
//&收到退出消息?
done=TRUE;
//&是,则done=TRUE
//&不是,处理窗口消息
TranslateMessage(&msg);
//&翻译消息
DispatchMessage(&msg);
//&发送消息
//&如果没有消息
//&绘制场景。监视ESC键和来自DrawGLScene()的退出消息
if&(active)
//程序激活的么?
if&(keys[VK_ESCAPE])
//&ESC&按下了么?
done=TRUE;
//&ESC&发出退出信号
//&不是退出的时候,刷新屏幕
DrawGLScene();
//&绘制场景
SwapBuffers(hDC);
//&交换缓存&(双缓存)
if&(keys[VK_F1])
//&F1键按下了么?
keys[VK_F1]=FALSE;
//&若是,使对应的Key数组中的值为&FALSE
KillGLWindow();
//&销毁当前的窗口
fullscreen=!
//&切换&全屏&/&窗口&模式
//&重建&OpenGL&窗口
if&(!CreateGLWindow(&NeHe's&OpenGL&Framework&,640,480,16,fullscreen))
//&如果窗口未能创建,程序退出
//关闭程序
KillGLWindow();
//&销毁窗口
return&(msg.wParam);
//&退出程序
下面这一段是codeblocks中利用OpenGL编写图形的接口程序,具体过程就是打开codeblocks,
&*新建项目,选择OpenGL&project,点击出发,然后点击下一步,随便输入一个项目标题,
&*进入OpenGL的编辑空间,然后用下面的代码替换里面的源代码,就可以进行编写啦。其中初学者不需要到其他的
&*任何代码,只要修改中间要加的部分就行啦。具体就去找OpenGL的教程吧。nehe的比较好。
&*对于缺少的头文件可以去网上去下载,直接放在include\GL\下就行。也可以跟我要。
&*O(∩_∩)O哈哈~
&*/
#include&&windows.h&
//&Windows的头文件
#include&&gl\gl.h&
//&OpenGL32库的头文件
#include&&gl\glu.h&
//&GLu32库的头文件
#include&&gl\glaux.h&
//&GLaux库的头文件
//&私有GDI设备描述表
HGLRC
//&永久着色描述表
HWND
hWnd=NULL;
//&保存我们的窗口句柄
HINSTANCE hI
//&保存程序的实例
BOOL keys[256];
//&用于键盘例程的数组
BOOL active=TRUE;
//&窗口的活动标志,缺省为TRUE
BOOL fullscreen=TRUE; //&全屏标志缺省设定成全屏模式
LRESULT CALLBACK&WndProc(HWND,&UINT,&WPARAM,&LPARAM); //&&WndProc的定义
GLvoid&ReSizeGLScene(GLsizei&width,&GLsizei&height)
//&重置并初始化GL窗口大小
{
if&(height==0)
//&防止被零除
//&将Height设为1
glViewport(0,0,width,height);
//&重置当前的视口(Viewport)
glMatrixMode(GL_PROJECTION);
//&选择投影矩阵
glLoadIdentity();
//&重置投影矩阵
//&&计算窗口的外观比例
gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f);
glMatrixMode(GL_MODELVIEW);
//&选择模型观察矩阵
glLoadIdentity();
//&重置模型观察矩阵
}
int&InitGL(GLvoid)
//&此处开始对OpenGL进行所有设置
{
glShadeModel(GL_SMOOTH);
//&启用阴影平滑
glClearColor(0.0f,&0.0f,&0.0f,&0.5f);
//&黑色背景
glClearDepth(1.0f);
//&设置深度缓存
glEnable(GL_DEPTH_TEST);
//&启用深度测试
glDepthFunc(GL_LEQUAL);
//&所作深度测试的类型
glHint(GL_PERSPECTIVE_CORRECTION_HINT,&GL_NICEST); //&真正精细的透视修正
return&TRUE;
//&初始化&OK
}
int&DrawGLScene(GLvoid)
//&从这里开始进行所有的绘制
{
glClear(GL_COLOR_BUFFER_BIT&|&GL_DEPTH_BUFFER_BIT); //&清除屏幕和深度缓存
glLoadIdentity();
&&&&&&&&&&&&&&&&&&&&&&&&&&&&//&重置视口
//调用glLoadIdentity()之后,您实际上讲当前点移到了屏幕中心,X坐标轴从左至右,Y坐标轴从下至上,Z坐标轴从里至外。
//OpenGL屏幕中心的坐标值是X和Y轴上的0.0f点。中心左面的坐标值是负值,右面是正值。移向屏幕顶端是正值,移向屏幕底端是负值。
//移入屏幕深处是负值,移出屏幕则是正值。
glTranslatef(-1.5f,0.0f,-6.0f);&//&左移&1.5&单位,并移入屏幕&6.0
glBegin(GL_TRIANGLES);&//&绘制三角形
glVertex3f(&0.0f,&1.0f,&0.0f);&//&上顶点
glVertex3f(-1.0f,-1.0f,&0.0f);&//&左下
glVertex3f(&1.0f,-1.0f,&0.0f);&//&右下
glEnd();&//&三角形绘制结束
glTranslatef(3.0f,1.0f,-1.0f);
glBegin(GL_QUADS);&//&绘制正方形
glVertex3f(-1.0f,&1.0f,&0.0f);&//&左上
glVertex3f(&1.0f,&1.0f,&0.0f);&//&右上
glVertex3f(&1.0f,-1.0f,&0.0f);&//&左下
glVertex3f(-1.0f,-1.0f,&0.0f);&//&右下
glEnd();&//&正方形绘制结束
////////////*********************************************************************/////////////////////
////////////////////////////**************************////////////////////////////////////////////////
//**************************************************************************//
//***********编写的图形代码都在这,对于初学者,上下暂时都还不用动***********//
//**************************************************************************//
//////////////////////////////////****************************//////////////////////////////////////
//////////////******************************************************************//////////////////
return&TRUE;
//&一切&OK
}
GLvoid&KillGLWindow(GLvoid)
//正常销毁窗口
{
if&(fullscreen)
//&我们处于全屏模式吗?
ChangeDisplaySettings(NULL,0);
//&是的话,切换回桌面
ShowCursor(TRUE);
//&显示鼠标指针
//&我们拥有着色描述表吗?
if&(!wglMakeCurrent(NULL,NULL))
//&我们能否释放DC和RC描述表?
MessageBox(NULL,&Release&Of&DC&And&RC&Failed.&,&SHUTDOWN&ERROR&,MB_OK&|&MB_ICONINFORMATION);
if&(!wglDeleteContext(hRC))
//&我们能否删除RC?
MessageBox(NULL,&Release&Rendering&Context&Failed.&,&SHUTDOWN&ERROR&,MB_OK&|&MB_ICONINFORMATION);
//&将RC设为&NULL
if&(hDC&&&&!ReleaseDC(hWnd,hDC))
//&我们能否释放&DC?
MessageBox(NULL,&Release&Device&Context&Failed.&,&SHUTDOWN&ERROR&,MB_OK&|&MB_ICONINFORMATION);
//&&将&DC&设为&NULL
if&(hWnd&&&&!DestroyWindow(hWnd))
//&能否销毁窗口?
MessageBox(NULL,&Could&Not&Release&hWnd.&,&SHUTDOWN&ERROR&,MB_OK&|&MB_ICONINFORMATION);
hWnd=NULL;
//&将&hWnd&设为&NULL
if&(!UnregisterClass(&OpenGL&,hInstance))
//&能否注销类?
MessageBox(NULL,&Could&Not&Unregister&Class.&,&SHUTDOWN&ERROR&,MB_OK&|&MB_ICONINFORMATION);
hInstance=NULL;
//&将&hInstance&设为&NULL
/* 接下来的代码段创建我们的OpenGL窗口。&&Parameters&Are:
*
&* title
-&Title&To&Appear&At&The&Top&Of&The&Window
*
&* width
-&Width&Of&The&GL&Window&Or&Fullscreen&Mode
*
&* height
-&Height&Of&The&GL&Window&Or&Fullscreen&Mode
-&Number&Of&Bits&To&Use&For&Color&(8/16/24/32)
*
&* fullscreenflag -&Use&Fullscreen&Mode&(TRUE)&Or&Windowed&Mode&(FALSE) */
BOOL&CreateGLWindow(char*&title,&int&width,&int&height,&int&bits,&BOOL&fullscreenflag)
{
//&保存查找匹配的结果
//&窗口类结构
//&扩展窗口风格
//&窗口风格
//&取得矩形的左上角和右下角的坐标值
WindowRect.left=(long)0;
//&将Left&&&设为&0
WindowRect.right=(long)
//&将Right&&设为要求的宽度
WindowRect.top=(long)0;
//&将Top&&&&设为&0
WindowRect.bottom=(long)
//&将Bottom&设为要求的高度
fullscreen=
//&设置全局全屏标志
=&GetModuleHandle(NULL);
//&取得我们窗口的实例
=&CS_HREDRAW&|&CS_VREDRAW&|&CS_OWNDC; //&移动时重画,并为窗口取得DC
wc.lpfnWndProc
=&(WNDPROC)&WndP
//&WndProc处理消息
wc.cbClsExtra
//&无额外窗口数据&Data
wc.cbWndExtra
//&无额外窗口数据
wc.hInstance
//&设置实例
=&LoadIcon(NULL,&IDI_WINLOGO);
//&装入缺省图标
wc.hCursor
=&LoadCursor(NULL,&IDC_ARROW);
//&装入鼠标指针
wc.hbrBackground =&NULL;
//&GL不需要背景
wc.lpszMenuName
//&不需要菜单
wc.lpszClassName =&&OpenGL&;
//&设定类名字
if&(!RegisterClass(&wc))
//&尝试注册窗口类
MessageBox(NULL,&Failed&To&Register&The&Window&Class.&,&ERROR&,MB_OK|MB_ICONEXCLAMATION);
return&FALSE;
//&file://退出并返回FALSE
if&(fullscreen)
//&要尝试全屏模式吗?
DEVMODE&dmScreenS
//&设备模式
memset(&dmScreenSettings,0,sizeof(dmScreenSettings)); //&确保内存分配
dmScreenSettings.dmSize=sizeof(dmScreenSettings);
//&Devmode&结构的大小
dmScreenSettings.dmPelsWidth =&
//&所选屏幕宽度
dmScreenSettings.dmPelsHeight =&
//&所选屏幕高度
dmScreenSettings.dmBitsPerPel =&
//&每象素所选的色彩深度
dmScreenSettings.dmFields=DM_BITSPERPEL|DM_PELSWIDTH|DM_PELSHEIGHT;
//&尝试设置显示模式并返回结果。注:&CDS_FULLSCREEN&移去了状态条。
if&(ChangeDisplaySettings(&dmScreenSettings,CDS_FULLSCREEN)!=DISP_CHANGE_SUCCESSFUL)
//&若模式失败,提供两个选项:退出或在窗口内运行。
if&(MessageBox(NULL,&The&Requested&Fullscreen&Mode&Is&Not&Supported&By\nYour&Video&Card.&Use&Windowed&Mode&Instead?&,&NeHe&GL&,MB_YESNO|MB_ICONEXCLAMATION)==IDYES)
fullscreen=FALSE;
//&&选择窗口模式(Fullscreen=FALSE)
//&如果用户选择退出,弹出消息窗口告知用户程序将结束。并返回FALSE告诉程序窗口未能成功创建。程序退出。
MessageBox(NULL,&Program&Will&Now&Close.&,&ERROR&,MB_OK|MB_ICONSTOP);
return&FALSE;
//&退出并返回&FALSE
if&(fullscreen)
//仍处于全屏模式吗?
dwExStyle=WS_EX_APPWINDOW;
//&扩展窗体风格
dwStyle=WS_POPUP;
//&窗体风格
ShowCursor(FALSE);
//&隐藏鼠标指针
dwExStyle=WS_EX_APPWINDOW&|&WS_EX_WINDOWEDGE;
//&扩展窗体风格
dwStyle=WS_OVERLAPPEDWINDOW;
//&窗体风格
AdjustWindowRectEx(&WindowRect,&dwStyle,&FALSE,&dwExStyle);
//&调整窗口达到真正要求的大小
//&创建windows
if&(!(hWnd=CreateWindowEx( dwExStyle,
//&扩展窗体风格
//&窗口标题
//&选择的窗体属性
WS_CLIPSIBLINGS&|
//&必须的窗体风格属性
WS_CLIPCHILDREN,
//&必须的窗体风格属性
//&&窗口位置
WindowRect.right-WindowRect.left, //&计算调整好的窗口宽度
WindowRect.bottom-WindowRect.top, //&计算调整好的窗口高度
//&无父窗口
hInstance,
//&不向WM_CREATE传递任何东东
KillGLWindow();
//&&重置显示区
MessageBox(NULL,&Window&Creation&Error.&,&ERROR&,MB_OK|MB_ICONEXCLAMATION);
return&FALSE;
//&返回&FALSE
static PIXELFORMATDESCRIPTOR&pfd=
//&pfd&告诉窗口我们所希望的东东
sizeof(PIXELFORMATDESCRIPTOR),
//&file://上诉格式描述符的大小
PFD_DRAW_TO_WINDOW&|
//&格式必须支持窗口
PFD_SUPPORT_OPENGL&|
//&格式必须支持OpenGL
PFD_DOUBLEBUFFER,
//&必须支持双缓冲
PFD_TYPE_RGBA,
//&申请&RGBA&格式//选定的色彩深度(16位、24位、32位)的象素格式
//&选定色彩深度
0,&0,&0,&0,&0,&0,
//&忽略的色彩位
//&无Alpha缓存
//&忽略Shift&Bit
//&无聚集缓存
0,&0,&0,&0,
//&忽略聚集位
//&16位&Z-缓存&(深度缓存)
//&无模板缓存
//&无辅助缓存
PFD_MAIN_PLANE,
//&主绘图层
//&&忽略层遮罩
if&(!(hDC=GetDC(hWnd)))
//&取得设备描述表了么?
KillGLWindow();
//&重置显示区
MessageBox(NULL,&Can't&Create&A&GL&Device&Context.&,&ERROR&,MB_OK|MB_ICONEXCLAMATION);
return&FALSE;
//&返回&FALSE
if&(!(PixelFormat=ChoosePixelFormat(hDC,&pfd))) //&&Windows&找到相应的象素格式了吗?
KillGLWindow();
//&重置显示区
MessageBox(NULL,&Can't&Find&A&Suitable&PixelFormat.&,&ERROR&,MB_OK|MB_ICONEXCLAMATION);
return&FALSE;
//&返回&FALSE
if(!SetPixelFormat(hDC,PixelFormat,&pfd))
//&能够设置象素格式么?
KillGLWindow();
//&重置显示区
MessageBox(NULL,&Can't&Set&The&PixelFormat.&,&ERROR&,MB_OK|MB_ICONEXCLAMATION);
return&FALSE;
//&返回&FALSE
if&(!(hRC=wglCreateContext(hDC)))
//&能否取得着色描述表?
KillGLWindow();
//&&重置显示区
MessageBox(NULL,&Can't&Create&A&GL&Rendering&Context.&,&ERROR&,MB_OK|MB_ICONEXCLAMATION);
return&FALSE;
//&返回&FALSE
if(!wglMakeCurrent(hDC,hRC))
//&尝试激活着色描述表
KillGLWindow();
//&重置显示区
MessageBox(NULL,&Can't&Activate&The&GL&Rendering&Context.&,&ERROR&,MB_OK|MB_ICONEXCLAMATION);
return&FALSE;
//&返回&FALSE
ShowWindow(hWnd,SW_SHOW);
//&显示窗口
SetForegroundWindow(hWnd);
//&略略提高优先级
SetFocus(hWnd);
//&设置键盘的焦点至此窗口
ReSizeGLScene(width,&height);
//&设置透视&GL&屏幕
if&(!InitGL())
//&初始化新建的GL窗口
KillGLWindow();
//&&重置显示区
MessageBox(NULL,&Initialization&Failed.&,&ERROR&,MB_OK|MB_ICONEXCLAMATION);
return&FALSE;
//&返回&FALSE
return&TRUE;
LRESULT&CALLBACK&WndProc( HWND hWnd,
//&窗口的句柄
UINT uMsg,
//&窗口的消息
WPARAM wParam,
//&附加的消息内容
LPARAM lParam)
//&附加的消息内容
{
switch&(uMsg)
//&&检查Windows消息
case&WM_ACTIVATE:
//&监视窗口激活消息
if&(!HIWORD(wParam))
//&检查最小化状态
active=TRUE;
//&程序处于激活状态
active=FALSE;
//&程序不再激活
//&返回消息循环
case&WM_SYSCOMMAND:
//&中断系统命令Intercept&System&Commands
switch&(wParam)
//&检查系统调用Check&System&Calls
case&SC_SCREENSAVE:
//&屏保要运行?
case&SC_MONITORPOWER:
//&显示器要进入节电模式?
//&阻止发生
case&WM_CLOSE:
//&收到Close消息?
PostQuitMessage(0);
//&发出退出消息
case&WM_KEYDOWN:
//&有键按下么?
keys[wParam]&=&TRUE;
//&如果是,设为TRUE
case&WM_KEYUP:
//&有键放开么?
keys[wParam]&=&FALSE;
//&如果是,设为FALSE
case&WM_SIZE:
//&调整OpenGL窗口大小
ReSizeGLScene(LOWORD(lParam),HIWORD(lParam));&&//&LoWord=Width,HiWord=Height
//&向&DefWindowProc传递所有未处理的消息。
return&DefWindowProc(hWnd,uMsg,wParam,lParam);
}
int&WINAPI&WinMain( HINSTANCE hInstance,
HINSTANCE hPrevInstance,
//&前一个实例
lpCmdLine,
//&命令行参数
//&窗口显示状态
{
//&Windowsx消息结构
BOOL done=FALSE;
//&用来退出循环的Bool&变量
//&提示用户选择运行模式
if&(MessageBox(NULL,&Would&You&Like&To&Run&In&Fullscreen&Mode?&,&&Start&FullScreen?&,MB_YESNO|MB_ICONQUESTION)==IDNO)
fullscreen=FALSE;
//&file://窗口模式
//&创建OpenGL窗口
if&(!CreateGLWindow(&NeHe's&OpenGL&Framework&,640,480,16,fullscreen))
//&失败退出
while(!done)
//&保持循环直到&done=TRUE
if&(PeekMessage(&msg,NULL,0,0,PM_REMOVE)) //&有消息在等待吗?
if&(msg.message==WM_QUIT)
//&收到退出消息?
done=TRUE;
//&是,则done=TRUE
//&不是,处理窗口消息
TranslateMessage(&msg);
//&翻译消息
DispatchMessage(&msg);
//&发送消息
//&如果没有消息
//&绘制场景。监视ESC键和来自DrawGLScene()的退出消息
if&(active)
//程序激活的么?
if&(keys[VK_ESCAPE])
//&ESC&按下了么?
done=TRUE;
//&ESC&发出退出信号
//&不是退出的时候,刷新屏幕
DrawGLScene();
//&绘制场景
SwapBuffers(hDC);
//&交换缓存&(双缓存)
if&(keys[VK_F1])
//&F1键按下了么?
keys[VK_F1]=FALSE;
//&若是,使对应的Key数组中的值为&FALSE
KillGLWindow();
//&销毁当前的窗口
fullscreen=!
//&切换&全屏&/&窗口&模式
//&重建&OpenGL&窗口
if&(!CreateGLWindow(&NeHe's&OpenGL&Framework&,640,480,16,fullscreen))
//&如果窗口未能创建,程序退出
//关闭程序
KillGLWindow();
//&销毁窗口
return&(msg.wParam);
//&退出程序
#include "stdafx.h"#include "stdafx.h" #include &GL/glut.h& // void display() { glClear(GL_COLOR_BUFFER_BIT); glBegin(GL_LINES); &&& glColor3f(1.0,1.0,1.0); &&& glVertex2f(1.0,1.0); &&& glColor3f(1.0,0.0,1.0); &&& glVertex2f(1.0,0.5); &&& glVertex2f(0.0,0.0); &&& glVertex2f(0.0,1.0); &&&& glEnd(); glFlush(); } void init() {
glClearColor(0.0,0.0,0.0,0.0);
glColor3f(1.0,1.0,1.0);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(-1.0,1.0,-1.0,1.0); } int main(int argc, char** argv) { glutInit(&argc,argv); glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); glutCreateWindow("sin"); glutInitWindowPosition(0.0,0.0); glutDisplayFunc(display); glutMainLoop(); return 0; } 改过后的,可以运行
加群可以随时交流
登录百度帐号推荐应用
为兴趣而生,贴吧更懂你。或

我要回帖

更多关于 messagebox ok cancel 的文章

 

随机推荐