`
daojin
  • 浏览: 701785 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

终于搭好了一个游戏的窗口框架(一个调试窗口,一个消息窗口,一个主窗口)

阅读更多
//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_)

 

分享到:
评论

相关推荐

    一个特殊的UI,多子框架窗口

    "一个特殊的UI,多子框架窗口"这个标题暗示了我们需要讨论的是一个具有复杂结构或者独特功能的用户界面,它可能包含多个嵌套的窗口或框架,以提供更丰富、更分层的操作环境。 UI设计的目标是创造直观、美观且高效的...

    搭好的Vue服务器渲染框架,用vue做网站开发、做seo的首选

    最成熟的Vue ssr框架,一个命令就能启动和部署。零侵入开发,跟开发vue纯客户端一模一样。

    安卓游戏—翻窗口源码

    【标题解析】:“安卓游戏—翻窗口源码”这一标题表明了我们讨论的主题是关于一个Android平台的游戏应用程序,而且特别提到了“翻窗口”可能是游戏的核心玩法或特色功能。源码意味着我们将研究的是游戏的编程代码,...

    activity框架资料(搭好的ssm框架,能跑起来的)

    本资源提供的是一个已经搭建好的Activity框架,它包含了完整的SSM配置,业务逻辑代码也已抽离,可以直接运行并进行二次开发。 首先,我们来详细了解一下SSM框架的组成部分: 1. Spring:这是一个全面的Java应用...

    基于LabVIEW搭配 NI Vision模块视觉通用免编程框架来了 轻松玩转视觉小测试 1、框架支持自定义显示窗口的数量 2、框架支持自定义TCP IP通讯的IP和端口号 3、框架支持外部相机硬件

    基于LabVIEW搭配 NI Vision...7、最最最重要的:每个相机视觉流程不需要编程、不需要编程、不需要编程,直接根据封装好的工具进行拖拉配置即可完成一个视觉 ………………功能更多多 不在这一一列举 你们想要的功能都有

    SSH、JPA做项目时搭好的框架

    这是我学习中搭好的框架,有两种:一个是用的SSH,一个是用的JPA+Struts2+Spring,扩展性强,有基础接口,封装了CRUD,下载引入工程即可使用,能用,已经测试了,如果谁有更好的方案,希望可以学习一下!!

    SSM框架简单搭建

    3. **MyBatis框架**:MyBatis是一个持久层框架,它允许开发者编写SQL语句并与Java代码直接交互。MyBatis与Spring结合使用时,可以实现DAO层的事务管理,提高数据访问的灵活性。在MyBatis的配置文件中,我们需要配置...

    Jfina 自搭框架

    【Jfina 自搭框架】是一个基于Java的轻量级开发框架,它的设计目标是简化开发流程,提高开发效率。Jfinal 是一个MVC(Model-View-Controller)架构的实现,它借鉴了Ruby on Rails的许多设计理念,使得Java开发者也能...

    自搭ssh框架

    SSH框架是Java开发中常用的三大框架,分别是Struts、Spring和Hibernate。它们分别负责Web层、业务层和服务层的管理,极大地提高了开发效率和...实践中不断调试和优化,将有助于你更好地掌握SSH框架的使用和背后的原理。

    在PB里实现窗口的多种打开方式

    接着,我们需要在PB应用中创建一个新的主窗口(w_main),并在窗口中添加OLE控制按钮。在插入对象对话框中选择“Insert Control”,在控制类型列表中找到“Window Show Control”,然后点击“OK”。这样,OLE控件就...

    实现像QQ一样,每窗口一个任务

    - MDI(Multi-Document Interface)允许在一个主窗口内打开多个子窗口,通常用于编辑器或IDE等应用,但并不符合QQ的窗口独立需求。 - SDI(Single-Document Interface)每个窗口代表一个单独的任务或文档,更符合...

    Struts2.1.6 Spring2.5.6 Ibaits2.3.4 自己搭一个框架吧

    搭建这样一个框架可以帮助开发者更好地理解和掌握这些技术,同时提高开发效率。下面将详细阐述这三个框架的主要功能和集成方式。 **Struts2.1.6** Struts2 是一款基于MVC(Model-View-Controller)设计模式的开源...

    易语言取任意窗口句柄

    在IT行业中,窗口句柄(Window Handle)是一个重要的概念,特别是在Windows编程中。窗口句柄是Windows操作系统为每个窗口分配的一个唯一标识符,用于区分不同的窗口。开发者可以通过这个句柄来操作特定的窗口,例如...

    最新版本ssh搭好的框架模板

    在这个最新的“最新版本ssh搭好的框架模板”中,我们将会探讨Spring 3、Hibernate 4和Struts2的核心功能和它们如何协同工作。 **Spring框架** Spring是一个全方位的轻量级应用框架,它提供了依赖注入(DI)和面向切...

    一个已经搭好的ssm框架下的JFreeChart项目

    包含SSM的环境配置和里面的增删查改功能,还有JFreeChart的柱状图,饼状图和折线图的实现。JFreeChart已经改成SSM的形式,实现了controller,service的分层,还把复杂的字体设置代码提取到了utils里面,使得...

    易语言仿QQ窗口

    在本项目中,"易语言仿QQ窗口"是指利用易语言编写的一个应用程序,该程序模仿了腾讯QQ的用户界面和某些功能。下面将详细讨论相关知识点。 1. **易语言**:易语言是一种具有图形化编程界面的编程工具,它使用汉字...

    口袋妖怪RMXP用窗口皮肤

    标题中的“口袋妖怪RMXP用窗口皮肤”表明这是一个关于使用角色扮演游戏制作大师(RPG Maker XP,简称RMXP)制作的口袋妖怪同人游戏的资源分享。RMXP是一款流行的、专为非专业开发者设计的游戏开发工具,允许用户通过...

    零配置Struts框架 的一个全新框架

    望愿意开发框架的爱好都能加入群:41229007 零配置Struts框架 action拦截器 自定义ModelAndView 框架开发 提供了参考手册,LMVCDemo project.上手非常快 http://download.csdn.net/source/1373612 源程序

    MatchingGame数字搭配游戏

    "MatchingGame"数字搭配游戏通常涉及到匹配两个或多个相同元素的目标,这需要我们构建一个游戏逻辑系统。在C#中,我们可以创建类来代表游戏中的元素,如数字卡片,包含其值和状态(是否被选中)。通过事件驱动编程,...

    struts spring hibernate ssh 三大框架集成详细步骤 手把手教你搭框架

    Struts是一个开源的MVC框架,负责处理用户请求并展示视图。它通过Action类来控制业务流程,使用ActionForm对象传递请求参数,同时提供了一套强大的标签库简化JSP页面的编写。在SSH集成中,Struts主要作为前端控制器...

Global site tag (gtag.js) - Google Analytics