热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Win7VS2015及MinGW环境编译矢量库agg2.5和cairo1.14.6

书接上文,昨天装了MinGW,主要原因之一是要用到MSYS,所以顺手把FFMPEG又编译了一遍。回到主题,其实我是想编译矢量

书接上文,昨天装了MinGW,主要原因之一是要用到MSYS,所以顺手把FFMPEG又编译了一遍。

回到主题,其实我是想编译矢量库,因为最近要学习一些计算几何算法,所以找个方便的2D画图库就很重要。

说白了其实是懒得用OpenGL写画几何体代码,画线,AA什么的。

不管怎么说,介绍看的是这篇文章。

http://www.cnblogs.com/yanhuiw/p/3885144.html

提到了3个矢量库,因为墙的原因,google的Skia死活弄不下来,所以只写前两个。

首先是AGG,http://www.antigrain.com/

第三方依懒库只有freetype,而freetype自带sln工程,所以编译没有问题,我直接打开的2010工程

freetype2\builds\windows\vc2010

然后新建一个Win32 Console Static library空工程,把AGG源码手动添加进工程,注意平台相关,别把没用的也加进去

并把相关目录加到include目录中,再加上freetype2的include,library,

编译就行了

相关目录

font_freetype

font_win32_tt

gpc

src

src\ctrl

src\platform\win32

========================================

然后新建一个Win32 Project,也就是窗口程序,实际上我建的Win32 Console空工程,然后在工程设置又改成的窗口,怎么弄都行。

配置上AGG的include,library目录

然后使用下面这个测试hello world,原文在哪忘了,只是测试下。

1 #include "agg_basics.h"
2 #include "agg_rendering_buffer.h"
3 #include "agg_rasterizer_scanline_aa.h"
4 #include "agg_scanline_u.h"
5 #include "agg_renderer_scanline.h"
6 #include "agg_pixfmt_rgb.h"
7 #include "platform/agg_platform_support.h"
8 #include "agg_ellipse.h"
9 #include "agg_conv_contour.h"
10 #include "agg_conv_stroke.h"
11
12 #include "agg_conv_marker.h"
13 #include "agg_arrowhead.h"
14 #include "agg_path_storage.h"
15 #include "agg_vcgen_markers_term.h"
16
17
18 #include // conv_stroke
19 #include // conv_dash
20 #include // conv_marker
21 #include // conv_curve
22 #include // conv_contour
23 #include // conv_smooth_poly1.h
24 #include // conv_bspline
25 #include // conv_transform
26
27
28 class the_application : public agg::platform_support
29 {
30 public:
31 the_application(agg::pix_format_e format, bool flip_y) :
32 agg::platform_support(format, flip_y)
33 {
34 }
35
36 virtual void on_draw()
37 {
38 //Rendering Buffer //用于存放像素点阵数据的内存块,这里是最终形成的图像数据
39 agg::rendering_buffer &rbuf = rbuf_window();
40 agg::pixfmt_bgr24 pixf(rbuf);
41
42 // Renderers
43 typedef agg::renderer_base renderer_base_type; //底层渲染器
44 renderer_base_type renb(pixf);
45
46 // typedef agg::renderer_scanline_aa_solid renderer_scanline_type; //高层渲染器
47 typedef agg::renderer_scanline_bin_solid renderer_scanline_type; //高层渲染器
48
49 renderer_scanline_type rensl(renb);
50 /*
51 // Vertex Source
52 //agg::ellipse ell(100,100,50,50); //顶点源,里面存放了一堆2D顶点以及对应的命令,这个顶点源呈现的是一个圆形
53 agg::triangle ell(100,100,50);
54
55 // Coordinate conversion pipeline //坐标转换管道,它可以变换Vertex Source中的顶点,比如矩阵变换,轮廓提取,转换为虚线等。
56 //typedef agg::conv_contour ell_cc_type; //扩展轮廓线
57 typedef agg::conv_contour ell_cc_type;
58 ell_cc_type ccell(ell);
59
60 typedef agg::conv_stroke ell_cc_cs_type; //只显示轮廓线
61 ell_cc_cs_type csccell(ccell);
62 */
63
64 // Vertex Source
65
66 agg::ellipse ell(0, 0, 50, 50); // 圆心在中间
67 // Coordinate conversion pipeline
68 agg::trans_affine mtx; // trans_affine不 仅仅用于源顶点的变换,在AGG库中有不少地方都能看到它
69 mtx.scale(0.5, 1); // x轴缩小到原来的一半
70 mtx.rotate(agg::deg2rad(30)); // 旋转30度
71 mtx.translate(100, 100); // 平移100,100
72 typedef agg::conv_transform ell_ct_type;
73 ell_ct_type ctell(ell, mtx); // 矩阵变换
74
75 typedef agg::conv_contour ell_cc_type;
76 ell_cc_type ccell(ctell); // 轮廓变换
77
78 typedef agg::conv_dash ell_cd_type;
79 ell_cd_type cdccell(ccell);
80 cdccell.add_dash(5, 5);
81
82
83 typedef agg::conv_stroke ell_cc_cs_type;
84 // ell_cc_cs_type csccell(ccell); // 转换成多义线
85 ell_cc_cs_type csccell(cdccell);
86
87 // csccell.width(3);
88
89
90 // Scanline Rasterizer //把顶点数据(矢量数据)转换成一组水平扫描线,扫描线由一组线段(Span)组成,线段(Span)包含了起始位置、长度和覆盖率(可以理解为透明度)信息。AGG的抗锯齿(Anti-Aliasing)功能也是在这时引入的。
91 agg::rasterizer_scanline_aa<> ras;
92 agg::scanline_u8 sl;
93
94 // Draw
95 renb.clear(agg::rgba8(255, 255, 255));
96 // renb.clip_box(30,30,160,160); // 设置可写区域
97
98 for (int i &#61; 0; i<5; i&#43;&#43;)
99 {
100 ccell.width(i * 20);
101 ras.add_path(csccell);
102 rensl.color(agg::rgba8(0, 0, i * 50));
103 // agg::render_scanlines(ras,sl,rensl);
104 agg::render_scanlines_aa_solid(ras, sl, renb, agg::rgba8(0, 0, i * 50));
105
106 }
107
108
109 static double i &#61; 0;
110 &#43;&#43;i;
111 agg::path_storage ps;
112
113 ps.start_new_path();
114 ps.move_to(200&#43; i, 60);
115 ps.line_to(400, 100);
116 ps.line_to(300, 140);
117 ps.end_poly();
118
119
120
121 agg::conv_stroke csps(ps);
122 ras.add_path(csps);
123 agg::render_scanlines_aa_solid(ras, sl, renb, agg::rgba8(0, 0, 0));
124
125
126
127
128
129 /*
130 agg::arrowhead ah;
131 ah.head(0,10,5,5);
132 ah.tail(10,10,5,5);
133 // 用path_storage生成一条直线
134 agg::path_storage ps;
135 ps.move_to(160,60);
136 ps.line_to(100,100);
137 // 转换
138 agg::conv_stroke csps(ps);
139 agg::conv_marker
140 arrow(csps.markers(), ah);
141 // 画线
142 ras.add_path(csps);
143 agg::render_scanlines_aa_solid(ras,sl,renb,agg::rgba8(0,0,0));
144 // 画箭头
145 ras.add_path(arrow);
146 agg::render_scanlines_aa_solid(ras,sl,renb,agg::rgba8(255,0,0));
147
148
149 agg::triangle t(100,100,50);//自定义顶点源
150 agg::conv_smooth_poly1_curve cspct(t);
151 ras.add_path(cspct);
152 agg::render_scanlines_aa_solid(
153 ras,sl,renb,agg::rgba8(255,0,0));
154
155
156 for(int j&#61;0; j<20; j&#43;&#43;)
157 pixf.blend_vline(50&#43;j,20,100,agg::rgba(j/20.0,0,0),128);
158
159
160
161 agg::int8u* p &#61; rbuf.row_ptr(20);//得到第20行指针
162 memset(p,0,rbuf.stride_abs());//整行以0填充
163 */
164 }
165
166 virtual void on_post_draw(void* raw_handler) override
167 {
168 }
169
170 };
171
172
173 int agg_main(int argc, char* argv[])
174 {
175
176
177 the_application app(agg::pix_format_bgr24, false);
178
179 app.caption("AGG Example. Anti-Aliasing Demo");
180
181 if (app.init(600, 400, agg::window_resize))
182 {
183 return app.run();
184 }
185 return -1;
186
187 }

编译运行&#xff0c;一切OK的话显示如图

还没完&#xff0c;AGG最叼的是自带演示工程水平非常高&#xff0c;在源码中有一个叫examples的目录&#xff0c;直接拖一个idea.cpp编译&#xff0c;如图

所有例子都有预编译好的二进制版可看&#xff0c;真正良心实用的例子。

http://www.antigrain.com/demo/index.html

好&#xff0c;到此AGG部分就结束了。

&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;

接下来看看Cairo

第三方依懒库有

libpng

zlib

pixman

当然Cairo源码肯定少不了 http://www.cairographics.org/download/

libpng和zlib编译直接使用之前编译好的 http://www.cnblogs.com/kileyi/p/5193823.html

官网有一个说明&#xff0c;但是我没完全照做。

http://www.cairographics.org/end_to_end_build_for_win32/

主要不同的是&#xff0c;我的libpng和zlib编译好了&#xff0c;直接从pixman开始的

首先打开VS2015命令行开发环境&#xff0c;在开始菜单中可以找到

然后进入到pixman源码目录

D:\CPPLibs\pixman-0.34.0\pixman

注意这个不是源码根目录&#xff0c;而是pixman目录&#xff0c;一定不能搞错了

然后新建一个setpath.bat文件&#xff0c;内容如下&#xff0c;主要就是设置一下msys的bin到当前环境目录&#xff0c;并且release编译

set PATH&#61;%PATH%;D:\MinGW\msys\1.0\bin
make -f Makefile.win32 "CFG&#61;release"

之后在命令行中运行这个bat&#xff0c;一切OK会在release目录生成pixman-1.lib&#xff0c;等会儿要用到

 

3个依赖库都搞定后就要编译Cairo了&#xff0c;我的源码目录

D:\CPPLibs\cairo-1.14.6

然后在与源码目录同级新建libpng,zlib,pixman目录&#xff0c;放上对应的lib文件

D:\CPPLibs\libpng\libpng.lib

D:\CPPLibs\zlib\zdll.lib

D:\CPPLibs\pixman\pixman\release\pixman-1.lib

注意有些需要改名

然后回到源码目录

D:\CPPLibs\cairo-1.14.6

新建setpath.bat文件&#xff0c;内容如下,主要是设置include和library路径&#xff0c;出于一些原因我的libpng和zlib的library放到了一起&#xff0c;你如果没放到一起就自己加上

set INCLUDE&#61;%INCLUDE%;D:\CPPLibs\zlib-1.2.8
set INCLUDE&#61;%INCLUDE%;D:\CPPLibs\lpng1621
set INCLUDE&#61;%INCLUDE%;D:\CPPLibs\pixman-0.34.0\pixman
set INCLUDE&#61;%INCLUDE%;D:\CPPLibs\cairo-1.14.6\boilerplate
set INCLUDE&#61;%INCLUDE%;D:\CPPLibs\cairo-1.14.6\src

set LIB&#61;%LIB%;D:\CPPLibs\lpng1621\projects\vstudio\Release

make -f Makefile.win32 "CFG&#61;release"

有人可能想为什么这里都设置好了路径&#xff0c;上面还要建立libpng和zlib,pixman目录&#xff0c;这主要是因为官方那个编译文件默认是写死的&#xff0c;只找他默认改名后的目录和文件&#xff0c;

我懒得改所以就直接复制了一份&#xff0c;在官方的那个编译说明中好像有提到

如果编译完一切OK&#xff0c;你会看到下面几个需要的文件

D:\CPPLibs\cairo-1.14.6\src\release\cairo.lib

D:\CPPLibs\cairo-1.14.6\src\release\cairo-static.lib

D:\CPPLibs\cairo-1.14.6\src\release\cairo.dll

我只需要cairo.lib和cairo.dll

 

接下来新建Win32 Console空工程&#xff0c;配置好Cario和OpenGL的include和library目录

使用glut,glext,opengl1.x语法&#xff0c;写个简单的测试工程

1 #include
2 #include
3 #include <malloc.h>
4
5 #define _USE_MATH_DEFINES
6 #include
7
8 #include
9 #include
10
11 #include
12
13
14
15 double win_width &#61; 800;
16 double win_height &#61; 600;
17 double hw &#61; win_width / 2;
18 double hh &#61; win_height / 2;
19 double line_width &#61; 5;
20 //double line_width &#61; 1 / win_width;
21
22 cairo_surface_t * surf &#61; NULL;
23 cairo_t * cr &#61; NULL;
24 unsigned char * surf_data &#61; NULL;
25
26 GLuint texture_id;
27
28 // Interface //
29
30 void opengl_init(void)
31 {
32 printf("OpenGL version: %s\n", glGetString(GL_VERSION));
33 printf("OpenGL vendor: %s\n", glGetString(GL_VENDOR));
34 printf("OpenGL renderer: %s\n", glGetString(GL_RENDERER));
35
36 glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
37 glDisable(GL_DEPTH_TEST);
38 glEnable(GL_BLEND);
39 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
40 glEnable(GL_TEXTURE_RECTANGLE_ARB);
41 }
42
43 void opengl_cleanup(void)
44 {
45 glDeleteTextures(1, &texture_id);
46 }
47
48 void opengl_draw(int width, int height, unsigned char * surf_data)
49 {
50 if (!surf_data)
51 {
52 printf("draw_func() - No valid pointer to surface-data passed\n");
53 return;
54 }
55
56 glMatrixMode(GL_MODELVIEW);
57 glLoadIdentity();
58 glClear(GL_COLOR_BUFFER_BIT);
59
60 glPushMatrix();
61
62 glBindTexture(GL_TEXTURE_RECTANGLE_ARB, texture_id);
63 glTexImage2D(GL_TEXTURE_RECTANGLE_ARB,
64 0,
65 GL_RGBA,
66 width,
67 height,
68 0,
69 GL_BGRA,
70 GL_UNSIGNED_BYTE,
71 surf_data);
72
73 glColor3f(0.25f, 0.5f, 1.0f);
74 glBegin(GL_QUADS);
75 glTexCoord2f(0.0f, 0.0f);
76 glVertex2f(0.0f, 0.0f);
77 glTexCoord2f((GLfloat)width, 0.0f);
78 glVertex2f(1.0f, 0.0f);
79 glTexCoord2f((GLfloat)width, (GLfloat)height);
80 glVertex2f(1.0f, 1.0f);
81 glTexCoord2f(0.0f, (GLfloat)height);
82 glVertex2f(0.0f, 1.0f);
83 glEnd();
84
85 glPopMatrix();
86 }
87
88 void opengl_resize(int width, int height)
89 {
90 glViewport(0, 0, width, height);
91 glMatrixMode(GL_PROJECTION);
92 glLoadIdentity();
93 glOrtho(0.0f, 1.0f, 0.0f, 1.0f, -1.0f, 1.0f);
94
95 glClear(GL_COLOR_BUFFER_BIT);
96
97 glDeleteTextures(1, &texture_id);
98 glGenTextures(1, &texture_id);
99 glBindTexture(GL_TEXTURE_RECTANGLE_ARB, texture_id);
100 glTexImage2D(GL_TEXTURE_RECTANGLE_ARB,
101 0,
102 GL_RGBA,
103 width,
104 height,
105 0,
106 GL_BGRA,
107 GL_UNSIGNED_BYTE,
108 NULL);
109 glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
110 }
111
112
113 void drawShape()
114 {
115 //save current brush
116 cairo_save(cr);
117
118 // clear background
119 cairo_set_operator(cr, CAIRO_OPERATOR_OVER);
120 //cairo_scale(cr, (double)win_height / 1.0f, (double)win_height / 1.0f);
121 cairo_set_source_rgba(cr, 1, 1, 1, 1);
122 cairo_paint(cr);
123
124 //set line color and style
125 cairo_set_line_cap(cr, CAIRO_LINE_CAP_ROUND);
126 cairo_set_line_width(cr, line_width);
127
128
129
130 static double angle &#61; 0;
131 angle &#43;&#61; 0.01f;
132
133 //画矩形
134 cairo_set_source_rgba(cr, 1, 0, 0, 1);
135 //cairo_rectangle(cr, 0.5f &#43; sinf(angle) * 0.1f, 0.5f, 0.1f, 0.1f);
136 cairo_rectangle(cr, hw &#43; sin(angle) * 100, hh, 100, 100);
137 cairo_fill(cr);
138 cairo_stroke(cr);
139
140 //画弧
141 cairo_set_source_rgba(cr, 0, 0, 1, 1);
142 cairo_arc(cr, 300, hh, 100, 0, 2 * M_PI);
143 //cairo_fill(cr);
144 cairo_stroke(cr);
145
146 //画线
147 static double r &#61; 100;
148 static double posx &#61; 500;
149 static double posy &#61; 500;
150 static double x &#61; 0;
151 static double y &#61; 0;
152
153 x &#61; r * cosf(angle);
154 y &#61; r * sinf(angle);
155
156 cairo_set_source_rgba(cr, 0, 1, 0, 1);
157 cairo_move_to(cr, x &#43; posx, y &#43; posy);
158 cairo_line_to(cr, -x &#43; posx, -y &#43; posy);
159 cairo_stroke(cr);
160
161
162
163 //restore previous brush
164 cairo_restore(cr);
165 }
166
167
168 void display(void)
169 {
170 drawShape();
171
172 opengl_draw(win_width, win_height, surf_data);
173
174 glutSwapBuffers();
175 }
176
177 cairo_t*
178 create_cairo_context(int width,
179 int height,
180 int channels,
181 cairo_surface_t** surf,
182 unsigned char** buffer)
183 {
184 cairo_t* cr;
185
186 // create cairo-surface/context to act as OpenGL-texture source
187 *buffer &#61; (unsigned char*)calloc(channels * width * height, sizeof(unsigned char));
188 if (!*buffer)
189 {
190 printf("create_cairo_context() - Couldn&#39;t allocate buffer\n");
191 return NULL;
192 }
193
194 *surf &#61; cairo_image_surface_create_for_data(*buffer,
195 CAIRO_FORMAT_ARGB32,
196 width,
197 height,
198 channels * width);
199 if (cairo_surface_status(*surf) !&#61; CAIRO_STATUS_SUCCESS)
200 {
201 free(*buffer);
202 printf("create_cairo_context() - Couldn&#39;t create surface\n");
203 return NULL;
204 }
205
206 cr &#61; cairo_create(*surf);
207 if (cairo_status(cr) !&#61; CAIRO_STATUS_SUCCESS)
208 {
209 free(*buffer);
210 printf("create_cairo_context() - Couldn&#39;t create context\n");
211 return NULL;
212 }
213
214 return cr;
215 }
216
217 void cleanup(void)
218 {
219 opengl_cleanup();
220 free(surf_data);
221 cairo_destroy(cr);
222 exit(0);
223 }
224
225 void keyboard(unsigned char key, int x, int y)
226 {
227 switch (key)
228 {
229 //27 is ESC key
230 case 27:
231 case &#39;q&#39;:
232 cleanup();
233 break;
234
235 case &#39;d&#39;:
236 cairo_surface_write_to_png(surf, "frame.png");
237 break;
238
239 case &#39;&#43;&#39;:
240 if (line_width <10)
241 line_width &#43;&#61; 1;
242 break;
243
244 case &#39;-&#39;:
245 if (line_width > 1)
246 line_width -&#61; 1;
247 break;
248
249 }
250 }
251
252 void idle(void)
253 {
254 glutPostRedisplay();
255 }
256
257 int main(int argc, char ** argv)
258 {
259 glutInit(&argc, argv);
260 glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);
261 glutInitWindowSize(win_width, win_height);
262
263 if (glutCreateWindow("Opengl Test") &#61;&#61; 0)
264 exit(-2);
265
266 // create cairo-surface/context to act as OpenGL-texture source
267 cr &#61; create_cairo_context(win_width, win_height, 4, &surf, &surf_data);
268
269 // setup "GL-context"
270 opengl_init();
271
272 glutDisplayFunc(display);
273 glutKeyboardFunc(keyboard);
274 glutIdleFunc(idle);
275 opengl_resize(win_width, win_height);
276
277 glutMainLoop();
278
279 return 0;
280 }

 

 

至此Cairo部分就结束了&#xff0c;活动一下筋骨&#xff0c;可以开始写应用了

转:https://www.cnblogs.com/kileyi/p/5328872.html



推荐阅读
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • imx6ull开发板驱动MT7601U无线网卡的方法和步骤详解
    本文详细介绍了在imx6ull开发板上驱动MT7601U无线网卡的方法和步骤。首先介绍了开发环境和硬件平台,然后说明了MT7601U驱动已经集成在linux内核的linux-4.x.x/drivers/net/wireless/mediatek/mt7601u文件中。接着介绍了移植mt7601u驱动的过程,包括编译内核和配置设备驱动。最后,列举了关键词和相关信息供读者参考。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 本文详细介绍了PHP中与URL处理相关的三个函数:http_build_query、parse_str和查询字符串的解析。通过示例和语法说明,讲解了这些函数的使用方法和作用,帮助读者更好地理解和应用。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 本文介绍了通过ABAP开发往外网发邮件的需求,并提供了配置和代码整理的资料。其中包括了配置SAP邮件服务器的步骤和ABAP写发送邮件代码的过程。通过RZ10配置参数和icm/server_port_1的设定,可以实现向Sap User和外部邮件发送邮件的功能。希望对需要的开发人员有帮助。摘要长度:184字。 ... [详细]
  • switch语句的一些用法及注意事项
    本文介绍了使用switch语句时的一些用法和注意事项,包括如何实现"fall through"、default语句的作用、在case语句中定义变量时可能出现的问题以及解决方法。同时也提到了C#严格控制switch分支不允许贯穿的规定。通过本文的介绍,读者可以更好地理解和使用switch语句。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • Ubuntu 9.04中安装谷歌Chromium浏览器及使用体验[图文]
    nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
  • 成功安装Sabayon Linux在thinkpad X60上的经验分享
    本文分享了作者在国庆期间在thinkpad X60上成功安装Sabayon Linux的经验。通过修改CHOST和执行emerge命令,作者顺利完成了安装过程。Sabayon Linux是一个基于Gentoo Linux的发行版,可以将电脑快速转变为一个功能强大的系统。除了作为一个live DVD使用外,Sabayon Linux还可以被安装在硬盘上,方便用户使用。 ... [详细]
  • 本文介绍了在Windows环境下如何配置php+apache环境,包括下载php7和apache2.4、安装vc2015运行时环境、启动php7和apache2.4等步骤。希望对需要搭建php7环境的读者有一定的参考价值。摘要长度为169字。 ... [详细]
  • 本文介绍了在多平台下进行条件编译的必要性,以及具体的实现方法。通过示例代码展示了如何使用条件编译来实现不同平台的功能。最后总结了只要接口相同,不同平台下的编译运行结果也会相同。 ... [详细]
  • 本文讨论了如何在dotnet桌面(Windows)应用程序中添加图标。作者提到可以使用dotnet命令行工具与resource.rc文件一起使用来为标准.NET核心应用程序添加图标。作者还介绍了在创建控制台应用程序时如何编辑projeto1.csproj文件来添加图标。 ... [详细]
author-avatar
笼-中鸟
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有