转载于:https://blog.csdn.net/liu_rong_fei/article/details/51271901
视频下载地址:链接: http://pan.baidu.com/s/1qYj9BMs 密码: fn8u

 

《c语言开发窗口应用程序》前言

本教程适合什么样的人学习

适合已经掌握基本的c语言语法,想进一步提高c语言,不想总是玩控制台和做数学计算题的朋友。

通过本教程能学到什么?

1.学会制作带窗口界面的程序。

2.学会软件开发中常用的各种技术,如网络编程,多线程编程,数据库编程。

3.项目实战,让您知道软件是怎么一步一步制作的。可以学会c语言的模块化编程以及一些编程习惯和思路。

 

教学模式

从需求出发,通过项目实战教学,期间遇到的知识点再详细讲解,最终项目学会了,知识也学会了,并且比零散的知识更加容易记住,做到真正的学以致用。

 

第一阶段:windows图形编程

第一节:我的第一个窗口

窗口是什么?

程序的窗口到底是什么?其实窗口,可以理解为电脑屏幕上的一个图片或者是像素点,底层的原理都是操作让显示屏显示特定的图形。只是这一切都不需要我们去编写代码来控制屏幕显示。是由操作系统来完成,然后编写操作系统的人编写出来一些函数,提供给程序员去使用,从而达到创建窗口的目的。

Windows系统下如何编写带窗口的程序?

c语言通过调用windows系统提供给的API来创建窗口。

API是什么?

API(Application Programming Interface,应用程序编程接口)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。

你也可以自己编写API提供特定的功能,然后给其他程序员去使用,这就是你的API。我们这里说的API特指windows系统提供的api,他是由编写windows操作系统的程序员编写的,然后提供给需要的程序员使用,比如创建窗口。

简而言之,windows API其实就是开发windows系统的程序员编写来提供给我们程序员用的函数。

 

为何其他的语言直接鼠标拖拉一下就能有界面?

很多语言都可以调用这些API,比如c、c++、java、vb、c#等等,调用的都是同样的函数,用法也是一样,只是不同语言调用方式上有点区别而已。

 

像vb、Delphi、易语言之类的,鼠标拖拉一下就有界面。其实只是对我们程序员隐藏了底层的东西,其本质还是一样调用了windows提供给他的API函数来实现。

 

大家可能会想,既然拖拉一下都可以做出界面,那我们还有必要学习直接用API创建窗口这么麻烦吗?当然是有必要的,理解原理以后,我们就不会被表面的东西遮住眼睛,能够一眼洞穿他的本质,撕去他的伪装。以后大家还会接触到很多的界面库(如:Duilib),有的是开放源码的,当大家去读这些代码的时候,就必须要具备这些基础的理论知识。

 

动手编写第一个带窗口的程序?

窗口程序的主函数名称 跟控制台程序的主函数名称不一样。

在控制台程序中,基本框架是:

int main(void)

{

return 0;

}

 

Win32窗口程序,基本框架是:

#include <windows.h>

 

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevinstance, PSTR szCmdLine, int iCmdShow)

{

return 0;

}

 

看起来比较复杂,是因为有很多数据类型没有见过。

 

下面来一一解释一下:

int :代表返回值是整形 这个跟控制台程序一样。

 

WINAPI :

这个是调用约定,实质上是它是宏 #define WINAPI __stdcall  说明是stdcall的调用约定,想了解更多关于调用约定的,可以直接谷歌搜索 调用约定。Ps:谷歌被墙,可以通过这个地址使用谷歌搜索服务(g.zixue7.cn或go.zixue7.cn)

 

WinMain :

这个是函数名 就像控制台程序中的 main

 

HINSTANCE :

这个是一个自定义类型, 是句柄型数据类型,相当于装入了内存的资源的ID,比如我们的程序被加载到内存中,就是一个资源,就有一个编号,WinMain函数的第一个参数就是表示我们当前运行这个程序本身的资源id。

 

hInstance:

应用程序当前实例的句柄。 这个值其实就是程序加载到内存空间后的首地址。

 

hPrevlnstance:

应用程序的先前实例的句柄。对于同一个程序打开两次,出现两个窗口第一次打开的窗口就是先前实例的窗口。

 

 

PSTR szCmdLine:

在WINNT.H中有如下定义

typedef char CHAR;  

typedef CHAR *LPSTR, *PSTR;

 

这就说明 PSTR 其实就是个char类型的指针而已。

这个参数的作用就是接受命令行参数。比如在启动程序的时候用如下命令:

zixue7.exe admin password

那么这个szCmdLine 中保存的就是 admin password这个字符串

这个参数的值,可以直接使用,也可以通过 GetCommandLine() 函数获取到。

 

int iCmdShow :这个是控制窗口的显示状态,比如最大化,最小化,隐藏。

 

上面这些参数解释,一开始看不懂,没有关系,完全不影响我们下面的学习,可以等到以后知识积累足够了,再回头好好理解。

 

对主函数了解差不多之后,我们来编写第一个窗口程序,代码如下:

 

#include <windows.h>

 

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevinstance, PSTR szCmdLine, int iCmdShow)

{

MessageBox(NULL, TEXT("窗口内容"), TEXT("窗口标题"), MB_OK);

return 0;

}

 

其实这还不算真正的窗口程序,只是一个对话框窗口。

接下来,我们先来配置好本次课程用的开发环境。

 

开发环境搭建

本套教程采用的开发工具是VS2013,下载地址:http://www.zixue7.com/thread-36148-1-1.html

 

安装过程 略微有点漫长。。

 

安装的时候遇到这个问题 要么装一下ie10  要么不管他 点继续。

 

 

如何创建项目,具体看视频演示,也可以自己摸索一下。

 

下面看第一个窗口的代码:

 

 

#include <windows.h>

 

//窗口过程函数

LRESULT CALLBACK WndProc(HWND,UINT, WPARAM, LPARAM);

 

 

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR szCmdLine,int iCmdShow)

{

//定义窗口类结构体变量

WNDCLASS wc;

 

//窗口类名称

static TCHAR* szAppName =TEXT("zixue7");

 

//窗口句柄

HWND hwnd = NULL;

 

//消息结构

MSG msg;

 

/**

下面的代码填充窗口类信息,如图标,鼠标样式,背景,过程函数等

*/

wc.style = CS_HREDRAW | CS_VREDRAW; //窗口样式

wc.lpfnWndProc = WndProc; //过程函数

wc.cbClsExtra = 0; //扩展字段

wc.cbWndExtra = 0; //扩展字段

wc.hInstance = hInstance; //当前实例句柄

wc.hIcon = LoadIcon(hInstance,IDI_APPLICATION); //设置程序图标

wc.hCursor = LoadCursor(NULL,IDC_ARROW); //设置鼠标

 

//用白色画刷填充背景

wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);

 

//菜单

wc.lpszMenuName = NULL;

 

//类名

wc.lpszClassName = szAppName;

 

 

//像操作系统注册窗口类

if (!RegisterClass(&wc))

{

MessageBox(NULL,TEXT("程序只能在windowsNT下运行"),

szAppName, MB_ICONERROR);

return 0;

}

 

//创建窗口

hwnd = CreateWindow(szAppName, //要注册的窗口类名

TEXT("c语言编写的第一个窗口程序-www.zixue7.com"),//窗口标题

WS_OVERLAPPEDWINDOW, //窗口样式

CW_USEDEFAULT, //窗口距离屏幕左上角都横坐标

CW_USEDEFAULT, //窗口距离屏幕左上角都纵坐标

400, //窗口宽度

300, //窗口高度

NULL, //父窗口句柄

NULL, //菜单句柄

hInstance, //当前实例句柄

NULL); //指向一个值的指针,该值传递给窗口 WM_CREATE消息。一般为NULL

 

//显示窗口

ShowWindow(hwnd, iCmdShow);

 

//更新窗口

UpdateWindow(hwnd);

 

 

//消息循环,一直停在这里,退出消息循环就表示程序结束了。

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_DESTROY:

//发送结束请求,里面的参数为退出码

PostQuitMessage(0);

break;

}

 

//调用默认的过程函数

return DefWindowProc(hwnd,message, wParam, lParam);

}

 

 

 

 

 

 

运行效果:

 

 

 

 

我们已经用纯代码生成了第一个窗口,这是一个好的开始,虽然只有短短的几十行代码,但是其中的信息量是非常大的,今后所有的窗口程序,我们都是基于上面的一个基本框架代码。

 

我们先来看看在windows下创建一个窗口的整个过程:

1.告诉系统,我们要创建一个怎么样的窗口。

如何告诉?通过WNDCLASS这个结构来告诉他,我们设置这个结构的不同字段。

设置好字段之后,调用RegisterClass函数来告诉系统,我们要注册一个这样的窗口类型。

 

2.创建窗口。

上一步创建了一个窗口类型,其实这个窗口类型可以理解为一个模板,接下来我们就告 操作系统,我们要以xx模板创建一个窗口。怎么告诉他呢?就是调用函数CreateWindow,这个函数参数十分的多,也不需要去死记硬背,书写多了自然就记住 了,写的时候不知道有哪些参数就百度搜下函数名称就好了。

 

3.显示窗口

创建好窗口之后,默认是没显示的,我们还需要让他显示出来,同样是调用函数

ShowWindow来显示, 调用这个函数来更新窗口UpdateWindow

 

4.消息循环

创建好窗口之后,不是要等待用户的操作吗?比如鼠标单击,键盘按键等等。

这些东西在windows系统中都是一种消息。

上面的 WndProc 这个函数就是专门处理这些消息,我们可以在这个函数中处理我们感

兴趣的消息。

 

 

重点:消息机制(也就是消息循环具体是怎么循环的,消息从哪里来,要到哪里去)

 

一个消息的产生到结束是怎样一个过程,就以用户点击鼠标为例。

1.用户在应用程序A上面单击了左键

2.操作系统捕捉到了这个单击左键的消息,就把它放到由操作系统管理的消息队列中。

3.我们的程序创建好之后就通过GetMessage函数一直不停的去检测消息队列中是否有自己关心的消息(至于如何判断哪些消息是我们窗口所关心的,这个由操作系统去管,此处不必深究。)

4.获取到消息之后,操作系统(可以看到我们并没有在我们代码中直接调用)就调用窗口过程函数来处理,窗口过程函数就是上面代码中的WndProc。 他怎么知道要调用这个函数来处理呢?是因为在我们注册窗口类的时候通过这段代码告诉他的wc.lpfnWndProc = WndProc;  程序又不是神,不告诉他,他怎么会知道呢?O(∩_∩)O~

 

5.如此反复,一直不停的处理消息,直到程序结束。

 

整个过程大致就是

操作系统获取到消息,再告诉相关的程序,相关程序在处理消息。

 

 

 

课后作业:

自己动手把上面的代码多输入几次,熟练他,并且理解整个创建窗口的过程。

代码熟练到可以不用看着原有的代码 都能自己打出来。

输入代码的时候 心中想着窗口创建的步骤,就很容易记住了。

注:目的不是让大家背代码,而是通过敲打代码来熟悉创建窗口的整个流程。

 

 

第二节:定时提醒喝水工具

使用场景与软件需求分析:

场景:作为程序员的我们,每天在电脑面前,低头抬头就是几个小时,有时候整天都不喝水,所以通过软件来定时提醒我们喝水是很有必要的。

 

第一:定时功能。

第二:提醒功能。

 

 

窗口创建到销毁的整个过程。

1.调用CreateWindow之后,窗口显示之前,会收到,WM_CREATE消息(只会收到一次)

2.ShowWindow函数设置窗口的显示状态(根据WinMain函数最后一个参数来定)

3.UpdateWindow 会发送一个WM_PAINT,消息处理函数会去绘制窗口的客户区,至此窗口创建显示完毕。

4.当检测到用户单击关闭按钮的时候,系统会给程序发送一个WM_SYSCOMMAND消息。

5.WndProc消息处理函数将这个消息传给DefWindowProc,DefWindowProc会发出一个WM_CLOSE消息。

6.消息处理函数收到一个WM_CLOSE消息(一般可以在这里提示用户是否真的要关闭窗口)

7.如果说用户不去拦截处理WM_CLOSE消息,将他叫给DefWindowProc处理,DefWindowProc函数会发送WM_DESTROY消息,一般对WM_DESTROY消息的处理是,调用PostQuitMessage函数。

8.PostQuitMessage函数将会发送一条WM_QUIT消息。

9.消息循环中的GetMessage函数获取到WM_QUIT消息之后,返回值为0,退出消息循环。

10.最后主函数返回 msg.wParam,这个msg.wParam的值 其实就是调用PostQuitMessage函数时传入的值,被填充到msg.wParam参数中,作为WinMain函数的返回值。至此,整个程序结束。

 

GDI简介

GDI (图形设备接口(GraphicsDeviceInterface)),他是windows提供的绘图接口,让我们无需关心底层设备以及设备驱动就可以在设备上输出内容,方便了开发工作。

 

设备内容(DC)和设备内容句柄(HDC):

DC是GDI内部保存的数据结构,跟显示器或打印机这类设备相关,DC中的有些属性值定义了GDI绘图函数的具体细节。

HDC是设备内容句柄,句柄实际上就是一个数值,Windows以它在内部使用对象。从windows获取到句柄以后,就可以在GDI函数中使用这个句柄来绘制内容了。

 

可以通过如下方法获得HDC:

1.通过BeginPaint和EndPaint函数(会让无效区域变成有效区域):

处理WM_PAINT时,通过调用BeginPaint函数,他的返回值就是HDC,通常使用如下代码:

PAINTSTRUCT ps ;

HDC hdc ;

 

case WM_PAINT:

  hdc = BeginPaint (hwnd, &ps) ;

   //在这里使用GDI函数

  EndPaint (hwnd, &ps) ;

  return 0 ;

 

2.通过GetDC 和ReleaseDC函数(不会让无效区域变成有效区域):

 

hdc = GetDC (hwnd) ;

//使用GDI函数

ReleaseDC (hwnd, hdc) ;

 

 

注意:调用GetDC 和ReleaseDC函数不会使无效区域变成有效区域,所以如果处理WM_PAINT消息时使用这种方式来绘制内容时,可以调用ValidateRect (hwnd, NULL) 函数来使无效矩形变为有效。

 

GetDC(NULL); 如果参数为NULL会获取到整个屏幕的设备句柄,意思就是,可以在整个屏幕上绘制文字或图像,比如以前看到过的一个全屏下雪的程序,就可以通过这个实现

O(∩_∩)O~。

 

与GetDC相似的函数是GetWindowDC。GetDC传回用于写入窗口显示区域的设备内容句柄,而GetWindowDC传回写入整个窗口的设备内容句柄。例如,您的程序可以使用从GetWindowDC传回的设备内容句柄在窗口的标题列上写入文字。然而,程序同样也应该处理WM_NCPAINT(「非显示区域绘制」)消息。

 

窗口的绘制与更新

在以前的控制台程序中,我们用printf输出一段文字之后,他就会一直显示在窗口上,不必担心他会莫名其妙的消失。

重点:在windows中,他不一定能保证我们显示的东西一直存在,比如:我们的窗口被其他窗口遮住的时候,windows不会自动保存被遮住部分的内容,等到窗口没有遮住的时候,他没有办法重新恢复那一部分的内容,但是他会发一个WM_PAINT消息给我们的程序,让我们自己去更新那一部分内容。

 

引用《windows程序设计第五版》中的一段文字:

在发生下面几种事件之一时,窗口消息处理程序会接收到一个WM_PAINT消息:

l ·在使用者移动窗口或显示窗口时,窗口中先前被隐藏的区域重新可见。

l ·使用者改变窗口的大小(如果窗口类别样式有着CS_HREDRAW和CS_VREDRAW位旗标的设定)。

l ·程序使用ScrollWindow或ScrollDC函数滚动显示区域的一部分。

l ·程序使用InvalidateRect或InvalidateRgn函数刻意产生WM_PAINT消息。

 

在某些情况下,显示区域的一部分被临时覆盖,Windows试图保存一个显示区域,并在以后恢复它,但这不一定能成功。在以下情况下,Windows可能发送WM_PAINT消息:

l ·Windows擦除覆盖了部分窗口的对话框或消息框。

l ·菜单下拉出来,然后被释放。

l ·显示工具提示消息。

 

在某些情况下,Windows总是保存它所覆盖的显示区域,然后恢复它。这些情况是:

l ·鼠标光标穿越显示区域。

l ·图标拖过显示区域。

 

 

有效矩形和无效矩形:

一般来说,当程序接收到WM_PAINT消息就准备更新整个窗口,但经常只会更新一个很小都区域。比如:当窗口被一个对话框覆盖一部分,当对话框移开的时候,需要重绘的只是先前被对话框覆盖部分而已。只有在显示区域中存在无效矩形时,窗口才会接收到WM_PAINT消息。

在windows内部为每个窗口保存了一个【绘图信息结构】,其中就记录了无效矩形的坐标和其他信息。当消息队列中已经存在一个WM_PAINT消息,在这个消息被处理之前,又有一个区域变成了无效区域,此时系统会自动计算两个无效区域,将两个区域合并成为一个新的无效矩形,最终消息队列中只有一个WM_PAINT消息,其中的无效区域就是合并后的无效矩形所包含的区域。

 

注意:由于以上原因,我们必须在接收到WM_PAINT消息的时候,重新绘制我们的内容,并把窗口中的无效矩形变成有效矩形。

 

在呼叫BeginPaint函数之后,整个显示区域将变成有效区域。

程序也可以通过呼叫ValidateRect函数使显示区域内的任意矩形区域变为有效。如果这呼叫具有令整个无效区域变为有效的效果,则目前队列中的任何WM_PAINT消息都将被删除。

 

一般地,处理WM_PAINT消息的形式如下:

 

case WM_PAINT:

  hdc = BeginPaint (hwnd, &ps) ;

         //使用GDI函数

  EndPaint (hwnd, &ps) ;

  return 0 ;

 

 

如果不处理WM_PAINT必须把它传给DefWindowProc函数处理,他默认使用如下代码来处理WM_PAINT消息:

case WM_PAINT:

    BeginPaint(hwnd, &ps);

    EndPaint(hwnd, &ps);

   return 0 ;

 

 

下面的写法是错误的!!!!

 

case WM_PAINT:

return 0 ;  

 

//错误写法,这样做的后果是,因为无效区域没有变成有效区域,所以会不停的收到WM_PAINT消息,消息队列中一直存在WM_PAINT消息!!!

 

 

实战编写定时提醒喝水工具

1.在WM_CREATE消息中设置定时器。

2.在WM_TIMER 消息中处理提示信息,比如闪动窗口,弹出窗口,播放声音等等。

3.在WM_DESTROY 消息中销毁定时器

 

定时器的使用

SetTimer / KillTimer 函数

 

 

控制台下使用消息循环以及定时器

#include <windows.h>

#include <stdio.h>

 

void CALLBACK TimerProc(HWND hWnd,UINT nMsg,UINT nTimerid,DWORD dwTime)

{

  printf("%s","abc");

}

 

int main(void)

{

int timerId = 0;

 

//创建一个定时器,返回定时器标识

    timerId = SetTimer(NULL, 0, 1000, TimerProc);

 

//如果创建失败,退出程序

if(0 == timerId)

{

printf("定时器创建失败");

return 1;

}

 

//消息结构体

    MSG   msg;

 

//消息循环

    while(GetMessage(&msg,NULL,0,0))   

    {

        //翻译消息

TranslateMessage(&msg);

//分发消息

DispatchMessage(&msg);

    }   

 

//销毁定时器

KillTimer(NULL, timerId);

 

return 0;

}

 

课后作业:

添加窗口变成顶层窗口。

添加自启动。

 

 

 

 

 

第三节:制作一个简单的画板

本节知识点

1.简单的绘图函数

2.获取鼠标信息

3.画笔的创建,选择,删除

 

 

涉及的函数:

SetPixel (hdc, x, y, crColor) ;

crColor = GetPixel (hdc, x, y)

 

 

MoveToEx (hdc, xBeg, yBeg, NULL) ;

        

LineTo (hdc, xEnd, yEnd) ;

        

 

Polyline和PolylineTo画一系列相连的直线。

 

 

CreatePen  创建画笔

SelectObject 选择画笔

DeleteObject 删除画笔

 

消息:

鼠标左键按下,松开

鼠标右键按下,松开

 

画板代码:

#include <windows.h>

 

//窗口过程函数

LRESULT CALLBACK WndProc(HWND,UINT, WPARAM, LPARAM);

 

 

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR szCmdLine,int iCmdShow)

{

//定义窗口类结构体变量

WNDCLASS wc;

 

//窗口类名称

static TCHAR* szAppName =TEXT("zixue7");

 

//窗口句柄

HWND hwnd = NULL;

 

//消息结构

MSG msg;

 

/**

下面的代码填充窗口类信息,如图标,鼠标样式,背景,过程函数等

*/

wc.style = CS_HREDRAW | CS_VREDRAW; //窗口样式

wc.lpfnWndProc = WndProc; //过程函数

wc.cbClsExtra = 0; //扩展字段

wc.cbWndExtra = 0; //扩展字段

wc.hInstance = hInstance; //当前实例句柄

wc.hIcon = LoadIcon(hInstance,IDI_APPLICATION); //设置程序图标

wc.hCursor = LoadCursor(NULL,IDC_ARROW); //设置鼠标

 

//用白色画刷填充背景

wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);

 

//菜单

wc.lpszMenuName = NULL;

 

//类名

wc.lpszClassName = szAppName;

 

 

//像操作系统注册窗口类

if (!RegisterClass(&wc))

{

MessageBox(NULL,TEXT("程序只能在windowsNT下运行"),

szAppName, MB_ICONERROR);

return 0;

}

 

//创建窗口

hwnd = CreateWindow(szAppName, //要注册的窗口类名

TEXT("c语言制作简单的画板-www.zixue7.com"),//窗口标题

WS_OVERLAPPEDWINDOW, //窗口样式

CW_USEDEFAULT, //窗口距离屏幕左上角都横坐标

CW_USEDEFAULT, //窗口距离屏幕左上角都纵坐标

800, //窗口宽度

600, //窗口高度

NULL, //父窗口句柄

NULL, //菜单句柄

hInstance, //当前实例句柄

NULL); //指向一个值的指针,该值传递给窗口 WM_CREATE消息。一般为NULL

 

//显示窗口

ShowWindow(hwnd, iCmdShow);

 

//更新窗口

UpdateWindow(hwnd);

 

 

//消息循环,一直停在这里,退出消息循环就表示程序结束了。

while (GetMessage(&msg,NULL, 0, 0))

{

//翻译消息

TranslateMessage(&msg);

 

//分发消息

DispatchMessage(&msg);

}

 

 

return msg.wParam;

}

 

 

/**

消息处理函数

*/

LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)

{

//记录鼠标移动时的坐标

long xPos, yPos;

 

static int i = 0;//保存坐标数组下标

static POINT pts[5000];//保存鼠标移动产生的坐标信息

static int leftDown = 0;//记录鼠标左键是否按下

 

TCHAR buf[512];

 

static HPEN hPenRed, hPenGreen, hPenBlue, hPenCur;//创建画笔句柄

 

HDC hdc; //设备内容句柄

switch (message)

{

case WM_CREATE:

 

//创建画笔

hPenRed = CreatePen(PS_DASH, 1, RGB(255, 0, 0));

hPenGreen = CreatePen(PS_DOT, 1, RGB(0, 255, 0));

hPenBlue = CreatePen(PS_SOLID, 5, RGB(0, 0, 255));

 

//让蓝色画笔成为当前画笔

hPenCur = hPenBlue;

 

return 0;

 

case WM_KEYDOWN:

sprintf(buf, "key-code:%d\n", wParam);

OutputDebugString(buf);

 

//判断哪个按键被按下

switch (wParam)

{

case 'R':

hPenCur = hPenRed;

break;

 

case 'G':

hPenCur = hPenGreen;

break;

 

case 'B':

hPenCur = hPenBlue;

break;

 

default:

break;

}

return 0;

 

 

//鼠标移动

case WM_MOUSEMOVE:

 

if (0 == leftDown) return 0;

 

xPos = LOWORD(lParam);//获取lParm中的低字,保存的是x坐标

yPos = HIWORD(lParam);//获取lParm中的高字,保存的是y坐标

 

 

//获取设备内容句柄

hdc = GetDC(hwnd);

 

//保存鼠标当前的作坐标到数组

pts[i].x = xPos;

pts[i].y = yPos;

 

 

++i;  //数组下标向后移动一个

 

InvalidateRect(hwnd, NULL, FALSE); //手动让整个窗口变为无效区域,从而产生WM_PAINT消息

ReleaseDC(hwnd, hdc);

return 0;

 

//鼠标左键单击

case WM_LBUTTONDOWN:

leftDown = 1;  //设置为左键按下

i = 0; //设置下标从0开始,重新画一条线

return 0;

 

case WM_LBUTTONUP:

leftDown = 0; //设置为鼠标左键放开

return 0;

 

 

case WM_PAINT:

 

hdc = GetDC(hwnd);

 

 

SelectObject(hdc, hPenCur); //选择hPenCur为当前的画笔

Polyline(hdc, pts, i); //根据pts数组绘制 连续的线

 

ReleaseDC(hwnd, hdc);

 

ValidateRect(hwnd, NULL); //因为没有使用 BeginPaint,客户区域的无效区域不会自动变为有效区域,所以手动掉用这个函数来让那个整个客户区域变成有效区域

return 0;

 

case WM_DESTROY:

 

DeleteObject(hPenRed);

DeleteObject(hPenGreen);

DeleteObject(hPenBlue);

//发送结束请求,里面的参数为退出码

PostQuitMessage(0);

return 0;

}

 

//调用默认的过程函数

return DefWindowProc(hwnd,message, wParam, lParam);

}

 

 

作业:

新建一个空项目,所有代码都自己输入,完成本次画板的功能。

要求:1.添加单击就清空画板的功能。

附加:制作一个画面可以刷新窗口而不消失的画板。

 

第四节:制作简易计算器

知识点:

1.创建常见的控件(子窗口创建)

2.响应子控件消息

3.父窗口向子控件发送消息

 

项目代码:

#define _CRT_SECURE_NO_WARNINGS

 

#include <windows.h>

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

 

 

#define                BTN0                100

#define                BTN1                101

#define                BTN2                102

#define                BTN3                103

#define                BTN4                104

#define                BTN5                105

#define                BTN6                106

#define                BTN7                107

#define                BTN8                108

#define                BTN9                109

#define                BTN_CLS                110

#define                BTN_ADD                111

#define                BTN_SUB                112

#define                BTN_MUL                113

#define                BTN_DIV                114

#define                BTN_EQU                115

 

#define                TEXT_BOX        120

 

char labels[][10] = { "1", "2", "3", "+", "4", "5", "6", "-", "7", "8", "9",

"*", "CLS", "0", "=", "/" };

int bid[] = {

BTN1, BTN2, BTN3, BTN_ADD,

BTN4, BTN5, BTN6, BTN_SUB,

BTN7, BTN8, BTN9, BTN_MUL,

BTN_CLS, BTN0, BTN_EQU, BTN_DIV };

 

char first[100], second[100], cz = 0;

 

LRESULT CALLBACK WndProc(HWND,UINT, WPARAM, LPARAM);

void create_button(HWND hwnd,int x, int y,int id);

void create_textbox(HWND hwnd);

void onCommand(HWND hwnd,WPARAM wParam);

 

HINSTANCE ghInstance;

 

INT WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR str,INT iCmdShow) {

HWND hWnd;

MSG msg;

WNDCLASS wndClass;

 

wndClass.style = CS_HREDRAW | CS_VREDRAW;

wndClass.lpfnWndProc = WndProc;

wndClass.cbClsExtra = 0;

wndClass.cbWndExtra = 0;

wndClass.hInstance = hInstance;

wndClass.hIcon = LoadIcon(NULL,IDI_APPLICATION);

wndClass.hCursor = LoadCursor(NULL,IDC_ARROW);

wndClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);

wndClass.lpszMenuName = NULL;

wndClass.lpszClassName = TEXT("calc");

 

RegisterClass(&wndClass);

 

ghInstance = hInstance;

 

hWnd = CreateWindow(

TEXT("calc"),   // window class name

TEXT("计算器-noxue.com"),// window caption

WS_OVERLAPPEDWINDOW,// window style

CW_USEDEFAULT,// initial x position

CW_USEDEFAULT,// initial y position

175,// initial x size

230,// initial y size

NULL,// parent window handle

NULL,// window menu handle

hInstance,// program instance handle

NULL);// creation parameters

 

ShowWindow(hWnd, iCmdShow);

UpdateWindow(hWnd);

 

while (GetMessage(&msg,NULL, 0, 0)) {

TranslateMessage(&msg);

DispatchMessage(&msg);

}

return msg.wParam;

}  // WinMain

 

LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,

LPARAM lParam) {

HDC hdc;

PAINTSTRUCT ps;

 

switch (message) {

case WM_CREATE:

 

for (int i = 0; i < 16; i++) {

create_button(hWnd, 10 + (i % 4 * 35), 50 + (i / 4 * 35), i);

}

create_textbox(hWnd);

return 0;

 

case WM_COMMAND:

onCommand(hWnd, wParam);

return 0;

 

case WM_PAINT:

hdc = BeginPaint(hWnd, &ps);

 

EndPaint(hWnd, &ps);

return 0;

case WM_DESTROY:

PostQuitMessage(0);

return 0;

default:

return DefWindowProc(hWnd,message, wParam, lParam);

}

} // WndProc

 

void create_button(HWND hwnd,int x,int y,int id) {

 

CreateWindow("Button", labels[id],WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, x, y, 30, 30, hwnd, (HMENU)bid[id], ghInstance,NULL);

}

 

void create_textbox(HWND hwnd) {

CreateWindow("Edit",NULL, WS_CHILD | WS_VISIBLE | WS_BORDER | WS_DISABLED, 10, 10, 135, 30,hwnd, (HMENU)TEXT_BOX, ghInstance,NULL);

}

 

void onCommand(HWND hwnd,WPARAM wParam) {

 

WORD w = LOWORD(wParam);

HWND h = NULL;

char buf[50] = "", text[100] = "";

//如果是0-9的数字键被按下,执行下面的操作

if (w >= BTN0 && w <= BTN9) {

 

//获取被单击的子控件的句柄

h = GetDlgItem(hwnd, w);

 

//获取被单击的子控件的内容

GetWindowText(h, buf, 50);

 

//获取编辑框的句柄

h = GetDlgItem(hwnd, TEXT_BOX);

 

//获取编辑框的内容

GetWindowText(h, text, 500);

 

//把内容拼接起来

strcat(text, buf);

 

//设置编辑框内容

SetWindowText(h, text);

 

}

else if (w >=BTN_ADD && w <= BTN_DIV) {

h = GetDlgItem(hwnd, TEXT_BOX);

memset(first, 0, 100);

GetWindowText(h, first, 500);

SetWindowText(h, "");

 

//保存哪个操作按钮(+-*/)被单击

h = GetDlgItem(hwnd, w);

GetWindowText(h, buf, 50);

cz = buf[0];

 

}

else if (w ==BTN_EQU) {

h = GetDlgItem(hwnd, TEXT_BOX);

GetWindowText(h, text, 100);

 

long num1 = atol(first);

long num2 = atol(text);

 

long result = 0;

 

switch (cz) {

case '+':

result = num1 + num2;

break;

case '-':

result = num1 - num2;

break;

case '*':

result = num1 * num2;

break;

case '/':

if (0 == num2) break; //防止被0除

result = num1 / num2;

break;

default:

break;

}

 

if ('/' == cz && 0 == num2)

{

 

sprintf(text, "不能被0除");

}

else 

{

sprintf(text, "%d%c%d=%d", num1, cz, num2, result);

}

 

SetWindowText(h, text);

}

else if (w ==BTN_CLS) {

h = GetDlgItem(hwnd, TEXT_BOX);

SetWindowText(h, "");

}

}

 

第五节:绘制透明背景的位图

如何显示位图

首先添加资源:

 

 

选择Bitmap位图,然后选择bmp图片作为资源:

 

 

打开资源管理器:

 

 

 

 

 

接下来修改资源id号(默认不是下图这个名字):

 

 

 

 

把id号修改成IDB_FLOWER(这个随你开心,建议IDB_作为前缀,这表示是一个Bitmap的编号)

 

 

 

通过上面的步骤,引入了位图资源,接下来在代码中把他画出来。

 

/**

消息处理函数

*/

LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)

{

static HBITMAP hBitmap;

BITMAP bitmap;

HDC hdc, hdcMem;

PAINTSTRUCT ps;

static int fcx, fcy;

static HINSTANCE hInstance;

 

switch (message)

{

case WM_CREATE:

 

//获取实例句柄,下面LoadBitmap函数要做为参数

hInstance = ((LPCREATESTRUCT)lParam)->hInstance;

 

//加载bitmap资源

hBitmap = LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_FLOWER));

 

//获取Bitmap信息

GetObject(hBitmap, sizeof(BITMAP), &bitmap);

fcx = bitmap.bmWidth;

fcy = bitmap.bmHeight;

 

return 0;

 

case WM_PAINT:

hdc = BeginPaint(hwnd, &ps);

 

//创建内存设备句柄

hdcMem = CreateCompatibleDC(hdc);

//把位图句柄选到内存设备句柄中

SelectObject(hdcMem, hBitmap);

 

//把内存设备中的位图拷贝到设备内容句柄中,也就是显示图片

BitBlt(hdc, 0, 0, fcx, fcy, hdcMem, 0, 0, SRCCOPY);

 

 

DeleteDC(hdcMem);

 

EndPaint(hwnd, &ps);

return 0;

 

case WM_DESTROY:

//发送结束请求,里面的参数为退出码

PostQuitMessage(0);

return 0;

}

 

//调用默认的过程函数

return DefWindowProc(hwnd,message, wParam, lParam);

}

 

如何绘制透明背景的位图

首先用ps将要显示的bmp图片背景变成纯色,比如蓝色,如下图:

 

 

我们要将这个玫瑰花显示在一个背景为蓝天白云的图片上。

 

要实现透明背景的位图,用以下步骤即可:

首先将玫瑰花图片变成中间那样,

然后将背景图片变成左边那样,

最后通过位或操作(SRCPAINT)合并在一起,像右边那样就透明了(没有把图片扣好,所以玫瑰花周围还有蓝色的杂色)。

 

 

 

实现代码:

 

/**

消息处理函数

*/

LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)

{

static HBITMAP hBitmap,hBitmapSky,hMaskBmp;

BITMAP bitmap;

HDC hdc, hdcMem,hMaskDC;

PAINTSTRUCT ps;

static int scx, scy,bgcx,bgcy;

 

switch (message)

{

case WM_CREATE:

hBitmap = LoadBitmap(((LPCREATESTRUCT)lParam)->hInstance,MAKEINTRESOURCE(IDB_FLOWER));

hBitmapSky = LoadBitmap(((LPCREATESTRUCT)lParam)->hInstance,MAKEINTRESOURCE(IDB_SKY));

GetObject(hBitmap, sizeof(BITMAP), &bitmap);

scx = bitmap.bmWidth;

scy = bitmap.bmHeight;

GetObject(hBitmapSky, sizeof(BITMAP), &bitmap);

bgcx = bitmap.bmWidth;

bgcy = bitmap.bmHeight;

 

return 0;

 

case WM_PAINT:

hdc = BeginPaint(hwnd, &ps);

 

hdcMem = CreateCompatibleDC(hdc);

hMaskDC = CreateCompatibleDC(hdc);

 

//显示蓝天白云背景图片

SelectObject(hdcMem, hBitmapSky);

BitBlt(hdc, 0, 0, bgcx, bgcy, hdcMem, 0, 0, SRCCOPY);

 

//制作掩码图片

hMaskBmp = CreateBitmap(scx, scy, 1, 1, NULL);

SelectObject(hMaskDC, hMaskBmp);

SelectObject(hdcMem, hBitmap);

//在hdcMem中的蓝色为背景色

SetBkColor(hdcMem, RGB(0, 0, 0XFF));

//SetTextColor(hdcMem, RGB(0, 0, 0xff));

BitBlt(hMaskDC, 0, 0, scx, scy, hdcMem,0,0,SRCCOPY);

 

 

//在蓝天白云背景图上,显示黑色的玫瑰花图片

BitBlt(hdc, 0, 300, scx, scy, hMaskDC, 0, 0, SRCAND);

 

//黑色背景的玫瑰花图片

SetBkColor(hdcMem, RGB(0, 0, 0));

SetTextColor(hdcMem, RGB(255, 255, 255));

BitBlt(hdcMem, 0, 0, scx, scy, hMaskDC, 0, 0, SRCAND);

 

//将黑色背景的玫瑰花图片跟,跟蓝天白云背景带有黑色玫瑰花的图片做抑或操作

BitBlt(hdc, 0, 300, scx, scy, hdcMem, 0, 0, SRCPAINT);

 

DeleteDC(hdcMem);

DeleteObject(hMaskBmp);

EndPaint(hwnd, &ps);

return 0;

 

case WM_DESTROY:

//发送结束请求,里面的参数为退出码

PostQuitMessage(0);

return 0;

}

 

//调用默认的过程函数

return DefWindowProc(hwnd,message, wParam, lParam);

}

 

封装绘制透明背景位图的函数:

 

void DrawTransparentBmp(HDC hdc,HBITMAP hBitmap,int x,int y,COLORREF transColor)

{

HDC hMaskDC, hMemDC;

HBITMAP hMaskBmp;

BITMAP bitmap;

COLORREF oldColor;

int bx, by;

 

GetObject(hBitmap,sizeof(bitmap), &bitmap);

bx = bitmap.bmWidth;

by = bitmap.bmHeight;

 

hMaskBmp = CreateBitmap(bx, by, 1, 1, NULL);

 

hMaskDC = CreateCompatibleDC(hdc);

SelectObject(hMaskDC, hMaskBmp);

 

hMemDC = CreateCompatibleDC(hdc);

SelectObject(hMemDC, hBitmap);

 

//设置透明色

SetBkColor(hMemDC, transColor);

//创建一个图片为黑色,背景为白色的掩码图片

BitBlt(hMaskDC, 0, 0, bx, by, hMemDC, 0, 0, SRCCOPY);

 

//把要透明显示的图片的背景变成黑色

SetBkColor(hMemDC, RGB(0, 0, 0)); //告诉hMemDc,背景颜色设置为黑色。

SetTextColor(hMemDC, RGB(255, 255, 255));//告诉hMemDc,背景颜色设置为白色。

BitBlt(hMemDC, 0, 0, bx, by, hMaskDC, 0, 0, SRCAND);

 

//在背景上面扣一个要透明显示的图片的黑洞

SetBkColor(hdc, RGB(255, 255, 255));

SetTextColor(hdc, RGB(0, 0, 0)); //设置前景为黑色,再跟背景做与操作,这样就会留下一个黑色的洞

BitBlt(hdc, x, y, bx, by, hMaskDC, 0, 0, SRCAND);

 

 

//再把上面生成的两个图片(1黑色背景的要透明显示的图片,2.扣了个洞的背景图片)做与操作。

BitBlt(hdc, x, y, bx, by, hMemDC, 0, 0, SRCPAINT);

 

DeleteObject(hBitmap);

DeleteDC(hMemDC);

DeleteDC(hMaskDC);

 

 

}

参考内容:

SRCAND

Combines the colors of the source and destination rectangles by using the Boolean AND operator.

通过“按位与(AND)”操作混合源和目标区域。

 

SRCCOPY

Copies the source rectangle directly to the destination rectangle.

直接将源拷贝到目标区域

 

SRCPAINT

Combines the colors of the source and destination rectangles by using the Boolean OR operator.

通过“按位或(OR)”操作混合源和目标区域

 

SetBkColor和SetTextColor在Bitblt中的作用(难点):

分两种情况:

第一种情况:彩色图片转黑白图片。

SetBkColor告诉彩色图片dc,彩色图片中的什么颜色是背景色(windows默认背景色是白色,前景色是黑色)。

 

第二种情况:黑白图片转彩色图片。

SetBkColor 告诉彩色图片dc黑白图片的背景色是什么颜色。

SetTextColor 告诉彩色图片dc 黑色图片的前景色是什么颜色。

最后执行BitBlt的时候,

如果是SRCCOPY就会把上面设置的颜色复制到彩色图片dc上;

如果是SRCAND 就会用彩色图片跟上面设置的背景色和前景色做位与操作。

比如:

SetBkColor(hMemDC, RGB(0, 0, 0)); //告诉hMemDc,背景颜色设置为黑色。

SetTextColor(hMemDC, RGB(255, 255, 255));//告诉hMemDc,背景颜色设置为白色。

BitBlt(hMemDC, 0, 0, bx, by, hMaskDC, 0, 0, SRCAND);

 

假如上面的hMemDC里面是彩色图片DC,hMaskDC是黑白图片DC。

BitBlt最后一个参数是SRCAND,意思就是,彩色图片跟一张背景为黑色,前景为白色 的黑白图片做位与操作(其实就是对应的颜色值做位运算,白色就是1,黑色就是0),

做好运算之后,就会显示彩色图片的前景部分(因为前景色是白色(1)),背景颜色是 黑色(0),所以,彩色图片的背景部分,就变成了黑色。

 

 

第六节:全屏玫瑰花实现(上节课的一点纠错)

知识点:

问题:上节课透明位图,有点小问题,刷新后,位图不再透明。

 

全屏玫瑰花实现思路。

 

完善后的透明位图绘制函数:

 

void DrawTransparentBmp(HDC hdc,HBITMAP hBitmap,int x,int y,COLORREF transColor)

{

HDC hMaskDC = NULL, hMemDC = NULL, hBmpDC = NULL;

HBITMAP hMaskBmp = NULL, hBitmap1 = NULL;

BITMAP bitmap;

int bx, by;

COLORREF fColor, bColor;

 

static auto i = 0;

 

GetObject(hBitmap,sizeof(bitmap), &bitmap);

bx = bitmap.bmWidth;

by = bitmap.bmHeight;

 

hMaskBmp = CreateBitmap(bx, by, 1, 1, NULL);

 

hMaskDC = CreateCompatibleDC(hdc);

SelectObject(hMaskDC, hMaskBmp);

 

 

hBmpDC = CreateCompatibleDC(hdc);

SelectObject(hBmpDC, hBitmap);

 

//重新创建一张位图,不修改原来的位图,如果修改了,第二次绘制结果就不对

hMemDC = CreateCompatibleDC(hdc);

hBitmap1 = CreateCompatibleBitmap(hBmpDC, bx, by);

SelectObject(hMemDC, hBitmap1);

 

BitBlt(hMemDC, 0, 0, bx, by, hBmpDC, 0, 0, SRCCOPY);

 

//设置透明色

bColor = SetBkColor(hMemDC, transColor);

//创建一个图片为黑色,背景为白色的掩码图片

BitBlt(hMaskDC, 0, 0, bx, by, hMemDC, 0, 0, SRCCOPY);

 

//BitBlt(hdc, x, y, bx, by, hMemDC, 0, 0, SRCCOPY);

//把要透明显示的图片的背景变成黑色

bColor = SetBkColor(hMemDC, RGB(0, 0, 0));//告诉hMemDc,背景颜色设置为黑色。

fColor = SetTextColor(hMemDC, RGB(255, 255, 255));//告诉hMemDc,背景颜色设置为白色。

 

BitBlt(hMemDC, 0, 0, bx, by, hMaskDC, 0, 0, SRCAND);

 

 

//在背景上面扣一个要透明显示的图片的黑洞

bColor = SetBkColor(hdc, RGB(255, 255, 255));

fColor = SetTextColor(hdc, RGB(0, 0, 0)); //设置前景为黑色,再跟背景做与操作,这样就会留下一个黑色的洞

 

BitBlt(hdc, x, y, bx, by, hMaskDC, 0, 0, SRCAND);

 

//再把上面生成的两个图片(1黑色背景的要透明显示的图片,2.扣了个洞的背景图片)做与操作。

BitBlt(hdc, x, y, bx, by, hMemDC, 0, 0, SRCPAINT);

 

DeleteObject(hMaskBmp);

DeleteObject(hBitmap1);

DeleteDC(hMemDC);

DeleteDC(hMaskDC);

DeleteDC(hBmpDC);

 

}

 

生成爱心路径代码:

#include <iostream>

#include <windows.h>

 

using namespace std;

 

int main()

{

POINT pt;

POINT pts[10000];

long n=0;

HDC hdc;

HPEN hPen;

 

hdc = GetDC(NULL);

MoveToEx(hdc, 0, 0, NULL);  

 

hPen = CreatePen(PS_SOLID,5,RGB(255,0,0));

SelectObject(hdc, hPen);

 

while(true)

{

GetCursorPos(&pt);

cout << "{" << pt.x << "," << pt.y << "},";

pts[n].x = pt.x;

pts[n].y = pt.y;

//Polyline(hdc,pts,n);

if(n>3)

PolyBezierTo(hdc, pts+n-3, 3);  

SetPixel(hdc, pt.x,pt.y,RGB(255,0,0));

Sleep(100);

}

DeleteObject(hPen);

ReleaseDC(NULL,hdc);

 

return 0;

}

 

全屏玫瑰花思路:

1.创建窗口时 使用WS_EX_TRANSPARENT | WS_EX_LAYERED这两个样式

hwnd = CreateWindowEx(WS_EX_TRANSPARENT |WS_EX_LAYERED, szAppName, //要注册的窗口类名

TEXT("子窗口创建-www.noxue.com"),//窗口标题

WS_POPUP, //窗口样式

CW_USEDEFAULT, //窗口距离屏幕左上角都横坐标

CW_USEDEFAULT, //窗口距离屏幕左上角都纵坐标

nScreenWidth, //窗口宽度

nScreenHeight, //窗口高度

NULL, //父窗口句柄

NULL, //菜单句柄

hInstance, //当前实例句柄

NULL); //指向一个值的指针,该值传递给窗口 WM_CREATE消息。一般为NULL

2.在WM_CREATE消息中,设置什么颜色透明

SetLayeredWindowAttributes(hwnd, RGB(255, 255, 255), 0, LWA_COLORKEY); //白色为透明色

//让窗口置顶

SetWindowPos(hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE |SWP_NOMOVE);

 

3.调用透明位图绘制函数,在指定的坐标绘制玫瑰花

for (int i = 0; i <sizeof(pts) / sizeof(pts[0]); ++i)

{

DrawTransparentBmp(hdc, hBitmap, pts[i].x, pts[i].y, RGB(0, 0, 0XFF));

}

 

 

第二阶段:网络编程和多线程

 

第三阶段:数据库编程

附:实战项目列表

定时提醒喝水软件

简易画板

简易计算器

QQ喊话工具

个性相册

全屏玫瑰花软件

天气预报工具

U盘小偷

zip压缩工具

个性剪贴板(支持多个内容复制)

电脑锁屏工具

qq群发工具

屏幕截图工具(自定义水印)

IP代理地址采集工具

HTTP代理工具

简易邮箱客户端

手机短信轰炸机

ftp账号爆破工具

webshell爆破工具

多用户聊天工具

QQ空间秒赞工具

记账本

远程协助工具

 

上面的项目都会贯穿整个教程,按照合适的顺序来讲解。

查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. 51单片机之矩阵键盘

    独立键盘与单片机连接时,每一个按键都需要单片机的一个I/O口若某单片机系统需较多按键,如果用独立按键便会占用过多的I/O口资源。单片机系统中I/O口资源往往比较宝贵,当用到多个按键时为了节省I/O口口线,我们引入矩阵键盘。我们以4X4矩阵键盘为例讲解其工作原理和检测方法。…...

    2024/5/2 11:42:29
  2. 【Ruby】与ruby相关的内容

    本博文是为了记录Ruby相关的可学习资源,以便日常使用 在线学习Rails的网站版本 Ruby on Rails教程(Rails 5) Ruby的中文社区 Ruby China转载于:https://www.cnblogs.com/sows/p/9022200.html...

    2024/4/20 21:09:37
  3. Ruby是什么

    1 - Ruby是什么东东?Ruby是一种简单的面向对象编程语言,十分容易上手,并且功能强大。她是一个日本的Yukihiro Matsumoto(大家都叫他Matz.)在1995年首次发布的。Ruby从Perl语言那里借鉴了许多东西(有人形象地说Ruby是Perl的漂亮的妹妹:),和Perl相似,Ruby也擅长于文本处…...

    2024/4/21 0:02:09
  4. 键盘驱动出现黄色感叹号解决方法

    文章来源:http://www.uzzf.com/news/5908.html 最近发现公司一台机器,由于员工胡乱删除文件,导致键盘驱动显示黄色叹号,右键点击属性显示错误代码39,卸载后还是不行,于是就从网上找到了解决方法:第一步:打开注册表:regedit 注:键盘不能用,怎么输入呢? 方法1:依次点…...

    2024/4/21 0:02:08
  5. CC2530单片机入门学习

    实训周学习的CC2530单片机 单片机P1.0、P1.1口接共阴发光二极管(即P1.0 P1.1赋1灯亮,赋0灯灭),P1.2口接开关(根据电路判断开关按下P1.2为0)。#include"ioCC2530.h" #define SW(P1.2) //声明按钮P1.2的常量 #define LED0(P1.0) LED1(P1.…...

    2024/4/21 0:02:07
  6. 通过Ruby on Rails和docker构建微服务架构之入门教程

    说到时下的架构,免不了会涉及到微服务。而谈到微服务架构,又跟容器和Docker技术脱不了关系。虽然容器和Docker并不完全是一回事,但两者是密不可分的,而且二者之间也有共同之处:在大型复杂应用的构建和运营方面,二者都可以大大提高企业的效率。微服务可不像一般的应用,可…...

    2024/5/2 19:56:47
  7. 【8051单片机学习资料大全】

    《51单片机开发与应用技术详解+配套光盘代码》 http://item.taobao.com/item.htm?spm=0.0.0.72.b1YoAW&id=21009440582 《51系列单片机设计实例(第2版)》 http://item.taobao.com/item.htm?spm=0.0.0.75.b1YoAW&id=17892531245 《单片机C语言程序设计实训100例:基…...

    2024/5/2 11:17:57
  8. android监听虚拟键盘隐藏和显示事件

    刚开始在onconfigurationChanged中监听,结果发现该方法在configuration变化即配置文件发生变化时才会被调用,如横竖屏切换,android重新载入配置文件时。而键盘隐藏不会触发该方法。后来采用如下方法完美解决了键盘隐藏监听事件。//该Activity的最外层LayoutfinalView activi…...

    2024/4/21 0:02:05
  9. 共享目录

    public string ConnectLan(){Process p;p=new Process();p.StartInfo.FileName="cmd.exe"; // 这里是关键点,不用Shell启动/重定向输入/重定向输出/不显示窗口p.StartInfo.UseShellExecute = false;p.StartInfo.RedirectStandardInput = true;p.StartInfo.Redirec…...

    2024/4/21 0:02:02
  10. 如何在ruby中用http 发送get,post请求

    Ruby发送http协议(get、post、https服务器验证、https双向验证)1. 建立HTTP连接(通过GET方式发送请求参数)require "open-uri"#如果有GET请求参数直接写在URI地址中 uri = http://urihtml_response = nilopen(uri) do |http| html_response = http.read endputs h…...

    2024/4/20 1:20:40
  11. 基于proteus的51单片机仿真实例五十四、中断的概念和外部中断实例1

    1、在日常生活中,我们经常会碰到这样的情况:我们正在处理某一项事情,忽然电话响了,或者有更重要的事情要去做,这时我们就需要停下正在做的事情,转而去处理更重要的事情,等忙完更重要的事情后,我们会回头接着做之前被打断的事情。这就是现实生活中的“中断”的例子。2、…...

    2024/5/2 16:38:59
  12. 如何判断当前是否在线!

    具体过程为如下: private static string LinkPing(string strIp) { Process p = new Process(); p.StartInfo.FileName = "cmd.exe"; p.StartInfo.UseShellExecute = false; p.StartInfo.RedirectStandardInput = true; p.StartInfo.RedirectStandardOut…...

    2024/4/21 0:01:59
  13. Ruby卡通教程--《why's (poignant) guide to Ruby 》

    什么样的编程书我都见过,就是没见过集卡通,散文和编程于一身的教程。 《whys (poignant) guide to Ruby 》就是这样一本书。一本编程书写的再好读久了也会觉得枯燥,但是配上卡通故事呢?按照郑渊洁的话讲,这是一本适合0-100岁人读的书。这本书还在写作中,期待正式版本会更…...

    2024/4/21 0:01:58
  14. Android软键盘的全面解析,让你不再怕控件被遮盖

    本文出自博客Vander丶CSDN博客,如需转载请标明出处,尊重原创谢谢 博客地址:http://blog.csdn.net/l540675759/article/details/74528641注明本文已授权CSDN官方微信公众号《mobilehub》原创首发,转载请务必注明出处。修正1.修正了flagNoFullscreen和flagNoExtractUi的说明…...

    2024/4/26 22:17:15
  15. C语言不但执行效率高 而且应用广泛

    可以毫不犹豫的说,C语言是学习编程的第一门语言,你不用考虑其他选择。也许你将来的工作或学习不会使用C语言,但是它能让你了解编程相关的概念,带你走进编程的大门,以后学习其他语言,会触类旁通,很快上手,7 天学会一门新语言不是神话。也只有C语言的教程(书籍、在线教程…...

    2024/5/2 7:35:55
  16. windows下安装ruby devkit

    超简单的办法如果你是ruby刚入门,推荐这个方法。如果通过上面方法安装DevKit成功率会比较高,下面这种方法不一定能成。但如果你想折腾,可以来试试下面的手动安装。windows下安装或升级时gem经常会碰到1 Please update your PATH to include build tools or download the Dev…...

    2024/4/20 21:09:48
  17. android 对软键盘的显示和消失监听

    1.首先在配置文件中添加 android:windowSoftInputMode="adjustResize" 意思是activity会根据软键盘的显示和消失始终调节布局的大小 2.@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.…...

    2024/4/20 21:09:46
  18. RESTful in ruby on rails

    REST:全称Representational State Transfer,一种软件架构风格。REST风格意味着满足一定的约束条件,满足它们的应用或设计即RESTful。 RESTful路由是Rails的标准路由方式。 RESTful使用一种约定好的标准配置Controllers和Actions,尽管有人不喜欢这样的方式。Ruby on Rails具…...

    2024/4/20 21:09:46
  19. 基于proteus的51单片机仿真实例五、第一个proteus仿真实例(续)

    接上一节,继续来学习一下PROTEUS的应用。1、元器件的放置、移动、旋转删除以at89c51为例来介绍元器件的放置和编辑操作。1)放置在对象选择器中选择“at89c51”,然后将光标移动到原理图编辑区,在任意位置单击鼠标左键,即可出现一个随光标移动的元器件原理图符号,如图所示2…...

    2024/4/20 21:09:46
  20. Android监听系统输入法键盘弹出显示与隐藏事件

    Android监听系统输入法键盘弹出显示与隐藏事件有时候需要监听Android系统输入法的弹出显示事件,比如:微信聊天时,不管你当前在聊天中的什么位置(上滑查看消息历史),每当你点击输入框时,都会自动帮你聚集到最新的聊天记录。 而android系统没有提供对应的API来监听输入法的…...

    2024/4/20 21:09:43

最新文章

  1. 【项目纪实】某国有航空公司人力资源系统诊断咨询项目

    公司的人力资源管理问题一直都比较严重&#xff0c;比如人员冗余、员工工作积极性差等问题&#xff0c;虽然经过多次的管理尝试&#xff0c;存在的问题仍然没有缓解。华恒智信人力资源咨询公司的老师特别专业&#xff0c;帮我们系统、全面的诊断了人力资源管理上存在的问题&…...

    2024/5/2 20:27:42
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/3/20 10:50:27
  3. Oracle insert日期to_date()含时分秒

    to_date(2005-01-01 13:14:20,yyyy-MM-dd HH24:mi:ss)//正确写法 参见&#xff1a; Oracle的to_date()函数_oracle to_date-CSDN博客...

    2024/5/2 13:02:24
  4. Golang Gin框架

    1、这篇文章我们简要讨论一些Gin框架 主要是给大家一个基本概念 1、Gin主要是分为路由和中间件部分。 Gin底层使用的是net/http的逻辑&#xff0c;net/http主要是说&#xff0c;当来一个网络请求时&#xff0c;go func开启另一个协程去处理后续(类似epoll)。 然后主协程持续…...

    2024/5/2 2:34:23
  5. 最新AI智能系统ChatGPT网站源码V6.3版本,GPTs、AI绘画、AI换脸、垫图混图+(SparkAi系统搭建部署教程文档)

    一、前言 SparkAi创作系统是基于ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;那么如何搭建部署AI创作ChatGPT&#xff1f;小编这里写一个详细图文教程吧。已支持GPT…...

    2024/5/1 9:27:34
  6. 【外汇早评】美通胀数据走低,美元调整

    原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...

    2024/5/1 17:30:59
  7. 【原油贵金属周评】原油多头拥挤,价格调整

    原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...

    2024/5/2 16:16:39
  8. 【外汇周评】靓丽非农不及疲软通胀影响

    原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...

    2024/4/29 2:29:43
  9. 【原油贵金属早评】库存继续增加,油价收跌

    原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...

    2024/5/2 9:28:15
  10. 【外汇早评】日本央行会议纪要不改日元强势

    原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...

    2024/4/27 17:58:04
  11. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

    原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...

    2024/4/27 14:22:49
  12. 【外汇早评】美欲与伊朗重谈协议

    原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...

    2024/4/28 1:28:33
  13. 【原油贵金属早评】波动率飙升,市场情绪动荡

    原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...

    2024/4/30 9:43:09
  14. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

    原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...

    2024/4/27 17:59:30
  15. 【原油贵金属早评】市场情绪继续恶化,黄金上破

    原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...

    2024/5/2 15:04:34
  16. 【外汇早评】美伊僵持,风险情绪继续升温

    原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...

    2024/4/28 1:34:08
  17. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

    原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...

    2024/4/26 19:03:37
  18. 氧生福地 玩美北湖(上)——为时光守候两千年

    原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...

    2024/4/29 20:46:55
  19. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

    原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...

    2024/4/30 22:21:04
  20. 氧生福地 玩美北湖(下)——奔跑吧骚年!

    原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...

    2024/5/1 4:32:01
  21. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

    原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...

    2024/4/27 23:24:42
  22. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

    原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...

    2024/4/28 5:48:52
  23. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

    原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...

    2024/4/30 9:42:22
  24. 广州械字号面膜生产厂家OEM/ODM4项须知!

    原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...

    2024/5/2 9:07:46
  25. 械字号医用眼膜缓解用眼过度到底有无作用?

    原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...

    2024/4/30 9:42:49
  26. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  27. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  28. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  29. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  30. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  31. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  32. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  33. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  34. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  35. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  36. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  37. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  38. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  39. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  40. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  41. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  42. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  43. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  44. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  45. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57