C#实现键盘(除了ESC)和鼠标被锁定,按下ESC后 解锁 这种是怎么搞出来的。。

C#实现键盘(除了ESC)和鼠标被锁定,按下ESC后 解锁 这种是怎么搞出来的。
我刚开始想用API 后来发现不行。BLOCKINPUT(TRUE)后检测不到键盘输入了。
这个东西怎么实现嗯。查了一早上了。刚刚学习C# 谢谢大家、
钩子好难啊。希望大家解答 谢谢~

1个回答

我的思路是:循环监听键盘输入,若是ESC,退出循环

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
C# Winfrom项目,如何实现Panel控件响应键盘事件
在C# Winfrom 项目中,有一个from窗体和一个Panel控件。 目前from窗体和Panel控件都是全屏显示。并且在Panel控件内用于加载显示外部应用程序。 目前遇到一个问题就是按下键盘的“Esc”键,无法响应键盘的事件。 无法实现按下键盘的“Esc”键后就立即退出整个程序。 请问怎么样解决下用户按下键盘的“Esc”键后无法响应键盘的事件?
c#如果使用网口热敏打印机?
项目要求使用网口的热敏打印机打印标签用,我拿到的一个样品打印机是芯烨XP-C230,支持的打印命令为:ESC/POS命令,想找一个用C#的例子,不知道有没有大神可以提供?
javascript 在浏览器全屏状态下如何监听按下esc键的动作?
请问javascript 在浏览器全屏状态下如何监听按下esc键的动作,谢谢! (触发fullscreen方法实现的全屏) ![图片说明](https://img-ask.csdn.net/upload/201910/30/1572404311_870654.png)
C# Winform项目,如何实现关闭退出外部视频客户端程序
在C# Winform项目,有三个Form窗体(form1,form2,form3),在form1窗体有一个button按钮。 目前已经可以在button的点击事件中,通过以下代码实现将“CBOX央视影音”在线视频播放的App客户端打开。 代码如下: Process proc = new Process(); proc.StartInfo.FileName = @"C:\Program Files\CNTV\CBox\CBox.exe"; proc.Start(); 目前遇到一个问题,需用手工点击“关闭”按钮才能关闭这个视频播放客户端。 请问怎么样实现用户按键盘的“ESC”键或在form1窗体关闭时自动退出“CBOX央视影音”的播放客户端以及退出form1窗体。最好能提供相关的源码。谢谢!
c# winform,WndProc 消息响应,如何避免重复触发?如何判断接受的消息为“按键弹起”?
用C# 编写 winform 程序,注册了热键ESC,然后用WndProc 接受消息进行响应。 现象:当键盘按住ESC稍长时间,会重复触发设定的功能函数。 设想:如果可以只接受键盘的弹起消息,是不是可以避免重复触发。 问题:如何避免重复触发?如何判断消息为“按键弹起” protected override void WndProc(ref Message m) { const int WM_HOTKEY = 0x0312; switch (m.Msg) { case WM_HOTKEY: switch (m.WParam.ToInt32()) { case (int)EnumHotkey.ESC: ....
javafx如何实现按下esc退出窗口的功能
javafx中实现按Esc键退出的功能,不用比较KeyCode的方式
Windows10这两天老是提示修复驱动
宏基笔记本,装的Windows10系统开机这几天一直蓝屏0xc000000f,之后有几个选项。第一个是按enter可重试,第二个按f1进入恢复环境,第三个按f8以指定启动设置,第四个按esc指定UEFI固件设置。我按第四个选项才能进入系统。 今天进入系统后小娜提示修复驱动器,点之后开机一直扫描驱动器,修复进度100%后蓝屏0xc000000f,又是那四个选项,始终在蓝屏和扫描驱动间跳转,进不了系统。
OpenCV读取摄像头图像,退出时出错了,各位大佬帮帮忙!!!在下新人?
![图片说明](https://img-ask.csdn.net/upload/201910/25/1571981544_18376.png) 报错如下: C:\Users\11985\AppData\Local\Programs\Python\Python37\python.exe G:/Learnning/Program/python/OpenCv/Tutorial_1.py [ WARN:1] global C:\projects\opencv-python\opencv\modules\videoio\src\cap_msmf.cpp (674) SourceReaderCB::~SourceReaderCB terminating async callback Process finished with exit code 0 读取图像可以但是按下ESC退出时就有问题了。
c#+jquery+ajax实现注册登录功能
数据库是sql server 客户端和服务器端怎么交换数据 页面代码如下 ``` <nav class="main_nav"> <ul> <li ><a class="cd-signin" href="#0">登录</a></li> <li ><a class="cd-signup" href="#0">注册</a></li> </ul> </nav> <div class="cd-user-modal"> <div class="cd-user-modal-container"> <ul class="cd-switcher"> <li ><a href="#0">用户登录</a></li> <li ><a href="#0">注册新用户</a></li> </ul> <div id="cd-login"><!-- 登录表单 --> <form class="cd-form" method="post"> <p class="fieldset"> <label class="image-replace cd-username" for="signin-username-email">姓名或邮箱</label> <input class="full-width has-padding has-border" id="signin-username" type="text" placeholder="输入姓名或邮箱" > </p> <p class="fieldset"> <label class="image-replace cd-password" for="signin-password">密码</label> <input class="full-width has-padding has-border" id="signin-password" type="text" placeholder="输入密码"> </p> <p class="fieldset"> <input type="checkbox" id="remember-me" checked> <label for="remember-me">记住登录状态</label> </p> <p class="fieldset"> <input class="full-width2" id="login" type="submit" value="登 录"> </p> </form> </div> <div id="cd-signup"> <!-- 注册表单 --> <form class="cd-form" method="post"> <p class="fieldset"> <label class="image-replace cd-username" for="signup-username">姓名</label> <input class="full-width has-padding has-border" id="signup-username" type="text" placeholder="输入姓名"> </p> <p class="fieldset"> <label class="image-replace cd-email" for="signup-email">邮箱</label> <input class="full-width has-padding has-border" id="signup-email" type="email" placeholder="输入mail"> </p> <p class="fieldset"> <label class="image-replace cd-password" for="signup-password">密码</label> <input class="full-width has-padding has-border" id="signup-password" type="text" placeholder="输入密码"> </p> <p class="fieldset"> <input type="checkbox" id="accept-terms"> <label for="accept-terms">我已阅读并同意 <a href="#0">用户协议</a></label> </p> <p class="fieldset"> <input class="full-width2" id="register" type="submit" value="注册新用户"> </p> </form> </div> <a href="#0" class="cd-close-form">关闭</a> </div> </div> ``` js代码如下: ``` jQuery(document).ready(function ($) { var $form_modal = $('.cd-user-modal'), $form_login = $form_modal.find('#cd-login'), $form_signup = $form_modal.find('#cd-signup'), $form_modal_tab = $('.cd-switcher'), $tab_login = $form_modal_tab.children('li').eq(0).children('a'), $tab_signup = $form_modal_tab.children('li').eq(1).children('a'), $main_nav = $('.main_nav'); //弹出窗口 $main_nav.on('click', function (event) { if ($(event.target).is($main_nav)) { // on mobile open the submenu $(this).children('ul').toggleClass('is-visible'); } else { // on mobile close submenu $main_nav.children('ul').removeClass('is-visible'); //show modal layer $form_modal.addClass('is-visible'); //show the selected form ($(event.target).is('.cd-signup')) ? signup_selected() : login_selected(); } }); //关闭弹出窗口 $('.cd-user-modal').on('click', function (event) { if ($(event.target).is($form_modal) || $(event.target).is('.cd-close-form')) { $form_modal.removeClass('is-visible'); } }); //使用Esc关闭弹出窗口 $(document).keyup(function (event) { if (event.which == '27') { $form_modal.removeClass('is-visible'); } }); //切换表单 $form_modal_tab.on('click', function (event) { event.preventDefault(); ($(event.target).is($tab_login)) ? login_selected() : signup_selected(); }); function login_selected() { $form_login.addClass('is-selected'); $form_signup.removeClass('is-selected'); $form_forgot_password.removeClass('is-selected'); $tab_login.addClass('selected'); $tab_signup.removeClass('selected'); } function signup_selected() { $form_login.removeClass('is-selected'); $form_signup.addClass('is-selected'); $form_forgot_password.removeClass('is-selected'); $tab_login.removeClass('selected'); $tab_signup.addClass('selected'); } }); //credits http://css-tricks.com/snippets/jquery/move-cursor-to-end-of-textarea-or-input/ jQuery.fn.putCursorAtEnd = function () { return this.each(function () { // If this function exists... if (this.setSelectionRange) { // ... then use it (Doesn't work in IE) // Double the length because Opera is inconsistent about whether a carriage return is one character or two. Sigh. var len = $(this).val().length * 2; this.setSelectionRange(len, len); } else { // ... otherwise replace the contents with itself // (Doesn't work in Google Chrome) $(this).val($(this).val()); } }); }; ``` 接下来该怎么写功能 与数据库交换数据 最好有详细代码 谢谢了!
unity3d按esc键无法实现弹出窗口与关闭窗口
javascript编写了一段代码,无法实现esc键弹出与关闭窗口,请高手帮忙解决一下,代码如下 #pragma strict static var WindowSwitch :boolean = false private var windowRect = Rect (240, 200, 240, 200); function Update () { if(Input.GetKeyDown(KeyCode.Escape)){ WindowSwitch = !WindowSwitch; } function OnGUI () { if(WindowSwitch == true){ windowRect = GUI.Window (0,windowRect, WindowContain, "测试窗口"); } } function WindowContain (windowID : int){ if (GUI.Button (Rect (70,70,100,20), "关闭音乐")) {gameObject.Find("Terrain").GetComponent(AudioSource).enabled=false;} if (GUI.Button (Rect (70,100,100,20), "播放音乐")) {gameObject.Find("Terrain").GetComponent(AudioSource).enabled=true;} if (GUI.Button (Rect (70,130,100,20), "关闭窗口")) { WindowSwitch = false;} if (GUI.Button (Rect (70,160,100,20), "退出游戏")) { Application.Quit();} GUI.DragWindow(new Rect(0,0,1000,1000)); }
求求求!!各位大佬,这是为啥呀,为啥输入了两个图形,显示的图形信息只有一个呀
``` #include <stdio.h> #include <stdlib.h> #define N 35 typedef struct zhixian { int x1,y1; int x2,y2; }Z; typedef struct dian { int x,y; }D; typedef struct juxing { int x1,y1; int x2,y2; }J; typedef struct yuanxing { int x,y; int r; }Y; typedef struct tuoyuan { int x,y; int a,b; }T; union tuxing { T tuo; Y yuan; J juxing; Z zhixian; D dian; int kind; }; int main() { union tuxing ch[100]; int flag1 = 1,flag2 = 1,flag3 = 1,flag4 = 1; int i = 0,j = 0; int count = 0; int t; char c2; while(1) { start:printf("Add/List/Delete/Quit\n"); printf("输入首字母选择功能:"); char c; scanf("%c",&c); system("cls"); switch(c) { case 'A': case 'a': printf("Line/Rectangle/Circle/Ellipsc\n"); printf("输入首字母选择要添加的图形类型,按ESC返回:\n"); char c1; scanf(" %c",&c1); system("cls"); switch(c1) { case 'L': case 'l': if(flag1) { printf("请输入直线的两个端点:x1,y1,x2,y2并按回车\n"); scanf("%d%d%d%d",&ch[i].zhixian.x1,&ch[i].zhixian.y1,&ch[i].zhixian.x2,&ch[i].zhixian.y2); printf("一条直线已被添加!按任意键继续。。。\n"); count++; printf("count = %d\n",count); ch[i].kind = 1; flag1= 0; scanf("%c",&c2); scanf("%c",&c2); system("cls"); goto start; } else { printf("请输入直线的两个端点:x1,y1,x2,y2并按回车\n"); printf("一条直线已被添加!按任意键继续。。。\n"); printf("count = %d\n",count); scanf("%c",&c2); scanf("%c",&c2); system("cls"); goto start; } break; case 'R': case 'r': if(flag2) { printf("请输入矩形的左上角与右下角的坐标:x1,y1,x2,y2并按回车\n"); scanf("%d%d%d%d",&ch[i].juxing.x1,&ch[i].juxing.y1,&ch[i].juxing.x2,&ch[i].juxing.y2); printf("一条矩形已被添加!按任意键继续。。。\n"); ch[i].kind = 2; count++; printf("count = %d\n",count); scanf("%c",&c2); scanf("%c",&c2); system("cls"); flag2= 0; goto start; } else { printf("请输入直线的两个端点:x1,y1,x2,y2并按回车\n"); printf("一条矩形已被添加!按任意键继续。。。\n"); printf("count = %d\n",count); scanf("%c",&c2); scanf("%c",&c2); system("cls"); goto start; } break; case 'C': case 'c': if(flag3) { printf("请输入圆心坐标和半径:x1,y1,r并按回车\n"); scanf("%d%d%d",&ch[i].yuan.x,&ch[i].yuan.y,&ch[i].yuan.r); printf("一条圆形已被添加!按任意键继续。。。\n"); ch[i].kind = 3; count++; printf("count = %d\n",count); scanf("%c",&c2); scanf("%c",&c2); system("cls"); flag3= 0; goto start; } else { printf("请输入圆心坐标和半径:x1,y1,r并按回车\n"); printf("一条圆形已被添加!按任意键继续。。。\n"); scanf("%c",&c2); printf("count = %d\n",count); scanf("%c",&c2); system("cls"); goto start; } break; case 'E': case 'e': if(flag4) { printf("请输入椭圆中心坐标,半长轴和半短轴:x,y,a,b并按回车\n"); scanf("%d%d%d%d",&ch[i].tuo.x,&ch[i].tuo.y,&ch[i].tuo.a,&ch[i].tuo.b); printf("一条椭圆已被添加!按任意键继续。。。\n"); scanf(" %c",&c2); scanf("%c",&c2); ch[i].kind = 4; count++; printf("count = %d\n",count); system("cls"); flag4= 0; goto start; } else { printf("请输入椭圆中心坐标,半长轴和半短轴:x,y,a,b并按回车\n"); printf("一条椭圆已被添加!按任意键继续。。。\n"); printf("count = %d\n",count); getchar(); scanf("%c",&c2); system("cls"); goto start; } break; } break; case 'D': case 'd': if(count!=0) { for(i = 0;i<count;i++) { printf("请输入要删除的图形的ID号或按ESC返回:"); scanf("%d",&t); if(t>=0&&t<count) { if(t==1) { flag1 = 0; } else if(t==2) { flag2 = 0; } else if(t==3) { flag3 = 0; } else if(t==4) { flag4 = 0; } for(j = t;j<count;j++) { if(ch[j+1].kind == 1) { ch[j].kind = 1; ch[j].zhixian.x1 = ch[j+1].zhixian.x1; ch[j].zhixian.y1 = ch[j+1].zhixian.y1; ch[j].zhixian.x2 = ch[j+1].zhixian.x2; ch[j].zhixian.y2 = ch[j+1].zhixian.y2; count--; } else if(ch[j+1].kind == 2) { ch[j].kind = 2; ch[j].juxing.x1 = ch[j+1].juxing.x1; ch[j].juxing.y1 = ch[j+1].juxing.y1; ch[j].zhixian.x2 = ch[j+1].zhixian.x2; ch[j].zhixian.y2 = ch[j+1].zhixian.y2; count--; } else if(ch[j+1].kind == 3) { ch[j].kind = 3; ch[j].yuan.x = ch[j+1].yuan.x; ch[j].yuan.y = ch[j+1].yuan.y; ch[j].yuan.r = ch[j+1].yuan.r; count--; } else if(ch[j+1].kind == 4) { ch[j].kind = 4; ch[j].tuo.x = ch[j+1].tuo.x; ch[j].tuo.y = ch[j+1].tuo.y; ch[j].tuo.a = ch[j+1].tuo.a; ch[j].tuo.b = ch[j+1].tuo.b; count--; } } printf("ID为%d的图形被删除!\n",t); scanf(" %c",&c2); scanf("%c",&c2); system("cls"); goto start; } else { printf("No found!"); } scanf("%c",&c2); scanf("%c",&c2); system("cls"); goto start; } } else { printf("请按任意键继续。。"); getchar(); scanf("%c",&c2); system("cls"); goto start; } break; case 'Q': case 'q': goto end; break; case 'L': case 'l': while(j<count) { if(ch[j].kind ==1) { printf("ID=%d,直线:端点坐标为x1=%d, y1=%d, x2=%d, y2=%d",j,ch[j].zhixian.x1, ch[j].zhixian.y1,ch[j].zhixian.x2,ch[j].zhixian.y2); } else if (ch[j].kind ==2) { printf ("ID=%d,矩形:左上角坐标为: xl=%d, yl=%d;右下角坐标为:x2=%d, y2=%d",j,ch[j].juxing.x1,ch[j].juxing.y1,ch[j].juxing.x2,ch[j].juxing.x2); } else if (ch[j] .kind ==3) { printf ("ID=%d,圆形:圆心坐标为: x=%d, y=%d;半径为:r=%d",j,ch[j].yuan.x,ch[j].yuan.y,ch[j].yuan.r); } else if (ch[j].kind ==4) { printf ("ID=%d,椭圆:中心坐标为。x=%d, y=%d;半长轴为:a=%d,半短轴为:b=%d",j,ch[j].tuo.x,ch[j].tuo.y,ch[j].tuo.a,ch[j].tuo.b); } j++; } getchar(); scanf("%c",&c2); system("cls"); goto start; break; } i++; } end:return 0; } ```
C语言函数中怎么写Esc退出
各位大神,我想问问怎么写Esc退出啊,像下面的代码,我输入了1,然后进去case 1,我想按下Esc键退出到第一个printf:输入你的选择,急,谢谢 ``` #include<stdio.h> void main() { int choice=0; printf("输入你的选择\n"); switch(choice) { case 1:printf("谢\n");break; case 2:printf("谢\n");break; case 3:printf("各位\n");break; case 4:printf("大神\n");break; } } ```
c语言read函数在非阻塞下无法读取内容
直接贴代码 ``` fcntl(STDIN_FILENO, F_SETFL, O_NONBLOCK); if (write(STDIN_FILENO, "b[6n", 4) != 4) return -1; /* Read the response: ESC [ rows ; cols R */ sleep(1); while (i < sizeof(buf)-1) { if ((cols = read(STDIN_FILENO, buf+i, 1)) != 1) { printf("cols %d ,errno %d",cols, errno); continue; } if (buf[i] == 'R') break; printf("i=%d %c \n",i,buf[i]); i++; } ``` 一直返回error = EAGAIN
MongoDB数据库导出到Excel没内容
使用cmd导出mongoDB的数据到Excel时候,表格里没东西。 语句如下:mongoexport -d guazi -c esc -csv -o C:/Users/Administrator/Desktop/test.csv 不知道是不是我的语句有问题,小白鼠求救。 ![图片说明](https://img-ask.csdn.net/upload/201911/16/1573907722_172971.png)![图片说明](https://img-ask.csdn.net/upload/201911/16/1573907733_696935.png)
请问在浏览器全屏状态下如何屏蔽esc和f11按键,搜了一下好像这两个键不能屏蔽,请问该如何解决
## 请问在浏览器全屏状态下如何屏蔽esc和f11按键,搜了一下好像这两个键不能屏蔽,请问该如何解决
有大佬能够通过stdin和stdout来获取终端的大小吗?
我曾见过一段代码,功能就是利用stdin和stdout通过一些读写的过程得到终端的大小。 <br> 但是具体原理不清楚,希望有高手讲讲! ``` /* Report cursor location */ if (write(ofd, "\x1b[6n", 4) != 4) return -1; /* Read the response: ESC [ rows ; cols R */ while (i < sizeof(buf)-1) { if (read(ifd,buf+i,1) != 1) break; if (buf[i] == 'R') break; i++; } ``` 具体不能贴上去。
OpenGL图像显示和别人不一样
用老师给的源代码,原封不动运行,图像异常 原本应该是这样的 ![原本的样子](https://img-ask.csdn.net/upload/201909/20/1568908959_14748.png) 然后我电脑上是这样子的 ![我运行出来的样子](https://img-ask.csdn.net/upload/201909/20/1568908978_338083.png) 下面附上main.cpp的代码 (第一次遇到这样的问题,百度谷歌弄了一下午,把VS2013卸载安装了2019,还是搞不定,求大神帮忙,感激不尽) ``` #include "Angel.h" #pragma comment(lib, "glew32.lib") const int MENU_CHOICE_WHITE = 0; const int MENU_CHOICE_BLACK = 1; const int MENU_CHOICE_RED = 2; const int MENU_CHOICE_GREEN = 3; const int MENU_CHOICE_BLUE = 4; const int MENU_CHOICE_YELLOW = 5; const int MENU_CHOICE_ORANGE = 6; const int MENU_CHOICE_PURPLE = 7; const vec3 WHITE(1.0, 1.0, 1.0); const vec3 BLACK(0.0, 0.0, 0.0); const vec3 RED(1.0, 0.0, 0.0); const vec3 GREEN(0.0, 1.0, 0.0); const vec3 BLUE(0.0, 0.0, 1.0); const vec3 YELLOW(1.0, 1.0, 0.0); const vec3 ORANGE(1.0, 0.65, 0.0); const vec3 PURPLE(0.8, 0.0, 0.8); // 主窗口变量 const int SQUARE_NUM = 6; const int SQUARE_NUM_POINTS = 4 * SQUARE_NUM; int mainWindow; int mainWindowMenu; int mainWindowSubmenu; int width = 600; // 主窗口宽度 int height = 600; // 主窗口高度 double offsetAngle = 0; // 角度偏移量 double delta = 0.05; // 每次改变角度偏移的变化量 vec3 mainWindowSquareColor = WHITE; // 子窗口变量 const int ELLIPSE_NUM_POINTS = 100; int subWindow; int subWindowMenu; vec3 subWindowObjectColor = RED; // 获得圆上的点 vec2 getEllipseVertex(vec2 center, double scale, double verticleScale, double angle) { vec2 vertex(sin(angle), cos(angle)); vertex += center; vertex *= scale; vertex.y *= verticleScale; // 修改垂直分量 return vertex; } // 生成圆上顶点的属性 void generateEllipsePoints(vec2 vertices[], vec3 colors[], vec3 color, int startVertexIndex, int numPoints, vec2 center, double scale, double verticalScale) { double angleIncrement = (2 * M_PI) / numPoints; double currentAngle = M_PI / 2; for (int i = startVertexIndex; i < startVertexIndex + numPoints; i++) { vertices[i] = getEllipseVertex(center, scale, verticalScale, currentAngle); colors[i] = color; currentAngle += angleIncrement; } } // 获得正方形的每个角度 double getSquareAngle(int point) { return (M_PI / 4 + (M_PI / 2 * point)) + offsetAngle; } // 生成正方形上顶点的属性 void generateSquarePoints(vec2 vertices[], vec3 colors[], int squareNum, int startVertexIndex) { double scale = 0.90; double scaleAdjust = scale / squareNum; vec2 center(0.0, -0.25); int vertexIndex = startVertexIndex; for (int i = 0; i < squareNum; i++) { vec3 currentColor = 0 == i % 2 ? mainWindowSquareColor : BLACK; for (int j = 0; j < 4; j++) { double currentAngle = getSquareAngle(j); vertices[vertexIndex] = vec2(sin(currentAngle), cos(currentAngle)) * scale + center; colors[vertexIndex] = currentColor; vertexIndex++; } scale -= scaleAdjust; } } // 空闲回调函数 void idleFunction() { // 改变角度的偏移量 offsetAngle += delta; // 标记主窗口重绘 glutPostWindowRedisplay(mainWindow); } void mainWindowInit() { vec2 vertices[SQUARE_NUM * 4]; vec3 colors[SQUARE_NUM * 4]; // 创建主窗口中多个正方形 generateSquarePoints(vertices, colors, SQUARE_NUM, 0); // 创建顶点数组对象 GLuint vao[1]; glGenVertexArrays(1, vao); glBindVertexArray(vao[0]); // 创建并初始化顶点缓存对象 GLuint buffer; glGenBuffers(1, &buffer); glBindBuffer(GL_ARRAY_BUFFER, buffer); glBufferData(GL_ARRAY_BUFFER, sizeof(vertices) + sizeof(colors), NULL, GL_STATIC_DRAW); // 分别读取数据 glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(vertices), vertices); glBufferSubData(GL_ARRAY_BUFFER, sizeof(vertices), sizeof(colors), colors); // 读取着色器并使用 GLuint program = InitShader("vshader.glsl", "fshader.glsl"); glUseProgram(program); // 从顶点着色器中初始化顶点的位置 GLuint pLocation = glGetAttribLocation(program, "vPosition"); glEnableVertexAttribArray(pLocation); glVertexAttribPointer(pLocation, 2, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(0)); // 从片元着色器中初始化顶点的颜色 GLuint cLocation = glGetAttribLocation(program, "vColor"); glEnableVertexAttribArray(cLocation); glVertexAttribPointer(cLocation, 3, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(sizeof(vertices))); // 黑色背景 glClearColor(0.0, 0.0, 0.0, 1.0); } // 菜单回调函数 void mainWindowMenuEvents(int menuChoice) { switch (menuChoice) { case MENU_CHOICE_WHITE: mainWindowSquareColor = WHITE; break; case MENU_CHOICE_BLACK: mainWindowSquareColor = BLACK; break; case MENU_CHOICE_RED: mainWindowSquareColor = RED; break; case MENU_CHOICE_GREEN: mainWindowSquareColor = GREEN; break; case MENU_CHOICE_BLUE: mainWindowSquareColor = BLUE; break; case MENU_CHOICE_YELLOW: mainWindowSquareColor = YELLOW; break; case MENU_CHOICE_ORANGE: mainWindowSquareColor = ORANGE; break; case MENU_CHOICE_PURPLE: mainWindowSquareColor = PURPLE; break; /*在此处添加控制旋转动画开始和停止的菜单选项*/ } // 标记mainWindow主窗口进行重绘 glutPostWindowRedisplay(mainWindow); } // 创建和设置主窗口菜单 void mainWindowSetupMenu() { // 创建子菜单,并注册菜单回调函数mainWindowMenuEvents mainWindowSubmenu = glutCreateMenu(mainWindowMenuEvents); glutAddMenuEntry("Yellow", MENU_CHOICE_YELLOW); glutAddMenuEntry("Orange", MENU_CHOICE_ORANGE); glutAddMenuEntry("Purple", MENU_CHOICE_PURPLE); glutAddMenuEntry("Black", MENU_CHOICE_BLACK); // 创建主菜单 mainWindowMenu = glutCreateMenu(mainWindowMenuEvents); glutAddMenuEntry("Red", MENU_CHOICE_RED); glutAddMenuEntry("Green", MENU_CHOICE_GREEN); glutAddMenuEntry("Blue", MENU_CHOICE_BLUE); glutAddMenuEntry("White", MENU_CHOICE_WHITE); // 在主菜单中添加子菜单 glutAddSubMenu("Other Square Colors", mainWindowSubmenu); // 关联鼠标右键激活菜单 glutAttachMenu(GLUT_RIGHT_BUTTON); } void mainWindowDisplay() { mainWindowInit(); // 重绘时写入新的颜色数据 glClear(GL_COLOR_BUFFER_BIT); for (int i = 0; i < SQUARE_NUM; i++) { glDrawArrays(GL_TRIANGLE_FAN, (i * 4), 4); } glutSwapBuffers(); } // 主窗口键盘回调函数 void mainWindowKeyboard(unsigned char key, int x, int y) { /*在此添加按下Esc按键退出的代码*/ } // 主窗口鼠标回调函数 void mainWindowMouse(int button, int state, int x, int y) { if (button == GLUT_MIDDLE_BUTTON && state == GLUT_DOWN) { // 按下鼠标中键,指定当没有其他事件处理时,去调用idleFunction()这个函数 glutIdleFunc(idleFunction); } else if (button == GLUT_MIDDLE_BUTTON && state == GLUT_UP) { // 释放鼠标中键,解除调用 glutIdleFunc(NULL); } } void subWindowInit() { vec2 vertices[ELLIPSE_NUM_POINTS]; vec3 colors[ELLIPSE_NUM_POINTS]; // 创建子窗口中的椭圆 generateEllipsePoints(vertices, colors, subWindowObjectColor, 0, ELLIPSE_NUM_POINTS, vec2(0.0, 0.0), 0.7, 0.5); // 创建顶点数组对象 GLuint vao[1]; glGenVertexArrays(1, vao); glBindVertexArray(vao[0]); // 创建并初始化顶点缓存对象 GLuint buffer; glGenBuffers(1, &buffer); glBindBuffer(GL_ARRAY_BUFFER, buffer); glBufferData(GL_ARRAY_BUFFER, sizeof(vertices) + sizeof(colors), NULL, GL_STATIC_DRAW); // 分别读取数据 glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(vertices), vertices); glBufferSubData(GL_ARRAY_BUFFER, sizeof(vertices), sizeof(colors), colors); // 读取着色器并复用 GLuint program = InitShader("vshader.glsl", "fshader.glsl"); glUseProgram(program); // 从顶点着色器中初始化顶点的位置 GLuint pLocation = glGetAttribLocation(program, "vPosition"); glEnableVertexAttribArray(pLocation); glVertexAttribPointer(pLocation, 2, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(0)); // 从片元着色器中初始化顶点的颜色 GLuint cLocation = glGetAttribLocation(program, "vColor"); glEnableVertexAttribArray(cLocation); glVertexAttribPointer(cLocation, 3, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(sizeof(vertices))); // 设置子窗口背景颜色为白色 glClearColor(1.0, 1.0, 1.0, 1.0); } void subWindowDisplay() { subWindowInit(); // 重绘时写入新的颜色数据 glClear(GL_COLOR_BUFFER_BIT); glDrawArrays(GL_TRIANGLE_FAN, 0, ELLIPSE_NUM_POINTS); glutSwapBuffers(); } // 子窗口键盘回调函数 void subWindowKeyboard(unsigned char key, int x, int y) { switch (key) { case 'r': subWindowObjectColor = RED; break; case 'g': subWindowObjectColor = GREEN; break; case 'b': subWindowObjectColor = BLUE; break; case 'y': subWindowObjectColor = YELLOW; break; case 'o': subWindowObjectColor = ORANGE; break; case 'p': subWindowObjectColor = PURPLE; break; case 'w': subWindowObjectColor = WHITE; break; } // 标记subWindow子窗口进行重绘 glutPostWindowRedisplay(subWindow); } void printHelp() { printf("%s\n\n", "Interaction and Submenu"); printf("Keys to update the background color in sub window:\n"); printf("'r' - red\n'g' - green\n'b' - blue\n'y' - yellow\n'o' - orange\n'p' - purple\n'w' - white\n"); } int main(int argc, char **argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE); // 启用双重缓冲 glutInitWindowSize(width, height); mainWindow = glutCreateWindow("Interaction and Submenu"); glewExperimental = GL_TRUE; glewInit(); mainWindowInit(); mainWindowSetupMenu(); glutDisplayFunc(mainWindowDisplay); // 在主窗口中指定函数mainWindowMouse,在鼠标按下或释放时将会被调用 glutMouseFunc(mainWindowMouse); // 创建子窗口 subWindow = glutCreateSubWindow(mainWindow, 0, 0, width / 4, height / 4); subWindowInit(); glutDisplayFunc(subWindowDisplay); // 在子窗口中指定函数subWindowKeyboard,当一个能够生成ASCII字符的键释放时会被调用 glutKeyboardFunc(subWindowKeyboard); // 输出帮助信息 printHelp(); glutMainLoop(); return 0; } ```
热敏打印机ESC/POS格式问题
下面的数据是我通过USBHound软件从USB热敏打印机的USB抓取的数据。 数据格式中,第一行是标准的ESC/POS指令,后面的有几个就不知道是什么指令了,在ESC/POS指令手册中找不到??? 还有下面的 0x15,0x1c,0x16,0x30,这个又是什么数据?每个48个字节就会出现一组这样的数据??? 0x1b,0x40, 0x1d,0x45,0x00, 0x1d,0x44,0x01, 0x1b,0x70,0x00,0x32,0x32, 0x1d,0x56,0x63, 0x04,0x20, 0x15,0x1c,0x16,0x30, 0x00,0x00,0x00,0x00,0x00,0x00,...,0x00,0x00, ----- 每行共48个字节 0x15,0x01,0x16,0x30,          ..., 0x00,0x00,0x00,0x00,0x00,0x00,...,0x00,0x00, 0x15,0x01,0x16,0x30,          ..., 0x00,0x00,0x00,0x00,0x00,0x00,...,0x00,0x00, 0x15,0x01,0x16,0x30,          ..., 0x00,0x00,0x00,0x00,0x00,0x00,...,0x00,0x00, ... ... 打印软件用的是小票打印专家,热敏打印机是SPRT的。 有知道这种数据格式的大神么?
JAVA的线程给Jframe添加键盘监听不同时运行
我想用Java写一个俄罗斯方块,其中有一个线程是关于JFrame的键盘监听实现图形的变形,但是监听一直没有同时进行,咋回事。 ``` public class practice1 { public static void main(String[] args) { // RegisterInterface Tetris = new RegisterInterface("俄罗斯方块"); SnakeDemo t = new SnakeDemo(); } } ``` ``` import java.awt.Canvas; import java.awt.Container; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JTextArea; public class SnakeDemo extends JFrame{ private static final long serialVersionUID = 5671798241966272024L; protected static JFrame game = new JFrame(); protected static Container game1 = game.getContentPane(); private JLabel label1 = new JLabel("分 数:"); private JLabel label2 = new JLabel("所花时间:"); private JLabel label3 = new JLabel("说 明:"); protected static JTextArea explain = new JTextArea("此游戏是一个俄罗斯方块简易版本,实现简单地移动,得分,变形的功能," + "外加上一些显示,计时和音效后。\n" + "游戏界面按左右键实现移动,按ESC重新开始,按空格键可以实现暂停和开始,按Shift变形。"); private Font f = new Font("微软雅黑", Font.PLAIN, 15); protected static boolean a = true; private boolean b = true; protected static int x; protected static int y; protected static int i,u; protected static int s2, s3, s4, s5, s6, s7, s8, s1, p = 0; protected int ran2, l; private Graphics g1; Thread e1 = new shift(); public SnakeDemo() { game.setTitle("俄罗斯方块"); game.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); game.setBounds(400, 10, 700, 800); game.setResizable(false); game1.add(label1); label1.setBounds(500, 260, 85, 20); label1.setFont(f); game1.add(label2); label2.setBounds(500, 290, 85, 20); label2.setFont(f); game1.add(label3); label3.setBounds(500, 320, 85, 20); label3.setFont(f); game1.add(explain); explain.setBounds(500, 350, 160, 200); explain.setLineWrap(true); explain.setEditable(false); explain.setOpaque(false); explain.setFont(f); game1.add(new mycanvas()); game.setVisible(true); game.setFocusable(true); } /* * 在绘制图形时x,y表示的是一个图形左下角的坐标,其中每个小方块的长宽都为20, * polygon绘制图形其中s(int)表示生成图形的x轴坐标,每个图形的y轴坐标由一个y计算得到 这里提供了最简单的方块的生成与变形,及生成一个横向的可以变形为一个纵向的。 */ public class mycanvas extends Canvas { public void paint(Graphics g) { g1 = (Graphics2D) g; int max = 7, min = 1; ran2 = (int) (Math.random() * (max - min) + min); ran2 = 1; background(); //绘制背景 //定义线程shift,shift释放则发生变形 if (ran2 == 1) { //如果ran=1则绘制第一种横向方块 i = 0; s1 = 165; s2 = 245; s3 = 245; s4 = 165; y = 25; e1.start(); //调用线程shift while (a) { //while循环实现图形移动 int x1[] = { s1, s2, s3, s4 }; if (i == 0) { //i=0时为横向状态 int y1[] = { y, y, y - 20, y - 20 }; g1.fillPolygon(x1, y1, 4); } if (i == 1) { //i=1时为变形为竖向的状态 int y1[] = { y, y, y - 80, y - 80 }; g1.fillPolygon(x1, y1, 4); } movement(); //调用descend方法实现图形下移 background(); //再次绘制背景 } } } } public void background() { //绘制背景的方法 for (int x2 = 5; x2 <= 405; x2 += 20) { for (int y2 = 5; y2 <= 705; y2 += 20) { g1.drawRect(x2, y2, 20, 20); } } } public void movement() { //图形下移的方法 System.out.println(i); if (i == 0) { //正常状态下移方法 g1.clearRect(s1, y - 40, 80, 20); } if (i == 1) { //变形后下移方法 if (l == 0) { g1.clearRect(s1 + 20, y - 40, 60, 20); l = 1; } g1.clearRect(s1, y - 100, 20, 20); } if (y <= 705) y += 20; else a = false; } } ``` ```import java.awt.event.KeyEvent; import java.awt.event.KeyListener; public class shift extends Thread { public void run() { SnakeDemo.game.addKeyListener(new KeyListener() { // 对Jframe窗体game添加键盘事件监听 public void keyTyped(KeyEvent e) { } public void keyReleased(KeyEvent e) { int code; code = e.getKeyCode(); switch (code) { case KeyEvent.VK_SHIFT: // 如果当shift键释放时发生如下变化 if (SnakeDemo.y >= 85) { // 判断图形是否有充足的Y轴变形,如果有则有横向状态变为竖向状态 synchronized (this) { SnakeDemo.i = 1; SnakeDemo.s2 = SnakeDemo.s1 + 20; SnakeDemo.s3 = SnakeDemo.s2; SnakeDemo.s4 = SnakeDemo.s1; System.out.println("ghjkbnm,ghjklhjklhjk"); } } code = 0; break; default: throw new IllegalArgumentException("Unexpected value: " + code); } } public void keyPressed(KeyEvent e) { } }); } } ```
相见恨晚的超实用网站
搞学习 知乎:www.zhihu.com 简答题:http://www.jiandati.com/ 网易公开课:https://open.163.com/ted/ 网易云课堂:https://study.163.com/ 中国大学MOOC:www.icourse163.org 网易云课堂:study.163.com 哔哩哔哩弹幕网:www.bilibili.com 我要自学网:www.51zxw
花了20分钟,给女朋友们写了一个web版群聊程序
参考博客 [1]https://www.byteslounge.com/tutorials/java-ee-html5-websocket-example
爬虫福利二 之 妹子图网MM批量下载
爬虫福利一:27报网MM批量下载    点击 看了本文,相信大家对爬虫一定会产生强烈的兴趣,激励自己去学习爬虫,在这里提前祝:大家学有所成! 目标网站:妹子图网 环境:Python3.x 相关第三方模块:requests、beautifulsoup4 Re:各位在测试时只需要将代码里的变量 path 指定为你当前系统要保存的路径,使用 python xxx.py 或IDE运行即可。
字节跳动视频编解码面经
引言 本文主要是记录一下面试字节跳动的经历。 三四月份投了字节跳动的实习(图形图像岗位),然后hr打电话过来问了一下会不会opengl,c++,shador,当时只会一点c++,其他两个都不会,也就直接被拒了。 七月初内推了字节跳动的提前批,因为内推没有具体的岗位,hr又打电话问要不要考虑一下图形图像岗,我说实习投过这个岗位不合适,不会opengl和shador,然后hr就说秋招更看重基础。我当时
开源一个功能完整的SpringBoot项目框架
福利来了,给大家带来一个福利。 最近想了解一下有关Spring Boot的开源项目,看了很多开源的框架,大多是一些demo或者是一个未成形的项目,基本功能都不完整,尤其是用户权限和菜单方面几乎没有完整的。 想到我之前做的框架,里面通用模块有:用户模块,权限模块,菜单模块,功能模块也齐全了,每一个功能都是完整的。 打算把这个框架分享出来,供大家使用和学习。 为什么用框架? 框架可以学习整体
Java学习的正确打开方式
在博主认为,对于入门级学习java的最佳学习方法莫过于视频+博客+书籍+总结,前三者博主将淋漓尽致地挥毫于这篇博客文章中,至于总结在于个人,实际上越到后面你会发现学习的最好方式就是阅读参考官方文档其次就是国内的书籍,博客次之,这又是一个层次了,这里暂时不提后面再谈。博主将为各位入门java保驾护航,各位只管冲鸭!!!上天是公平的,只要不辜负时间,时间自然不会辜负你。 何谓学习?博主所理解的学习,它
程序员必须掌握的核心算法有哪些?
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过
Python——画一棵漂亮的樱花树(不同种樱花+玫瑰+圣诞树喔)
最近翻到一篇知乎,上面有不少用Python(大多是turtle库)绘制的树图,感觉很漂亮,我整理了一下,挑了一些我觉得不错的代码分享给大家(这些我都测试过,确实可以生成喔~) one 樱花树 动态生成樱花 效果图(这个是动态的): 实现代码 import turtle as T import random import time # 画樱花的躯干(60,t) def Tree(branch
深深的码丨Java HashMap 透析
HashMap 相关概念 HashTab、HashMap、TreeMap 均以键值对像是存储或操作数据元素。HashTab继承自Dictionary,HashMap、TreeMap继承自AbstractMap,三者均实现Map接口 **HashTab:**同步哈希表,不支持null键或值,因为同步导致性能影响,很少被使用 **HashMap:**应用较多的非同步哈希表,支持null键或值,是键值对...
大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了
大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、电子书搜索 对于大部分程序员...
linux系列之常用运维命令整理笔录
本博客记录工作中需要的linux运维命令,大学时候开始接触linux,会一些基本操作,可是都没有整理起来,加上是做开发,不做运维,有些命令忘记了,所以现在整理成博客,当然vi,文件操作等就不介绍了,慢慢积累一些其它拓展的命令,博客不定时更新 顺便拉下票,我在参加csdn博客之星竞选,欢迎投票支持,每个QQ或者微信每天都可以投5票,扫二维码即可,http://m234140.nofollow.ax.
Python 基础(一):入门必备知识
目录1 标识符2 关键字3 引号4 编码5 输入输出6 缩进7 多行8 注释9 数据类型10 运算符10.1 常用运算符10.2 运算符优先级 1 标识符 标识符是编程时使用的名字,用于给变量、函数、语句块等命名,Python 中标识符由字母、数字、下划线组成,不能以数字开头,区分大小写。 以下划线开头的标识符有特殊含义,单下划线开头的标识符,如:_xxx ,表示不能直接访问的类属性,需通过类提供
程序员接私活怎样防止做完了不给钱?
首先跟大家说明一点,我们做 IT 类的外包开发,是非标品开发,所以很有可能在开发过程中会有这样那样的需求修改,而这种需求修改很容易造成扯皮,进而影响到费用支付,甚至出现做完了项目收不到钱的情况。 那么,怎么保证自己的薪酬安全呢? 我们在开工前,一定要做好一些证据方面的准备(也就是“讨薪”的理论依据),这其中最重要的就是需求文档和验收标准。一定要让需求方提供这两个文档资料作为开发的基础。之后开发
网页实现一个简单的音乐播放器(大佬别看。(⊙﹏⊙))
今天闲着无事,就想写点东西。然后听了下歌,就打算写个播放器。 于是乎用h5 audio的加上js简单的播放器完工了。 欢迎 改进 留言。 演示地点跳到演示地点 html代码如下`&lt;!DOCTYPE html&gt; &lt;html&gt; &lt;head&gt; &lt;title&gt;music&lt;/title&gt; &lt;meta charset="utf-8"&gt
Python十大装B语法
Python 是一种代表简单思想的语言,其语法相对简单,很容易上手。不过,如果就此小视 Python 语法的精妙和深邃,那就大错特错了。本文精心筛选了最能展现 Python 语法之精妙的十个知识点,并附上详细的实例代码。如能在实战中融会贯通、灵活使用,必将使代码更为精炼、高效,同时也会极大提升代码B格,使之看上去更老练,读起来更优雅。 1. for - else 什么?不是 if 和 else 才
数据库优化 - SQL优化
前面一篇文章从实例的角度进行数据库优化,通过配置一些参数让数据库性能达到最优。但是一些“不好”的SQL也会导致数据库查询变慢,影响业务流程。本文从SQL角度进行数据库优化,提升SQL运行效率。 判断问题SQL 判断SQL是否有问题时可以通过两个表象进行判断: 系统级别表象 CPU消耗严重 IO等待严重 页面响应时间过长
2019年11月中国大陆编程语言排行榜
2019年11月2日,我统计了某招聘网站,获得有效程序员招聘数据9万条。针对招聘信息,提取编程语言关键字,并统计如下: 编程语言比例 rank pl_ percentage 1 java 33.62% 2 c/c++ 16.42% 3 c_sharp 12.82% 4 javascript 12.31% 5 python 7.93% 6 go 7.25% 7
通俗易懂地给女朋友讲:线程池的内部原理
餐厅的约会 餐盘在灯光的照耀下格外晶莹洁白,女朋友拿起红酒杯轻轻地抿了一小口,对我说:“经常听你说线程池,到底线程池到底是个什么原理?”我楞了一下,心里想女朋友今天是怎么了,怎么突然问出这么专业的问题,但做为一个专业人士在女朋友面前也不能露怯啊,想了一下便说:“我先给你讲讲我前同事老王的故事吧!” 大龄程序员老王 老王是一个已经北漂十多年的程序员,岁数大了,加班加不动了,升迁也无望,于是拿着手里
经典算法(5)杨辉三角
杨辉三角 是经典算法,这篇博客对它的算法思想进行了讲解,并有完整的代码实现。
腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹?
昨天,有网友私信我,说去阿里面试,彻底的被打击到了。问了为什么网上大量使用ThreadLocal的源码都会加上private static?他被难住了,因为他从来都没有考虑过这个问题。无独有偶,今天笔者又发现有网友吐槽了一道腾讯的面试题,我们一起来看看。 腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹? 在互联网职场论坛,一名程序员发帖求助到。二面腾讯,其中一个算法题:64匹
面试官:你连RESTful都不知道我怎么敢要你?
面试官:了解RESTful吗? 我:听说过。 面试官:那什么是RESTful? 我:就是用起来很规范,挺好的 面试官:是RESTful挺好的,还是自我感觉挺好的 我:都挺好的。 面试官:… 把门关上。 我:… 要干嘛?先关上再说。 面试官:我说出去把门关上。 我:what ?,夺门而去 文章目录01 前言02 RESTful的来源03 RESTful6大原则1. C-S架构2. 无状态3.统一的接
JDK12 Collectors.teeing 你真的需要了解一下
前言 在 Java 12 里面有个非常好用但在官方 JEP 没有公布的功能,因为它只是 Collector 中的一个小改动,它的作用是 merge 两个 collector 的结果,这句话显得很抽象,老规矩,我们先来看个图(这真是一个不和谐的图????): 管道改造经常会用这个小东西,通常我们叫它「三通」,它的主要作用就是将 downstream1 和 downstre...
为啥国人偏爱Mybatis,而老外喜欢Hibernate/JPA呢?
关于SQL和ORM的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行了一番讨论,感触还是有一些,于是就有了今天这篇文。 声明:本文不会下关于Mybatis和JPA两个持久层框架哪个更好这样的结论。只是摆事实,讲道理,所以,请各位看官勿喷。 一、事件起因 关于Mybatis和JPA孰优孰劣的问题,争论已经很多年了。一直也没有结论,毕竟每个人的喜好和习惯是大不相同的。我也看
项目中的if else太多了,该怎么重构?
介绍 最近跟着公司的大佬开发了一款IM系统,类似QQ和微信哈,就是聊天软件。我们有一部分业务逻辑是这样的 if (msgType = "文本") { // dosomething } else if(msgType = "图片") { // doshomething } else if(msgType = "视频") { // doshomething } else { // doshom...
致 Python 初学者
欢迎来到“Python进阶”专栏!来到这里的每一位同学,应该大致上学习了很多 Python 的基础知识,正在努力成长的过程中。在此期间,一定遇到了很多的困惑,对未来的学习方向感到迷茫。我非常理解你们所面临的处境。我从2007年开始接触 python 这门编程语言,从2009年开始单一使用 python 应对所有的开发工作,直至今天。回顾自己的学习过程,也曾经遇到过无数的困难,也曾经迷茫过、困惑过。开办这个专栏,正是为了帮助像我当年一样困惑的 Python 初学者走出困境、快速成长。希望我的经验能真正帮到你
“狗屁不通文章生成器”登顶GitHub热榜,分分钟写出万字形式主义大作
一、垃圾文字生成器介绍 最近在浏览GitHub的时候,发现了这样一个骨骼清奇的雷人项目,而且热度还特别高。 项目中文名:狗屁不通文章生成器 项目英文名:BullshitGenerator 根据作者的介绍,他是偶尔需要一些中文文字用于GUI开发时测试文本渲染,因此开发了这个废话生成器。但由于生成的废话实在是太过富于哲理,所以最近已经被小伙伴们给玩坏了。 他的文风可能是这样的: 你发现,...
程序员:我终于知道post和get的区别
是一个老生常谈的话题,然而随着不断的学习,对于以前的认识有很多误区,所以还是需要不断地总结的,学而时习之,不亦说乎
《程序人生》系列-这个程序员只用了20行代码就拿了冠军
你知道的越多,你不知道的越多 点赞再看,养成习惯GitHub上已经开源https://github.com/JavaFamily,有一线大厂面试点脑图,欢迎Star和完善 前言 这一期不算《吊打面试官》系列的,所有没前言我直接开始。 絮叨 本来应该是没有这期的,看过我上期的小伙伴应该是知道的嘛,双十一比较忙嘛,要值班又要去帮忙拍摄年会的视频素材,还得搞个程序员一天的Vlog,还要写BU...
加快推动区块链技术和产业创新发展,2019可信区块链峰会在京召开
11月8日,由中国信息通信研究院、中国通信标准化协会、中国互联网协会、可信区块链推进计划联合主办,科技行者协办的2019可信区块链峰会将在北京悠唐皇冠假日酒店开幕。   区块链技术被认为是继蒸汽机、电力、互联网之后,下一代颠覆性的核心技术。如果说蒸汽机释放了人类的生产力,电力解决了人类基本的生活需求,互联网彻底改变了信息传递的方式,区块链作为构造信任的技术有重要的价值。   1...
程序员把地府后台管理系统做出来了,还有3.0版本!12月7号最新消息:已在开发中有github地址
第一幕:缘起 听说阎王爷要做个生死簿后台管理系统,我们派去了一个程序员…… 996程序员做的梦: 第一场:团队招募 为了应对地府管理危机,阎王打算找“人”开发一套地府后台管理系统,于是就在地府总经办群中发了项目需求。 话说还是中国电信的信号好,地府都是满格,哈哈!!! 经常会有外行朋友问:看某网站做的不错,功能也简单,你帮忙做一下? 而这次,面对这样的需求,这个程序员...
相关热词 c#处理浮点数 c# 生成字母数字随机数 c# 动态曲线 控件 c# oracle 开发 c#选择字体大小的控件 c# usb 批量传输 c#10进制转8进制 c#转base64 c# 科学计算 c#下拉列表获取串口
立即提问