[原创]使用MFC界面库LibUIDK制作超酷界面

zz使用界面库LibUIDK制作界面 LibUIDK简介:LibUIDK是专业开发Windows平台下图形用户界面的开发包,该开发包基于Microsoft的MFC库。使用此开发工具包可轻易把美工制作的精美界面用VC实现,由于使用LibUIDK创建的所有窗口都支持控件的从控件工具栏中拖入创建,所以极大的提高了新产品的开发速度,并大大增强图形用户界面(GUI)的亲和力。LibUIDK还可以使您的软件轻松具有当今流行的换肤功能,以提高产品 阅读详情

LibUIDK简介:

    LibUIDK是专业开发Windows平台下图形用户界面的开发包,该开发包基于Microsoft的MFC库。使用此开发工具包可轻易把美工制作的精美界面用VC实现,由于LibUIDK采用所见即所得的方式创建产品界面,所以极大的提高了产品的开发速度,并大大增强图形用户界面(GUI)的亲和力。LibUIDK还可以使您的软件轻松具有当今流行的换肤功能,以提高产品的竞争力。

LibUIDK的目标用户:
任何使用Microsoft Visual C++ 6.0、Microsoft Visual C++ 2003、Microsoft Visual C++ 2005、Microsoft Visual C++ 2008或Microsoft Visual C++ 2010的程序开发人员。

主要特点:

快速创建窗口:
使用LibUIDK创建一个窗口与VC创建一个对话框一样方便,所见即所得的操作方式,极易上手。UIShop在设计时尽量模拟VC6.0创建一个对话框那样来创建UI窗口。
支持换肤:
你可以为同一个应该程序创建多个不同的皮肤,每个皮肤可以有不同的外观,不同的控件布局,也就是说,同一个控件在不同的皮肤中可以位于不同的位置,这样就为不规则窗口中重新布置控件的位置提供了支持。
皮肤与代码的分离:
程序员可以不必等到美工把所有的图片全部做好就可以开始编码,在工程前期,程序员可以使用Windows自带的画图软件简单创建一些纯色的底图而在上面创建控件,等美工把图片做好后替换一下即可,不需要修改代码。并且,如果由美工使用皮肤编辑器UIShop创建皮肤,可以直接看到程序最终的效果。而不必先把图片交给程序员接入代码中编译到源工程后才能查看界面效果。软件发布后也可以由软件爱好者为您的软件设计皮肤而不需要重新编译您的程序。更激动人心的是,UIShop创建皮肤非常简单。
支持png, jpg等格式。


 

为什么选择LibUIDK?

1. 加快开发速度:

开发一个中等规模的UI产品, 大约需要一个熟练掌握MFC的开发人员写三个月(并且还不包含Debug的时间). 而使用LibUIDK, 可以提高6-8倍的效率, 一般10-15天就可以完成. 这不仅节约了时间成本, 还节约了财力成本. 最重要的是, 您可以快速推出产品, 而使您在与您的竞争对手的较量中处理优势地位. LibUIDK使您的开发由手工作坊式变为机械化大生产式。

2. 节约成本:

使用LibUIDK开发产品,不仅所需时间大为减少, 所需人力也大大减少,通常情况,只需要1个人来开发界面。所以会使贵公司在人力资源方面减少投入。

3. 减小程序Bug数量:

一般一个中等规模产品的UI大约有5000-10000行代码, 按每100行代码1个Bug的概率, 可能整个UI有50-100个Bug. 而LibUIDK经过3年多的发展和数万用户的使用, 系统已经非常稳定可靠, 所以可以大幅减少您的产品的UI部分的Bug数量,节约大量的Debug时间。

4. 更容易对客户的需求做出改变:

一个产品在开发过程中, 常常会根据客户的要求, 进行反复修改. 大量的修改常令程序员感到无所适从. 由于LibUIDK采用所见既所得的方式生成代码, 所以修改起来非常方便.

5. 贵公司的GUI开发能力可能不足:

如果贵公司的专业领域不在GUI的开发, 但临时有项目需要较高水平的GUI规格. 那您可以使用LibUIDK来进行开发.

6. 需要制作高级用户界面:

MFC制作高级用户界面比较复杂, 但项目的需求又需要制作高质量用户界面, 比如一些多媒体播放器界面, IM聊天软件等. 那么您可以使用LibUIDK来定制. LibUIDK使您开发用户界面仅受限于想像力, 而不是受限于技术.

 

支持列表:

 Microsoft Windows 2000, XP, Win2003, Vista or Win7.
Microsoft Visual C++ 6.0, Microsoft Visual C++ 2003, Microsoft Visual C++ 2005, Microsoft Visual C++ 2008, Microsoft Visual C++ 2010.

 

创建第一个基于LibUIDK的程序

    LibUIDK的皮肤编辑器提供了基于LibUIDK的应用程序创建向导,使用向导,您可以快速创建一个基于LibUIDK的工程。
一、打开皮肤编辑器,选择菜单【File/New Visual C++ Project...】,如下图:

在弹出的“New Project”对话框中,您可以像设置基于MFC的工程那样,设置一些工程选项,如下图:

 

使用应用程序创建向导,您可以创建基于VC6、VC2003、VC2005、VC2008的工程。向导直接生成工程所需的文件和一个基本的界面,你使用Visual C++,就可以直接编译生成的工程,并且运行编译之后的可执行文件。与您创建MFC工程相似,LibUIDK工程创建向导也允许您创建工程时指定工程是否支持数据库、ActiveX、Sockets等。当您需要界面使用png、jpg等格式时,您可以选中“Gdiplus”选项,LibUIDK将使用GDI+技术来支持这些图像格式,当然,如果你选择了这个选项,那么在您发布产品时,要包含Gdiplus.dll这个文件。
输入工程名和选择工程存放路径后,点击“OK”按钮,就可以创建出一个LibUIDK工程。使用相应的Visual C++版本编译后运行界面如下:

文件结构如下:

Bin---界面文件夹,包含了界面所需要的背景图片、界面布局定义文件等,也是编译成功的可执行文件存放路径
res---程序中图标文件存放路径
MainFrm.cpp和MainFrm.h---程序主界面类
ReadMe.txt---描述工程信息的文本文件
Resource.h和Test.rc---工程中使用到的资料的ID定义,如字符串、菜单、对话框资料的ID。注意,界面中窗口及控件的ID不在这个文件中定义,而是由皮肤编辑器自动生成,定义在Bin文件夹下的Resource.h中。
SstaAfx.cpp和StaAfx.h---全局变量、头文件等定义。
Test.clw---VC6类信息临时文件。
Test.cpp和Text.h---应用程序类
Test.dsp和Test.dsw---VC6工程文件

生成工程文件之后,您就可以像开发MFC对话框程序那样,来开发基于LibUIDK的项目了。
9. 创建其它从CUIWnd派生的子窗口,以完成整个应用程序的GUI部分。

libuidk MFC贴图界面库高级UI设计实战v7.5 MFC(Microsoft Foundation Classes)作为Windows平台上历史悠久的界面开发框架,凭借其与Windows API的深度集成,广泛应用于企业级桌面软件开发。然而,随着现代UI设计理念的不断演进,MFC默认的界面风格显得过于陈旧,难以满足用户对视觉体验和交互感受的高要求。为了解决这一问题,开发者们开始借助第三方UI库来提升MFC应用的视觉表现力。其中,libuidk。 阅读详情

相关推荐

VC界面设计皮肤控件-LibUIDK

里面有VC皮肤控件设计库,里面有使用说明。LibUIDK!

LibUIDK:打造专业级Windows图形用户界面的利器

LibUIDK:打造专业级Windows图形用户界面的利器 项目介绍 LibUIDK,全称为LibUIDevelopment Kit,是一款专为Windows平台设计的高级图形用户界面(GUI)开发工具包。它最初作为商业界面库,于2019年9月8日正式开源,成为国内首款开源的高级界面开发工具。LibUIDK基于Microsoft的MFC库,旨在帮助开发者轻松实现如QQ、360安全卫士等软件的精美界...

gitblog_00469的博客 771

自己整理的一个简单界面库(基于MFC)

自己整理的一个简单界面库(基于MFC),支持控件包括:Static、Button、Edit、Slider、Progress、ComboBox、RadioBox、CheckBox。

使用MFC界面库LibUIDK

LibUIDK简介: LibUIDK是专业开发Windows平台下图形用户界面的开发包,该开发包基于Microsoft的MFC库。使用此开发工具包可轻易把美工制作的精美界面用VC实现,由于LibUIDK采用所见即所得的方式创建产品界面,所以极大的提高了产品的开发速度,并大大增强图形用户界面(GUI)的亲和力。LibUIDK还可以使您的软件轻松具有当今流行的换肤功能,以提高产品的竞争力。 ...

u011269801的专栏 2041

标准MFC WinSock ActiveX控件开发实例(II)高级篇

主要利用VARIANT类型作参数进行的网络数据传送和接收,以及SAFEARRAY,BSTR的详细使用方法。 另外还提供该控件在VC,VB下的调用方式以及相关数据的处理。 关键字:ActiveX,Socket,VARIANT, SAFEARRAY,BSTR。 回顾:在上一篇文章《标准MFC WinSock ActiveX控件开发实例》中我们详细介绍了控件的开发过程,以及接口和事件的 添加和响应方法。现在我们将继续上次没有写完的控件继续进行开发,并完善作为一个WinSock控件应该具备的功能。 二、按照前一篇文章提到的知识,现在我们来添加两个新的接口分别是SendData()和GetData(),它们看起来如下: //网络数据发送,在指定的超时时间内进行发送然后返回,成功返回实际发送字节数,否则返回负数 long CMFCWinSockCtrl::SendData(const VARIANT FAR& Data, const VARIANT FAR& DataType, const VARIANT FAR& DataLength, const VARIANT FAR& TimeOut) { // TODO: Add your dispatch handler code here return 0; } //获取数据,并指定获取数据的超时时间,返回实际获取到的数据长度,否则返回负数 long CMFCWinSockCtrl::GetData(VARIANT FAR* Data, const VARIANT FAR& DataType, const VARIANT FAR& DataMaxLength, const VARIANT FAR& TimeOut) { // TODO: Add your dispatch handler code here return 0; }   两个接口的参数除了第一个参数外,其它都类似。SendData()是发送数据,不要求将数据带回,因此直接用 VARIANT,而GetData()则要求将数据带回来给调用者,因此定义为 VARIANT *类型,第二个参数DataType故名思义是定义所传送或接收数据的类型,第三个参数是传送或接收数据的长度,这里的长度以char作为一个长度,假如传入的类型是int类型,则长度为4,如果定义的是字符串,一个中文字符占用2个长度。最后一个参数,是网络发送或读取时的超时时间。 三、为Connect()接口添加源代码,看起来如下: //网络数据发送,在指定的超时时间内进行发送然后返回,成功返回实际发送字节数,否则返回负数 long CMFCWinSockCtrl::SendData(const VARIANT FAR& Data, const VARIANT FAR& DataType, const VARIANT FAR& DataLength, const VARIANT FAR& TimeOut) { // TODO: Add your dispatch handler code here if(!OnlySock) return -1;//网络尚未开始建立连接 int gDataType = VariantToLong(DataType); long gDataLength = VariantToLong(DataLength); int gTimeOut = VariantToLong(TimeOut); if(gDataType < 0) return -2; if(gDataLength <= 0) return -2; if(gTimeOut < 0) return -2; switch(gDataType) { case 0://默认形式,这时如果发现Data为整型数组,将不进行任何转换,直接把一个int传给一个char传送(数据可能溢出范围) case 1://当指定该值为1时,当Date为长整型数组时,将把一个long转换成四个char传送 case 2://当指定该值为2时,当Date为整型数组时,将把一个int转换成四个char传送 case 3://当指定该值为3时,当Date为无符号短整型数组时,将把一个unsigned short转换成两个char传送 case 4://当指定该值为4时,当Date为BYTE数组时,将把一个BYTE转换成一个char传送 case 5://当指定该值为5时,当Date为短整型数组时,将把一个short转换成两个char传送 case 6://当指定该值为6时,当Date为浮点型数组时,将把一个float转换成四个char传送 case 7://当指定该值为7时,当Date为双精度数组时,将把一个double转换成八个char传送 break; default://如果不在上面取值范围内,将按当前的Data相应类型进行传送 break; } timeval tv; fd_set fdwrite; int len = 0; long m = 0; long n = 0; long changetype = 0;//将浮点型数据进行类型转换,再进行传送 VARIANT gData; VariantInit(&gData); //送出信息至服务器 FD_ZERO(&fdwrite); tv.tv_sec = gTimeOut;//指定时间后返回 tv.tv_usec = 0; FD_SET(OnlySock,&fdwrite);//是否可以发送数据 select(0,NULL,&fdwrite,NULL,&tv); char *buffer = NULL; if(FD_ISSET(OnlySock,&fdwrite)) { switch(Data.vt) { case VT_BSTR://按字符串形式发送 buffer = _com_util::ConvertBSTRToString(Data.bstrVal); break; case VT_BYREF|VT_UI1: //按BYTE*形式发送 buffer = new char[gDataLength]; memcpy(buffer,Data.pbVal,gDataLength); break; case VT_BYREF|VT_I1://按 char * 发送 buffer = new char[gDataLength]; memcpy(buffer,Data.pcVal,gDataLength); break; case VT_ARRAY|VT_I4://以长整型数组发送 gData.vt = VT_I4; if(gDataType!=0)//long = char*4 { //sizeof(long),在这里一个长整型的长度为4个char buffer = new char[gDataLength]; for(m=0,n=0; n>24)&0xff; buffer[m++] = (gData.lVal>>16)&0xff; buffer[m++] = (gData.lVal>>8)&0xff; buffer[m++] = gData.lVal&0xff; } } else//long = char*1 //数据可能溢出 { buffer = new char[gDataLength]; for(m=0,n=0; n<gDataLength; n++) { SafeArrayGetElement(Data.parray,&n,&gData.lVal); buffer[n] = (char)gData.lVal; } } break; case VT_ARRAY|VT_INT://以整型数组发送 gData.vt = VT_INT; if(gDataType != 0) { //一个int等于四个char buffer = new char[gDataLength]; for(m=0,n=0; n>24)&0xff; buffer[m++] = (gData.intVal>>16)&0xff; buffer[m++] = (gData.intVal>>8)&0xff; buffer[m++] = gData.intVal&0xff; } } else { buffer = new char[gDataLength]; for(n=0; n<gDataLength; n++) { SafeArrayGetElement(Data.parray,&n,&gData.intVal); buffer[n] = (char)gData.intVal; } } break; case VT_ARRAY|VT_UI1://以BYTE数组发送 gData.vt = VT_UI1;//一个char等于一个BYTE不必进行转换 buffer = new char[gDataLength]; for(n=0; n<gDataLength; n++) { SafeArrayGetElement(Data.parray,&n,&gData.bVal); buffer[n] = gData.bVal; } break; default://在这里没有一一列出其它类型,剩下的就由阁下进行数据转换处理了,我就偷懒了^_^ return -3;//传入的数据类型不被支持 } len = send(OnlySock, buffer, gDataLength, 0);//发送数据 delete[] buffer; buffer = NULL; if (len>24)&0xff; buffer[1] = (lData>>16)&0xff; buffer[2] = (lData>>8)&0xff; buffer[3] = lData&0xff; //4个char组成一个long lData_2 = ((buffer[0]&0xff)<<24) + ((buffer[1]&0xff)<<16) + ((buffer[2]&0xff)<<8) + (buffer[3]&0xff); 四、现在来看看GetData()的处理,具体实现,请看如下代码: // TODO: Add your dispatch handler code here if(!OnlySock) return -1;//网络尚未开始建立连接 int gDataType = VariantToLong(DataType); long gDataMaxLength = VariantToLong(DataMaxLength); int gTimeOut = VariantToLong(TimeOut); if(gDataType < 0) return -2; if(gDataMaxLength <= 0) return -2; if(gTimeOut < 0) return -2; switch(gDataType) { case 0://默认形式,这时如果发现Data为整型数组,将不进行任何转换,直接把一个int传给一个char传送(数据可能溢出范围) case 1://当指定该值为1时,当Date为长整型数组时,将把一个long转换成四个char传送 case 2://当指定该值为2时,当Date为整型数组时,将把一个int转换成四个char传送 case 3://当指定该值为3时,当Date为无符号短整型数组时,将把一个unsigned short转换成两个char传送 case 4://当指定该值为4时,当Date为BYTE数组时,将把一个BYTE转换成一个char传送 case 5://当指定该值为5时,当Date为短整型数组时,将把一个short转换成两个char传送 case 6://当指定该值为6时,当Date为浮点型数组时,将把一个float转换成四个char传送 case 7://当指定该值为7时,当Date为双精度数组时,将把一个double转换成八个char传送 break; default://如果不在上面取值范围内,将按当前的Data相应类型进行传送 break; } timeval tv; fd_set fdread; int len = -3;//如果找不到该连接,则返回-3 long n = 0; long m = 0; long changetype = 0; VARIANT gData; VariantInit(&gData); char *buffer=NULL; buffer = new char[gDataMaxLength+1]; memset(buffer, 0, gDataMaxLength+1); FD_ZERO(&fdread); tv.tv_sec = gTimeOut;//超过指定时间后返回 tv.tv_usec = 0; FD_SET(OnlySock,&fdread);//是否可以读取数据 select( 0,&fdread,NULL,NULL,&tv); if(FD_ISSET(OnlySock,&fdread)) { len = recv(OnlySock, buffer, gDataMaxLength, 0); if (len<=0) { delete[] buffer; return -102;//无法读取数据,对方可能已断开连接 } if(lenvt) { case VT_BSTR://按字符串形式接收 buffer[gDataMaxLength] = '\0'; Data->bstrVal = _com_util::ConvertStringToBSTR(buffer); break; case VT_BYREF|VT_UI1: //按BYTE*形式接收 memcpy(Data->pbVal,buffer,gDataMaxLength); break; case VT_BYREF|VT_I1://按 char * 形式接收 memcpy(Data->pcVal,buffer,gDataMaxLength); break; case VT_BYREF|VT_I4://以长整型指针接收 buffer[gDataMaxLength]='\0'; for(n=0; nplVal[n] = buffer[n]; } break; case VT_ARRAY|VT_I4://以长整型数组接收 gData.vt = VT_I4; if(gDataType != 0) { for(m=0,n=0; n<gDataMaxLength;n++) { gData.lVal = ((buffer[m]&0xff)<<24) + ((buffer[m+1]&0xff)<<16) + ((buffer[m+2]&0xff)<parray,&n,&gData.lVal); m = m+4; } } else { for(n = 0; nparray,&n,&gData.lVal); } } break; case VT_ARRAY|VT_INT://以整型数组接收 gData.vt = VT_INT; if(gDataType != 0) { for(m=0,n=0; n<gDataMaxLength;n++) { gData.intVal = ((buffer[m]&0xff)<<24) + ((buffer[m+1]&0xff)<<16) + ((buffer[m+2]&0xff)<parray,&n,&gData.intVal); m = m+4; } } else { for(n = 0; nparray,&n,&gData.intVal); } } break; case VT_ARRAY|VT_UI1://以BYTE数组接收 gData.vt = VT_UI1; for(n = 0; nparray,&n,&gData.bVal); } break; default://其它类型,请各位看官自行实现处理,嘿嘿 delete[] buffer; return -3;//无法识别传入的数据类型 } } else { delete[] buffer; return 0;//网络数据读取超时 } VariantClear(&gData); delete[] buffer; return len; 五、接下来,我们看看VC和VB如何调用该控件: VC调用控件方式: 新建一对话框工程,然后在工程中添加该控件,设置如下图: 图一 创建新对话框工程,并加入控件 响应控件的断网和数据到达事件,设置如下图: 图二 响应控件的两个事件 添加相应代码,看起来如下: void CTestMFCWinSockDlg::OnRecvSockEventMfcwinsockctrl1() { // TODO: Add your control notification handler code here SAFEARRAYBOUND Bound[1];//一维数组 Bound[0].lLbound=0; Bound[0].cElements=100;//该一维数组最大接收100个元素 VARIANT *data; data = new VARIANT; VariantInit(data); data->vt = VT_ARRAY|VT_I4;//指明为长整型数组 data->parray = SafeArrayCreate(VT_I4,1,Bound);//创建SAFEARRAY结构 long l = m_sock.GetData(data, COleVariant((long)0), COleVariant((long)100), COleVariant((long)3)); if(l<=0) { ;//在这里判断出错信息,并作相应处理,我就偷懒了. } char pData[100]={0};//这里以字符数组显示结果 long change = 0; for(long n=0; nparray,&n,&change); pData[n] = (char)change; } CString mess; mess.Format("%s",pData); AfxMessageBox(mess); SafeArrayDestroy(data->parray); delete data; } void CTestMFCWinSockDlg::OnCloseWinsockMfcwinsockctrl1() { // TODO: Add your control notification handler code here m_sock.DisConnect();//调用断开连接接口 AfxMessageBox("服务器断开了该次连接,请检查!"); } void CTestMFCWinSockDlg::OnConnect() { // TODO: Add your control notification handler code here UpdateData(TRUE); if(!m_sock.Connect(COleVariant(m_ip),COleVariant(m_port))) AfxMessageBox("与服务器建立连接失败,请确认服务器是否存在!"); } VB调用控件方式: VB时面调用要方便很多,这得益于VB的很多自动化功能,请看下图: 图三 VB调用控件方法 同样,双击我们的控件,然后添加控件事件,如下图: 图四 VB响应控件事件 然后,添加相关代码如下: Private Sub Command1_Click() MFCWinSock1.Connect CStr(ip), CLng(port) End Sub Private Sub Command2_Click() MFCWinSock1.SendData "SendData: 欢迎使用!", 0, 50, 3 End Sub Private Sub MFCWinSock1_CloseWinsock() MFCWinSock1.DisConnect MsgBox "服务器断开了连接,请检查!" End Sub Private Sub MFCWinSock1_RecvSockEvent() Dim data As Variant Dim data2(100) As Long Dim data3 As String Dim l As Long data = data2 '在VB里当把一个Variant变量data等于另一个确定变量data2时,data将被初始化为与data2相同的类型变量 'data = data3 '如果让data等于data3,那么data将变成字符串型的变量参数 l = MFCWinSock1.GetData(data, 0, 100, 3) '这时data里面已存放了接收到的数据 data3 = data(0) '这里只显示接收到的首字符编码 MsgBox data3 End Sub 大家可以看到,对于SAFEARRAY类型的数据进行相关处理也并不可怕,由于在源码里给出了具体代码和详细注解,在这里我就不再赘述了, 至于BSTR和char *类型的数据,相信不用我多说,大家也已经知道如何使用了。 结束语:   全文至此暂告一段落,本文向大家展示了MFC ActiveX控件的魅力,以及所用的VARIANT类型参数,还详细给出了WinSock的开发代码, 以用在VC,VB的调用方法,由于这段时间忙于一些新项目的开发,因此没办法花太多时间进行详细解释,所以很多地方都直接给出源代码 再加上注解,而没有进行通俗的讲解,还请各位读者仔细查看源代码。 本控件目前只能作为客户端,阁下还可以继续进行完善,比如进行端口的监听,实现服务器的相关处理等等,但这已经不是本文的目的, 授人以鱼,不如授人如渔,剩下的功能,就由各位读者去实现了,也欢迎与我进行交流,谢谢! 另外:本文的示例,需要一个服务器程序,大家可以在网上随便下载一下进行测试,我就不提供了。 声明: 部分资料来源于网络,本文所用的所有源代码仅供非商业用途,并请保留原版权,否则后果自负! 欢迎大家拍砖,指正错误或不足的地方,一起探导更好的方法。 欢迎访问www.59186618.com,感谢您的支持!

LibUIDK 图形界面控件 5.5版

LibUIDK 图形界面控件 5.5版 LibUIDK 图形界面控件 5.5版

LibUIDK 学习------登录对话款

先使用UIShop界面设计器画出基本的界面,如下所示:【此界面主要用到了:<Aa Static Text>,<abl Edit Control>,<Push Button>控件】 属性注意: 1、 框选部分表示界面上十字线条的位置,用于界面拉伸的时候从这个位置开始 2、Title Bar Height 这个属性用于设置当前鼠标可以拖拽移动的区域高度 0:不可以拖拽 -1:整个对话款可拖拽 3、如下界面添加类的时候,直接可以创建继承【CUIWnd..

u011269801的专栏 845

基于MFC的Windows平台高级图形用户界面开发工具包_LibUIDK_专业级界面库_商业级开源界面框架_所见即所得UI设计器_高效开发工具_美工友好型界面引擎_支持换肤功能_降.zip

基于MFC的Windows平台高级图形用户界面开发工具包_LibUIDK_专业级界面库_商业级开源界面框架_所见即所得UI设计器_高效开发工具_美工友好型界面引擎_支持换肤功能_降.zip

Windows C++界面库

记得大一学C语言的时候,觉得黑白窗很无聊,后来在网上找到了EasyX (一个模仿turbo c的图形库)http://www.easyx.cn ,用它写一些贪吃蛇、扫雷这类有图形界面的游戏来练手。 当时学的时候就很好奇为什么调用这些函数就能绘制图形,后来从网上了解到了Windows编程,于是从淘宝淘了本《Windows程序设计》看了起来,当时看的时候还有点吃力。 趁着大一结束后的那次暑假我看完了王

优快云文章已停止维护,后续文章会在 https://blog.hufeifei.cn 持续更新 1万+

别再只用固定线了!聊聊Android车机‘快速倒车’与‘正常倒车’的UI与数据流核心差异(附动态轨迹线实现原理)

本文深度解析Android车机中快速倒车与正常倒车的核心差异,探讨从内核级视频流水线到动态轨迹线的技术实现。快速倒车通过内核直接操作FrameBuffer实现2秒内响应,而正常倒车则支持多传感器数据融合与动态UI元素。文章还分享了动态轨迹线的算法实现与性能优化技巧,帮助开发者打造极致的倒车体验。

weixin_42550597的博客 253

高通 Gen AI 推理扩展 (GENIE)(5):实战指南与Engine API深度解析

本文深入解析高通Gen AI推理扩展(GENIE)的Engine API核心功能与实战应用,涵盖引擎实例化、多引擎动态切换、性能调优及跨平台部署等关键技巧。通过详细代码示例和性能数据,帮助开发者高效利用GENIE进行AI推理,提升应用性能与稳定性。

weixin_29065959的博客 464

C++界面库

        刚开始用C++做界面的时候,根本不知道怎么用简陋的MFC控件做出比较美观的界面,后来就开始逐渐接触到BCG  Xtreme ToolkitPro v15.0.1,Skin++,等界面库,以及一些网友自己写的界面库,开始对于C++软件界面美化有了一点点的心得。不敢藏私,希望和一些新手朋友们分享交流。     一...

少得多惑的博客 2万+

SAP ABAP实战:用GN_DELIVERY_CREATE批量创建内部交货单的完整代码与避坑指南

本文详细介绍了在SAP ABAP开发中使用GN_DELIVERY_CREATE函数批量创建内部交货单的完整实现方案。通过数据结构设计、多源数据整合、批量处理逻辑和错误处理机制等核心环节的深入解析,帮助开发者高效完成物流单据自动化处理,特别针对VL31N/VL32N等常见场景提供避坑指南。

weixin_42116058的博客 343

MFC UI界面库

Xtrme toolkit,BCGControlBar,SkinMagic,AppFace,Skin++,Uskin++,SYGUI,LibUIDK,GuiToolkit,GardenUI等等,除了后两种一个是开源,一个是免费的外,其余的都是收费的。 The Ultimate Toolbox http://www.codeproject.com/KB/MFC/Ulti...

blogfeifei 1712

华硕ROG玩家国度安装Ubuntu双系统避坑指南:安全启动密钥那些事儿

本文详细解析了在华硕ROG玩家国度设备上安装Ubuntu双系统时,如何正确处理BIOS中的安全启动(Secure Boot)与密钥管理,避免常见的引导失败和Windows系统无法启动问题。指南提供了从数据备份、启动盘制作到BIOS精细设置(如将OS Type改为Other OS而非简单关闭Secure Boot)以及分区规划的完整流程,确保两个系统都能稳定共存。

weixin_29219189的博客 754

【目标检测-YOLO】YOLOv5-v5.0-yolov5s网络架构详解(第一篇)

源码:GitHub - ultralytics/yolov5 at v5.0 由于YOLO v5 代码库在持续更新,如上图,有多个版本,每个版本的网络结构不尽相同。以下内容以 v5.0 为准,网络结构选用 yolov5s。 为了方便画图和理解网络结构,选用可视化工具:Netron 网页版进行可视化, 然后使用PPT作图。 在Releases · ultralytics/yolov5 · GitHub找到 v5.0中的Assets 中的yolov5s.pt并下载该权重。 下图为直接......

博观约取,厚积薄发 2万+

使用MFC界面库LibUIDK制作超酷界面

<br />原作者:psbeyond    源出处:优快云    发布者:施昌权    发布类型:转载    发布日期:2008-11-13<br /><br />LibUIDK简介:<br />LibUIDK是专业开发Windows平台下图形用户界面的开发包,该开发包基于Microsoft的MFC库。使用此开发工具包可轻易把美工制作的精美界面用VC实现,由于使用LibUIDK创建的所有窗口都支持控件的从控件工具栏中拖入创建,所以极大的提高了新产品的开发速度,并大大增强图形用户界面(GUI)的亲和力。Li

个人开发记录 2576

华为OD机试 - 机器人活动区域(Python/JS/C/C++ 双机位C卷 200分)

本专栏收录于《华为OD机试真题(Python/JS/C/C++)》。刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新。现有一个机器人,可放置于 M × N的网格中任意位置,每个网格包含一个非负整数编号。当相邻网格的数字编号差值的绝对值小于等于 1 时,机器人可在网格间移动问题:求机器人可活动的最大范围对应的网格点数目。说明:1)网格左上角坐标为 (0, 0),右

学Java,找哪吒 1432

LibUIDK 开源项目教程

LibUIDK 开源项目教程 1. 项目介绍 LibUIDK 是一个专业的 Windows 平台下图形用户界面(GUI)开发包,基于 Microsoft 的 MFC 库。它最初是一个商业界面库,于 2019 年 9 月 8 日开源。LibUIDK 的主要目标是帮助开发者快速创建类似于 QQ、360 安全卫士等软件的精美界面。 LibUIDK 采用所见即所得的方式创建产品界面,极大地提高了产品的开发...

gitblog_01066的博客 955

51、基于深度卷积神经网络的自闭症分类研究

本研究提出了一种基于深度卷积神经网络的自闭症分类方法,通过融合VGGNet-19和ResNet-52模型的特征,并在决策层采用SVM分类器,实现了对自闭症谱系障碍(ASD)和典型发育(TD)个体的准确区分。研究使用ABIDE数据集,结合数据增强和特征拼接技术,取得了88.12%的分类准确率和0.88的ROC曲线下面积。结果表明,该方法在自闭症自动诊断中具有良好的性能,同时研究也探讨了其局限性,并展望了未来改进方向,如多模态数据融合、迁移学习和模型可解释性的提升。

grpc6streamer的博客 129

PPT里文字太多如何排版-一口气教你7种布局瞬间让PPT高大上起来

PPT里全是文字且很拥挤怎么办?本篇教你使用7种不同的排版让你的PPT瞬间变得高大上起来。

打造全国最全的AI Agent开发知识领域的博客 5022

LibUIDK:助力高效开发Windows平台图形用户界面

LibUIDK:助力高效开发Windows平台图形用户界面 1. 项目基础介绍及编程语言 LibUIDK 是一个开源项目,旨在为Windows平台下的图形用户界面开发提供高效、便捷的解决方案。该项目基于著名的MFC(Microsoft Foundation Class)库,主要使用C++和C两种编程语言进行开发。通过LibUIDK,开发者可以轻松地将美工制作的精美界面用Visual C++实现,大...

gitblog_01010的博客 927

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

vs 2008 界面开发调研

LibUIDK贴图  BCG,xtremes是做vs或office效果最强大的mfc界面库,libuidk是做贴图界面最强大的mfc界面库。  skin++这类hook类型的界面库,基本上没有什么价值,只会使你的程序变得不稳定。它并不会对你的开发界面的过程有任何帮助的。skinse这种界面库和libuidk开发界面的模式应该差不多吧?都是在界面编辑器中创建窗口和控件吧?不过我看了一下,他们不是

心静如水 2901

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

国内各个界面库比较,告诉你怎么选择界面库?

<br />目前网络上的界面库多彩多样。这里以个人的观点,来评价一下界面库。如果有不当的地方望批评指出。<br /> <br />1 Skin++(www.uipower.com)<br />      该界面库是基于WIN32的界面库,以上海勇进公司的形式来运作,公司规模10人内,开发人员5人左右。05年发布第一个版本以来,运作时间较长。但是产品和目前最新出的界面库比较起来,略显逊色。(可能不了解的朋友不信,呵呵~~)可以去下载他们的成功案例来看看。比如:呱呱聊天室(www.17guagua.com)、P

SkinSE界面技术 6411

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

上一篇: [原创]为CEdit设置背景图片
下一篇: [原创]右键加入"命令提示符"
psbeond
博客等级 码龄24年 128粉丝 61原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值