Files
XCEngine/MVS/Music fluctuations/source/window/Window.cpp

176 lines
4.3 KiB
C++
Raw Normal View History

#include"Window.h"
//app<70><70><EFBFBD><EFBFBD>
Window* Window::currentWindow = nullptr;
Window::Window(Input& p_input):m_input(p_input)
{
//ShowCursor(false);
}
Window::~Window() {}
//<2F><>ע<EFBFBD><D7A2><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><C2BC>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ǿ<EFBFBD>̬<EFBFBD><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
LRESULT CALLBACK Wndproc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
Window::currentWindow->handleMessage(hWnd, message, wParam, lParam);
return(DefWindowProc(hWnd, message, wParam, lParam));
}
bool Window::initWindow(HINSTANCE hInstance, const uint32_t& width, const uint32_t& height) {
currentWindow = this;
mWidth = width;
mHeight = height;
//<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD><CDA3><EFBFBD><EFBFBD><EFBFBD>ע<EFBFBD><D7A2>
registerWindowClass(hInstance);
//<2F><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E5A3AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ
if (!createWindow(hInstance)) {
return false;
}
//<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/*
* DC<EFBFBD><EFBFBD>Device Context <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* ÿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڶ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Լ<EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӳ<EFBFBD><EFBFBD><EFBFBD>mhDC
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڼ<EFBFBD><EFBFBD>ݵ<EFBFBD>DC<EFBFBD><EFBFBD>mCanvasDC
* <EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD>mCanvasDC<EFBFBD><EFBFBD>mhDC<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
mhDC = GetDC(mHwnd);
mCanvasDC = CreateCompatibleDC(mhDC);
BITMAPINFO bmpInfo{};
bmpInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmpInfo.bmiHeader.biWidth = mWidth;
bmpInfo.bmiHeader.biHeight = mHeight;
bmpInfo.bmiHeader.biPlanes = 1;
bmpInfo.bmiHeader.biBitCount = 32;
bmpInfo.bmiHeader.biCompression = BI_RGB; //ʵ<><CAB5><EFBFBD>ϴ洢<CFB4><E6B4A2>ʽΪbgra
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>mhMem<65><6D><EFBFBD>ݵ<EFBFBD>λͼ,<2C><>ʵʵ<CAB5><CAB5>mhMemָ<6D><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϻ<EFBFBD><CFBB><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ڴ棬<DAB4><E6A3AC>mCanvasBufferָ<72><D6B8><EFBFBD><EFBFBD>
mhBmp = CreateDIBSection(mCanvasDC, &bmpInfo, DIB_RGB_COLORS, (void**)&mCanvasBuffer, 0, 0);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFB4B4>buffer<65><72><EFBFBD>ڴ<EFBFBD>
//һ<><D2BB><EFBFBD><EFBFBD><E8B1B8><EFBFBD>Դ<EFBFBD><D4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λͼ<CEBB><CDBC><EFBFBD><EFBFBD><EFBFBD>ʹ<E8B1B8><CAB9>mhBmp<6D><70>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>λͼ<CEBB><CDBC><EFBFBD><EFBFBD>mCanvasDC<44><43><EFBFBD>ڴ濽<DAB4><E6BFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5><EFBFBD>ǿ<EFBFBD><C7BF><EFBFBD><EFBFBD><EFBFBD>mhBmp<6D><70><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
SelectObject(mCanvasDC, mhBmp);
memset(mCanvasBuffer, 0, mWidth * mHeight * 4); //<2F><><EFBFBD><EFBFBD>bufferΪ0
return true;
}
ATOM Window::registerWindowClass(HINSTANCE hInstance)
{
WNDCLASSEXW wndClass;
wndClass.cbSize = sizeof(WNDCLASSEX);
wndClass.style = CS_HREDRAW | CS_VREDRAW; //ˮƽ/<2F><>ֱ<EFBFBD><D6B1>С<EFBFBD><D0A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ػ洰<D8BB><E6B4B0>
wndClass.lpfnWndProc = Wndproc;
wndClass.cbClsExtra = 0;
wndClass.cbWndExtra = 0;
wndClass.hInstance = hInstance; //Ӧ<>ó<EFBFBD><C3B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
wndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);//Ӧ<>ó<EFBFBD><C3B3><EFBFBD>ͼ<EFBFBD><CDBC>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD>ͼ<EFBFBD><CDBC>
wndClass.hCursor = LoadCursor(NULL, IDC_ARROW);//<2F><><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC>
wndClass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);//<2F><><EFBFBD>ڱ<EFBFBD><DAB1><EFBFBD>ɫ
wndClass.lpszMenuName = NULL;
wndClass.lpszClassName = mWindowClassName;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
wndClass.hIconSm = LoadIcon(NULL, IDI_WINLOGO);//<2F><><EFBFBD>ڱ<EFBFBD><DAB1><EFBFBD>ͼ<EFBFBD><CDBC>
return RegisterClassExW(&wndClass);
}
BOOL Window::createWindow(HINSTANCE hInstance)
{
mWindowInst = hInstance;
/*
* WS_POPUP:<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD>߿<EFBFBD>
* WS_OVERLAPPEDWINDOW<EFBFBD><EFBFBD>ӵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>б߿<EFBFBD>
*
* WS_CLIPSIBLINGS:<EFBFBD><EFBFBD><EFBFBD>ֵܴ<EFBFBD><EFBFBD>ڵ<EFBFBD>ס<EFBFBD><EFBFBD><EFBFBD>򲻻<EFBFBD><EFBFBD><EFBFBD>
* WS_CLIPCHILDREN:<EFBFBD><EFBFBD><EFBFBD>Ӵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD>ס<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>򲻻<EFBFBD><EFBFBD><EFBFBD>
*/
auto dwExStyle = WS_EX_APPWINDOW;
auto dwStyle = WS_OVERLAPPEDWINDOW | WS_CLIPSIBLINGS | WS_CLIPCHILDREN;
//<2F><><EFBFBD>ڴ<EFBFBD><DAB4>ڱ<EFBFBD><DAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȣ<EFBFBD><C8A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD>м<EFBFBD><D0BC><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD>С,<2C><><EFBFBD><EFBFBD>PopUp<55>Ĵ<EFBFBD><C4B4><EFBFBD><E5A3AC>û<EFBFBD>б<EFBFBD><D0B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>򲻻<EFBFBD><F2B2BBBB>ı<EFBFBD>
RECT windowRect;
windowRect.left = 0L;
windowRect.top = 0L;
windowRect.right = (long)mWidth;
windowRect.bottom = (long)mHeight;
AdjustWindowRectEx(&windowRect, dwStyle, FALSE, dwExStyle);
mHwnd = CreateWindowW(
mWindowClassName,
(LPCWSTR)"doom", //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
dwStyle,
400,//xλ<78>ã<EFBFBD><C3A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ͻ<EFBFBD>
200,//yλ<79>ã<EFBFBD><C3A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ͻ<EFBFBD>
windowRect.right - windowRect.left,
windowRect.bottom - windowRect.top,
nullptr,//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
nullptr,//<2F>˵<EFBFBD><CBB5><EFBFBD>
hInstance,//<2F><><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5>
nullptr);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (!mHwnd)
{
return FALSE;
}
ShowWindow(mHwnd, true);
UpdateWindow(mHwnd);
return TRUE;
}
void Window::peekMessage() {
MSG msg;
if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
void Window::handleMessage(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
switch (message)
{
case WM_CLOSE:
{
DestroyWindow(hWnd);//<2F>˴<EFBFBD><CBB4><EFBFBD><EFBFBD>ٴ<EFBFBD><D9B4><EFBFBD>,<2C><><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD>WM_DESTROY
break;
}
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hWnd, &ps);
EndPaint(hWnd, &ps);
break;
}
case WM_DESTROY:
{
PostQuitMessage(0);//<2F><><EFBFBD><EFBFBD><EFBFBD>߳<EFBFBD><DFB3><EFBFBD>ֹ<EFBFBD><D6B9><EFBFBD><EFBFBD>
mAlive = false;
break;
}
/*case WM_SIZING:
{
int newWidth = LOWORD(lParam);
int newHeight = HIWORD(lParam);
std::cout<<newWidth<<" "<<newHeight<<std::endl;
}*/
default:
{
m_input.HandelInput(hWnd, message, wParam, lParam);
break;
}
}
}
void Window::swapBuffer() {
BitBlt(mhDC, 0, 0, mWidth, mHeight, mCanvasDC, 0, 0, SRCCOPY);
}