Cimage

article/2025/10/16 5:56:30

本系列文章由zhmxy555编写,转载请注明出处。  http://blog.csdn.net/zhmxy555/article/details/7422922

作者:毛星云    邮箱: happylifemxy@qq.com    欢迎邮件交流编程心得



我们知道,Visual C++中的CBitmap类的功能简直太弱小了,这曾经让Visual C++在图像处理方面的功能比较尴尬。之前笔记里面,我们采用的CBitmap配合GDI进行透明图像的处理有些晦涩繁琐,而且受到图像素材的限制,可以说是有些落后,不是太实用。


为了解决这个问题,这节笔记我们将系统的学习MFC和ATL中新增一个图像处理的类,它就是华丽而强大的CImage类。

由于本节笔记是对CImage类的一个非常系统近乎完全的介绍,我尽量让它涵盖到了CImage类的所有的属性和类成员,所以

篇幅也许比以往的笔记内容都长,里面的不少内容是用到的时候才需要掌握或者查阅的,并不用强行记忆。




一,概念讲解部分



1.CImage类的定位和概述


首先,我们简单介绍一下CImage类的定位。

CImage是MFC和ATL共享的新类,它提供了增强的位图支持,包括加载、保存和转换JPEG,BMP,GIF,PNG图像格式的能力。可以说是微软意识到了CBitmap的不足,然后推出了一个CBitmap的增强版。使用CImage类,需在代码头部加入包含atlimage.h文件,即添加代码#include "atlimage.h"。

由于CImage拥有功能强大的类成员函数的支持,它便具有了下列四个比较出彩的特性: 

1、AlphaBlend支持像素级的颜色混合,从而实现透明和半透明的效果。 

2、PlgBlt能使一个矩形区域的位图映射到一个平行四边形区域中,而且还可能使用位屏蔽操作。 

3、TransparentBlt在目标区域中产生透明图像

4、MaskBlt在目标区域中产生源位图与屏蔽位图合成的效果。



2.以CImage类做媒,让CBitmap类也能处理丰富的图片格式


解决的思路比较明朗,我们采用CImage类的Load函数加载图片,之后用Detch取得HBITMAP的句柄,然后再将此句柄附加给CBitmap的对象就行了。

这样就实现了让CBitmap类也可以操作JPG/JPEG/GIF/PNG格式的图片。

具体代码如下:

[cpp] view plain copy
  1. #include "atlimage.h"  
  2. CImage image;               //定义一个CBitmap类  
  3. image.Load(“filename”); //filename为要加载的文件地址  
  4. HBITMAP hBitmap=image.Detach(); //返回被分离的图片的句柄  
  5. CBitmap bmp;                     // 定义一个bitmap  
  6. bmp.Attach(hBitmap);        //进行句柄的附加  

然后就可以用CBitmap进行余下的操作了。


3.CImage额外的一些性质


CImage类对于DIB(device-independent bitmap)设备无关位图文件和非DIB都可以处理。我们可以通过Create函数或者CImage::Load来处理DIB部分,用Attach函数来将非DIB部分附加到一个CImage对象上。

对于以下函数,只支持DIB部分的位图文件,他们是:

GetBitsGetColorTable,GetMaxColorTableEntries,GetPitch,GetPixelAddress,IsIndexed,SetColorTable。


我们可以通过CImage类中的IsDIBSection()函数来帮助我们判断一个位图文件是否为DIB部分,其定义如下:

[cpp] view plain copy
  1. bool IsDIBSection( ) const throw( );  //如果返回值为true,则该文件为DIB;返回flase则不是DIB文件  


我们需要注意的是,CImage不能被选到一个新的CDC( class of device-context设备描述表的类),CImage会为图像创建自己的HDC(设备描述表DC的句柄)。因为一个HBITMAP只能被选入到一个HDC中一次,也就是说这个与CImage相关的HBITMAP不能被选到一个其他的HDC中。

如果需要一个CDC,我们可以从CImage中获取HDC,然后使用CDC::FromHandle函数。


4.CImage兼容性的说明


在CImage中,有如下兼容性的要求:

只支持Windows NT4.0以上系统的成员函数:PlgBlt,MaskBlt,AlphaBlend。

只支持Windows 2000,98以上系统的成员函数:TransparentBlt,Draw

其实由于目前都是Windows XP以上的操作系统,这个知识点了解一下就行。



5.CImage类用于贴图的一般的使用方法


使用方法不唯一,最常用的方法如下,该方法大致分为三部分:

<1> 在源文件中添加CImage类的包含文件: 

#include "atlimage.h"

<2> 定义一个CImage类对象,然后调用CImage::Load方法装载一个外部图像文件。Load方法有如下两种重载:

[cpp] view plain copy
  1. HRESULT Load(  
  2.    LPCTSTR pszFileName    //包含加载文件名的字符串指针  
  3. throw( );  
  4.   
  5.   
  6. HRESULT Load(  
  7.    IStream* pStream   //指向包含加载文件名的流的指针  
  8. throw();  



<3> 调用CImage::Draw方法绘制图像

下面重点介绍一下Draw方法。

CImage::Draw  将一个位图文件从源设备描述表复制到当前设备描述表

该函数有如下六种重载:

[cpp] view plain copy
  1. BOOL Draw(  
  2.    HDC hDestDC,         //目标设备环境DC的句柄  
  3.    int xDest,           //目的矩形的左上角X坐标(逻辑单位)  
  4.    int yDest,           //目的矩形的左上角Y坐标(逻辑单位)  
  5.    int nDestWidth,     //目标矩形的宽度(就是设定贴过去的图片的宽度)  
  6.    int nDestHeight,    //目标矩形的高度(就是设定铁锅的图片的高度)  
  7.    int xSrc,            //源矩形的左上角X坐标  
  8.    int ySrc,            //源矩形的左上角Y坐标  
  9.    int nSrcWidth,      //源矩形的宽度  
  10.    int nSrcHeight      //源矩形的高度  
  11. const throw( );  
  12.   
  13.   
  14. BOOL Draw(  
  15.    HDC hDestDC,       //目标环境DC的句柄  
  16.    const RECT& rectDest,        //一个RECT结构的引用,用来确定目标图像。  
  17.    const RECT& rectSrc         //一个RECT结构体的引用,用来确定源图像  
  18. const throw( );  
  19.   
  20.   
  21. BOOL Draw(  
  22.    HDC hDestDC,         //目标环境DC的句柄  
  23.    int xDest,        //目标矩形的左上角X坐标  
  24.    int yDest         //目标矩形的左上角Y坐标  
  25. const throw( );        //  
  26. BOOL Draw(  
  27.    HDC hDestDC,        //目标环境DC的句柄  
  28.    const POINT& pointDest         //一个POINT结构体,用来确定目的矩形的左上角坐标  
  29. const throw( );  
  30.   
  31.   
  32. BOOL Draw(  
  33.    HDC hDestDC,        //目标环境DC的句柄  
  34.    int xDest,        //目标矩形的左上角X坐标  
  35.    int yDest,        //目标矩形的左上角Y坐标  
  36.    int nDestWidth,        //目标矩形的宽度  
  37.    int nDestHeight         //目标矩形的宽度  
  38. const throw( );  
  39.   
  40.   
  41. BOOL Draw(  
  42.    HDC hDestDC,        //目标环境DC的句柄  
  43.    const RECT& rectDest         //一个RECT结构的引用,用来确定目标图像。  
  44. const throw( );  


在上面的Draw函数的各种重载中,对于没有指定源矩形的版本,则整个源图像就是默认的源矩形。对于没有指定目的矩形尺寸的,则源图片的尺寸就是默认的目的矩形尺寸。


需要注意的是,Draw方法综合了StretchBlt、TransparentBlt和AlphaBlend函数的功能。。通常情况下,Draw()函数作用和StretchBlt()函数一致。但是当我们的图像中存在透明的颜色和alpha通道的时候,Draw()函数作用和TransparentBlt()或者AlphaBlend()函数一致。所以,在一般情况下,我们都尽量调用Draw方法来绘制图像。



6.对CImage所有类成员的介绍


我将CImage类的所有类函数按功能分为了四大类,可以更方面的了解各函数的定位和作用,也方便大家查阅:


<1>功能为创建与连接,释放的函数


Attach         附加一个HBITMAP到CImage对象,位图类型DIB与否都可以

Create         创建一个DIB部分的位图,并将其附加到之前创建的CImage对象

CreateEX      创建一个DIB部分的位图(拥有额外的参数),并将其附加到之前 创建的CImage对象

Destroy       从CImage类上分离该位图并进行删除

Detach       从CImage类里分离该位图

ReleaseDC                释放设备描述表中的数据

ReleaseGDIPlus             释放GDI+使用的源

<2>功能为输入与输出的函数


GetExporterFilterString 返回系统支持的输入文件格式类型及其描述

GetImporterFilterString 返回系统支持的输出文件格式类型及其描述

LoadFromResource           从指定的源处加载一个图像资源

Load                        从指定文件处加载一个图像资源

IsIndexed            判断一个位图颜色映射到了一个索引调色盘

IsNull                判断一个源位图是否被当前载入

Save                       以指定的类型来保存图像

<3>关于位图类型与参数的函数


GetBits        返回一个指向该位图实际像素值指针

GetBPP        返回该位图每个像素的位

GetColorTable  返回颜色表中RGB值的范围条目

GetDC         返回目前被选择的设备描述表

GetExporterFilterString 返回系统支持的输入文件格式类型及其描述

GetImporterFilterString 返回系统支持的输出文件格式类型及其描述

GetHeight          返回当前图像的像素高度

GetMaxColorTableEntries    返回颜色表条目中的最大值

GetPitch             返回当前图片的间距(单位为字节),用来决定像素格式的

GetTransparentColor  返回颜色表中透明色的位置

GetWidth            返回当前图片的宽度(单位为像素)

<4>功能为图形绘制与位图块传输相关的函数


AlphaBlend     显示一个半透明或者透明像素的位图

BitBlt          从源设备描述表复制一个位图文件到当前设备描述表

Draw         从源矩形复制一个位图到目的矩形,该函数伸缩或者拉伸位图来适应目标矩 形的尺寸,如果有必要,会处理Alpha值和透明颜色。

MaskBlt                     用指定的掩码和光栅操作来结合颜色数据和目的位图

PlgBlt                       执行一个从源设备描述表的矩形到目标设备描述表的平行 四边形的块状位图转换

SetColorTabel              在DIB的颜色表中设定一系列条目的RGB颜色的值

SetPixelIndexed            设置在指定坐标处的像素(使用索调色板的索引值)。

SetPixelRGB                设置在指定坐标处的像素(使用RGB值)

SetPixel                    在指定坐标处设置像素的颜色

SetTransparentColor        设置将被视为透明色的颜色的索引值(只能选取调色板中的 一种颜色)

StretchBlt                  从源矩形复制一个位图到目的矩形,如果有必要,该函数会 伸缩或者拉伸位图来适应目标矩形的尺寸,

TransparentBlt              从源设备描述表中复制一个带有透明色的位图到当前设备 描述表





二,实例运用部分


运用CImage完成透明贴图的一个完整实例

介绍了这么多了,下面我们依然用一个实例来巩固本节笔记的知识。

我们知道,CImage支持透明PNG的贴图,下面我们就运用透明PNG的贴图,来代替之前的掩码操作贴图。

<第一步>

准备两张素材图,一张背景图,一张需要进行透明操作的人物图。

这次的选材就很广了,没有之前透明操作需要自己一定的美工功底或者美工童鞋支持的诸多限制了。

我选的两张图片素材如下:

背景图 bg.bmp  640x444



人物图  onion.bmp  130x130(呵呵,可爱的洋葱头~~)


<第二步>

将人物图 onion.bmp用photoshop等图像处理软件进行抠图操作,除去红黄相间的背景图,并将背景图用透明图层代替,再将图片大小调节成85x113,用png格式输出,效果如下:

处理好的人物图  onion.png  85x113


<第三步>

将bg.bmp以及onion.png放到工程目录下,并在源文件写入代码并运行。


该代码和笔记六中代码的思路基本相同,只不过,将笔记六中使用掩码操作进行透明化处理的方式换成了png透明贴图的方式,更加的直观和易懂易用。




详细注释的源代码如下


[cpp] view plain copy
  1. #include "stdafx.h"    
  2. #include "atlimage.h"  
  3. //全局变量声明    
  4. HINSTANCE hInst;    
  5. HBITMAP bg;        //声明一个位图对象,用于存储背景图    
  6. HDC  mdc;        //声明一个内存DC"mdc",用来暂存位图  
  7. //全局函数声明    
  8. ATOM     MyRegisterClass(HINSTANCE hInstance);    
  9. BOOL     InitInstance(HINSTANCEint);    
  10. LRESULT CALLBACK    WndProc(HWNDUINTWPARAMLPARAM);    
  11. void     MyPaint(HDC hdc);    
  12. ****Winmain函数,程序入口点函数**************************************    
  13. int APIENTRY WinMain(HINSTANCE hInstance,    
  14.                      HINSTANCE hPrevInstance,    
  15.                      LPSTR     lpCmdLine,    
  16.                      int       nCmdShow)    
  17. {    
  18. MSG msg;    
  19. MyRegisterClass(hInstance);    
  20. if (!InitInstance (hInstance, nCmdShow))     
  21. {    
  22. return FALSE;    
  23. }    
  24. //消息循环    
  25. while (GetMessage(&msg, NULL, 0, 0))     
  26. {    
  27. TranslateMessage(&msg);    
  28. DispatchMessage(&msg);    
  29. }    
  30. return msg.wParam;    
  31. }    
  32. //****设计一个窗口类,类似填空题,使用窗口结构体*************************    
  33. ATOM MyRegisterClass(HINSTANCE hInstance)    
  34. {    
  35. WNDCLASSEX wcex;    
  36. wcex.cbSize = sizeof(WNDCLASSEX);     
  37. wcex.style   = CS_HREDRAW | CS_VREDRAW;    
  38. wcex.lpfnWndProc    = (WNDPROC)WndProc;    
  39. wcex.cbClsExtra  = 0;    
  40. wcex.cbWndExtra  = 0;    
  41. wcex.hInstance   = hInstance;    
  42. wcex.hIcon   = LoadIcon(NULL,IDI_APPLICATION);    
  43. wcex.hCursor     = NULL;    
  44. wcex.hCursor     = LoadCursor(NULL, IDC_ARROW);    
  45. wcex.hbrBackground  = (HBRUSH)(COLOR_WINDOW+1);    
  46. wcex.lpszMenuName   = NULL;    
  47. wcex.lpszClassName  = "canvas";    
  48. wcex.hIconSm     = NULL;    
  49. return RegisterClassEx(&wcex);    
  50. }    
  51. //****初始化函数*************************************    
  52. // 1.建立与窗口DC兼容的内存DC    
  53. // 2.从文件加载背景图及透明的洋葱头   
  54. BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)    
  55. {    
  56. HWND hWnd;    
  57. HDC hdc;    
  58. hInst = hInstance;    
  59. hWnd = CreateWindow("canvas""浅墨的绘图窗口" , WS_OVERLAPPEDWINDOW,    
  60. CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);    
  61. if (!hWnd)    
  62. {    
  63. return FALSE;    
  64. }    
  65. MoveWindow(hWnd,10,10,600,444,true);    
  66. ShowWindow(hWnd, nCmdShow);    
  67. UpdateWindow(hWnd);    
  68. hdc = GetDC(hWnd);                     //获得窗口DC    
  69. mdc = CreateCompatibleDC(hdc);           //创建与窗口兼容的内存DC(mdc)    
  70. bg = (HBITMAP)LoadImage(NULL,"bg.bmp",IMAGE_BITMAP,600,444,LR_LOADFROMFILE);    
  71.    
  72. MyPaint(hdc);    
  73. ReleaseDC(hWnd,hdc);    
  74. return TRUE;    
  75. }    
  76. //****自定义绘图函数*********************************    
  77. //透明贴图    
  78. void MyPaint(HDC hdc)    
  79. {    
  80. SelectObject(mdc,bg);    
  81. BitBlt(hdc,0,0,600,450,mdc,0,0,SRCCOPY);    //先将背景图贴到显示窗口中    
  82. CImage image;      //定义一个CImage对象,用于透明贴图  
  83. CString str;      //定义一个CString对象,用于存放文件名字符串  
  84. str="onion.png";              //将字符串赋值为文件名  
  85. image.Load(str);                    //在image中载入图像文件  
  86. image.Draw(hdc,120,180,85,113,0,0,85,113);    //调用Draw进行透明贴图  
  87. //或者为image.TransparentBlt(hdc, 120, 180, 85, 113,CLR_INVALID );//调用TransparentBlt进行透明贴图  
  88. image.Destroy();  
  89. }    
  90. //****消息处理函数**********************************    
  91. LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)    
  92. {    
  93. PAINTSTRUCT ps;    
  94. HDC hdc;    
  95. switch (message)    
  96. {    
  97. case WM_PAINT:   //窗口重绘消息    
  98. hdc = BeginPaint(hWnd, &ps);    
  99. MyPaint(hdc);    
  100. EndPaint(hWnd, &ps);    
  101. break;    
  102. case WM_DESTROY:     //窗口结束消息    
  103. DeleteDC(mdc);    
  104. DeleteObject(bg);    
  105. PostQuitMessage(0);    
  106. break;    
  107. default:     //其他消息    
  108. return DefWindowProc(hWnd, message, wParam, lParam);    
  109.    }    
  110.    return 0;    
  111. }    



最后得到的效果图如下:



我们可以改变CImage::Draw函数的参数值,让“洋葱头”出现在地图不同的地方。





通过这个实例可以发现,用CImage类进行透明贴图,实在是方便多了。




本节笔记到这里就结束了,由于近期在做一个纯flash的网站,更新速度和评论的回复都不像往常那么及时,希望大家能够体谅。


本节笔记的源代码请点击这里下载:   【Visual C++】Code_Note_14


感谢一直支持【Visual C++】游戏开发笔记系列专栏的朋友们,也请大家继续关注我的专栏,我一有时间就会把自己的学习心得,觉得比较好的知识点写出来和大家一起分享。

精通游戏开发的路还很长很长,非常希望能和大家一起交流,共同学习,共同进步。

大家看过后觉得值得一看的话,可以顶一下这篇文章,你们的支持是我继续写下去的动力~

如果文章中有什么疏漏的地方,也请大家指正。也希望大家可以多留言来和我探讨编程相关的问题。

最后,谢谢你们一直的支持~~~


——————————浅墨于2012年4月3日


The end.



http://chatgpt.dhexx.cn/article/GSnbkBAY.shtml

相关文章

【无标题】c++ MFC图像处理CImage类常用操作代码

原文作者&#xff1a;aircraft 原文地址&#xff1a;https://www.cnblogs.com/DOMLX/p/9598974.html 我看了一下发现关于c下的CImage图像处理类 的图像处理相关的介绍真的是比较少&#xff0c;因为我要做大二的数据结构的课程设计&#xff0c;要用纯c语言去实现&#xff08;老…

C++,CImage类的建立方法(可以打开图像和保存)

建立CImage类&#xff08;以vs2015为例&#xff09; 一&#xff0c; 新建一个MFC项目&#xff1a;名字为 image3 二&#xff0c; 单个文档&#xff0c;MFC标准&#xff0c;然后完成。 三&#xff0c;打开应用程序的 stdafx.h 文件添加 CImage 类的包含文件&#xff1a; #incl…

VB.net 进程通信中FindWindow、FindWindowEX、SendMessage函数的理解

目录 一、代码背景 二、主要工具 三、函数解析 1、FindWindow&#xff1a; 2、 FindWindowEx&#xff1a; 3、SendMessage&#xff1a; 四、具体代码示例&#xff1a; 1、第一部分功能&#xff1a; A、接收端&#xff1a; B、发送端 C、运行测试 2.第二部分功能&…

C#-FindWindow的用法

C# FindWindow用法 函数功能&#xff1a;该函数获得一个顶层窗口的句柄&#xff0c;该窗口的类名和窗口名与给定的字符串相匹配。 这个函数不查找子窗口。在查找时不区分大小写。 函数型&#xff1a;HWND FindWindow&#xff08;LPCTSTR IpClassName&#xff0c;LPCTSTR IpWi…

vb.net中FindWindow方法的使用

问题描述 遇到的问题是&#xff0c;需要判断MsgBox是否已经弹出&#xff0c;如果已经弹出就不要重复弹出了。 解决方案&#xff1a; 利用FindWindow方法判断MsgBox是否已经出现 MsgBox的本质就是一个窗体&#xff0c;有标题和内容&#xff0c;可以使用FindWindow这个API函数去…

C# FindWindow的用法

找了一大堆C#怎么用FindWindowAPI函数不多说,请看步骤. 创建好WinForm窗口,如果不会创建的话,在图下面有. 项目名字和位置这个自己设置,下面那个框架,目前现在出5.0了,为了演示实例,就4.6吧. 创建完成后,把自己窗口设置一下

FindWindow ,GetWindowThreadProcessId , OpenProcess 和ReadProcessMemory

文章目录 FindWindow函数功能&#xff1a;函数声明&#xff1a;第一个参数第二个参数返回值注意&#xff1a;GetWindowThreadProcessId函数功能函数声明第一个参数&#xff1a;第二个参数&#xff1a;返回值代码实现OpenProcess函数功能&#xff1a;函数声明&#xff1a;第一个…

【CV系列】主动轮廓模型snake及其应用

DATE: 2019.5.30 前言 主动轮廓模型(Active Contour Model)&#xff0c;又被称为Snake&#xff0c;是由Andrew Blake教授提出的一种目标轮廓描述方法&#xff0c;主要应用于基于形状的目标分割。该模型的优越之处在于它对于范围广泛的一系列视觉问题给出了统一的解决方法,在最…

图像分割之Snake主动轮廓模型(Matlab代码)

示例演示 如果在中文搜索的话&#xff0c;一般会找到《数字图像处理-图像分割&#xff1a;Snake主动轮廓模型 Matlab代码及运行结果》。里面有句代码&#xff0c;千万别用&#xff0c;否则出不来效果。&#xff08;别问我怎么知道的&#xff09; % 转化为双精度型 %I im2doub…

Snake活动轮廓模型Matlab实现

1. Snake模型 人为地在图像感兴趣的区域&#xff08;ROI&#xff09;上给出初始轮廓曲线&#xff0c;最小化一个能量函数&#xff0c;使轮廓曲线在图像中运动&#xff08;变形&#xff09;&#xff0c;最终逼近该区域的边界。 设v(s)[x(s),y(s)]为活动轮廓线&#xff0c;s∈[0,…

snake主动轮廓模型

模型&#xff1a;一条可变形的参数曲线及相应的能量函数&#xff0c;以最小化能量函数为目标&#xff0c;控制参数曲线变形&#xff0c;具有最小能量的闭合曲线即是目标轮廓。 snake模型调和了上层知识和底层图像特征矛盾。 上层知识指物体形状。表示内部力。 底层图像特征是局…

Snake活动轮廓模型

1. Snake模型 人为地在图像感兴趣的区域&#xff08;ROI&#xff09;上给出初始轮廓曲线&#xff0c;最小化一个能量函数&#xff0c;使轮廓曲线在图像中运动&#xff08;变形&#xff09;&#xff0c;最终逼近该区域的边界。 设v(s)[x(s),y(s)]为活动轮廓线&#xff0c;s∈[0,…

基于边缘的主动轮廓模型——从零到一用python实现snake

从零到一实现snake算法 1、Snake算法原理2、基于曲线演化的实现方法2.1演化方程推导2.2离散化过程2.3 代码实现 3、基于水平集的实现方法4、讨论与分析源码地址[snake](https://github.com/woshimami/snake) 1、Snake算法原理 Kass等人1最早于1988年提出了主动轮廓模型&#x…

主动轮廓模型snake

原理概述 snake模型将图像分割问题转换为求解能量泛函最小值的问题。主要思路是构造能量函数进行迭代后&#xff0c;轮廓曲线由初始位置逐渐向使能量函数最小&#xff08;局部极小&#xff09;的图像边缘逼近&#xff0c;最终分割出目标。 曲线理论 假设一条光滑封闭曲线 C …

腾讯电脑管家,vs安装文件报成木马,还能信吗?

今天在公司安装vs2013&#xff0c;安装过程中腾讯公司的产品“电脑管家”提示有新版本&#xff0c;没有犹豫的点了升级&#xff0c;完成后直接在管家主界面上点了“全面体检”按钮&#xff0c;这一点不要紧&#xff0c;报告有一个木马&#xff0c;看紧看一下“详情”&#xff0…

计算机windows8黑屏怎么办,Win8电脑开机黑屏只有鼠标光标怎么解决

有些win8系统用户在开机的时候&#xff0c;遇到了黑屏的情况&#xff0c; 整个屏幕上面只有一个闪烁的鼠标光标&#xff0c;导致无法进入到系统桌面&#xff0c;遇到这样的情况该怎么解决呢&#xff1f;现在给大家分享一下Win8电脑开机黑屏只有鼠标光标的具体解决方法吧。 Win8…

解决ValueError: Cannot run multiple SparkContexts at once; existing SparkContext

一、问题描述 创建sparkcontext和SparkSession&#xff0c;连接spark集群时报错&#xff0c;如题ValueError: Cannot run multiple SparkContexts at once; existing SparkContext。 from pyspark.sql import SparkSession from pyspark.sql import functions as F from pysp…

1、Qt线程(二):继承QThread,重写run

一、功能说明 1、通过继承QThread&#xff0c;重写run的方式实现多线程 2、点击“开始”按钮启动子线程&#xff0c;同时通过信号槽的方式给子线程发送“开始”字符串&#xff1b; 3、子线程每隔1秒向主线程发送累加数&#xff1b; 4、点击"停止"按钮&#xff0c…

诡异的RunOnce病毒启动项和神奇的URL Protocol

整理磁盘发现之前有个有趣的流氓招数忘记分享了,每次看到新鲜的东东都感慨黑暗势力的层出不穷的招数,比某些安全厂商是不是自相残杀好多了.电脑日常使用过程中我们经常输入开头为http ftp,点击诸如ed2k的链接,每个链接的背后都会执行相应的功能.如http 通过iexplore.exe,ed2k通…

如何创建水晶报表

开发工具与关键技术&#xff1a;VS与MVC 作者&#xff1a;刘华叶 撰写时间&#xff1a;2019年4月29日 MVC是软件工程中的一种软件架构模式&#xff0c;涉及到的知识点也是相当广泛&#xff0c;而我们在做项目的过程中&#xff0c;总会遇到要制作一些报表&#xff0c;水晶报表就…