ClubEnsayos.com - Ensayos de Calidad, Tareas y Monografias
Buscar

C++ miniwin actualizado


Enviado por   •  10 de Junio de 2020  •  Práctica o problema  •  5.133 Palabras (21 Páginas)  •  288 Visitas

Página 1 de 21

/*

* 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;

...

Descargar como (para miembros actualizados) txt (24 Kb) pdf (75 Kb) docx (28 Kb)
Leer 20 páginas más »
Disponible sólo en Clubensayos.com