SU-ZE-CC 1 year ago
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.

@ -0,0 +1,142 @@
#include <stdio.h>
#include <stdlib.h>
#include "acllib.h"
#include <Windows.h>
#define Text_num 1 //输入框容量
#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
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
typedef struct TBox *TextBox;
struct TBox{
char text[Text_num];//输入框输入内容
int x;//输入框x坐标
int y;//输入框y坐标
int length;//输入框长度
int height;//输入框高度
int charLen;//当前字符长度
char select;//当前是否被选中 0未被选中1被选中一个界面最多一个输入框被选中
int see_flag;//1不可见
int text_flag;//1文字不可见
};
TextBox TextBox1;
void paintNumber(int x,int y,int TextSize,ACL_Color TextColor,ACL_Color TextBkColor, char num[]){//画数字 参数x坐标 y坐标 字体大小 字体颜色 字体背景颜色 要输出的文字
beginPaint();
setTextSize(TextSize);//设置字体大小
setTextColor(TextColor);//设置字体颜色
setTextBkColor(TextBkColor);//设置背景
paintText(x,y,num);//输出字体
endPaint();
}
void paint_TextBox(){
beginPaint();
setTextSize(16);
setTextBkColor(EMPTY);
setPenColor(BLACK);
setBrushColor(WHITE);
rectangle(TextBox1->x,TextBox1->y,TextBox1->x+TextBox1->length,TextBox1->y+TextBox1->height);//框
paintText(680+2,280+2,TextBox1->text);//文字
endPaint();
}
int is_zh_ch(char p){//判断是否为汉字
if(~(p >> 8) == 0){ // 将p字节进行移位运算右移8位这样如果移位后是0则说明原来的字节最高位为0不是1那么也就不是汉字的一个字节。
return 0; //代表是汉字
}
return -1;
}
void paint_Textbox_text(char c){//参数:输入的字符
printf("TextBox1->see_flag=%d\n",TextBox1->see_flag);
char textflag=-2;//用于记录上一个字符是否为中文 0为 中文-1不是中文
if(TextBox1->charLen>0){//确保有内容
textflag=is_zh_ch(TextBox1->text[TextBox1->charLen-1]);
}
if(TextBox1->select == 1){//输入框被选择且输入框可见
TextBox1->text_flag = 0;
if(c == '\b' && TextBox1->charLen-1 >= 0){//退格操作
if(textflag==0){//若检测是中文退两格
TextBox1->text[--TextBox1->charLen] = ' ';
TextBox1->text[--TextBox1->charLen] = ' ';
paint_TextBox();//先覆盖输入框 再输出文字
paint_Caret();//画光标
}
else{//不是中文退一格
TextBox1->text[--TextBox1->charLen] = ' ';
paint_TextBox();//先覆盖输入框 再输出文字
paint_Caret();//画光标
}
}
else if(c == '\b' && TextBox1->charLen == 0){//当长度为0时不再进行退格操作
return;
}
else if(TextBox1->charLen+1 < Text_num){//增加内容
TextBox1->text[TextBox1->charLen++] = c;
paint_TextBox();//先覆盖输入框 再输出文字
paint_Caret();
}
puts(TextBox1->text);//输出输入结果
}
}
//画光标
void paint_Caret(){
setCaretPos(TextBox1->x+TextBox1->charLen*9+3,TextBox1->y+3);//一个字符的宽度是9个像素
}
int Setup(void){
initConsole();
initWindow("abc",DEFAULT,DEFAULT,803,600);
paint_TextBox();
return 0;
}

Binary file not shown.

@ -0,0 +1,61 @@
struct TBox{
char text[Text_num];//输入框输入内容
int x;//输入框x坐标
int y;//输入框y坐标
int length;//输入框长度
int height;//输入框高度
int charLen;//当前字符长度
char select;//当前是否被选中 0未被选中1被选中一个界面最多一个输入框被选中
int see_flag;//1不可见
int text_flag;//1文字不可见
};
void paint_TextBox(){
beginPaint();
setTextSize(16);
setTextBkColor(EMPTY);
setPenColor(BLACK);
setBrushColor(WHITE);
rectangle(TextBox1->x,TextBox1->y,TextBox1->x+TextBox1->length,TextBox1->y+TextBox1->height);//框
paintText(680+2,280+2,TextBox1->text);//文字
endPaint();
}
//画光标
void paint_Caret(){
setCaretPos(TextBox1->x+TextBox1->charLen*9+3,TextBox1->y+3);//一个字符的宽度是9个像素
}
typedef struct
{
HBITMAP hbitmap;
int width;
int height;
} ACL_Image;//图片
void LoadAllImages(){//加载所有图片
loadImage("images/background.jpg" , &IMAGES.background);
loadImage("images/button_month.jpg" , &IMAGES.button_month);
loadImage("images/button_month_hover.jpg" , &IMAGES.button_month_hover);
loadImage("images/month.jpg" , &IMAGES.month);
loadImage("images/gobacktoday.jpg" , &IMAGES.gobacktoday);
loadImage("images/gobacktoday_hover.jpg" , &IMAGES.gobacktoday_hover);
loadImage("images/test.jpg" , &IMAGES.test);
loadImage("images/addevent.jpg" , &IMAGES.addevent);
loadImage("images/addevent_hover.jpg" , &IMAGES.addevent_hover);
loadImage("images/data_background.jpg" , &IMAGES.data_background);
}
void paintNumber(int x,int y,int TextSize,ACL_Color TextColor,ACL_Color TextBkColor, char num[]){//画数字 参数x坐标 y坐标 字体大小 字体颜色 字体背景颜色 要输出的文字
beginPaint();
setTextSize(TextSize);//设置字体大小
setTextColor(TextColor);//设置字体颜色
setTextBkColor(TextBkColor);//设置背景
paintText(x,y,num);//输出字体
endPaint();
}
void setTextColor(ACL_Color color);
void setTextBkColor(ACL_Color color);
void setTextSize(int size);
void setTextFont(char *pFontName);
void paintText(int x, int y, const char *pStr);
说明:
将 pStr 所指向的文字输出到屏幕坐标 x、y 处。

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=

@ -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

@ -0,0 +1,164 @@
#include "acllib.h"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#define random(x) (rand()%x) //随机产生[0-x)的整数
#define Text_num 2 //输入框容量
#define _CRT_SECURE_NO_WARNINGS
/*输入框结构体*/
typedef struct TBox *TextBox;
struct TBox{
char text[Text_num];//输入框输入内容
int x;//输入框x坐标
int y;//输入框y坐标
int length;//输入框长度
int height;//输入框高度
int charLen;//当前字符长度
char select;//当前是否被选中 0未被选中1被选中一个界面最多一个输入框被选中
int see_flag;//1不可见
int text_flag;//1文字不可见
};
TextBox TextBox1[15][15];
int index_x;
int index_y;
/*功能函数*/
/*输入框函数 */
//画输入框
void paint_TextBox(int i,int j){
beginPaint();
setTextSize(16);
setTextBkColor(EMPTY);
setPenColor(BLACK);
setBrushColor(WHITE);
rectangle(TextBox1[i][j]->x,TextBox1[i][j]->y,TextBox1[i][j]->x+TextBox1[i][j]->length,TextBox1[i][j]->y+TextBox1[i][j]->height);//框
paintText(TextBox1[i][j]->x,TextBox1[i][j]->y,TextBox1[i][j]->text);//文字
endPaint();
}
//画光标
void paint_Caret(int i,int j){
setCaretPos(TextBox1[i][j]->x+TextBox1[i][j]->charLen*9+3,TextBox1[i][j]->y+3);//一个字符的宽度是9个像素
}
int is_zh_ch(char p){//判断是否为汉字
if(~(p >> 8) == 0){ // 将p字节进行移位运算右移8位这样如果移位后是0则说明原来的字节最高位为0不是1那么也就不是汉字的一个字节。
return 0; //代表是汉字
}
return -1;
}
//画输入框
void paint_Textbox_text(char c,int i,int j){//参数:输入的字符
char textflag=-2;//用于记录上一个字符是否为中文 0为 中文-1不是中文
if(TextBox1[i][j]->charLen>0){//确保有内容
textflag=is_zh_ch(TextBox1[i][j]->text[TextBox1[i][j]->charLen-1]);
}
if(TextBox1[i][j]->select == 1){//输入框被选择且输入框可见
TextBox1[i][j]->text_flag = 0;
if(c == '\b' && TextBox1[i][j]->charLen-1 >= 0){//退格操作
if(textflag==0){//若检测是中文退两格
TextBox1[i][j]->text[--TextBox1[i][j]->charLen] = ' ';
TextBox1[i][j]->text[--TextBox1[i][j]->charLen] = ' ';
paint_TextBox(i,j);//先覆盖输入框 再输出文字
paint_Caret(i,j);//画光标
}
else{//不是中文退一格
TextBox1[i][j]->text[--TextBox1[i][j]->charLen] = ' ';
paint_TextBox(i,j);//先覆盖输入框 再输出文字
paint_Caret(i,j);//画光标
}
}
else if(c == '\b' && TextBox1[i][j]->charLen == 0){//当长度为0时不再进行退格操作
return;
}
else if(TextBox1[i][j]->charLen+1 < Text_num){//增加内容
TextBox1[i][j]->text[TextBox1[i][j]->charLen++] = c;
paint_TextBox(i,j);//先覆盖输入框 再输出文字
paint_Caret(i,j);
}
puts(TextBox1[i][j]->text);//输出输入结果
}
}
void CharEvent(char c){//参数:输入的字符
paint_Textbox_text(c,index_x,index_y);//输出输入框的内容
}
void initializeData(int x,int y,int i,int j){//初始化数据 输入框的参数
int k;
TextBox1[i][j] = (TextBox)malloc(sizeof(struct TBox));
for(k = 0; k < Text_num; k++){
TextBox1[i][j]->text[k] = '\0';
}
/*输入框的x坐标,y坐标*/
TextBox1[i][j]->x = x;
TextBox1[i][j]->y = y;
/*输入框的宽度,宽度*/
TextBox1[i][j]->length = 20;
TextBox1[i][j]->height = 20;
TextBox1[i][j]->charLen = 0;
}
void paintFrame(i,j){//初始化
paint_TextBox(i,j);//输入框绘画
}
void mouseEvent(int x,int y,int bt,int event){//鼠标事件 参数x坐标 y坐标 按键 事件
if(event==BUTTON_DOWN){
if(bt==LEFT_BUTTON){
clickEvent(x,y);//鼠标点击事件
}
}
}
void clickEvent(int x,int y){//鼠标点击产生的事件
int i=0;
int j=0;
i=(x-200)/20;
j=(y-200)/20;
index_x=i;
index_y=j;
/*输入框点击事件*/
if(x>TextBox1[i][j]->x&&x<TextBox1[i][j]->x+TextBox1[i][j]->length&&y>TextBox1[i][j]->y&&y<TextBox1[i][j]->y+TextBox1[i][j]->height){
setCaretSize(1,13);
showCaret();//显示光标
TextBox1[i][j]->select = 1;//表示当前被选中
paint_Caret(i,j);
}
else{
TextBox1[i][j]->select = 0;
hideCaret();//隐藏光标
}
}
int Setup(){
int n;
initWindow("输入框",DEFAULT,DEFAULT,803,600);
initConsole();
registerMouseEvent(mouseEvent);//鼠标事件
registerCharEvent(CharEvent);//键盘事件
/*输入框部分*/
int i,j;
for(i=0;i<15;i++){
for(j=0;j<15;j++){
initializeData(200+i*20,200+j*20,i,j);//输入框数据初始化
paint_TextBox(i,j);//画输入框
}
}
return 0;
}

@ -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…
Cancel
Save