//Map.cpp #include <StdAfx.h>terrain.cpp:
// terrain.cpp : Defines the entry point for the application. // #include "StdAfx.h" #include "Map.h" #include "Console.h" #include "IO.H" #include <sstream> #include <iostream> #include <stdio.h> static bool IsInit=true; std::wstring reader; using std::wstring; using std::wcout; using std::cout; using std::endl; HWND hWnd=NULL; // 保存 Windows 分配给程序的窗口句柄 HWND hWnd2=NULL; // 保存 Windows 分配给程序的窗口句柄 HWND hConsole; int Width=800; LRESULT WINAPI ght(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam ); int Height=600; //声明消息处理函数 //创建对话框,显示系统消息: LPCTSTR title="游戏初始化中,请稍等"; void InitMessagePrint(LPCWSTR text); LRESULT WINAPI MsgProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam ); LRESULT WINAPI lpDialogFunc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam ); //声明消息循环函数。 void GameLoop(); DWORD WINAPI ThreadFunc( LPVOID lpParam ) { int Width=200; int Height=200; bool fullScreen =TRUE; DWORD dwExStyle; // Window 扩展风格 DWORD dwStyle; // Window 窗口风格 RECT windowRect; // 窗口尺寸 int nX=0,nY=0; int wid=GetSystemMetrics(SM_CXSCREEN); // 获取当前屏幕宽 int hei=GetSystemMetrics(SM_CYSCREEN); // 获取当前屏幕高 nX=0;nY=0; // 计算窗口居中用 dwExStyle=WS_EX_WINDOWEDGE; // 使窗口具有3D外观 dwStyle=WS_BORDER|WS_CAPTION|WS_SYSMENU|WS_MINIMIZEBOX; //创建一个带边框和标题的窗口。 AdjustWindowRectEx(&windowRect,dwStyle,FALSE,dwExStyle); char cc1[]="terrainmessage"; //窗口类 WNDCLASSEX wc1 = { sizeof(WNDCLASSEX), //所有的窗口共用一个设备。 CS_CLASSDC, //消息循环函数 ght, //窗口类额外的存储空间 0L, //窗口实例额外的存储空间。 0L, //获得创建窗口的进程单元句柄(.EXE文件的文件句柄) GetModuleHandle(NULL), // NULL, NULL, NULL, NULL, cc1, NULL }; //注册窗口类 RegisterClassEx( &wc1 ); hWnd2 = CreateWindowEx(NULL,cc1,"我的第一个3D地形程序", dwStyle|WS_CLIPCHILDREN|WS_CLIPSIBLINGS, nX, nY,Width, Height, NULL,NULL,NULL,NULL); // 创建窗口 // PostQuitMessage(0); //显示窗口 ShowWindow( hWnd2, SW_SHOWDEFAULT ); // 显示窗口 //更新窗口 UpdateWindow( hWnd2 ); //消息循环 //消息循环 //窗口2的消息循环。 GameLoop(); //UnregisterClass(cc1, // hInstance //); return 0; } int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { RedirectIOToConsole(); //得到控制台窗口的窗口句柄。 //hConsole=GetConsoleWindow(void); hConsole=FindWindow("ConsoleWindowClass",NULL); //HRGN hRgn=CreateRectRgn(0,0,500,500); //SetWindowRgn(h,hRgn,false); /*********************线程创建**********************/ DWORD dwThreadId, dwThrdParam = 1; HANDLE hThread; //创建线程ID,参数为dwThrdParam; hThread = CreateThread( NULL, // default security attributes 0, // use default stack size ThreadFunc, // thread function &dwThrdParam, // argument to thread function 0, // use default creation flags &dwThreadId); // returns the thread identifier if (hThread == NULL) { printf( "CreateThread failed (%d)\n", GetLastError() ); } else { CloseHandle( hThread ); } //检测窗口是否初始化完毕。 while(IsInit){ Sleep(1); } /************************我们的线程就在这里*********************************/ //The AdjustWindowRectEx function //calculates the required size of the window rectangle, //based on the desired size of the client rectangle. //The window rectangle can then be passed to the CreateWindowEx //function to create a window //whose client area is the desired size. //根据所要求的客户区大小,来创建窗口。 //是否全屏模式。 bool fullScreen =TRUE; DWORD dwExStyle; // Window 扩展风格 DWORD dwStyle; // Window 窗口风格 RECT windowRect; // 窗口尺寸 int nX=0,nY=0; int wid=GetSystemMetrics(SM_CXSCREEN); // 获取当前屏幕宽 int hei=GetSystemMetrics(SM_CYSCREEN); // 获取当前屏幕高 nX=(wid-Width)/2;nY=(hei-Height)/2; // 计算窗口居中用 dwExStyle=WS_EX_APPWINDOW|WS_EX_WINDOWEDGE; // 使窗口具有3D外观 dwStyle=WS_BORDER|WS_CAPTION|WS_SYSMENU|WS_MAXIMIZE|WS_MINIMIZEBOX|WS_MAXIMIZEBOX; //创建一个带边框和标题的窗口。 AdjustWindowRectEx(&windowRect,dwStyle,FALSE,dwExStyle); /* typedef struct { UINT cbSize; UINT style; WNDPROC lpfnWndProc; int cbClsExtra; int cbWndExtra; HINSTANCE hInstance; HICON hIcon; HCURSOR hCursor; HBRUSH hbrBackground; LPCTSTR lpszMenuName; LPCTSTR lpszClassName; HICON hIconSm; } WNDCLASSEX, *PWNDCLASSEX; */ //窗口类名 char cc[]="terrain"; //窗口类 InitMessagePrint(L"注册窗口类"); WNDCLASSEX wc = { sizeof(WNDCLASSEX), //所有的窗口共用一个设备。 CS_CLASSDC, //消息循环函数 MsgProc, //窗口类额外的存储空间 0L, //窗口实例额外的存储空间。 0L, //获得创建窗口的进程单元句柄(.EXE文件的文件句柄) GetModuleHandle(NULL), // NULL, NULL, NULL, NULL, cc, NULL }; RegisterClassEx( &wc ); /*****************************hWnd2用来显示初始消息**************************************/ InitMessagePrint(L"正在创建窗口"); /************************************************************/ hWnd = CreateWindowEx(NULL,cc,"我的第一个3D地形程序", dwStyle|WS_CLIPCHILDREN|WS_CLIPSIBLINGS, nX, nY,Width, Height, NULL,NULL,hInstance,NULL); // 创建窗口 //显示窗口发送 ShowWindow( hWnd, SW_SHOWDEFAULT ); // 显示窗口 //更新窗口 PostThreadMessage(dwThreadId,WM_QUIT,0,0); UpdateWindow( hWnd ); InitMessagePrint(L"正在处理小数点"); //这个时候的消息循环再次发送至第一个窗口类的窗口函数,为什么。 GameLoop(); return; } void GameLoop() { static int i=0; //cout<<i++<<endl; MSG msg; BOOL fMessage; PeekMessage(&msg, NULL, 0U, 0U, PM_NOREMOVE); while(msg.message != WM_QUIT) // 消息循环 { fMessage = PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE); if(fMessage) //有消息 { TranslateMessage(&msg); //对DispatchMessage的深刻理解 //DispatchMessage将不同的消息发往不同的HWND标识的窗口处理函数。 //如果消息的HWND为NULL,那么将发送至所有的属于当前线程的函数。 DispatchMessage(&msg); } } //cout<<"消息循环结束!"<<endl; } LRESULT WINAPI MsgProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam ){ RECT rect; static bool IsInit=true; switch(message) { case WM_PAINT: PAINTSTRUCT ps; HDC hdc= BeginPaint(hWnd,&ps); GetClientRect(hWnd,&rect); Rectangle(hdc,rect.left-1,rect.top-1,rect.right+1,rect.bottom+1); EndPaint(hWnd,&ps); break; } //cout<<"我的事情我做主!"<<endl; // wstring ws=wstring(L"ggggggggggg"); //MyWrite(ws); // InitMessagePrint(L"正在创建窗口"); int state; switch(state){ case START_STATE: break; case WORKING_STATE: break; case END_STATE: break; } if(IsInit==true) { //设置窗口前置。 IsInit=false; SetForegroundWindow( hWnd); } return (DefWindowProc(hWnd, message, wParam, lParam)); } LRESULT WINAPI lpDialogFunc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam ){ switch(message) { case WM_CLOSE: // 关闭窗口 //m_OpenGL->CleanUp(); // 结束处理 PostQuitMessage(0); return 0; } } void InitMessagePrint(LPCWSTR text) { wstring ws=wstring(text); MyWrite(ws); RECT rect; GetClientRect(hWnd2,&rect); InvalidateRect(hWnd2,&rect,true); //这四个参数分别对应MSG结构体中的4个参数。 //也对应于消息处理函数中的四个参数。 } //消息窗口 LRESULT WINAPI ght(HWND hWnd2,UINT message,WPARAM wParam,LPARAM lParam ){ //cout<<"是系统消息么"<<endl; HDC hdc; HBRUSH hBr; RECT rect; switch(message){ case WM_CLOSE: DestroyWindow(hWnd2); // 关闭窗口 //m_OpenGL->CleanUp(); // 结束处理 PostQuitMessage(0); return 0; case WM_PAINT: // ReleaseDC(hWnd2, hdc); // LPSTR k[10]="123456789"; /* char wsz[5] = "aadf"; char the[5]; //char thechar[10]=(char *)wsz; io.write(wsz,5); io.read(the,5); for(int i=0;i<5;i++) { cout<<"daaaaaaaaa"<<the[i]<<"ddddddd"<<endl; } //把单字节转化为多字节: //wchar_t the23[5] =L"1231"; TextOutA(hdc,0,0,(const char *)the,100); */ //ostream& MyWrite(string s); // Paint into this DC //得到客户区坐标 hdc = GetDCEx(hWnd2, (HRGN)1, DCX_INTERSECTRGN); GetClientRect(hWnd2,&rect); Rectangle(hdc,rect.left-1,rect.top-1,rect.right+1,rect.bottom+1); const wchar_t *pchar; // wcout<<L"reader"<<endl; while(MyRead(reader)){ //wcout<<reader; pchar=reader.c_str(); TextOutW(hdc,0,0,pchar,reader.length()); } ReleaseDC(hWnd2,hdc); if(IsInit==true)IsInit=false; break; } return DefWindowProc(hWnd2, message, wParam, lParam); } /* // 注册窗口类 bool fullScreen =TRUE; DWORD dwExStyle; // Window 扩展风格 DWORD dwStyle; // Window 窗口风格 RECT windowRect; // 窗口尺寸 int nX=0,nY=0; dwExStyle=WS_EX_APPWINDOW|WS_EX_WINDOWEDGE; // 使窗口具有3D外观 dwStyle=WS_OVERLAPPEDWINDOW; // 使用标准窗口 //WS_OVERLAPPEDWINDOW是有标题栏,窗口菜单,最大、小化按钮和可调整尺寸的窗口 int wid=GetSystemMetrics(SM_CXSCREEN); // 获取当前屏幕宽 int hei=GetSystemMetrics(SM_CYSCREEN); // 获取当前屏幕高 nX=(wid-Width)/2;nY=(hei-Height)/2; // 计算窗口居中用 //------------------------------------------------------------------- AdjustWindowRectEx(&windowRect,dwStyle,FALSE,dwExStyle); //根据窗口风格来调整窗口尺寸达到要求的大小 char cc[]="tml"; WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L, GetModuleHandle(NULL), NULL, NULL, NULL, NULL, cc, NULL }; RegisterClassEx( &wc ); m_OpenGL=new OpenGL();// hWnd = CreateWindowEx(NULL,cc,"我的第一个3D地形器", dwStyle|WS_CLIPCHILDREN|WS_CLIPSIBLINGS, nX, nY,Width, Height, NULL,NULL,hInst,NULL); // 创建窗口 ShowWindow( hWnd, SW_SHOWDEFAULT ); // 显示窗口 UpdateWindow( hWnd ); // 刷新窗口 GameLoop(); // 进入消息循环 return 0; */
Console.cpp:
//说明:此函数用来在MFC或者WindowsAPP中进行标准输入。 #include < process.h> #include "stdafx.h" #include <errno.h> #include <stdio.h> #include <fcntl.h> #include <io.h> #include <iostream.h> #include <fstream.h> #include "Console.h" #define MAX_CONSOLE_LINES 10; HANDLE g_hConsoleOut; // Handle to debug console // This function dynamically creates a //"Console" window and points stdout and stderr to it. // It also hooks stdin to the window // You must free it later with FreeConsole void RedirectIOToConsole() { int hConHandle; long lStdHandle; CONSOLE_SCREEN_BUFFER_INFO coninfo; FILE *fp; // allocate a console for this app AllocConsole(); // set the screen buffer to be big enough to let us scroll text GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &coninfo); coninfo.dwSize.Y = MAX_CONSOLE_LINES; // How many lines do you want to have in the console buffer SetConsoleScreenBufferSize(GetStdHandle(STD_OUTPUT_HANDLE),coninfo.dwSize); // redirect unbuffered STDOUT to the console g_hConsoleOut = GetStdHandle(STD_OUTPUT_HANDLE); lStdHandle = (long)GetStdHandle(STD_OUTPUT_HANDLE); hConHandle = _open_osfhandle(lStdHandle, _O_TEXT); fp = _fdopen( hConHandle, "w" ); *stdout = *fp; setvbuf( stdout, NULL, _IONBF, 0 ); // redirect unbuffered STDIN to the console lStdHandle = (long)GetStdHandle(STD_INPUT_HANDLE); hConHandle = _open_osfhandle(lStdHandle, _O_TEXT); fp = _fdopen( hConHandle, "r" ); *stdin = *fp; setvbuf( stdin, NULL, _IONBF, 0 ); // redirect unbuffered STDERR to the console lStdHandle = (long)GetStdHandle(STD_ERROR_HANDLE); //把系统的文件句柄转化为c运行库的文件指针 hConHandle = _open_osfhandle(lStdHandle, _O_TEXT); //用write 方法打开文件流 fp = _fdopen( hConHandle, "w" ); //将stderr指向这个文件流。 *stderr = *fp; //第二个参数为NULL,表明没有缓冲区和流相关联。 setvbuf( stderr, NULL, _IONBF, 0 ); SetConsoleTitle("The Console Titlebar Text"); // make cout, wcout, cin, wcin, wcerr, cerr, wclog and clog // point to console as well Uncomment the next line if you are using c++ cio or comment if you don't ios::sync_with_stdio(); }
IO.cpp:
#include "StdAfx.h" #include "IO.H" #include <locale> using std::wstringstream; wstringstream *pBuffer=new wstringstream(); bool MyWrite(std::wstring s) { static bool InitLocal=true; if(InitLocal){ std::locale loc("chs"); pBuffer->imbue(loc); InitLocal=false; } pBuffer->clear(); if((*pBuffer)<<s) { pBuffer->put(L'\n'); return true; } return false; } bool MyRead(std::wstring& s) { if(NULL!=pBuffer) { wchar_t name[256]; pBuffer->clear(); pBuffer->getline(name,256); s=std::wstring(name); // pBuffer->ignore(); if(s.length()>0) { return true; } } return false; }
// stdafx.cpp : source file that includes just the standard includes // terrain.pch will be the pre-compiled header // stdafx.obj will contain the pre-compiled type information #include "stdafx.h" // TODO: reference any additional headers you need in STDAFX.H // and not in this file
Map.h
//常量表示程序的各种状态 //要想使用const必须把头文件包含进去。 //定义全局的cons会造成意想不到的错误。因为重复定义!! const int START_STATE=0; const int END_STATE=1; const int WORKING_STATE=2;
Console.h
#include <stdio.h> #include <fcntl.h> #include <io.h> void RedirectIOToConsole();
//IO.H #ifndef IO_H #define IO_H #include <string> #include <sstream> extern bool MyWrite(std::wstring s); extern bool MyRead(std::wstring& s); #endif
//Map.H //常量表示程序的各种状态 //要想使用const必须把头文件包含进去。 //定义全局的cons会造成意想不到的错误。因为重复定义!! const int START_STATE=0; const int END_STATE=1; const int WORKING_STATE=2;
// stdafx.h : include file for standard system include files, // or project specific include files that are used frequently, but // are changed infrequently // #if !defined(AFX_STDAFX_H__A9DB83DB_A9FD_11D0_BFD1_444553540000__INCLUDED_) #define AFX_STDAFX_H__A9DB83DB_A9FD_11D0_BFD1_444553540000__INCLUDED_ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 #define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers #include <windows.h> // TODO: reference additional headers your program requires here //{{AFX_INSERT_LOCATION}} // Microsoft Visual C++ will insert additional declarations immediately before the previous line. #endif // !defined(AFX_STDAFX_H__A9DB83DB_A9FD_11D0_BFD1_444553540000__INCLUDED_)