C++ miniwin actualizado
Enviado por Juan Pablo Bedoya Benavides • 10 de Junio de 2020 • Práctica o problema • 5.133 Palabras (21 Páginas) • 289 Visitas
/*
* MiniWin: Un mini-conjunto de funciones para abrir una ventana, pintar en
* ella y detectar la presión de algunas teclas. Básicamente para hacer
* juegos sencillos.
*
* (c) Pau Fernández, licencia MIT: http://es.wikipedia.org/wiki/MIT_License
*/
// VERSION: 0.2.2
#if defined(_WIN32)
// Windows ////////////////////////////////////////////////////////////////////////////
#include <fstream>
#include <sstream>
#include <queue>
#include <math.h>
#include <process.h>
#include <windows.h>
#include <windowsx.h>
#define MINIWIN_SOURCE
#include "miniwin.h"
LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);
char szClassName[ ] = "programa palindromos";
// Variables globales //////////////////////////////////////////////////////////
HWND hWnd; // ventana principal
HBITMAP hBitmap; // bitmap para pintar off-screen
int iWidth = 400; // ancho de la ventana
int iHeight = 300; // alto de la ventana
HDC hDCMem = NULL; // Device Context en memoria
std::queue<int> _teclas; // cola de teclas
bool _raton_dentro; // el raton está dentro del 'client area'
int _xraton, _yraton; // posicion del raton
bool _bot_izq, _bot_der;// botones izquierdo y derecho
////////////////////////////////////////////////////////////////////////////////
std::ostream& log() {
#if defined(DEBUG)
static std::ofstream _log("log.txt");
#else
static std::stringstream _log;
_log.str(""); // lo borra
#endif
return _log;
}
VOID Thread(PVOID pvoid) {
Sleep(10); // FIXME
_main_();
}
void maybe_call_main() {
static bool started = false;
if (!started) {
_beginthread(Thread, 0, NULL); // Llama a 'main' (realmente '_main_')
started = true;
}
}
void frame_real(int w, int h, int& rw, int &rh) {
RECT frame = { 0, 0, w, h };
AdjustWindowRect(&frame, WS_POPUPWINDOW, TRUE);
rw = frame.right - frame.left;
rh = frame.bottom - frame.top;
}
void newMemDC(int w, int h) {
if (hDCMem != NULL) {
DeleteObject(hBitmap);
DeleteDC(hDCMem);
}
log() << "New MemDC\n";
HDC hDC = GetDC(hWnd);
hDCMem = CreateCompatibleDC(hDC);
hBitmap = CreateCompatibleBitmap (hDC, w, h);
SelectObject(hDCMem, hBitmap);
SetBkMode(hDCMem, OPAQUE);
}
int WINAPI WinMain (HINSTANCE hThisInstance,
HINSTANCE hPrevInstance,
LPSTR lpszArgument,
int nFunsterStil)
{
static WNDCLASSEX wincl;
wincl.hInstance = hThisInstance;
wincl.lpszClassName = szClassName;
wincl.lpfnWndProc = WindowProcedure;
wincl.style = CS_DBLCLKS;
wincl.cbSize = sizeof (WNDCLASSEX);
wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
wincl.lpszMenuName = NULL;
wincl.cbClsExtra = 10;
wincl.cbWndExtra = 10;
wincl.hbrBackground = (HBRUSH)(COLOR_WINDOW);
if (!RegisterClassEx (&wincl))
return 0;
int w, h;
frame_real(iWidth, iHeight, w, h);
hWnd = CreateWindowEx (
0, /* Extended possibilites for variation */
szClassName, /* Classname */
"MiniWin", /* Title Text */
WS_POPUPWINDOW, /* default window */
-1, /* Windows decides the position */
-1, /* where the window ends up on the screen */
w, /* The programs width */
h, /* and height in pixels */
HWND_DESKTOP, /* The window is a child-window to desktop */
NULL, /* No menu */
hThisInstance, /* Program Instance handler */
NULL /* No Window Creation data */
);
hBitmap = NULL;
ShowWindow (hWnd, nFunsterStil);
MSG messages;
while (GetMessage (&messages, NULL, 0, 0)) {
TranslateMessage(&messages);
DispatchMessage(&messages);
}
return messages.wParam;
}
LRESULT CALLBACK WindowProcedure (HWND hWnd,
UINT message,
WPARAM wParam,
LPARAM lParam)
{
switch (message) {
case WM_SIZE: {
log() << "WM_SIZE\n";
RECT R;
GetClientRect(hWnd, &R);
int w = R.right - R.left;
int h = R.bottom - R.top;
log() << w << ' ' << h << ' ' << '\n';
if (w == 0 && h == 0) break; // Al minimizar envia WM_SIZE(0,0)
if (hDCMem == NULL || w != iWidth || h != iHeight) {
newMemDC(w, h);
maybe_call_main();
}
break;
}
case WM_SIZING: {
RECT* pRECT = (RECT*)lParam;
log() << pRECT->top << ' ' << pRECT->left << ' '
<< pRECT->bottom << ' ' << pRECT->right << '\n';
log() << iHeight << '\n';
int w, h;
frame_real(iWidth, iHeight, w, h);
switch (wParam) {
case WMSZ_BOTTOM:
pRECT->bottom = pRECT->top + h;
break;
...