parent
486cff7b66
commit
8df2111ed6
@ -0,0 +1,31 @@
|
||||
# Project: ÏîÄ¿1
|
||||
# Makefile created by Dev-C++ 5.11
|
||||
|
||||
CPP = g++.exe -D__DEBUG__
|
||||
CC = gcc.exe -D__DEBUG__
|
||||
WINDRES = windres.exe
|
||||
OBJ = ces.o acllib.o
|
||||
LINKOBJ = ces.o acllib.o
|
||||
LIBS = -L"E:/Dev-Cpp/MinGW64/lib" -L"E:/Dev-Cpp/MinGW64/x86_64-w64-mingw32/lib" -static-libgcc E:/Dev-Cpp/MinGW64/x86_64-w64-mingw32/lib/libwinmm.a E:/Dev-Cpp/MinGW64/x86_64-w64-mingw32/lib/libmsimg32.a E:/Dev-Cpp/MinGW64/x86_64-w64-mingw32/lib/libkernel32.a E:/Dev-Cpp/MinGW64/x86_64-w64-mingw32/lib/libuser32.a E:/Dev-Cpp/MinGW64/x86_64-w64-mingw32/lib/libgdi32.a E:/Dev-Cpp/MinGW64/x86_64-w64-mingw32/lib/libole32.a E:/Dev-Cpp/MinGW64/x86_64-w64-mingw32/lib/liboleaut32.a E:/Dev-Cpp/MinGW64/x86_64-w64-mingw32/lib/libuuid.a -g3
|
||||
INCS = -I"E:/Dev-Cpp/MinGW64/include" -I"E:/Dev-Cpp/MinGW64/x86_64-w64-mingw32/include" -I"E:/Dev-Cpp/MinGW64/lib/gcc/x86_64-w64-mingw32/4.9.2/include"
|
||||
CXXINCS = -I"E:/Dev-Cpp/MinGW64/include" -I"E:/Dev-Cpp/MinGW64/x86_64-w64-mingw32/include" -I"E:/Dev-Cpp/MinGW64/lib/gcc/x86_64-w64-mingw32/4.9.2/include" -I"E:/Dev-Cpp/MinGW64/lib/gcc/x86_64-w64-mingw32/4.9.2/include/c++"
|
||||
BIN = ÏîÄ¿1.exe
|
||||
CXXFLAGS = $(CXXINCS) -g3
|
||||
CFLAGS = $(INCS) -g3
|
||||
RM = rm.exe -f
|
||||
|
||||
.PHONY: all all-before all-after clean clean-custom
|
||||
|
||||
all: all-before $(BIN) all-after
|
||||
|
||||
clean: clean-custom
|
||||
${RM} $(OBJ) $(BIN)
|
||||
|
||||
$(BIN): $(OBJ)
|
||||
$(CC) $(LINKOBJ) -o $(BIN) $(LIBS)
|
||||
|
||||
ces.o: ces.c
|
||||
$(CC) -c ces.c -o ces.o $(CFLAGS)
|
||||
|
||||
acllib.o: acllib.c
|
||||
$(CC) -c acllib.c -o acllib.o $(CFLAGS)
|
@ -0,0 +1,862 @@
|
||||
/*
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
////////////////////////////////////////////////////////////////
|
||||
// ACLLib - Advanced C Lab Library
|
||||
// Ver. 2014-07
|
||||
// For Students' Lab at Zhejiang University
|
||||
// Created 2008 by Gao Yuan
|
||||
// Modified 2009 by Cui Liwei
|
||||
// 2010 by Lan Huidong
|
||||
// Revised 2012 by Li Rui
|
||||
// Modified 2014 by Weng Kai for MOOC
|
||||
////////////////////////////////////////////////////////////////
|
||||
|
||||
#define _CRT_SECURE_NO_WARNINGS
|
||||
#define _CRT_NON_CONFORMING_SWPRINTFS
|
||||
|
||||
#define CINTERFACE
|
||||
|
||||
#ifdef _UNICODE
|
||||
#undef _UNICODE
|
||||
#endif
|
||||
#ifdef UNICODE
|
||||
#undef UNICODE
|
||||
#endif
|
||||
|
||||
#include "acllib.h"
|
||||
|
||||
#include <windows.h>
|
||||
#include <olectl.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#pragma comment(lib,"winmm.lib")
|
||||
#pragma comment(lib,"msimg32.lib")
|
||||
#endif
|
||||
|
||||
#ifdef _DEBUG
|
||||
#define ACL_ASSERT(_Expression,errStr) (void)( (!!(_Expression)) || (acl_error(errStr),0) )
|
||||
#else
|
||||
#define ACL_ASSERT(flag,errStr) ((void)0)
|
||||
#endif
|
||||
|
||||
#define ACL_ASSERT_HWND ACL_ASSERT(g_hWnd!=0, \
|
||||
"You should call function \"initWindow(...)\" befor use function \"" __FUNCTION__ "\"" )
|
||||
#define ACL_ASSERT_BEGIN_PAINT ACL_ASSERT(g_hmemdc!=0, \
|
||||
"You should call function \"beginPaint()\" befor use function \"" __FUNCTION__ "\"" )
|
||||
|
||||
// f
|
||||
int Setup(void);
|
||||
|
||||
const char g_wndClassName[] = "ACL_WND_CLASS";
|
||||
const char g_libName[] = "ACLLIB";
|
||||
|
||||
HINSTANCE g_hInstance;
|
||||
|
||||
HWND g_hWnd = NULL;
|
||||
HDC g_hmemdc = NULL;
|
||||
HBITMAP g_hbitmap = NULL;
|
||||
|
||||
int g_wndHeight;
|
||||
int g_wndWidth;
|
||||
|
||||
HPEN g_pen = NULL;
|
||||
ACL_Color g_penColor = BLACK;
|
||||
int g_penWidth = 1;
|
||||
int g_penStyle = PEN_STYLE_SOLID;
|
||||
|
||||
HBRUSH g_brush = NULL;
|
||||
ACL_Color g_brushColor = BLACK;
|
||||
int g_brushStyle = BRUSH_STYLE_SOLID;
|
||||
|
||||
HFONT g_font = NULL;
|
||||
char g_fontName[256] = "ËÎÌå";
|
||||
int g_textSize = 12;
|
||||
ACL_Color g_textColor = BLACK;
|
||||
ACL_Color g_textBkColor = WHITE;
|
||||
|
||||
int g_caretHeight = 12;
|
||||
int g_caretWidth = 6;
|
||||
int g_caretX = 0;
|
||||
int g_caretY = 0;
|
||||
|
||||
int g_soundID = 0;
|
||||
|
||||
KeyboardEventCallback g_keyboard = NULL;
|
||||
MouseEventCallback g_mouse = NULL;
|
||||
TimerEventCallback g_timer = NULL;
|
||||
CharEventCallback g_char = NULL;
|
||||
|
||||
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
|
||||
|
||||
//
|
||||
void acl_error(char *errStr)
|
||||
{
|
||||
MessageBoxA(g_hWnd,errStr,g_libName,MB_ICONERROR);
|
||||
exit(0);
|
||||
}
|
||||
|
||||
//
|
||||
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
|
||||
{
|
||||
MSG msg;
|
||||
WNDCLASSA wndclass;
|
||||
|
||||
g_hInstance = hInstance;
|
||||
g_hWnd = NULL;
|
||||
g_keyboard = NULL;
|
||||
g_mouse = NULL;
|
||||
g_timer = NULL;
|
||||
|
||||
wndclass.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC | CS_DBLCLKS;
|
||||
wndclass.lpfnWndProc = WndProc;
|
||||
wndclass.cbClsExtra = 0;
|
||||
wndclass.cbWndExtra = 0;
|
||||
wndclass.hInstance = hInstance;
|
||||
wndclass.hInstance = hInstance;
|
||||
wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION);
|
||||
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW);
|
||||
wndclass.hbrBackground = (HBRUSH) GetStockObject (BLACK_BRUSH);
|
||||
wndclass.lpszMenuName = NULL;
|
||||
wndclass.lpszClassName = g_wndClassName;
|
||||
|
||||
if (!RegisterClassA(&wndclass))
|
||||
{
|
||||
MessageBoxA(NULL, "This program requires Windows NT!", g_libName, MB_ICONERROR);
|
||||
return 0;
|
||||
}
|
||||
|
||||
Setup();
|
||||
|
||||
ACL_ASSERT(g_hWnd,"You must call \"initWindow(...)\" in Main()");
|
||||
|
||||
while (GetMessage(&msg, NULL, 0, 0))
|
||||
{
|
||||
TranslateMessage (&msg);
|
||||
DispatchMessage (&msg);
|
||||
}
|
||||
return msg.wParam;
|
||||
}
|
||||
|
||||
//
|
||||
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
switch (message)
|
||||
{
|
||||
case WM_CREATE:
|
||||
{
|
||||
HDC hdc;
|
||||
hdc = GetDC(hwnd);
|
||||
g_hbitmap = CreateCompatibleBitmap(
|
||||
hdc, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN));
|
||||
g_hmemdc = CreateCompatibleDC(hdc);
|
||||
SelectObject(g_hmemdc, g_hbitmap);
|
||||
BitBlt(g_hmemdc,
|
||||
0, 0,
|
||||
GetSystemMetrics(SM_CXSCREEN),
|
||||
GetSystemMetrics(SM_CYSCREEN),
|
||||
g_hmemdc,
|
||||
0, 0,
|
||||
WHITENESS);
|
||||
DeleteDC(g_hmemdc);
|
||||
ReleaseDC(hwnd, hdc);
|
||||
|
||||
CreateCaret(hwnd,0,g_caretWidth,g_caretHeight);
|
||||
g_caretX = g_wndWidth;
|
||||
g_caretY = g_wndHeight;
|
||||
SetCaretPos(g_caretX,g_caretY);
|
||||
|
||||
break;
|
||||
}
|
||||
case WM_ERASEBKGND:
|
||||
break;
|
||||
case WM_PAINT:
|
||||
{
|
||||
HDC hdc;
|
||||
PAINTSTRUCT ps;
|
||||
RECT rect;
|
||||
|
||||
hdc = BeginPaint(hwnd, &ps);
|
||||
g_hmemdc = CreateCompatibleDC(hdc);
|
||||
SelectObject(g_hmemdc, g_hbitmap);
|
||||
GetClientRect(hwnd,&rect);
|
||||
BitBlt(hdc, 0, 0, rect.right - rect.left,
|
||||
rect.bottom - rect.top, g_hmemdc, 0, 0, SRCCOPY);
|
||||
DeleteDC(g_hmemdc);
|
||||
g_hmemdc = 0;
|
||||
EndPaint(hwnd,&ps);
|
||||
break;
|
||||
}
|
||||
case WM_CHAR:
|
||||
if (g_char != NULL)
|
||||
g_char((char) wParam);
|
||||
break;
|
||||
|
||||
case WM_KEYDOWN:
|
||||
if (g_keyboard != NULL)
|
||||
g_keyboard((int) wParam,KEY_DOWN);
|
||||
break;
|
||||
|
||||
case WM_KEYUP:
|
||||
if(g_keyboard != NULL)
|
||||
g_keyboard((int) wParam,KEY_UP);
|
||||
break;
|
||||
|
||||
case WM_LBUTTONDOWN:
|
||||
if (g_mouse != NULL)
|
||||
g_mouse((int) LOWORD(lParam), (int) HIWORD(lParam), LEFT_BUTTON, BUTTON_DOWN);
|
||||
break;
|
||||
|
||||
case WM_LBUTTONUP:
|
||||
if (g_mouse != NULL)
|
||||
g_mouse((int) LOWORD(lParam), (int) HIWORD(lParam), LEFT_BUTTON, BUTTON_UP);
|
||||
break;
|
||||
|
||||
case WM_LBUTTONDBLCLK:
|
||||
if (g_mouse != NULL)
|
||||
g_mouse((int) LOWORD(lParam), (int) HIWORD(lParam), LEFT_BUTTON, BUTTON_DOUBLECLICK);
|
||||
break;
|
||||
|
||||
case WM_MBUTTONDOWN:
|
||||
if (g_mouse != NULL)
|
||||
g_mouse((int) LOWORD(lParam), (int) HIWORD(lParam), MIDDLE_BUTTON, BUTTON_DOWN);
|
||||
break;
|
||||
|
||||
case WM_MBUTTONUP:
|
||||
if (g_mouse != NULL)
|
||||
g_mouse((int) LOWORD(lParam), (int) HIWORD(lParam), MIDDLE_BUTTON, BUTTON_UP);
|
||||
break;
|
||||
|
||||
case WM_MBUTTONDBLCLK:
|
||||
if (g_mouse != NULL)
|
||||
g_mouse((int) LOWORD(lParam), (int) HIWORD(lParam), MIDDLE_BUTTON, BUTTON_DOUBLECLICK);
|
||||
break;
|
||||
|
||||
case WM_RBUTTONDOWN:
|
||||
if (g_mouse != NULL)
|
||||
g_mouse((int) LOWORD(lParam), (int) HIWORD(lParam), RIGHT_BUTTON, BUTTON_DOWN);
|
||||
break;
|
||||
|
||||
case WM_RBUTTONUP:
|
||||
if (g_mouse != NULL)
|
||||
g_mouse((int) LOWORD(lParam), (int) HIWORD(lParam), RIGHT_BUTTON, BUTTON_UP);
|
||||
break;
|
||||
|
||||
case WM_RBUTTONDBLCLK:
|
||||
if (g_mouse != NULL)
|
||||
g_mouse((int) LOWORD(lParam), (int) HIWORD(lParam), RIGHT_BUTTON, BUTTON_DOUBLECLICK);
|
||||
break;
|
||||
|
||||
case WM_MOUSEMOVE:
|
||||
if(g_mouse != NULL)
|
||||
g_mouse((int) LOWORD(lParam), (int) HIWORD(lParam), MOUSEMOVE, MOUSEMOVE);
|
||||
break;
|
||||
|
||||
case WM_MOUSEWHEEL:
|
||||
if(g_mouse == NULL)
|
||||
break;
|
||||
if(HIWORD(wParam) == 120)
|
||||
g_mouse((int) LOWORD(lParam), (int) HIWORD(lParam),MIDDLE_BUTTON,ROLL_UP);
|
||||
else if(HIWORD(wParam)==65416)
|
||||
g_mouse((int) LOWORD(lParam), (int) HIWORD(lParam),MIDDLE_BUTTON,ROLL_DOWN);
|
||||
break;
|
||||
|
||||
case WM_TIMER:
|
||||
if (g_timer != NULL)
|
||||
g_timer(wParam);
|
||||
break;
|
||||
|
||||
case WM_DESTROY:
|
||||
DeleteObject(g_hbitmap);
|
||||
PostQuitMessage(0);
|
||||
break;
|
||||
default:
|
||||
return DefWindowProc(hwnd, message, wParam, lParam);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
//
|
||||
void initWindow(const char *wndName, int x, int y, int width, int height)
|
||||
{
|
||||
RECT rect;
|
||||
|
||||
ACL_ASSERT(!g_hWnd,"Don't call initWindow twice");
|
||||
|
||||
g_wndHeight = height;
|
||||
g_wndWidth = width;
|
||||
|
||||
if(x==DEFAULT || y==DEFAULT)
|
||||
x=y=CW_USEDEFAULT;
|
||||
|
||||
g_hWnd = CreateWindowA (
|
||||
g_wndClassName, wndName,
|
||||
WS_OVERLAPPEDWINDOW & ~WS_MAXIMIZEBOX & ~WS_SIZEBOX,
|
||||
x, y,
|
||||
width, height,
|
||||
NULL, NULL, 0, NULL) ;
|
||||
|
||||
if(!g_hWnd)
|
||||
{
|
||||
MessageBoxA(NULL,"Fail to create window",g_libName,MB_ICONERROR);
|
||||
exit(0);
|
||||
}
|
||||
GetClientRect(g_hWnd,&rect);
|
||||
width += width - (rect.right-rect.left);
|
||||
height += height - (rect.bottom-rect.top);
|
||||
SetWindowPos(g_hWnd,HWND_TOP,0,0,width,height,SWP_NOMOVE);
|
||||
|
||||
ShowWindow (g_hWnd,1);
|
||||
UpdateWindow (g_hWnd);
|
||||
}
|
||||
|
||||
void initConsole(void)
|
||||
{
|
||||
AllocConsole();
|
||||
freopen("CONIN$", "r+t", stdin);
|
||||
freopen("CONOUT$", "w+t", stdout);
|
||||
}
|
||||
|
||||
void msgBox(const char title[],const char text[],int flag)
|
||||
{
|
||||
ACL_ASSERT_HWND;
|
||||
MessageBoxA(g_hWnd,text,title,flag);
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
void updatePen();
|
||||
void updateBrush();
|
||||
void updateFont();
|
||||
|
||||
//
|
||||
void beginPaint()
|
||||
{
|
||||
HDC hdc;
|
||||
|
||||
ACL_ASSERT_HWND;
|
||||
|
||||
hdc = GetDC(g_hWnd);
|
||||
g_hmemdc = CreateCompatibleDC(hdc);
|
||||
SelectObject(g_hmemdc,g_hbitmap);
|
||||
|
||||
updatePen();
|
||||
updateBrush();
|
||||
updateFont();
|
||||
setTextColor(g_textColor);
|
||||
setTextBkColor(g_textBkColor);
|
||||
}
|
||||
|
||||
void endPaint()
|
||||
{
|
||||
DeleteDC(g_hmemdc);
|
||||
g_hmemdc = 0;
|
||||
InvalidateRect(g_hWnd,0,0);
|
||||
|
||||
DeleteObject(g_pen);
|
||||
DeleteObject(g_brush);
|
||||
DeleteObject(g_font);
|
||||
g_pen = NULL;
|
||||
g_brush = NULL;
|
||||
g_font = NULL;
|
||||
}
|
||||
|
||||
void clearDevice(void)
|
||||
{
|
||||
ACL_ASSERT_BEGIN_PAINT;
|
||||
BitBlt(
|
||||
g_hmemdc,
|
||||
0, 0,
|
||||
GetSystemMetrics(SM_CXSCREEN),
|
||||
GetSystemMetrics(SM_CYSCREEN) ,
|
||||
g_hmemdc,
|
||||
0, 0,
|
||||
WHITENESS);
|
||||
}
|
||||
|
||||
void updatePen()
|
||||
{
|
||||
if(g_pen)DeleteObject(g_pen);
|
||||
if(g_penColor==EMPTY)
|
||||
g_pen = (HPEN)GetStockObject(NULL_PEN);
|
||||
else
|
||||
g_pen = CreatePen(g_penStyle,g_penWidth,g_penColor);
|
||||
SelectObject(g_hmemdc,g_pen);
|
||||
}
|
||||
|
||||
void updateBrush()
|
||||
{
|
||||
if(g_brush)DeleteObject(g_brush);
|
||||
if(g_brushColor==EMPTY)
|
||||
{
|
||||
g_brush = (HBRUSH)GetStockObject(NULL_BRUSH);
|
||||
}
|
||||
else
|
||||
{
|
||||
if(g_brushStyle==BRUSH_STYLE_SOLID)
|
||||
g_brush = CreateSolidBrush(g_brushColor);
|
||||
else
|
||||
g_brush = CreateHatchBrush(g_brushStyle,g_brushColor);
|
||||
}
|
||||
SelectObject(g_hmemdc,g_brush);
|
||||
}
|
||||
|
||||
void updateFont()
|
||||
{
|
||||
if(g_font)DeleteObject(g_font);
|
||||
g_font = CreateFontA(
|
||||
g_textSize,
|
||||
0,
|
||||
0,0,700,0,0,0,0,0,0,0,0,g_fontName);
|
||||
SelectObject(g_hmemdc,g_font);
|
||||
}
|
||||
|
||||
void setPenColor(ACL_Color newColor)
|
||||
{
|
||||
ACL_ASSERT_BEGIN_PAINT;
|
||||
g_penColor = newColor;
|
||||
updatePen();
|
||||
}
|
||||
|
||||
void setPenWidth(int width)
|
||||
{
|
||||
ACL_ASSERT_BEGIN_PAINT;
|
||||
g_penWidth = width;
|
||||
updatePen();
|
||||
}
|
||||
|
||||
void setPenStyle(ACL_Pen_Style newStyle)
|
||||
{
|
||||
ACL_ASSERT_BEGIN_PAINT;
|
||||
|
||||
switch(newStyle)
|
||||
{
|
||||
case PEN_STYLE_SOLID:
|
||||
g_penStyle = PS_SOLID; break;
|
||||
case PEN_STYLE_DASH:
|
||||
g_penStyle = PS_DASH; break;
|
||||
case PEN_STYLE_DOT:
|
||||
g_penStyle = PS_DOT; break;
|
||||
case PEN_STYLE_DASHDOT:
|
||||
g_penStyle = PS_DASHDOT; break;
|
||||
case PEN_STYLE_DASHDOTDOT:
|
||||
g_penStyle = PS_DASHDOTDOT; break;
|
||||
case PEN_STYLE_NULL:
|
||||
g_penStyle = -1;
|
||||
setPenColor(EMPTY);
|
||||
return;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
updatePen();
|
||||
}
|
||||
|
||||
void setBrushColor(ACL_Color newColor)
|
||||
{
|
||||
ACL_ASSERT_BEGIN_PAINT;
|
||||
g_brushColor = newColor;
|
||||
updateBrush();
|
||||
}
|
||||
|
||||
void setBrushStyle(ACL_Brush_Style newStyle)
|
||||
{
|
||||
ACL_ASSERT_BEGIN_PAINT;
|
||||
|
||||
switch(newStyle)
|
||||
{
|
||||
case BRUSH_STYLE_SOLID:
|
||||
g_brushStyle = BRUSH_STYLE_SOLID; break;
|
||||
case BRUSH_STYLE_HORIZONTAL:
|
||||
g_brushStyle = HS_HORIZONTAL; break;
|
||||
case BRUSH_STYLE_VERTICAL:
|
||||
g_brushStyle = HS_VERTICAL; break;
|
||||
case BRUSH_STYLE_FDIAGONAL:
|
||||
g_brushStyle = HS_FDIAGONAL; break;
|
||||
case BRUSH_STYLE_BDIAGONAL:
|
||||
g_brushStyle = HS_BDIAGONAL; break;
|
||||
case BRUSH_STYLE_CROSS:
|
||||
g_brushStyle = HS_CROSS; break;
|
||||
case BRUSH_STYLE_DIAGCROSS:
|
||||
g_brushStyle = HS_DIAGCROSS; break;
|
||||
case BRUSH_STYLE_NULL:
|
||||
g_brushStyle = BRUSH_STYLE_SOLID;
|
||||
setBrushColor(EMPTY);
|
||||
return;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
updateBrush();
|
||||
}
|
||||
|
||||
void setTextColor(ACL_Color color)
|
||||
{
|
||||
ACL_ASSERT_BEGIN_PAINT;
|
||||
ACL_ASSERT(color!=EMPTY,"text color can not be EMPTY");
|
||||
g_textColor = color;
|
||||
SetTextColor(g_hmemdc,color);
|
||||
}
|
||||
|
||||
void setTextBkColor(ACL_Color color)
|
||||
{
|
||||
ACL_ASSERT_BEGIN_PAINT;
|
||||
g_textBkColor = color;
|
||||
if(color == EMPTY)
|
||||
SetBkMode(g_hmemdc,TRANSPARENT);
|
||||
else
|
||||
{
|
||||
SetBkMode(g_hmemdc,OPAQUE);
|
||||
SetBkColor(g_hmemdc,color);
|
||||
}
|
||||
}
|
||||
|
||||
void setTextSize(int size)
|
||||
{
|
||||
ACL_ASSERT_BEGIN_PAINT;
|
||||
g_textSize = size;
|
||||
updateFont();
|
||||
}
|
||||
|
||||
void setTextFont(const char *pfn)
|
||||
{
|
||||
size_t len;
|
||||
ACL_ASSERT_BEGIN_PAINT;
|
||||
len = strlen(pfn);
|
||||
strcpy(g_fontName,pfn);
|
||||
updateFont();
|
||||
}
|
||||
|
||||
void paintText(int x, int y, const char *textstring)
|
||||
{
|
||||
ACL_ASSERT_BEGIN_PAINT;
|
||||
TextOutA(g_hmemdc, x, y, textstring, strlen(textstring));
|
||||
}
|
||||
|
||||
void putPixel(int x, int y, ACL_Color color)
|
||||
{
|
||||
ACL_ASSERT_BEGIN_PAINT;
|
||||
SetPixel(g_hmemdc, x, y, color);
|
||||
}
|
||||
|
||||
ACL_Color getPixel(int x, int y)
|
||||
{
|
||||
ACL_ASSERT_BEGIN_PAINT;
|
||||
return GetPixel(g_hmemdc, x, y);
|
||||
}
|
||||
|
||||
int getWidth(void)
|
||||
{
|
||||
RECT rect;
|
||||
GetClientRect(g_hWnd, &rect);
|
||||
return rect.right;
|
||||
}
|
||||
|
||||
int getHeight(void)
|
||||
{
|
||||
RECT rect;
|
||||
GetClientRect(g_hWnd, &rect);
|
||||
return rect.bottom;
|
||||
}
|
||||
|
||||
int getX(void)
|
||||
{
|
||||
POINT point;
|
||||
ACL_ASSERT_BEGIN_PAINT;
|
||||
GetCurrentPositionEx(g_hmemdc, &point);
|
||||
return (int) point.x;
|
||||
}
|
||||
|
||||
int getY(void)
|
||||
{
|
||||
POINT point;
|
||||
ACL_ASSERT_BEGIN_PAINT;
|
||||
GetCurrentPositionEx(g_hmemdc, &point);
|
||||
return (int) point.y;
|
||||
}
|
||||
|
||||
void moveTo(int x, int y)
|
||||
{
|
||||
ACL_ASSERT_BEGIN_PAINT;
|
||||
MoveToEx(g_hmemdc, x, y,NULL);
|
||||
}
|
||||
|
||||
void moveRel(int dx, int dy)
|
||||
{
|
||||
POINT point;
|
||||
ACL_ASSERT_BEGIN_PAINT;
|
||||
GetCurrentPositionEx(g_hmemdc, &point);
|
||||
MoveToEx(g_hmemdc, (int) point.x + dx, (int) point.y + dy,NULL);
|
||||
}
|
||||
|
||||
// Lines and Curves
|
||||
void arc(int x1,int y1,int x2,int y2,int x3,int y3,int x4,int y4)
|
||||
{
|
||||
ACL_ASSERT_BEGIN_PAINT;
|
||||
Arc(g_hmemdc,x1,y1,x2,y2,x3,y3,x4,y4);
|
||||
}
|
||||
|
||||
void line(int x0, int y0, int x1, int y1)
|
||||
{
|
||||
POINT point;
|
||||
ACL_ASSERT_BEGIN_PAINT;
|
||||
GetCurrentPositionEx(g_hmemdc, &point);
|
||||
MoveToEx(g_hmemdc, x0, y0, NULL);
|
||||
LineTo(g_hmemdc, x1, y1);
|
||||
MoveToEx(g_hmemdc,point.x,point.y,NULL);
|
||||
}
|
||||
|
||||
void lineTo(int x, int y)
|
||||
{
|
||||
ACL_ASSERT_BEGIN_PAINT;
|
||||
LineTo(g_hmemdc, x, y);
|
||||
}
|
||||
|
||||
void lineRel(int dx, int dy)
|
||||
{
|
||||
POINT point;
|
||||
ACL_ASSERT_BEGIN_PAINT;
|
||||
GetCurrentPositionEx(g_hmemdc, &point);
|
||||
LineTo(g_hmemdc, (int) point.x + dx, (int) point.y + dy);
|
||||
}
|
||||
|
||||
void polyBezier(const POINT *lppt,int cPoints)
|
||||
{
|
||||
PolyBezier(g_hmemdc,lppt,cPoints);
|
||||
}
|
||||
|
||||
void polyLine(const POINT *lppt, int cPoints)
|
||||
{
|
||||
Polyline(g_hmemdc,lppt,cPoints);
|
||||
}
|
||||
|
||||
// Filled Shapes
|
||||
void chrod(int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4)
|
||||
{
|
||||
ACL_ASSERT_BEGIN_PAINT;
|
||||
Chord(g_hmemdc,x1, y1, x2, y2, x3, y3, x4, y4);
|
||||
}
|
||||
|
||||
void ellipse(int left,int top,int right, int bottom)
|
||||
{
|
||||
ACL_ASSERT_BEGIN_PAINT;
|
||||
Ellipse(g_hmemdc,left,top,right,bottom);
|
||||
}
|
||||
|
||||
void pie(int left, int top, int right, int bottom, int xr1, int yr1, int xr2, int yr2)
|
||||
{
|
||||
ACL_ASSERT_BEGIN_PAINT;
|
||||
Pie(g_hmemdc,left,top,right,bottom,xr1,yr1,xr2,yr2);
|
||||
}
|
||||
|
||||
void polygon(const POINT *apt,int cpt)
|
||||
{
|
||||
ACL_ASSERT_BEGIN_PAINT;
|
||||
Polygon(g_hmemdc,apt,cpt);
|
||||
}
|
||||
|
||||
void rectangle(int left,int top,int right,int bottom)
|
||||
{
|
||||
ACL_ASSERT_BEGIN_PAINT;
|
||||
Rectangle(g_hmemdc,left,top,right,bottom);
|
||||
}
|
||||
|
||||
void roundrect(int left,int top,int right,int bottom,int width,int height)
|
||||
{
|
||||
ACL_ASSERT_BEGIN_PAINT;
|
||||
RoundRect(g_hmemdc,left,top,right,bottom,width,height);
|
||||
}
|
||||
|
||||
void polyline(POINT *apt,int cpt)
|
||||
{
|
||||
ACL_ASSERT_BEGIN_PAINT;
|
||||
Polyline(g_hmemdc,apt,cpt);
|
||||
}
|
||||
|
||||
|
||||
void putImage(ACL_Image *pImage, int x, int y)
|
||||
{
|
||||
HDC hbitmapdc;
|
||||
ACL_ASSERT_BEGIN_PAINT;
|
||||
hbitmapdc = CreateCompatibleDC(g_hmemdc);
|
||||
SelectObject(hbitmapdc, pImage->hbitmap);
|
||||
BitBlt(g_hmemdc, x, y, pImage->width, pImage->height, hbitmapdc,0,0,SRCCOPY);
|
||||
DeleteDC(hbitmapdc);
|
||||
}
|
||||
|
||||
void putImageScale(ACL_Image *pImage,int x,int y,int width,int height)
|
||||
{
|
||||
HDC hbitmapdc;
|
||||
ACL_ASSERT_BEGIN_PAINT;
|
||||
hbitmapdc = CreateCompatibleDC(g_hmemdc);
|
||||
SelectObject(hbitmapdc, pImage->hbitmap);
|
||||
if(width == -1)width = pImage->width;
|
||||
if(height == -1)height = pImage->height;
|
||||
SetStretchBltMode(g_hmemdc,COLORONCOLOR);
|
||||
StretchBlt( g_hmemdc,x,y,width,height,hbitmapdc,0,0,pImage->width,pImage->height,SRCCOPY);
|
||||
DeleteDC(hbitmapdc);
|
||||
}
|
||||
|
||||
void putImageTransparent(ACL_Image *pImage,int x,int y,int width,int height, ACL_Color bkColor)
|
||||
{
|
||||
HDC hbitmapdc;
|
||||
ACL_ASSERT_BEGIN_PAINT;
|
||||
hbitmapdc = CreateCompatibleDC(g_hmemdc);
|
||||
SelectObject(hbitmapdc, pImage->hbitmap);
|
||||
if(width == -1)width = pImage->width;
|
||||
if(height == -1)height = pImage->height;
|
||||
//SetStretchBltMode(g_hmemdc,COLORONCOLOR);
|
||||
TransparentBlt(g_hmemdc,x,y,width,height,hbitmapdc,0,0,pImage->width,pImage->height,bkColor);
|
||||
DeleteDC(hbitmapdc);
|
||||
}
|
||||
|
||||
void loadImage(const char *image, ACL_Image *mapbuf)
|
||||
{
|
||||
HDC hmapdc;
|
||||
IPicture *ipicture;
|
||||
IStream *istream;
|
||||
DWORD filesize = 0, bytes;
|
||||
OLE_XSIZE_HIMETRIC width;
|
||||
OLE_YSIZE_HIMETRIC height;
|
||||
HANDLE file = NULL;
|
||||
HGLOBAL global = NULL;
|
||||
LPVOID data = NULL;
|
||||
|
||||
ACL_ASSERT_HWND;
|
||||
|
||||
file = CreateFileA(image, GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL, NULL);
|
||||
if(file == INVALID_HANDLE_VALUE)
|
||||
acl_error("Fail to load image, File not exist");
|
||||
filesize = GetFileSize(file, NULL);
|
||||
|
||||
global = GlobalAlloc(GMEM_MOVEABLE, filesize);
|
||||
data = GlobalLock(global);
|
||||
ReadFile(file, data, filesize, &bytes, NULL);
|
||||
GlobalUnlock(global);
|
||||
CreateStreamOnHGlobal(global, TRUE, &istream);
|
||||
|
||||
OleLoadPicture(istream, filesize, TRUE, &IID_IPicture, (LPVOID*)&ipicture);
|
||||
ipicture->lpVtbl->get_Width(ipicture, &width);
|
||||
ipicture->lpVtbl->get_Height(ipicture, &height);
|
||||
|
||||
mapbuf->width = (int)(width / 26.45833333333);
|
||||
mapbuf->height = (int)(height / 26.45833333333);
|
||||
|
||||
hmapdc = CreateCompatibleDC(GetDC(g_hWnd));
|
||||
if (mapbuf->hbitmap != NULL)
|
||||
DeleteObject(mapbuf->hbitmap);
|
||||
mapbuf->hbitmap = CreateCompatibleBitmap(GetDC(g_hWnd), mapbuf->width, mapbuf->height);
|
||||
SelectObject(hmapdc, mapbuf->hbitmap);
|
||||
|
||||
ipicture->lpVtbl->Render(ipicture, hmapdc, 0, 0, mapbuf->width, mapbuf->height, 0, height, width, -height, NULL);
|
||||
ipicture->lpVtbl->Release(ipicture);
|
||||
istream->lpVtbl->Release(istream);
|
||||
|
||||
DeleteDC(hmapdc);
|
||||
GlobalFree(global);
|
||||
CloseHandle(file);
|
||||
}
|
||||
|
||||
void freeImage(ACL_Image *mapbuf)
|
||||
{
|
||||
if(mapbuf->hbitmap) return;
|
||||
DeleteObject(mapbuf->hbitmap);
|
||||
mapbuf->hbitmap = NULL;
|
||||
}
|
||||
|
||||
void registerKeyboardEvent(KeyboardEventCallback callback)
|
||||
{
|
||||
g_keyboard = callback;
|
||||
}
|
||||
|
||||
void registerCharEvent(CharEventCallback callback)
|
||||
{
|
||||
g_char = callback;
|
||||
}
|
||||
|
||||
void registerMouseEvent(MouseEventCallback callback)
|
||||
{
|
||||
g_mouse = callback;
|
||||
}
|
||||
|
||||
void registerTimerEvent(TimerEventCallback callback)
|
||||
{
|
||||
g_timer = callback;
|
||||
}
|
||||
|
||||
void startTimer(int id,int timeinterval)
|
||||
{
|
||||
SetTimer(g_hWnd, id, timeinterval, NULL);
|
||||
}
|
||||
|
||||
void cancelTimer(int id)
|
||||
{
|
||||
KillTimer(g_hWnd, id);
|
||||
}
|
||||
|
||||
void loadSound(const char *fileName,ACL_Sound *pSound)
|
||||
{
|
||||
char *cmdStr;
|
||||
int len = strlen(fileName)*sizeof(char);
|
||||
len +=64;
|
||||
cmdStr = (char*)malloc(len);
|
||||
sprintf(cmdStr,"open \"%s\" type mpegvideo alias S%d",fileName,g_soundID);
|
||||
*pSound = g_soundID;
|
||||
++g_soundID;
|
||||
mciSendStringA(cmdStr,NULL,0,NULL);
|
||||
free(cmdStr);
|
||||
}
|
||||
|
||||
void playSound(int sid,int repeat)
|
||||
{
|
||||
char cmdStr[32];
|
||||
stopSound(sid);
|
||||
if(repeat)
|
||||
sprintf(cmdStr,"play S%d from 0 repeat",sid);
|
||||
else
|
||||
sprintf(cmdStr,"play S%d from 0",sid);
|
||||
mciSendStringA(cmdStr,NULL,0,NULL);
|
||||
}
|
||||
|
||||
void stopSound(int sid)
|
||||
{
|
||||
char cmdStr[32];
|
||||
sprintf(cmdStr,"stop S%d",sid);
|
||||
mciSendStringA(cmdStr,NULL,0,NULL);
|
||||
}
|
||||
|
||||
void setCaretSize(int w,int h)
|
||||
{
|
||||
DestroyCaret();
|
||||
CreateCaret(g_hWnd,0,w,h);
|
||||
SetCaretPos(g_caretX,g_caretY);
|
||||
}
|
||||
|
||||
void setCaretPos(int x,int y)
|
||||
{
|
||||
g_caretX = x;
|
||||
g_caretY = y;
|
||||
SetCaretPos(g_caretX,g_caretY);
|
||||
}
|
||||
|
||||
void showCaret()
|
||||
{
|
||||
ShowCaret(g_hWnd);
|
||||
}
|
||||
|
||||
void hideCaret()
|
||||
{
|
||||
HideCaret(g_hWnd);
|
||||
}
|
||||
|
||||
|
@ -0,0 +1,235 @@
|
||||
/*
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
////////////////////////////////////////////////////////////////
|
||||
// ACLLib - Advanced C Lab Library
|
||||
// Ver 2014-07
|
||||
// For students' Lab at Zhejiang University
|
||||
// Created 2008 by Gao Yuan
|
||||
// Modified 2009 by Cui Liwei
|
||||
// 2010 by Lan Huidong
|
||||
// Revised 2012 by Li Rui
|
||||
// Modified 2014 by Weng Kai for MOOC
|
||||
////////////////////////////////////////////////////////////////
|
||||
|
||||
/*
|
||||
For Dev C++, these lib files need to be added into linker options.
|
||||
Be sure to change the leading folders as your installation.
|
||||
"C:/Program Files/Dev-Cpp/MinGW32/lib/libwinmm.a"
|
||||
"C:/Program Files/Dev-Cpp/MinGW32/lib/libmsimg32.a"
|
||||
"C:/Program Files/Dev-Cpp/MinGW32/lib/libkernel32.a"
|
||||
"C:/Program Files/Dev-Cpp/MinGW32/lib/libuser32.a"
|
||||
"C:/Program Files/Dev-Cpp/MinGW32/lib/libgdi32.a"
|
||||
"C:/Program Files/Dev-Cpp/MinGW32/lib/libole32.a"
|
||||
"C:/Program Files/Dev-Cpp/MinGW32/lib/liboleaut32.a"
|
||||
"C:/Program Files/Dev-Cpp/MinGW32/lib/libuuid.a"
|
||||
*/
|
||||
|
||||
#ifndef __ACLLIB_H__
|
||||
#define __ACLLIB_H__
|
||||
|
||||
#ifdef _UNICODE
|
||||
#undef _UNICODE
|
||||
#endif
|
||||
#ifdef UNICODE
|
||||
#undef UNICODE
|
||||
#endif
|
||||
|
||||
#include <Windows.h>
|
||||
|
||||
#define BLACK RGB(0, 0, 0)
|
||||
#define RED RGB(255, 0, 0)
|
||||
#define GREEN RGB(0, 255, 0)
|
||||
#define BLUE RGB(0, 0, 255)
|
||||
#define CYAN RGB(0, 255, 255)
|
||||
#define MAGENTA RGB(255, 0, 255)
|
||||
#define YELLOW RGB(255, 255, 0)
|
||||
#define WHITE RGB(255, 255, 255)
|
||||
|
||||
#define EMPTY 0xffffffff
|
||||
#define DEFAULT -1
|
||||
|
||||
typedef enum
|
||||
{
|
||||
PEN_STYLE_SOLID,
|
||||
PEN_STYLE_DASH, /* ------- */
|
||||
PEN_STYLE_DOT, /* ....... */
|
||||
PEN_STYLE_DASHDOT, /* _._._._ */
|
||||
PEN_STYLE_DASHDOTDOT, /* _.._.._ */
|
||||
PEN_STYLE_NULL
|
||||
} ACL_Pen_Style;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
BRUSH_STYLE_SOLID = -1,
|
||||
BRUSH_STYLE_HORIZONTAL, /* ----- */
|
||||
BRUSH_STYLE_VERTICAL, /* ||||| */
|
||||
BRUSH_STYLE_FDIAGONAL, /* \\\\\ */
|
||||
BRUSH_STYLE_BDIAGONAL, /* ///// */
|
||||
BRUSH_STYLE_CROSS, /* +++++ */
|
||||
BRUSH_STYLE_DIAGCROSS, /* xxxxx */
|
||||
BRUSH_STYLE_NULL
|
||||
} ACL_Brush_Style;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
NO_BUTTON = 0,
|
||||
LEFT_BUTTON,
|
||||
MIDDLE_BUTTON,
|
||||
RIGHT_BUTTON
|
||||
} ACL_Mouse_Button;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
BUTTON_DOWN,
|
||||
BUTTON_DOUBLECLICK,
|
||||
BUTTON_UP,
|
||||
ROLL_UP,
|
||||
ROLL_DOWN,
|
||||
MOUSEMOVE
|
||||
} ACL_Mouse_Event;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
KEY_DOWN,
|
||||
KEY_UP
|
||||
} ACL_Keyboard_Event;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
HBITMAP hbitmap;
|
||||
int width;
|
||||
int height;
|
||||
} ACL_Image;
|
||||
|
||||
//typedef enum
|
||||
//{
|
||||
// TM_NO = 0x00,
|
||||
// TM_COLOR = 0x01,
|
||||
// TM_ALPHA = 0x02
|
||||
//} ACL_TransparentMode;
|
||||
|
||||
typedef COLORREF ACL_Color;
|
||||
typedef int ACL_Sound;
|
||||
|
||||
typedef void(*KeyboardEventCallback) (int key, int event);
|
||||
typedef void(*CharEventCallback) (char c);
|
||||
typedef void(*MouseEventCallback) (int x, int y, int button, int event);
|
||||
typedef void(*TimerEventCallback) (int timerID);
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
int Setup(void);
|
||||
|
||||
//
|
||||
void initWindow(const char title[], int left, int top, int width, int height);
|
||||
void msgBox(const char title[], const char text[], int flag);
|
||||
|
||||
void registerKeyboardEvent(KeyboardEventCallback callback);
|
||||
void registerCharEvent(CharEventCallback callback);
|
||||
void registerMouseEvent(MouseEventCallback callback);
|
||||
void registerTimerEvent(TimerEventCallback callback);
|
||||
|
||||
void startTimer(int timerID, int timeinterval);
|
||||
void cancelTimer(int timerID);
|
||||
|
||||
// Sound
|
||||
void loadSound(const char *fileName, ACL_Sound *pSound);
|
||||
void playSound(ACL_Sound soundID, int repeat);
|
||||
void stopSound(ACL_Sound soundID);
|
||||
|
||||
// Paint
|
||||
void beginPaint();
|
||||
void endPaint();
|
||||
void clearDevice(void);
|
||||
int getWidth();
|
||||
int getHeight();
|
||||
|
||||
// Pen
|
||||
void setPenColor(ACL_Color color);
|
||||
void setPenWidth(int width);
|
||||
void setPenStyle(ACL_Pen_Style style);
|
||||
|
||||
// Brush
|
||||
void setBrushColor(ACL_Color color);
|
||||
void setBrushStyle(ACL_Brush_Style style);
|
||||
|
||||
// Text
|
||||
void setTextColor(ACL_Color color);
|
||||
void setTextBkColor(ACL_Color color);
|
||||
void setTextSize(int size);
|
||||
void setTextFont(const char *pFontName);
|
||||
|
||||
void paintText(int x, int y, const char *pStr);
|
||||
|
||||
void setCaretSize(int w, int h);
|
||||
void setCaretPos(int x, int y);
|
||||
void showCaret();
|
||||
void hideCaret();
|
||||
|
||||
// Pixel
|
||||
void putPixel(int x, int y, ACL_Color color);
|
||||
ACL_Color getPixel(int x, int y);
|
||||
|
||||
// the Point
|
||||
int getX(void);
|
||||
int getY(void);
|
||||
void moveTo(int x, int y);
|
||||
void moveRel(int dx, int dy);
|
||||
|
||||
// Lines and Curves
|
||||
void arc(int nLeftRect, int nTopRect, int nRightRect, int nBottomRect, \
|
||||
int nXStartArc, int nYStartArc, int nXEndArc, int nYEndArc);
|
||||
void line(int x0, int y0, int x1, int y1);
|
||||
void lineTo(int nXEnd, int nYEnd);
|
||||
void lineRel(int dx, int dy);
|
||||
void polyBezier(const POINT *lppt, int cPoints);
|
||||
void polyLine(const POINT *lppt, int cPoints);
|
||||
|
||||
// Filled Shapes
|
||||
void chrod(int nLeftRect, int nTopRect, int nRightRect, int nBottomRect, \
|
||||
int nXRadial1, int nYRadial1, int nXRadial2, int nYRadial2);
|
||||
void ellipse(int nLeftRect, int nTopRect, int nRightRect, int nBottomRect);
|
||||
void pie(int nLeftRect, int nTopRect, int nRightRect, int nBottomRect, \
|
||||
int nXRadial1, int nYRadial1, int nXRadial2, int nYRadial2);
|
||||
void polygon(const POINT *lpPoints, int nCount);
|
||||
void rectangle(int nLeftRect, int nTopRect, int nRightRect, int nBottomRect);
|
||||
void roundrect(int nLeftRect, int nTopRect, int nRightRect, int nBottomRect, \
|
||||
int nWidth, int nHeight);
|
||||
|
||||
// Image
|
||||
void loadImage(const char *pImageFileName, ACL_Image *pImage);
|
||||
void freeImage(ACL_Image *pImage);
|
||||
|
||||
void putImage(ACL_Image *pImage, int x, int y);
|
||||
void putImageScale(ACL_Image *pImage, int x, int y, int width, int height);
|
||||
void putImageTransparent(ACL_Image *pImage, int x, int y, int width, int height, ACL_Color bkColor);
|
||||
|
||||
//void putImageEx(ACL_Image *pImage,int dx,int dy,int dw,int dh,
|
||||
// int sx,int sy,int sw,int sh);
|
||||
|
||||
//void setTransparentMode(ACL_TransparenetMode);
|
||||
//void setTransparentColor(ACL_Color);
|
||||
//void setTransparetnAlpha(int alpha);
|
||||
|
||||
void initConsole(void);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -0,0 +1 @@
|
||||
Subproject commit 91e8bd3a9ad2b320edc6c15c128ae367113feefd
|
Binary file not shown.
@ -0,0 +1,82 @@
|
||||
[Project]
|
||||
FileName=Calendar.dev
|
||||
Name=Calendar
|
||||
Type=0
|
||||
Ver=2
|
||||
ObjFiles=
|
||||
Includes=
|
||||
Libs=
|
||||
PrivateResource=
|
||||
ResourceIncludes=
|
||||
MakeIncludes=
|
||||
Compiler=
|
||||
CppCompiler=
|
||||
Linker=E:/Dev-Cpp/MinGW64/x86_64-w64-mingw32/lib/libwinmm.a_@@_E:/Dev-Cpp/MinGW64/x86_64-w64-mingw32/lib/libmsimg32.a_@@_E:/Dev-Cpp/MinGW64/x86_64-w64-mingw32/lib/libkernel32.a_@@_E:/Dev-Cpp/MinGW64/x86_64-w64-mingw32/lib/libuser32.a_@@_E:/Dev-Cpp/MinGW64/x86_64-w64-mingw32/lib/libgdi32.a_@@_E:/Dev-Cpp/MinGW64/x86_64-w64-mingw32/lib/libole32.a_@@_E:/Dev-Cpp/MinGW64/x86_64-w64-mingw32/lib/liboleaut32.a_@@_E:/Dev-Cpp/MinGW64/x86_64-w64-mingw32/lib/libuuid.a_@@_
|
||||
IsCpp=0
|
||||
Icon=
|
||||
ExeOutput=
|
||||
ObjectOutput=
|
||||
LogOutput=
|
||||
LogOutputEnabled=0
|
||||
OverrideOutput=0
|
||||
OverrideOutputName=Calendar.exe
|
||||
HostApplication=
|
||||
UseCustomMakefile=0
|
||||
CustomMakefile=
|
||||
CommandLine=
|
||||
Folders=
|
||||
IncludeVersionInfo=0
|
||||
SupportXPThemes=0
|
||||
CompilerSet=0
|
||||
CompilerSettings=0000000000000000001000000
|
||||
UnitCount=3
|
||||
|
||||
[VersionInfo]
|
||||
Major=1
|
||||
Minor=0
|
||||
Release=0
|
||||
Build=0
|
||||
LanguageID=1033
|
||||
CharsetID=1252
|
||||
CompanyName=
|
||||
FileVersion=1.0.0.0
|
||||
FileDescription=Developed using the Dev-C++ IDE
|
||||
InternalName=
|
||||
LegalCopyright=
|
||||
LegalTrademarks=
|
||||
OriginalFilename=
|
||||
ProductName=
|
||||
ProductVersion=1.0.0.0
|
||||
AutoIncBuildNr=0
|
||||
SyncProduct=1
|
||||
|
||||
[Unit1]
|
||||
FileName=main.c
|
||||
CompileCpp=0
|
||||
Folder=
|
||||
Compile=1
|
||||
Link=1
|
||||
Priority=1000
|
||||
OverrideBuildCmd=0
|
||||
BuildCmd=
|
||||
|
||||
[Unit2]
|
||||
FileName=acllib.c
|
||||
CompileCpp=0
|
||||
Folder=Calendar
|
||||
Compile=1
|
||||
Link=1
|
||||
Priority=1000
|
||||
OverrideBuildCmd=0
|
||||
BuildCmd=
|
||||
|
||||
[Unit3]
|
||||
FileName=acllib.h
|
||||
CompileCpp=0
|
||||
Folder=Calendar
|
||||
Compile=1
|
||||
Link=1
|
||||
Priority=1000
|
||||
OverrideBuildCmd=0
|
||||
BuildCmd=
|
||||
|
Binary file not shown.
@ -0,0 +1,24 @@
|
||||
[Editors]
|
||||
Focused=0
|
||||
Order=1,0
|
||||
[Editor_0]
|
||||
Open=1
|
||||
Top=1
|
||||
CursorCol=31
|
||||
CursorRow=130
|
||||
TopLine=1
|
||||
LeftChar=1
|
||||
[Editor_1]
|
||||
Open=1
|
||||
Top=0
|
||||
CursorCol=6
|
||||
CursorRow=235
|
||||
TopLine=190
|
||||
LeftChar=1
|
||||
[Editor_2]
|
||||
Open=1
|
||||
Top=0
|
||||
CursorCol=1
|
||||
CursorRow=179
|
||||
TopLine=165
|
||||
LeftChar=1
|
@ -0,0 +1,31 @@
|
||||
# Project: Calendar
|
||||
# Makefile created by Dev-C++ 5.11
|
||||
|
||||
CPP = g++.exe -D__DEBUG__
|
||||
CC = gcc.exe -D__DEBUG__
|
||||
WINDRES = windres.exe
|
||||
OBJ = main.o acllib.o
|
||||
LINKOBJ = main.o acllib.o
|
||||
LIBS = -L"E:/Dev-Cpp/MinGW64/lib" -L"E:/Dev-Cpp/MinGW64/x86_64-w64-mingw32/lib" -static-libgcc -mwindows E:/Dev-Cpp/MinGW64/x86_64-w64-mingw32/lib/libwinmm.a E:/Dev-Cpp/MinGW64/x86_64-w64-mingw32/lib/libmsimg32.a E:/Dev-Cpp/MinGW64/x86_64-w64-mingw32/lib/libkernel32.a E:/Dev-Cpp/MinGW64/x86_64-w64-mingw32/lib/libuser32.a E:/Dev-Cpp/MinGW64/x86_64-w64-mingw32/lib/libgdi32.a E:/Dev-Cpp/MinGW64/x86_64-w64-mingw32/lib/libole32.a E:/Dev-Cpp/MinGW64/x86_64-w64-mingw32/lib/liboleaut32.a E:/Dev-Cpp/MinGW64/x86_64-w64-mingw32/lib/libuuid.a -g3
|
||||
INCS = -I"E:/Dev-Cpp/MinGW64/include" -I"E:/Dev-Cpp/MinGW64/x86_64-w64-mingw32/include" -I"E:/Dev-Cpp/MinGW64/lib/gcc/x86_64-w64-mingw32/4.9.2/include"
|
||||
CXXINCS = -I"E:/Dev-Cpp/MinGW64/include" -I"E:/Dev-Cpp/MinGW64/x86_64-w64-mingw32/include" -I"E:/Dev-Cpp/MinGW64/lib/gcc/x86_64-w64-mingw32/4.9.2/include" -I"E:/Dev-Cpp/MinGW64/lib/gcc/x86_64-w64-mingw32/4.9.2/include/c++"
|
||||
BIN = Calendar.exe
|
||||
CXXFLAGS = $(CXXINCS) -g3
|
||||
CFLAGS = $(INCS) -g3
|
||||
RM = rm.exe -f
|
||||
|
||||
.PHONY: all all-before all-after clean clean-custom
|
||||
|
||||
all: all-before $(BIN) all-after
|
||||
|
||||
clean: clean-custom
|
||||
${RM} $(OBJ) $(BIN)
|
||||
|
||||
$(BIN): $(OBJ)
|
||||
$(CC) $(LINKOBJ) -o $(BIN) $(LIBS)
|
||||
|
||||
main.o: main.c
|
||||
$(CC) -c main.c -o main.o $(CFLAGS)
|
||||
|
||||
acllib.o: acllib.c
|
||||
$(CC) -c acllib.c -o acllib.o $(CFLAGS)
|
@ -0,0 +1,862 @@
|
||||
/*
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
////////////////////////////////////////////////////////////////
|
||||
// ACLLib - Advanced C Lab Library
|
||||
// Ver. 2014-07
|
||||
// For Students' Lab at Zhejiang University
|
||||
// Created 2008 by Gao Yuan
|
||||
// Modified 2009 by Cui Liwei
|
||||
// 2010 by Lan Huidong
|
||||
// Revised 2012 by Li Rui
|
||||
// Modified 2014 by Weng Kai for MOOC
|
||||
////////////////////////////////////////////////////////////////
|
||||
|
||||
#define _CRT_SECURE_NO_WARNINGS
|
||||
#define _CRT_NON_CONFORMING_SWPRINTFS
|
||||
|
||||
#define CINTERFACE
|
||||
|
||||
#ifdef _UNICODE
|
||||
#undef _UNICODE
|
||||
#endif
|
||||
#ifdef UNICODE
|
||||
#undef UNICODE
|
||||
#endif
|
||||
|
||||
#include "acllib.h"
|
||||
|
||||
#include <windows.h>
|
||||
#include <olectl.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#pragma comment(lib,"winmm.lib")
|
||||
#pragma comment(lib,"msimg32.lib")
|
||||
#endif
|
||||
|
||||
#ifdef _DEBUG
|
||||
#define ACL_ASSERT(_Expression,errStr) (void)( (!!(_Expression)) || (acl_error(errStr),0) )
|
||||
#else
|
||||
#define ACL_ASSERT(flag,errStr) ((void)0)
|
||||
#endif
|
||||
|
||||
#define ACL_ASSERT_HWND ACL_ASSERT(g_hWnd!=0, \
|
||||
"You should call function \"initWindow(...)\" befor use function \"" __FUNCTION__ "\"" )
|
||||
#define ACL_ASSERT_BEGIN_PAINT ACL_ASSERT(g_hmemdc!=0, \
|
||||
"You should call function \"beginPaint()\" befor use function \"" __FUNCTION__ "\"" )
|
||||
|
||||
// f
|
||||
int Setup(void);
|
||||
|
||||
const char g_wndClassName[] = "ACL_WND_CLASS";
|
||||
const char g_libName[] = "ACLLIB";
|
||||
|
||||
HINSTANCE g_hInstance;
|
||||
|
||||
HWND g_hWnd = NULL;
|
||||
HDC g_hmemdc = NULL;
|
||||
HBITMAP g_hbitmap = NULL;
|
||||
|
||||
int g_wndHeight;
|
||||
int g_wndWidth;
|
||||
|
||||
HPEN g_pen = NULL;
|
||||
ACL_Color g_penColor = BLACK;
|
||||
int g_penWidth = 1;
|
||||
int g_penStyle = PEN_STYLE_SOLID;
|
||||
|
||||
HBRUSH g_brush = NULL;
|
||||
ACL_Color g_brushColor = BLACK;
|
||||
int g_brushStyle = BRUSH_STYLE_SOLID;
|
||||
|
||||
HFONT g_font = NULL;
|
||||
char g_fontName[256] = "ËÎÌå";
|
||||
int g_textSize = 12;
|
||||
ACL_Color g_textColor = BLACK;
|
||||
ACL_Color g_textBkColor = WHITE;
|
||||
|
||||
int g_caretHeight = 12;
|
||||
int g_caretWidth = 6;
|
||||
int g_caretX = 0;
|
||||
int g_caretY = 0;
|
||||
|
||||
int g_soundID = 0;
|
||||
|
||||
KeyboardEventCallback g_keyboard = NULL;
|
||||
MouseEventCallback g_mouse = NULL;
|
||||
TimerEventCallback g_timer = NULL;
|
||||
CharEventCallback g_char = NULL;
|
||||
|
||||
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
|
||||
|
||||
//
|
||||
void acl_error(char *errStr)
|
||||
{
|
||||
MessageBoxA(g_hWnd,errStr,g_libName,MB_ICONERROR);
|
||||
exit(0);
|
||||
}
|
||||
|
||||
//
|
||||
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
|
||||
{
|
||||
MSG msg;
|
||||
WNDCLASSA wndclass;
|
||||
|
||||
g_hInstance = hInstance;
|
||||
g_hWnd = NULL;
|
||||
g_keyboard = NULL;
|
||||
g_mouse = NULL;
|
||||
g_timer = NULL;
|
||||
|
||||
wndclass.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC | CS_DBLCLKS;
|
||||
wndclass.lpfnWndProc = WndProc;
|
||||
wndclass.cbClsExtra = 0;
|
||||
wndclass.cbWndExtra = 0;
|
||||
wndclass.hInstance = hInstance;
|
||||
wndclass.hInstance = hInstance;
|
||||
wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION);
|
||||
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW);
|
||||
wndclass.hbrBackground = (HBRUSH) GetStockObject (BLACK_BRUSH);
|
||||
wndclass.lpszMenuName = NULL;
|
||||
wndclass.lpszClassName = g_wndClassName;
|
||||
|
||||
if (!RegisterClassA(&wndclass))
|
||||
{
|
||||
MessageBoxA(NULL, "This program requires Windows NT!", g_libName, MB_ICONERROR);
|
||||
return 0;
|
||||
}
|
||||
|
||||
Setup();
|
||||
|
||||
ACL_ASSERT(g_hWnd,"You must call \"initWindow(...)\" in Main()");
|
||||
|
||||
while (GetMessage(&msg, NULL, 0, 0))
|
||||
{
|
||||
TranslateMessage (&msg);
|
||||
DispatchMessage (&msg);
|
||||
}
|
||||
return msg.wParam;
|
||||
}
|
||||
|
||||
//
|
||||
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
switch (message)
|
||||
{
|
||||
case WM_CREATE:
|
||||
{
|
||||
HDC hdc;
|
||||
hdc = GetDC(hwnd);
|
||||
g_hbitmap = CreateCompatibleBitmap(
|
||||
hdc, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN));
|
||||
g_hmemdc = CreateCompatibleDC(hdc);
|
||||
SelectObject(g_hmemdc, g_hbitmap);
|
||||
BitBlt(g_hmemdc,
|
||||
0, 0,
|
||||
GetSystemMetrics(SM_CXSCREEN),
|
||||
GetSystemMetrics(SM_CYSCREEN),
|
||||
g_hmemdc,
|
||||
0, 0,
|
||||
WHITENESS);
|
||||
DeleteDC(g_hmemdc);
|
||||
ReleaseDC(hwnd, hdc);
|
||||
|
||||
CreateCaret(hwnd,0,g_caretWidth,g_caretHeight);
|
||||
g_caretX = g_wndWidth;
|
||||
g_caretY = g_wndHeight;
|
||||
SetCaretPos(g_caretX,g_caretY);
|
||||
|
||||
break;
|
||||
}
|
||||
case WM_ERASEBKGND:
|
||||
break;
|
||||
case WM_PAINT:
|
||||
{
|
||||
HDC hdc;
|
||||
PAINTSTRUCT ps;
|
||||
RECT rect;
|
||||
|
||||
hdc = BeginPaint(hwnd, &ps);
|
||||
g_hmemdc = CreateCompatibleDC(hdc);
|
||||
SelectObject(g_hmemdc, g_hbitmap);
|
||||
GetClientRect(hwnd,&rect);
|
||||
BitBlt(hdc, 0, 0, rect.right - rect.left,
|
||||
rect.bottom - rect.top, g_hmemdc, 0, 0, SRCCOPY);
|
||||
DeleteDC(g_hmemdc);
|
||||
g_hmemdc = 0;
|
||||
EndPaint(hwnd,&ps);
|
||||
break;
|
||||
}
|
||||
case WM_CHAR:
|
||||
if (g_char != NULL)
|
||||
g_char((char) wParam);
|
||||
break;
|
||||
|
||||
case WM_KEYDOWN:
|
||||
if (g_keyboard != NULL)
|
||||
g_keyboard((int) wParam,KEY_DOWN);
|
||||
break;
|
||||
|
||||
case WM_KEYUP:
|
||||
if(g_keyboard != NULL)
|
||||
g_keyboard((int) wParam,KEY_UP);
|
||||
break;
|
||||
|
||||
case WM_LBUTTONDOWN:
|
||||
if (g_mouse != NULL)
|
||||
g_mouse((int) LOWORD(lParam), (int) HIWORD(lParam), LEFT_BUTTON, BUTTON_DOWN);
|
||||
break;
|
||||
|
||||
case WM_LBUTTONUP:
|
||||
if (g_mouse != NULL)
|
||||
g_mouse((int) LOWORD(lParam), (int) HIWORD(lParam), LEFT_BUTTON, BUTTON_UP);
|
||||
break;
|
||||
|
||||
case WM_LBUTTONDBLCLK:
|
||||
if (g_mouse != NULL)
|
||||
g_mouse((int) LOWORD(lParam), (int) HIWORD(lParam), LEFT_BUTTON, BUTTON_DOUBLECLICK);
|
||||
break;
|
||||
|
||||
case WM_MBUTTONDOWN:
|
||||
if (g_mouse != NULL)
|
||||
g_mouse((int) LOWORD(lParam), (int) HIWORD(lParam), MIDDLE_BUTTON, BUTTON_DOWN);
|
||||
break;
|
||||
|
||||
case WM_MBUTTONUP:
|
||||
if (g_mouse != NULL)
|
||||
g_mouse((int) LOWORD(lParam), (int) HIWORD(lParam), MIDDLE_BUTTON, BUTTON_UP);
|
||||
break;
|
||||
|
||||
case WM_MBUTTONDBLCLK:
|
||||
if (g_mouse != NULL)
|
||||
g_mouse((int) LOWORD(lParam), (int) HIWORD(lParam), MIDDLE_BUTTON, BUTTON_DOUBLECLICK);
|
||||
break;
|
||||
|
||||
case WM_RBUTTONDOWN:
|
||||
if (g_mouse != NULL)
|
||||
g_mouse((int) LOWORD(lParam), (int) HIWORD(lParam), RIGHT_BUTTON, BUTTON_DOWN);
|
||||
break;
|
||||
|
||||
case WM_RBUTTONUP:
|
||||
if (g_mouse != NULL)
|
||||
g_mouse((int) LOWORD(lParam), (int) HIWORD(lParam), RIGHT_BUTTON, BUTTON_UP);
|
||||
break;
|
||||
|
||||
case WM_RBUTTONDBLCLK:
|
||||
if (g_mouse != NULL)
|
||||
g_mouse((int) LOWORD(lParam), (int) HIWORD(lParam), RIGHT_BUTTON, BUTTON_DOUBLECLICK);
|
||||
break;
|
||||
|
||||
case WM_MOUSEMOVE:
|
||||
if(g_mouse != NULL)
|
||||
g_mouse((int) LOWORD(lParam), (int) HIWORD(lParam), MOUSEMOVE, MOUSEMOVE);
|
||||
break;
|
||||
|
||||
case WM_MOUSEWHEEL:
|
||||
if(g_mouse == NULL)
|
||||
break;
|
||||
if(HIWORD(wParam) == 120)
|
||||
g_mouse((int) LOWORD(lParam), (int) HIWORD(lParam),MIDDLE_BUTTON,ROLL_UP);
|
||||
else if(HIWORD(wParam)==65416)
|
||||
g_mouse((int) LOWORD(lParam), (int) HIWORD(lParam),MIDDLE_BUTTON,ROLL_DOWN);
|
||||
break;
|
||||
|
||||
case WM_TIMER:
|
||||
if (g_timer != NULL)
|
||||
g_timer(wParam);
|
||||
break;
|
||||
|
||||
case WM_DESTROY:
|
||||
DeleteObject(g_hbitmap);
|
||||
PostQuitMessage(0);
|
||||
break;
|
||||
default:
|
||||
return DefWindowProc(hwnd, message, wParam, lParam);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
//
|
||||
void initWindow(const char *wndName, int x, int y, int width, int height)
|
||||
{
|
||||
RECT rect;
|
||||
|
||||
ACL_ASSERT(!g_hWnd,"Don't call initWindow twice");
|
||||
|
||||
g_wndHeight = height;
|
||||
g_wndWidth = width;
|
||||
|
||||
if(x==DEFAULT || y==DEFAULT)
|
||||
x=y=CW_USEDEFAULT;
|
||||
|
||||
g_hWnd = CreateWindowA (
|
||||
g_wndClassName, wndName,
|
||||
WS_OVERLAPPEDWINDOW & ~WS_MAXIMIZEBOX & ~WS_SIZEBOX,
|
||||
x, y,
|
||||
width, height,
|
||||
NULL, NULL, 0, NULL) ;
|
||||
|
||||
if(!g_hWnd)
|
||||
{
|
||||
MessageBoxA(NULL,"Fail to create window",g_libName,MB_ICONERROR);
|
||||
exit(0);
|
||||
}
|
||||
GetClientRect(g_hWnd,&rect);
|
||||
width += width - (rect.right-rect.left);
|
||||
height += height - (rect.bottom-rect.top);
|
||||
SetWindowPos(g_hWnd,HWND_TOP,0,0,width,height,SWP_NOMOVE);
|
||||
|
||||
ShowWindow (g_hWnd,1);
|
||||
UpdateWindow (g_hWnd);
|
||||
}
|
||||
|
||||
void initConsole(void)
|
||||
{
|
||||
AllocConsole();
|
||||
freopen("CONIN$", "r+t", stdin);
|
||||
freopen("CONOUT$", "w+t", stdout);
|
||||
}
|
||||
|
||||
void msgBox(const char title[],const char text[],int flag)
|
||||
{
|
||||
ACL_ASSERT_HWND;
|
||||
MessageBoxA(g_hWnd,text,title,flag);
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
void updatePen();
|
||||
void updateBrush();
|
||||
void updateFont();
|
||||
|
||||
//
|
||||
void beginPaint()
|
||||
{
|
||||
HDC hdc;
|
||||
|
||||
ACL_ASSERT_HWND;
|
||||
|
||||
hdc = GetDC(g_hWnd);
|
||||
g_hmemdc = CreateCompatibleDC(hdc);
|
||||
SelectObject(g_hmemdc,g_hbitmap);
|
||||
|
||||
updatePen();
|
||||
updateBrush();
|
||||
updateFont();
|
||||
setTextColor(g_textColor);
|
||||
setTextBkColor(g_textBkColor);
|
||||
}
|
||||
|
||||
void endPaint()
|
||||
{
|
||||
DeleteDC(g_hmemdc);
|
||||
g_hmemdc = 0;
|
||||
InvalidateRect(g_hWnd,0,0);
|
||||
|
||||
DeleteObject(g_pen);
|
||||
DeleteObject(g_brush);
|
||||
DeleteObject(g_font);
|
||||
g_pen = NULL;
|
||||
g_brush = NULL;
|
||||
g_font = NULL;
|
||||
}
|
||||
|
||||
void clearDevice(void)
|
||||
{
|
||||
ACL_ASSERT_BEGIN_PAINT;
|
||||
BitBlt(
|
||||
g_hmemdc,
|
||||
0, 0,
|
||||
GetSystemMetrics(SM_CXSCREEN),
|
||||
GetSystemMetrics(SM_CYSCREEN) ,
|
||||
g_hmemdc,
|
||||
0, 0,
|
||||
WHITENESS);
|
||||
}
|
||||
|
||||
void updatePen()
|
||||
{
|
||||
if(g_pen)DeleteObject(g_pen);
|
||||
if(g_penColor==EMPTY)
|
||||
g_pen = (HPEN)GetStockObject(NULL_PEN);
|
||||
else
|
||||
g_pen = CreatePen(g_penStyle,g_penWidth,g_penColor);
|
||||
SelectObject(g_hmemdc,g_pen);
|
||||
}
|
||||
|
||||
void updateBrush()
|
||||
{
|
||||
if(g_brush)DeleteObject(g_brush);
|
||||
if(g_brushColor==EMPTY)
|
||||
{
|
||||
g_brush = (HBRUSH)GetStockObject(NULL_BRUSH);
|
||||
}
|
||||
else
|
||||
{
|
||||
if(g_brushStyle==BRUSH_STYLE_SOLID)
|
||||
g_brush = CreateSolidBrush(g_brushColor);
|
||||
else
|
||||
g_brush = CreateHatchBrush(g_brushStyle,g_brushColor);
|
||||
}
|
||||
SelectObject(g_hmemdc,g_brush);
|
||||
}
|
||||
|
||||
void updateFont()
|
||||
{
|
||||
if(g_font)DeleteObject(g_font);
|
||||
g_font = CreateFontA(
|
||||
g_textSize,
|
||||
0,
|
||||
0,0,700,0,0,0,0,0,0,0,0,g_fontName);
|
||||
SelectObject(g_hmemdc,g_font);
|
||||
}
|
||||
|
||||
void setPenColor(ACL_Color newColor)
|
||||
{
|
||||
ACL_ASSERT_BEGIN_PAINT;
|
||||
g_penColor = newColor;
|
||||
updatePen();
|
||||
}
|
||||
|
||||
void setPenWidth(int width)
|
||||
{
|
||||
ACL_ASSERT_BEGIN_PAINT;
|
||||
g_penWidth = width;
|
||||
updatePen();
|
||||
}
|
||||
|
||||
void setPenStyle(ACL_Pen_Style newStyle)
|
||||
{
|
||||
ACL_ASSERT_BEGIN_PAINT;
|
||||
|
||||
switch(newStyle)
|
||||
{
|
||||
case PEN_STYLE_SOLID:
|
||||
g_penStyle = PS_SOLID; break;
|
||||
case PEN_STYLE_DASH:
|
||||
g_penStyle = PS_DASH; break;
|
||||
case PEN_STYLE_DOT:
|
||||
g_penStyle = PS_DOT; break;
|
||||
case PEN_STYLE_DASHDOT:
|
||||
g_penStyle = PS_DASHDOT; break;
|
||||
case PEN_STYLE_DASHDOTDOT:
|
||||
g_penStyle = PS_DASHDOTDOT; break;
|
||||
case PEN_STYLE_NULL:
|
||||
g_penStyle = -1;
|
||||
setPenColor(EMPTY);
|
||||
return;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
updatePen();
|
||||
}
|
||||
|
||||
void setBrushColor(ACL_Color newColor)
|
||||
{
|
||||
ACL_ASSERT_BEGIN_PAINT;
|
||||
g_brushColor = newColor;
|
||||
updateBrush();
|
||||
}
|
||||
|
||||
void setBrushStyle(ACL_Brush_Style newStyle)
|
||||
{
|
||||
ACL_ASSERT_BEGIN_PAINT;
|
||||
|
||||
switch(newStyle)
|
||||
{
|
||||
case BRUSH_STYLE_SOLID:
|
||||
g_brushStyle = BRUSH_STYLE_SOLID; break;
|
||||
case BRUSH_STYLE_HORIZONTAL:
|
||||
g_brushStyle = HS_HORIZONTAL; break;
|
||||
case BRUSH_STYLE_VERTICAL:
|
||||
g_brushStyle = HS_VERTICAL; break;
|
||||
case BRUSH_STYLE_FDIAGONAL:
|
||||
g_brushStyle = HS_FDIAGONAL; break;
|
||||
case BRUSH_STYLE_BDIAGONAL:
|
||||
g_brushStyle = HS_BDIAGONAL; break;
|
||||
case BRUSH_STYLE_CROSS:
|
||||
g_brushStyle = HS_CROSS; break;
|
||||
case BRUSH_STYLE_DIAGCROSS:
|
||||
g_brushStyle = HS_DIAGCROSS; break;
|
||||
case BRUSH_STYLE_NULL:
|
||||
g_brushStyle = BRUSH_STYLE_SOLID;
|
||||
setBrushColor(EMPTY);
|
||||
return;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
updateBrush();
|
||||
}
|
||||
|
||||
void setTextColor(ACL_Color color)
|
||||
{
|
||||
ACL_ASSERT_BEGIN_PAINT;
|
||||
ACL_ASSERT(color!=EMPTY,"text color can not be EMPTY");
|
||||
g_textColor = color;
|
||||
SetTextColor(g_hmemdc,color);
|
||||
}
|
||||
|
||||
void setTextBkColor(ACL_Color color)
|
||||
{
|
||||
ACL_ASSERT_BEGIN_PAINT;
|
||||
g_textBkColor = color;
|
||||
if(color == EMPTY)
|
||||
SetBkMode(g_hmemdc,TRANSPARENT);
|
||||
else
|
||||
{
|
||||
SetBkMode(g_hmemdc,OPAQUE);
|
||||
SetBkColor(g_hmemdc,color);
|
||||
}
|
||||
}
|
||||
|
||||
void setTextSize(int size)
|
||||
{
|
||||
ACL_ASSERT_BEGIN_PAINT;
|
||||
g_textSize = size;
|
||||
updateFont();
|
||||
}
|
||||
|
||||
void setTextFont(const char *pfn)
|
||||
{
|
||||
size_t len;
|
||||
ACL_ASSERT_BEGIN_PAINT;
|
||||
len = strlen(pfn);
|
||||
strcpy(g_fontName,pfn);
|
||||
updateFont();
|
||||
}
|
||||
|
||||
void paintText(int x, int y, const char *textstring)
|
||||
{
|
||||
ACL_ASSERT_BEGIN_PAINT;
|
||||
TextOutA(g_hmemdc, x, y, textstring, strlen(textstring));
|
||||
}
|
||||
|
||||
void putPixel(int x, int y, ACL_Color color)
|
||||
{
|
||||
ACL_ASSERT_BEGIN_PAINT;
|
||||
SetPixel(g_hmemdc, x, y, color);
|
||||
}
|
||||
|
||||
ACL_Color getPixel(int x, int y)
|
||||
{
|
||||
ACL_ASSERT_BEGIN_PAINT;
|
||||
return GetPixel(g_hmemdc, x, y);
|
||||
}
|
||||
|
||||
int getWidth(void)
|
||||
{
|
||||
RECT rect;
|
||||
GetClientRect(g_hWnd, &rect);
|
||||
return rect.right;
|
||||
}
|
||||
|
||||
int getHeight(void)
|
||||
{
|
||||
RECT rect;
|
||||
GetClientRect(g_hWnd, &rect);
|
||||
return rect.bottom;
|
||||
}
|
||||
|
||||
int getX(void)
|
||||
{
|
||||
POINT point;
|
||||
ACL_ASSERT_BEGIN_PAINT;
|
||||
GetCurrentPositionEx(g_hmemdc, &point);
|
||||
return (int) point.x;
|
||||
}
|
||||
|
||||
int getY(void)
|
||||
{
|
||||
POINT point;
|
||||
ACL_ASSERT_BEGIN_PAINT;
|
||||
GetCurrentPositionEx(g_hmemdc, &point);
|
||||
return (int) point.y;
|
||||
}
|
||||
|
||||
void moveTo(int x, int y)
|
||||
{
|
||||
ACL_ASSERT_BEGIN_PAINT;
|
||||
MoveToEx(g_hmemdc, x, y,NULL);
|
||||
}
|
||||
|
||||
void moveRel(int dx, int dy)
|
||||
{
|
||||
POINT point;
|
||||
ACL_ASSERT_BEGIN_PAINT;
|
||||
GetCurrentPositionEx(g_hmemdc, &point);
|
||||
MoveToEx(g_hmemdc, (int) point.x + dx, (int) point.y + dy,NULL);
|
||||
}
|
||||
|
||||
// Lines and Curves
|
||||
void arc(int x1,int y1,int x2,int y2,int x3,int y3,int x4,int y4)
|
||||
{
|
||||
ACL_ASSERT_BEGIN_PAINT;
|
||||
Arc(g_hmemdc,x1,y1,x2,y2,x3,y3,x4,y4);
|
||||
}
|
||||
|
||||
void line(int x0, int y0, int x1, int y1)
|
||||
{
|
||||
POINT point;
|
||||
ACL_ASSERT_BEGIN_PAINT;
|
||||
GetCurrentPositionEx(g_hmemdc, &point);
|
||||
MoveToEx(g_hmemdc, x0, y0, NULL);
|
||||
LineTo(g_hmemdc, x1, y1);
|
||||
MoveToEx(g_hmemdc,point.x,point.y,NULL);
|
||||
}
|
||||
|
||||
void lineTo(int x, int y)
|
||||
{
|
||||
ACL_ASSERT_BEGIN_PAINT;
|
||||
LineTo(g_hmemdc, x, y);
|
||||
}
|
||||
|
||||
void lineRel(int dx, int dy)
|
||||
{
|
||||
POINT point;
|
||||
ACL_ASSERT_BEGIN_PAINT;
|
||||
GetCurrentPositionEx(g_hmemdc, &point);
|
||||
LineTo(g_hmemdc, (int) point.x + dx, (int) point.y + dy);
|
||||
}
|
||||
|
||||
void polyBezier(const POINT *lppt,int cPoints)
|
||||
{
|
||||
PolyBezier(g_hmemdc,lppt,cPoints);
|
||||
}
|
||||
|
||||
void polyLine(const POINT *lppt, int cPoints)
|
||||
{
|
||||
Polyline(g_hmemdc,lppt,cPoints);
|
||||
}
|
||||
|
||||
// Filled Shapes
|
||||
void chrod(int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4)
|
||||
{
|
||||
ACL_ASSERT_BEGIN_PAINT;
|
||||
Chord(g_hmemdc,x1, y1, x2, y2, x3, y3, x4, y4);
|
||||
}
|
||||
|
||||
void ellipse(int left,int top,int right, int bottom)
|
||||
{
|
||||
ACL_ASSERT_BEGIN_PAINT;
|
||||
Ellipse(g_hmemdc,left,top,right,bottom);
|
||||
}
|
||||
|
||||
void pie(int left, int top, int right, int bottom, int xr1, int yr1, int xr2, int yr2)
|
||||
{
|
||||
ACL_ASSERT_BEGIN_PAINT;
|
||||
Pie(g_hmemdc,left,top,right,bottom,xr1,yr1,xr2,yr2);
|
||||
}
|
||||
|
||||
void polygon(const POINT *apt,int cpt)
|
||||
{
|
||||
ACL_ASSERT_BEGIN_PAINT;
|
||||
Polygon(g_hmemdc,apt,cpt);
|
||||
}
|
||||
|
||||
void rectangle(int left,int top,int right,int bottom)
|
||||
{
|
||||
ACL_ASSERT_BEGIN_PAINT;
|
||||
Rectangle(g_hmemdc,left,top,right,bottom);
|
||||
}
|
||||
|
||||
void roundrect(int left,int top,int right,int bottom,int width,int height)
|
||||
{
|
||||
ACL_ASSERT_BEGIN_PAINT;
|
||||
RoundRect(g_hmemdc,left,top,right,bottom,width,height);
|
||||
}
|
||||
|
||||
void polyline(POINT *apt,int cpt)
|
||||
{
|
||||
ACL_ASSERT_BEGIN_PAINT;
|
||||
Polyline(g_hmemdc,apt,cpt);
|
||||
}
|
||||
|
||||
|
||||
void putImage(ACL_Image *pImage, int x, int y)
|
||||
{
|
||||
HDC hbitmapdc;
|
||||
ACL_ASSERT_BEGIN_PAINT;
|
||||
hbitmapdc = CreateCompatibleDC(g_hmemdc);
|
||||
SelectObject(hbitmapdc, pImage->hbitmap);
|
||||
BitBlt(g_hmemdc, x, y, pImage->width, pImage->height, hbitmapdc,0,0,SRCCOPY);
|
||||
DeleteDC(hbitmapdc);
|
||||
}
|
||||
|
||||
void putImageScale(ACL_Image *pImage,int x,int y,int width,int height)
|
||||
{
|
||||
HDC hbitmapdc;
|
||||
ACL_ASSERT_BEGIN_PAINT;
|
||||
hbitmapdc = CreateCompatibleDC(g_hmemdc);
|
||||
SelectObject(hbitmapdc, pImage->hbitmap);
|
||||
if(width == -1)width = pImage->width;
|
||||
if(height == -1)height = pImage->height;
|
||||
SetStretchBltMode(g_hmemdc,COLORONCOLOR);
|
||||
StretchBlt( g_hmemdc,x,y,width,height,hbitmapdc,0,0,pImage->width,pImage->height,SRCCOPY);
|
||||
DeleteDC(hbitmapdc);
|
||||
}
|
||||
|
||||
void putImageTransparent(ACL_Image *pImage,int x,int y,int width,int height, ACL_Color bkColor)
|
||||
{
|
||||
HDC hbitmapdc;
|
||||
ACL_ASSERT_BEGIN_PAINT;
|
||||
hbitmapdc = CreateCompatibleDC(g_hmemdc);
|
||||
SelectObject(hbitmapdc, pImage->hbitmap);
|
||||
if(width == -1)width = pImage->width;
|
||||
if(height == -1)height = pImage->height;
|
||||
//SetStretchBltMode(g_hmemdc,COLORONCOLOR);
|
||||
TransparentBlt(g_hmemdc,x,y,width,height,hbitmapdc,0,0,pImage->width,pImage->height,bkColor);
|
||||
DeleteDC(hbitmapdc);
|
||||
}
|
||||
|
||||
void loadImage(const char *image, ACL_Image *mapbuf)
|
||||
{
|
||||
HDC hmapdc;
|
||||
IPicture *ipicture;
|
||||
IStream *istream;
|
||||
DWORD filesize = 0, bytes;
|
||||
OLE_XSIZE_HIMETRIC width;
|
||||
OLE_YSIZE_HIMETRIC height;
|
||||
HANDLE file = NULL;
|
||||
HGLOBAL global = NULL;
|
||||
LPVOID data = NULL;
|
||||
|
||||
ACL_ASSERT_HWND;
|
||||
|
||||
file = CreateFileA(image, GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL, NULL);
|
||||
if(file == INVALID_HANDLE_VALUE)
|
||||
acl_error("Fail to load image, File not exist");
|
||||
filesize = GetFileSize(file, NULL);
|
||||
|
||||
global = GlobalAlloc(GMEM_MOVEABLE, filesize);
|
||||
data = GlobalLock(global);
|
||||
ReadFile(file, data, filesize, &bytes, NULL);
|
||||
GlobalUnlock(global);
|
||||
CreateStreamOnHGlobal(global, TRUE, &istream);
|
||||
|
||||
OleLoadPicture(istream, filesize, TRUE, &IID_IPicture, (LPVOID*)&ipicture);
|
||||
ipicture->lpVtbl->get_Width(ipicture, &width);
|
||||
ipicture->lpVtbl->get_Height(ipicture, &height);
|
||||
|
||||
mapbuf->width = (int)(width / 26.45833333333);
|
||||
mapbuf->height = (int)(height / 26.45833333333);
|
||||
|
||||
hmapdc = CreateCompatibleDC(GetDC(g_hWnd));
|
||||
if (mapbuf->hbitmap != NULL)
|
||||
DeleteObject(mapbuf->hbitmap);
|
||||
mapbuf->hbitmap = CreateCompatibleBitmap(GetDC(g_hWnd), mapbuf->width, mapbuf->height);
|
||||
SelectObject(hmapdc, mapbuf->hbitmap);
|
||||
|
||||
ipicture->lpVtbl->Render(ipicture, hmapdc, 0, 0, mapbuf->width, mapbuf->height, 0, height, width, -height, NULL);
|
||||
ipicture->lpVtbl->Release(ipicture);
|
||||
istream->lpVtbl->Release(istream);
|
||||
|
||||
DeleteDC(hmapdc);
|
||||
GlobalFree(global);
|
||||
CloseHandle(file);
|
||||
}
|
||||
|
||||
void freeImage(ACL_Image *mapbuf)
|
||||
{
|
||||
if(mapbuf->hbitmap) return;
|
||||
DeleteObject(mapbuf->hbitmap);
|
||||
mapbuf->hbitmap = NULL;
|
||||
}
|
||||
|
||||
void registerKeyboardEvent(KeyboardEventCallback callback)
|
||||
{
|
||||
g_keyboard = callback;
|
||||
}
|
||||
|
||||
void registerCharEvent(CharEventCallback callback)
|
||||
{
|
||||
g_char = callback;
|
||||
}
|
||||
|
||||
void registerMouseEvent(MouseEventCallback callback)
|
||||
{
|
||||
g_mouse = callback;
|
||||
}
|
||||
|
||||
void registerTimerEvent(TimerEventCallback callback)
|
||||
{
|
||||
g_timer = callback;
|
||||
}
|
||||
|
||||
void startTimer(int id,int timeinterval)
|
||||
{
|
||||
SetTimer(g_hWnd, id, timeinterval, NULL);
|
||||
}
|
||||
|
||||
void cancelTimer(int id)
|
||||
{
|
||||
KillTimer(g_hWnd, id);
|
||||
}
|
||||
|
||||
void loadSound(const char *fileName,ACL_Sound *pSound)
|
||||
{
|
||||
char *cmdStr;
|
||||
int len = strlen(fileName)*sizeof(char);
|
||||
len +=64;
|
||||
cmdStr = (char*)malloc(len);
|
||||
sprintf(cmdStr,"open \"%s\" type mpegvideo alias S%d",fileName,g_soundID);
|
||||
*pSound = g_soundID;
|
||||
++g_soundID;
|
||||
mciSendStringA(cmdStr,NULL,0,NULL);
|
||||
free(cmdStr);
|
||||
}
|
||||
|
||||
void playSound(int sid,int repeat)
|
||||
{
|
||||
char cmdStr[32];
|
||||
stopSound(sid);
|
||||
if(repeat)
|
||||
sprintf(cmdStr,"play S%d from 0 repeat",sid);
|
||||
else
|
||||
sprintf(cmdStr,"play S%d from 0",sid);
|
||||
mciSendStringA(cmdStr,NULL,0,NULL);
|
||||
}
|
||||
|
||||
void stopSound(int sid)
|
||||
{
|
||||
char cmdStr[32];
|
||||
sprintf(cmdStr,"stop S%d",sid);
|
||||
mciSendStringA(cmdStr,NULL,0,NULL);
|
||||
}
|
||||
|
||||
void setCaretSize(int w,int h)
|
||||
{
|
||||
DestroyCaret();
|
||||
CreateCaret(g_hWnd,0,w,h);
|
||||
SetCaretPos(g_caretX,g_caretY);
|
||||
}
|
||||
|
||||
void setCaretPos(int x,int y)
|
||||
{
|
||||
g_caretX = x;
|
||||
g_caretY = y;
|
||||
SetCaretPos(g_caretX,g_caretY);
|
||||
}
|
||||
|
||||
void showCaret()
|
||||
{
|
||||
ShowCaret(g_hWnd);
|
||||
}
|
||||
|
||||
void hideCaret()
|
||||
{
|
||||
HideCaret(g_hWnd);
|
||||
}
|
||||
|
||||
|
@ -0,0 +1,235 @@
|
||||
/*
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
////////////////////////////////////////////////////////////////
|
||||
// ACLLib - Advanced C Lab Library
|
||||
// Ver 2014-07
|
||||
// For students' Lab at Zhejiang University
|
||||
// Created 2008 by Gao Yuan
|
||||
// Modified 2009 by Cui Liwei
|
||||
// 2010 by Lan Huidong
|
||||
// Revised 2012 by Li Rui
|
||||
// Modified 2014 by Weng Kai for MOOC
|
||||
////////////////////////////////////////////////////////////////
|
||||
|
||||
/*
|
||||
For Dev C++, these lib files need to be added into linker options.
|
||||
Be sure to change the leading folders as your installation.
|
||||
"C:/Program Files/Dev-Cpp/MinGW32/lib/libwinmm.a"
|
||||
"C:/Program Files/Dev-Cpp/MinGW32/lib/libmsimg32.a"
|
||||
"C:/Program Files/Dev-Cpp/MinGW32/lib/libkernel32.a"
|
||||
"C:/Program Files/Dev-Cpp/MinGW32/lib/libuser32.a"
|
||||
"C:/Program Files/Dev-Cpp/MinGW32/lib/libgdi32.a"
|
||||
"C:/Program Files/Dev-Cpp/MinGW32/lib/libole32.a"
|
||||
"C:/Program Files/Dev-Cpp/MinGW32/lib/liboleaut32.a"
|
||||
"C:/Program Files/Dev-Cpp/MinGW32/lib/libuuid.a"
|
||||
*/
|
||||
|
||||
#ifndef __ACLLIB_H__
|
||||
#define __ACLLIB_H__
|
||||
|
||||
#ifdef _UNICODE
|
||||
#undef _UNICODE
|
||||
#endif
|
||||
#ifdef UNICODE
|
||||
#undef UNICODE
|
||||
#endif
|
||||
|
||||
#include <Windows.h>
|
||||
|
||||
#define BLACK RGB(0, 0, 0)
|
||||
#define RED RGB(255, 0, 0)
|
||||
#define GREEN RGB(0, 255, 0)
|
||||
#define BLUE RGB(0, 0, 255)
|
||||
#define CYAN RGB(0, 255, 255)
|
||||
#define MAGENTA RGB(255, 0, 255)
|
||||
#define YELLOW RGB(255, 255, 0)
|
||||
#define WHITE RGB(255, 255, 255)
|
||||
|
||||
#define EMPTY 0xffffffff
|
||||
#define DEFAULT -1
|
||||
|
||||
typedef enum
|
||||
{
|
||||
PEN_STYLE_SOLID,
|
||||
PEN_STYLE_DASH, /* ------- */
|
||||
PEN_STYLE_DOT, /* ....... */
|
||||
PEN_STYLE_DASHDOT, /* _._._._ */
|
||||
PEN_STYLE_DASHDOTDOT, /* _.._.._ */
|
||||
PEN_STYLE_NULL
|
||||
} ACL_Pen_Style;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
BRUSH_STYLE_SOLID = -1,
|
||||
BRUSH_STYLE_HORIZONTAL, /* ----- */
|
||||
BRUSH_STYLE_VERTICAL, /* ||||| */
|
||||
BRUSH_STYLE_FDIAGONAL, /* \\\\\ */
|
||||
BRUSH_STYLE_BDIAGONAL, /* ///// */
|
||||
BRUSH_STYLE_CROSS, /* +++++ */
|
||||
BRUSH_STYLE_DIAGCROSS, /* xxxxx */
|
||||
BRUSH_STYLE_NULL
|
||||
} ACL_Brush_Style;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
NO_BUTTON = 0,
|
||||
LEFT_BUTTON,
|
||||
MIDDLE_BUTTON,
|
||||
RIGHT_BUTTON
|
||||
} ACL_Mouse_Button;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
BUTTON_DOWN,
|
||||
BUTTON_DOUBLECLICK,
|
||||
BUTTON_UP,
|
||||
ROLL_UP,
|
||||
ROLL_DOWN,
|
||||
MOUSEMOVE
|
||||
} ACL_Mouse_Event;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
KEY_DOWN,
|
||||
KEY_UP
|
||||
} ACL_Keyboard_Event;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
HBITMAP hbitmap;
|
||||
int width;
|
||||
int height;
|
||||
} ACL_Image;
|
||||
|
||||
//typedef enum
|
||||
//{
|
||||
// TM_NO = 0x00,
|
||||
// TM_COLOR = 0x01,
|
||||
// TM_ALPHA = 0x02
|
||||
//} ACL_TransparentMode;
|
||||
|
||||
typedef COLORREF ACL_Color;
|
||||
typedef int ACL_Sound;
|
||||
|
||||
typedef void(*KeyboardEventCallback) (int key, int event);
|
||||
typedef void(*CharEventCallback) (char c);
|
||||
typedef void(*MouseEventCallback) (int x, int y, int button, int event);
|
||||
typedef void(*TimerEventCallback) (int timerID);
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
int Setup(void);
|
||||
|
||||
//
|
||||
void initWindow(const char title[], int left, int top, int width, int height);
|
||||
void msgBox(const char title[], const char text[], int flag);
|
||||
|
||||
void registerKeyboardEvent(KeyboardEventCallback callback);
|
||||
void registerCharEvent(CharEventCallback callback);
|
||||
void registerMouseEvent(MouseEventCallback callback);
|
||||
void registerTimerEvent(TimerEventCallback callback);
|
||||
|
||||
void startTimer(int timerID, int timeinterval);
|
||||
void cancelTimer(int timerID);
|
||||
|
||||
// Sound
|
||||
void loadSound(const char *fileName, ACL_Sound *pSound);
|
||||
void playSound(ACL_Sound soundID, int repeat);
|
||||
void stopSound(ACL_Sound soundID);
|
||||
|
||||
// Paint
|
||||
void beginPaint();
|
||||
void endPaint();
|
||||
void clearDevice(void);
|
||||
int getWidth();
|
||||
int getHeight();
|
||||
|
||||
// Pen
|
||||
void setPenColor(ACL_Color color);
|
||||
void setPenWidth(int width);
|
||||
void setPenStyle(ACL_Pen_Style style);
|
||||
|
||||
// Brush
|
||||
void setBrushColor(ACL_Color color);
|
||||
void setBrushStyle(ACL_Brush_Style style);
|
||||
|
||||
// Text
|
||||
void setTextColor(ACL_Color color);
|
||||
void setTextBkColor(ACL_Color color);
|
||||
void setTextSize(int size);
|
||||
void setTextFont(const char *pFontName);
|
||||
|
||||
void paintText(int x, int y, const char *pStr);
|
||||
|
||||
void setCaretSize(int w, int h);
|
||||
void setCaretPos(int x, int y);
|
||||
void showCaret();
|
||||
void hideCaret();
|
||||
|
||||
// Pixel
|
||||
void putPixel(int x, int y, ACL_Color color);
|
||||
ACL_Color getPixel(int x, int y);
|
||||
|
||||
// the Point
|
||||
int getX(void);
|
||||
int getY(void);
|
||||
void moveTo(int x, int y);
|
||||
void moveRel(int dx, int dy);
|
||||
|
||||
// Lines and Curves
|
||||
void arc(int nLeftRect, int nTopRect, int nRightRect, int nBottomRect, \
|
||||
int nXStartArc, int nYStartArc, int nXEndArc, int nYEndArc);
|
||||
void line(int x0, int y0, int x1, int y1);
|
||||
void lineTo(int nXEnd, int nYEnd);
|
||||
void lineRel(int dx, int dy);
|
||||
void polyBezier(const POINT *lppt, int cPoints);
|
||||
void polyLine(const POINT *lppt, int cPoints);
|
||||
|
||||
// Filled Shapes
|
||||
void chrod(int nLeftRect, int nTopRect, int nRightRect, int nBottomRect, \
|
||||
int nXRadial1, int nYRadial1, int nXRadial2, int nYRadial2);
|
||||
void ellipse(int nLeftRect, int nTopRect, int nRightRect, int nBottomRect);
|
||||
void pie(int nLeftRect, int nTopRect, int nRightRect, int nBottomRect, \
|
||||
int nXRadial1, int nYRadial1, int nXRadial2, int nYRadial2);
|
||||
void polygon(const POINT *lpPoints, int nCount);
|
||||
void rectangle(int nLeftRect, int nTopRect, int nRightRect, int nBottomRect);
|
||||
void roundrect(int nLeftRect, int nTopRect, int nRightRect, int nBottomRect, \
|
||||
int nWidth, int nHeight);
|
||||
|
||||
// Image
|
||||
void loadImage(const char *pImageFileName, ACL_Image *pImage);
|
||||
void freeImage(ACL_Image *pImage);
|
||||
|
||||
void putImage(ACL_Image *pImage, int x, int y);
|
||||
void putImageScale(ACL_Image *pImage, int x, int y, int width, int height);
|
||||
void putImageTransparent(ACL_Image *pImage, int x, int y, int width, int height, ACL_Color bkColor);
|
||||
|
||||
//void putImageEx(ACL_Image *pImage,int dx,int dy,int dw,int dh,
|
||||
// int sx,int sy,int sw,int sh);
|
||||
|
||||
//void setTransparentMode(ACL_TransparenetMode);
|
||||
//void setTransparentColor(ACL_Color);
|
||||
//void setTransparetnAlpha(int alpha);
|
||||
|
||||
void initConsole(void);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
Binary file not shown.
Binary file not shown.
@ -0,0 +1,82 @@
|
||||
[Project]
|
||||
FileName=ÏîÄ¿1.dev
|
||||
Name=ÏîÄ¿1
|
||||
Type=1
|
||||
Ver=2
|
||||
ObjFiles=
|
||||
Includes=
|
||||
Libs=
|
||||
PrivateResource=
|
||||
ResourceIncludes=
|
||||
MakeIncludes=
|
||||
Compiler=
|
||||
CppCompiler=
|
||||
Linker=E:/Dev-Cpp/MinGW64/x86_64-w64-mingw32/lib/libwinmm.a_@@_E:/Dev-Cpp/MinGW64/x86_64-w64-mingw32/lib/libmsimg32.a_@@_E:/Dev-Cpp/MinGW64/x86_64-w64-mingw32/lib/libkernel32.a_@@_E:/Dev-Cpp/MinGW64/x86_64-w64-mingw32/lib/libuser32.a_@@_E:/Dev-Cpp/MinGW64/x86_64-w64-mingw32/lib/libgdi32.a_@@_E:/Dev-Cpp/MinGW64/x86_64-w64-mingw32/lib/libole32.a_@@_E:/Dev-Cpp/MinGW64/x86_64-w64-mingw32/lib/liboleaut32.a_@@_E:/Dev-Cpp/MinGW64/x86_64-w64-mingw32/lib/libuuid.a_@@_
|
||||
IsCpp=0
|
||||
Icon=
|
||||
ExeOutput=
|
||||
ObjectOutput=
|
||||
LogOutput=
|
||||
LogOutputEnabled=0
|
||||
OverrideOutput=0
|
||||
OverrideOutputName=ÏîÄ¿1.exe
|
||||
HostApplication=
|
||||
UseCustomMakefile=0
|
||||
CustomMakefile=
|
||||
CommandLine=
|
||||
Folders=
|
||||
IncludeVersionInfo=0
|
||||
SupportXPThemes=0
|
||||
CompilerSet=0
|
||||
CompilerSettings=0000000000000000001000000
|
||||
UnitCount=3
|
||||
|
||||
[VersionInfo]
|
||||
Major=1
|
||||
Minor=0
|
||||
Release=0
|
||||
Build=0
|
||||
LanguageID=1033
|
||||
CharsetID=1252
|
||||
CompanyName=
|
||||
FileVersion=1.0.0.0
|
||||
FileDescription=Developed using the Dev-C++ IDE
|
||||
InternalName=
|
||||
LegalCopyright=
|
||||
LegalTrademarks=
|
||||
OriginalFilename=
|
||||
ProductName=
|
||||
ProductVersion=1.0.0.0
|
||||
AutoIncBuildNr=0
|
||||
SyncProduct=1
|
||||
|
||||
[Unit1]
|
||||
FileName=ces.c
|
||||
CompileCpp=0
|
||||
Folder=
|
||||
Compile=1
|
||||
Link=1
|
||||
Priority=1000
|
||||
OverrideBuildCmd=0
|
||||
BuildCmd=
|
||||
|
||||
[Unit2]
|
||||
FileName=acllib.c
|
||||
CompileCpp=0
|
||||
Folder=
|
||||
Compile=1
|
||||
Link=1
|
||||
Priority=1000
|
||||
OverrideBuildCmd=0
|
||||
BuildCmd=
|
||||
|
||||
[Unit3]
|
||||
FileName=acllib.h
|
||||
CompileCpp=0
|
||||
Folder=
|
||||
Compile=1
|
||||
Link=1
|
||||
Priority=1000
|
||||
OverrideBuildCmd=0
|
||||
BuildCmd=
|
||||
|
Binary file not shown.
@ -0,0 +1,18 @@
|
||||
[Editors]
|
||||
Order=0,1,2
|
||||
Focused=0
|
||||
[Editor_0]
|
||||
CursorCol=10
|
||||
CursorRow=91
|
||||
TopLine=85
|
||||
LeftChar=1
|
||||
[Editor_1]
|
||||
CursorCol=6
|
||||
CursorRow=141
|
||||
TopLine=119
|
||||
LeftChar=1
|
||||
[Editor_2]
|
||||
CursorCol=1
|
||||
CursorRow=210
|
||||
TopLine=193
|
||||
LeftChar=1
|
Loading…
Reference in new issue