[原创]使用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万+

agv调度系统3.0技术介绍

agv调度系统,穿梭车调度系统,调度系统技术介绍,教你做调度

持续分享调度系统开发过程 4868

量化投资进阶:Fama-French三因子模型实战解析与Python实现

本文深入解析了Fama-French三因子模型,并提供了完整的Python实战指南。文章阐述了该模型如何通过引入市值因子(SMB)和价值因子(HML),对传统CAPM模型进行重要扩展,以更精准地解释股票收益来源。详细演示了使用Python获取数据、执行回归分析并解读结果(包括关键的阿尔法α)的全过程,并探讨了该模型在量化策略构建、风格诊断和业绩归因中的核心应用。

yog99的博客 1126

C++界面库

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

少得多惑的博客 2万+

Linux之GTK系列教程

00、背上行囊1——程序员学习之道 01、背上行囊2——为什么要学习GTK 02、背上行囊3——GUI概述 03、背上行囊4——GTK简介 04、背上行囊5——GTK环境搭建( Linux ) 05、背上行囊6——GTK环境搭建( windows ) 06、踏上旅途1——一个简单的空白窗口 07、踏上旅途2——控件的添加 08、踏上旅途3——布局容器之水平布局 09、踏上旅途

每天积累一点点 2万+

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

如何用 OBProxy 实现 OceanBase 的最佳路由策略

本文基于业务中一类常见的路由问题展开,对OceanBase的路由功能及对应配置项做详细介绍,指导用户在业务实践中如何正确的配置路由策略及快速排查路由问题

OceanBase分布式数据库的博客 1682

手把手教你用U盘制作Win11启动盘:从PE工具到系统安装全流程

本文提供了一份详尽的Windows 11启动盘制作与系统安装全流程指南。从选择合适的U盘和PE工具开始,重点讲解了如何正确制作包含EFI引导分区的启动盘,并详细演示了在PE环境下进行GPT分区、使用CGI工具安装系统镜像,以及首次启动后的关键设置步骤,帮助用户轻松完成从零到一的系统安装。

weixin_28475533的博客 1287

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

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

个人开发记录 2576

PTA-浙大版 《Python程序设计》 第三章编程题目及答案

博主第一次写优快云的博客,所以排版上可能有些不尽人意,代码部分均为自己的思路,可能复杂或者考虑欠妥,欢迎大家一起讨论~ 第一题:大于身高的平均值 这里用了np数组求得平均数,当然for循环累加也是可以的 import numpy as np data = input().split() data = list(map(int,data)) avg = np.mean(data) for i in data: if i > avg: print(i,end = '

Legendwqs的博客 1万+

LibUIDK 开源项目教程

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

gitblog_01066的博客 955

手机也能跑!5.6MB的AnimeGANv3模型部署实战:从PyTorch到ONNX再到移动端推理

本文详细介绍了如何将轻量级动画生成器AnimeGANv3从PyTorch模型转换为ONNX格式,并部署到移动端进行实时推理。通过5.6MB的极简模型设计和优化策略,实现在手机等边缘设备上的高效动漫风格转换,涵盖模型准备、格式转换、移动端优化及性能调优全流程。

weixin_33724059的博客 383

Pydoll浏览器自动化框架教程

让浏览器自动化回归本质。不再纠缠驱动兼容、不再手动处理验证码、不再因为请求和 UI 分裂而头疼。如果你经常做 Web 自动化、爬虫或者测试,不妨试试 Pydoll。也别忘了给项目点个 ⭐,让作者知道有人喜欢这个工具。👉GitHub 地址。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 204

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

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

gitblog_01010的博客 927

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

vs 2008 界面开发调研

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

心静如水 2901

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

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

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

SkinSE界面技术 6411

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

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

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值