C语言:ACLLIB图形库——如何搭建环境(附三个文件代码)
看一下我配置完的运行结果:
1)首先创建一个项目。
2)选择win项目和C语言
3)然后找到你保存项目的文件夹里面拷贝两个.c和.h文件,两个文件代码我附在最后。
4)现在还不能用,找到项目属性
5)打开参数,点开连接,你可以看到我已经粘贴进去了
如果你是64位和我一样的话那就粘贴下面的两个其中一个(因为我的电脑这些文件位置不一样)
A种)
C:/Program Files/Dev-Cpp/MinGW64/x86_64-w64-mingw32/lib/libwinmm.a C:/Program Files/Dev-Cpp/MinGW64/x86_64-w64-mingw32/lib/libmsimg32.a C:/Program Files/Dev-Cpp/MinGW64/x86_64-w64-mingw32/lib/libkernel32.a C:/Program Files/Dev-Cpp/MinGW64/x86_64-w64-mingw32/lib/libuser32.a C:/Program Files/Dev-Cpp/MinGW64/x86_64-w64-mingw32/lib/libgdi32.a C:/Program Files/Dev-Cpp/MinGW64/x86_64-w64-mingw32/lib/libole32.a C:/Program Files/Dev-Cpp/MinGW64/x86_64-w64-mingw32/lib/liboleaut32.a C:/Program Files/Dev-Cpp/MinGW64/x86_64-w64-mingw32/lib/libuuid.a
B种)
"C:/Program Files (x86)/Dev-Cpp/MinGW64/x86_64-w64-mingw32/lib/libwinmm.a"
"C:/Program Files (x86)/Dev-Cpp/MinGW64/x86_64-w64-mingw32/lib32/libgdi32.a"
"C:/Program Files (x86)/Dev-Cpp/MinGW64/x86_64-w64-mingw32/lib32/libkernel32.a"
"C:/Program Files (x86)/Dev-Cpp/MinGW64/x86_64-w64-mingw32/lib32/libmsimg32.a"
"C:/Program Files (x86)/Dev-Cpp/MinGW64/x86_64-w64-mingw32/lib32/libole32.a"
"C:/Program Files (x86)/Dev-Cpp/MinGW64/x86_64-w64-mingw32/lib32/liboleaut32.a"
"C:/Program Files (x86)/Dev-Cpp/MinGW64/x86_64-w64-mingw32/lib32/libuser32.a"
"C:/Program Files (x86)/Dev-Cpp/MinGW64/x86_64-w64-mingw32/lib32/libuuid.a"
6)你现在可以把你在主函数里面自动生成的代码全部删掉,注意是主函数哈,不是那两个要你复制过去的文件。删掉后你就可以做你自己事情,写你的图形了
我的main函数代码:
#include "acllib.h"
#include<stdio.h>
int Setup()
{
initConsole();
printf("输入宽度:");
int width;
scanf("%d", &width);
initWindow( "text",100,100, 600, 500);
beginPaint();
line(20, 20, width-20, width-20);
endPaint();
return 0;
}
下面是两个文件
PS:简单说个前提,也就是我在配置的过程中遇到的问题
在文件里面有些dev配置不一样,导致会报错,所以当你报错的时候可以选择注释掉报错的那一行或者把我注释掉的代码给释放出来
有些比如这个是acllib.c里面的,被我注释掉,因为我dev报错 了,如果你报错了,你也可以试试释放出来
也比如说acllib.h文件里面,两个函数也被我注释掉了,在我dev里面报错了,如果你用了也会报错那么你试试把代码释放出来看看行不行。
acllib.c(记得文件名不能修改,只能叫acllib然后选择.c文件)
/*
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);
}
acllib.h(同样不能修改文件名,要是acllib选择.h头文件,你要修改的话里面的包含头文件代码也要修改)
代码:
/*
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
C语言:ACLLIB图形库——如何搭建环境(附三个文件代码)的更多相关文章
- C入门语言基础一[可移植性、涉及的三种文件、编程7个步骤、编译器、链接器]
Review Questions What dose portability mean in the context of programming? 文中讲到的可移植性是什么意思? C本身是不涉及 ...
- WIN32_FIND_DATA 详细结构(附循环读取文件代码)
//去除路径最后多余的斜杠和反斜杠 std::string TrimPath(std::string path) { //string test3("内容"); 使用引用字符数组作 ...
- QT树莓派交叉编译环开发环境搭建(附多个exe工具下载链接)
前两天入手了一块2.8’的tft液晶显示屏,于是和树莓派连了一发,成功将命令行显示在了这块小的可怜的屏幕上之后,觉得这屏幕就显示个黑白内容太浪费了,于是考虑开发一个”脸”(图形用户界面,GUI).首先 ...
- Java基础笔记(1) 语言 JAVA的历史 Java的搭建环境
本文除了搭建是重点,其他的都当阅读小说一样去看就好了,不想看可以直接抓住重点,我会改变颜色勾出重点! 英语是人与人交流沟通的重要方式之一.JAVA:是人与计算机沟通交流重要方式之一.我们除了用java ...
- Golang (Go语言) Mac OS X下环境搭建 环境变量配置 开发工具配置 Sublime Text 2 【转】
一.安装Golang的SDK 在官网 http://golang.org/ 直接下载安装包安装即可.下载pkg格式的最新安装包,直接双击运行,一路按照提示操作即可完成安装. 安装完成后,打开终端,输入 ...
- Ext.NET 4.1 系统框架的搭建(后台) 附源码
Ext.NET 4.1 系统框架的搭建(后台) 附源码 代码运行环境:.net 4.5 VS2013 (代码可直接编译运行) 预览图: 分析图: 上面系统的构建包括三块区域:North.West和C ...
- ActiveReports 9实战教程(1): 手把手搭建环境Visual Studio 2013 社区版
原文:ActiveReports 9实战教程(1): 手把手搭建环境Visual Studio 2013 社区版 ActiveReports 9刚刚发布3天,微软就发布了 Visual Studio ...
- 搭建环境Visual Studio 2013 社区版
搭建环境Visual Studio 2013 社区版 ActiveReports 9刚刚发布3天,微软就发布了 Visual Studio Community 2013 开发环境. Visual St ...
- php 手动搭建环境
php手动搭建环境有好多种组合,版本号不一致,会导致搭建失败. 我搭建的组合是: php5.6+MySQL5.6+Apache2.4的组合. 一.PHP语言包下载 首先从官网上下载php5.6 htt ...
- PHP手动搭建环境
php手动搭建环境有好多种组合,版本号不一致,会导致搭建失败. 我搭建的组合是: php5.6+MySQL5.6+Apache2.4的组合. 一.PHP语言包下载 首先从官网上下载php5.6 htt ...
随机推荐
- #2-SAT,Tarjan,前缀优化建边#洛谷 6378 [PA2010]Riddle
题目 \(n\) 个点 \(m\) 条边的无向图被分成 \(k\) 个部分.每个部分包含一些点. 请选择一些关键点,使得每个部分恰有一个关键点,且每条边至少有一个端点是关键点. 分析 每条边至少有一个 ...
- 使用OHOS SDK构建mimalloc
参照OHOS IDE和SDK的安装方法配置好开发环境. 从github下载源码. 执行如下命令: git clone https://github.com/microsoft/mimalloc.git ...
- OpenHarmony 4.0 Beta1发布,邀您体验
初夏之际,OpenAtom OpenHarmony(简称"OpenHarmony") 4.0 Beta1版本如期而至.4.0 Beta1版本在3.2 Release版本基础上, ...
- C# 通过ARP技术来观察目标主机数据包
由于之前写的C# 实现Arp欺诈的文章属于网络攻击,不能够被展示,所以这边我们稍微说一下C#调用ARP包以及查看其他电脑上网数据包的技术,委婉的说一下ARP在局域网之中的应用. 本文章纯属技术讨论,并 ...
- SQL 数据操作技巧:SELECT INTO、INSERT INTO SELECT 和 CASE 语句详解
SQL SELECT INTO 语句 SELECT INTO 语句将数据从一个表复制到一个新表中. SELECT INTO 语法 将所有列复制到新表中: SELECT * INTO newtable ...
- Numpy结构化数组
Numpy结构化数组 Numpy的结构化数组和记录数组为复合的.异构的的数据提供了非常有效的存储. 结构化数组 In [1]: import numpy as np In [2]: name = [' ...
- 【Insights直播】华为帐号服务,打造全场景安全帐号体系
在App运营过程中,如何保持用户增长和提升用户体验始终是开发者关注的问题,而作为用户使用体验感知的第一环节--帐号注册登录环节是不可忽视,且有很大提升空间的.如何提升帐号的注册登录体验?如何保证用户在 ...
- Tailscale 的 TLS 证书过期,网站挂了 90 分钟!
3月7日,基于 WireGuard 的知名 VPN 厂商 Tailscale 的官方网站 tailscale.com 因 TLS 证书过期而中断服务约90分钟. 虽然影响有限,但这起事件还是在 Hac ...
- HarmonyOS远端状态订阅开发实例
IPC/RPC提供对远端Stub对象状态的订阅机制, 在远端Stub对象消亡时,可触发消亡通知告诉本地Proxy对象.这种状态通知订阅需要调用特定接口完成,当不再需要订阅时也需要调用特定接口取消.使 ...
- 什么是报表工具?和 EXCEL 有什么区别?
报表是什么? 带数据的表格和图表就都是报表,像工资表,考勤表,成绩表,资产负载表等等都是报表. 那报表工具,顾名思义就是用来做报表的工具,那 Excel 是不是也算报表工具?广义上讲当然也算.但 IT ...