176 lines
4.3 KiB
C++
176 lines
4.3 KiB
C++
|
|
#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);
|
|||
|
|
}
|