📄 gameclient.cpp
字号:
#pragma once
#include "extern.h"
#include <commctrl.h>
#define WINDOW_WIDTH 800
#define WINDOW_HEIGHT 600
#define WINDOWS_CLASS_NAME "GameClient"
char g_szWindowsTitle[] = "GameClient";
// 全局变量:
HINSTANCE g_hInstance; // 当前实例
HWND g_hEditWnd = NULL;
LRESULT CALLBACK MainWndProc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK LoadWndProc(HWND, UINT, WPARAM, LPARAM);
bool InitCOREEngine(HWND hWnd,HINSTANCE hInstance,LONG lStyle,RECT &rcWindow);
bool InitGameClient(HWND hWnd);
bool ExitGameClient();
bool ChangeWindows(HWND,bool);
// 时间片
enum TIMER_TYPE
{
TIMER_EXIT = 0,
};
// 程序入口
int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
ATLTRACE("===== Begin Run App: %s =====\n",g_szWindowsTitle);
//_CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
//_CrtSetReportMode( _CRT_ERROR, _CRTDBG_MODE_DEBUG );
////第二次运行时根据内存号来定位有溢出的地方
//_CrtSetBreakAlloc(35451);
MSG msg;
WNDCLASSEX wcex;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_DBLCLKS | CS_OWNDC | CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = (WNDPROC)MainWndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon(hInstance, (LPCTSTR)IDI_GAMECLIENT);
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH/*WHITE_BRUSH*/);
wcex.lpszMenuName = NULL;
wcex.lpszClassName = WINDOWS_CLASS_NAME;
wcex.hIconSm = LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL);
RegisterClassEx(&wcex);
g_hInstance = hInstance;
RECT rcWindow;
rcWindow.left = (GetSystemMetrics(SM_CXSCREEN) - WINDOW_WIDTH)/2;
rcWindow.top = (GetSystemMetrics(SM_CYSCREEN) - WINDOW_HEIGHT)/2;
rcWindow.right = rcWindow.left + WINDOW_WIDTH;
rcWindow.bottom = rcWindow.top + WINDOW_HEIGHT;
DWORD dwWindowStyle =
WS_POPUP | // 窗口可绘制任意位置屏幕上
WS_SYSMENU | // 窗口拥有系统菜单
WS_CLIPSIBLINGS | // 被同级窗口挡住的部分不会重画
WS_CLIPCHILDREN; // 被子窗口挡住的部分不会重画
HWND hWnd = CreateWindowEx(0, WINDOWS_CLASS_NAME, g_szWindowsTitle, dwWindowStyle,
rcWindow.left,rcWindow.top, WINDOW_WIDTH, WINDOW_HEIGHT, NULL, NULL, hInstance, NULL);
if (!hWnd)
return FALSE;
HWND hLoadWnd = CreateDialog(hInstance,(LPCTSTR)IDD_LOADING_DLG,hWnd,(DLGPROC)LoadWndProc);
ResourceManager::m_hLoadWnd = hLoadWnd;
RECT rcLoadWnd;
SIZE sizeLoadWnd;
::GetWindowRect(hLoadWnd,&rcLoadWnd);
sizeLoadWnd.cx = rcLoadWnd.right - rcLoadWnd.left;
sizeLoadWnd.cy = rcLoadWnd.bottom - rcLoadWnd.top;
int nLoadX = (GetSystemMetrics(SM_CXSCREEN) - sizeLoadWnd.cx) / 2;
int nLoadY = (GetSystemMetrics(SM_CYSCREEN) - sizeLoadWnd.cy) / 2;
::SetWindowPos(hLoadWnd,NULL,nLoadX,nLoadY,0,0,SWP_NOZORDER|SWP_NOSIZE|SWP_SHOWWINDOW|SWP_DRAWFRAME);
if(InitCOREEngine(hWnd,hInstance,dwWindowStyle,rcWindow))
{
ShowWindow(hWnd, SW_SHOW);
//ShowWindow(g_hEditWnd, SW_SHOW);
::DestroyWindow(hLoadWnd);
while (GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg); //这句不能去掉,不然会收不到中文输入的回车键
DispatchMessage(&msg);
}
}
ExitGameClient();
ATLTRACE("===== End App: %s =====\n",g_szWindowsTitle);
return (int) 0;
}
void OnCreate(HWND hWnd)
{
DWORD dwStyle = WS_POPUP | WS_TABSTOP | ES_LEFT | ES_AUTOHSCROLL;
DWORD dwStyleEx = WS_EX_LEFT | WS_EX_LTRREADING | WS_EX_RIGHTSCROLLBAR | WS_EX_NOPARENTNOTIFY;
g_hEditWnd = CreateWindowEx(dwStyleEx,"edit","按钮",dwStyle,10,10,100,50,hWnd,NULL,g_hInstance,NULL);
}
LRESULT CALLBACK MainWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static bool bMouseLeave = false;
int xPos,yPos;
RECT rcWnd;
static int abc = 0;
switch (message)
{
//case WM_ACTIVATEAPP:
// if (wParam == TRUE && g_pMainThread)
// {
// EnterCriticalSection(&g_pMainThread->m_CS);
// GetWindowRect(hWnd,&rcWnd);
// GUI::GUIResize(rcWnd);
// LeaveCriticalSection(&g_pMainThread->m_CS);
// }
// return FALSE;
//case WM_SIZE:
// if (wParam == SIZE_RESTORED && g_pMainThread)
// {
// EnterCriticalSection(&g_pMainThread->m_CS);
// GetWindowRect(hWnd,&rcWnd);
// GUI::GUIResize(rcWnd);
// LeaveCriticalSection(&g_pMainThread->m_CS);
// }
// break;
case WM_CTLCOLOREDIT:
{
::SetTextColor((HDC)wParam,RGB(255,0,255));
::SetBkColor((HDC)wParam,RGB(0,0,0));
::SetBkMode((HDC)wParam,TRANSPARENT);
return (LRESULT)GetStockObject(BLACK_BRUSH);
}
break;
case WM_CREATE:
OnCreate(hWnd);
break;
case WM_SYSKEYDOWN:if(wParam==VK_F4){break;}
case WM_SYSKEYUP:
case WM_KEYUP:
case WM_KEYDOWN:
case WM_CHAR:
EnterCriticalSection(&g_pMainThread->m_CS);
g_pGUIRoot->OnKeyboardMsg(message,wParam,lParam);
LeaveCriticalSection(&g_pMainThread->m_CS);
return 0;
// 添加鼠标离开主窗口通知消息
case WM_MOUSELEAVE:
EnterCriticalSection(&g_pMainThread->m_CS);
g_pGUIRoot->DefMouseMoveOut();
LeaveCriticalSection(&g_pMainThread->m_CS);
bMouseLeave =false;
break;
case WM_MOUSEMOVE: ///鼠标移动
if (bMouseLeave == false)
{
bMouseLeave = true;
// 鼠标第一次移入窗口时, 请求一个WM_MOUSELEAVE 消息
TRACKMOUSEEVENT tme;
tme.cbSize = sizeof(tme);
tme.hwndTrack = hWnd;
tme.dwFlags = TME_LEAVE;
_TrackMouseEvent(&tme);
}
case WM_LBUTTONDOWN: ///鼠标左键按下
case WM_LBUTTONUP: ///鼠标左键松开
case WM_LBUTTONDBLCLK: ///鼠标左键双击
case WM_MBUTTONDOWN: ///鼠标左键按下
case WM_MBUTTONUP: ///鼠标左键松开
case WM_MBUTTONDBLCLK: ///鼠标左键双击
case WM_RBUTTONDOWN: ///鼠标左键按下
case WM_RBUTTONUP: ///鼠标左键松开
case WM_RBUTTONDBLCLK: ///鼠标左键双击
EnterCriticalSection(&g_pMainThread->m_CS);
g_pGUIRoot->OnMouseMessage(message,wParam,lParam);
LeaveCriticalSection(&g_pMainThread->m_CS);
return 0;
case WM_MOUSEWHEEL: ///鼠标滚轮
xPos = (short) LOWORD(lParam); //注意:滚轮消息的坐标和其他鼠标消息不一样,它是屏幕坐标,要用的话先换算
yPos = (short) HIWORD(lParam);
GetWindowRect(hWnd,&rcWnd);
xPos -= rcWnd.left;
yPos -= rcWnd.top;
lParam = xPos + (yPos << 16); //换算成窗口坐标
EnterCriticalSection(&g_pMainThread->m_CS);
g_pGUIRoot->OnMouseMessage(message,wParam,lParam);
LeaveCriticalSection(&g_pMainThread->m_CS);
return FALSE;
case CMD_BTN_MIN:
ShowWindow(hWnd,SW_MINIMIZE);
return FALSE;
case CMD_BTN_CLOSE:
GUI::EndGUIEngine();
return FALSE;
case WM_CLOSE:
// 中止线程,进入定时器检查
g_pMainThread->SetActive(false);
g_pMainThread->EndThread();
SetTimer(hWnd,TIMER_EXIT,100,NULL);
return FALSE;
case WM_TIMER:
if (wParam == TIMER_EXIT)
{
// 用定时器检测线程是否真的结束了
if (g_pMainThread->IsEndDone())
{
KillTimer(hWnd,TIMER_EXIT);
DestroyWindow(hWnd);
}
}
return FALSE;
case WM_DESTROY: //销毁
PostQuitMessage(0);
return FALSE;
case WM_MOVE:
{
GetWindowRect(hWnd,&rcWnd);
xPos = rcWnd.left;
yPos = rcWnd.top;
::SetWindowPos(g_hEditWnd,NULL,xPos + 10,yPos + 10,0,0,SWP_NOSIZE/* | SWP_NOZORDER*/);
}
break;
case WM_PAINT:
{
GetWindowRect(hWnd,&rcWnd);
HRGN hRgn = CreateRoundRectRgn(0,0,rcWnd.right-rcWnd.left+1,rcWnd.bottom-rcWnd.top+1,20,20);
SetWindowRgn(hWnd,hRgn,TRUE);
DeleteObject(hRgn);
}
break;
}
return DefWindowProc(hWnd, message, wParam, lParam);
}
LRESULT CALLBACK LoadWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_INITDIALOG:
UpdateWindow(hWnd);
return TRUE;
case WM_CORE_LOADING:
sprintf(g_pBuf,"%s LOADING:%d%%",wParam==0?"TEX":(wParam==1?"SND":"ANI"),lParam);
SetDlgItemText(hWnd,IDC_STATIC_LOADING,g_pBuf);
break;
}
return FALSE;//DefWindowProc(hWnd, message, wParam, lParam);
}
bool InitCOREEngine(HWND hWnd,HINSTANCE hInstance,LONG lStyle,RECT &rcWindow)
{
bool bRet = false;
RECT rcClient;
GetClientRect(hWnd,&rcClient);
///创建引擎核心
g_pCORE = (CORE*)CoreCreate(CORE_VERSION);
if (!g_pCORE)
return false;
ANIObject::InitANIObject(g_pCORE);
///初始化引擎核心
BASECORE init;
init.hWnd = hWnd;
init.nWidth = rcWindow.right - rcWindow.left;
init.nHeight = rcWindow.bottom - rcWindow.top;
init.nBPP = 32;
init.rcWnd = rcWindow;
init.lStyleWnd = lStyle;
BOOL bInit = CoreInitialize(init,"config.ini");
if (!bInit)
return false;
///创建资源管理器
bRet = CreateResourceManager(g_pCORE);
if (!bRet)
return false;
// 加载资源包
char *_lpszResourcePack = g_pCORE->Ini_GetString("CONFIG","PACK","");
bRet = g_pCORE->Resource_AttachPack(_lpszResourcePack);
if (!bRet)
return false;
char *_lpszResourceFile = g_pCORE->Ini_GetString("CONFIG","SCRIPT","");
bRet = LoadResourceFromScript(_lpszResourceFile);
if (!bRet)
return false;
// 卸载资源包
g_pCORE->Resource_RemoveAllPacks();
///创建系统字体(加载项目内部字体纹理资源)
g_pResourceManager->LoadTexFromRC(IDR_SYSFONT_PNG_12,TEXT("SYSFONT"),"font_12.png");
char *_lpszFontCNFile = g_pCORE->Ini_GetString("CONFIG","FONTCN","");
bRet = CreateGUIFont(g_pCORE,_lpszFontCNFile);
if (!bRet)
return bRet;
//if(!ClientSocketInit())
//{
// WriteLog(TRUE,"初始化网络失败,请检查您的网络配置是否正常!");
// return FALSE;
//}
///创建线程
#ifdef _DEBUG
WriteLog(FALSE,"创建工作线程");
#endif
g_pMainThread = new MainThread();
if(NULL == g_pMainThread)
{
WriteLog(TRUE,"无法创建主线程,游戏结束!");
return false;
}
g_pMainThread->SetMainWnd(hWnd);
return InitGameClient(hWnd);
}
bool InitGameClient(HWND hWnd)
{
///创建根对象
g_pGUIRoot = new GUIRoot;
if (!g_pGUIRoot->CreateGUIRoot("RootGUI",0,0,WINDOW_WIDTH,WINDOW_HEIGHT))
{
WriteLog(FALSE,"创建GUIRoot失败");
return false;
}
GUI::InitGUIEngine(g_pCORE,g_pGUIRoot);
if (!g_pGUIRoot->InitGUIRoot())
{
WriteLog(FALSE,"初始化GUIRoot失败");
return false;
}
g_pGUIRoot->ShowTitleBarButton(false,true);
float ClientWidth = g_pGUIRoot->GetClientFrameWidth();
float ClientHeight = g_pGUIRoot->GetClientFrameHeight();
//客户绘制区,游戏中所有的绘制均在此区域中进行
g_pWindowFrame = new WindowFrame;
if (!g_pWindowFrame)
return false;
if (!g_pWindowFrame->CreateWindowFrame("mainback",ClientWidth,ClientHeight,g_pGUIRoot))
return false;
g_pGUIRoot->SetClientFrame(g_pWindowFrame);
///启动线程
g_pMainThread->StartThread();
g_pMainThread->SetActive(TRUE);
return true;
}
bool ExitGameClient()
{
DELETE_OBJECT(g_pGUIRoot);
DELETE_OBJECT(g_pFontCN);
DELETE_OBJECT(g_pResourceManager);
DELETE_OBJECT(g_pMainThread);
CoreDestroy(CORE_VERSION);
return true;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -