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

KiCad 7.0 + 嘉立创打样:从原理图到实物,打造你的双LLCC68 LoRa串口透传板

本文详细介绍了使用KiCad 7.0设计双LLCC68 LoRa串口透传板的完整流程,从原理图设计到嘉立创打样。重点解析了AVR+LLCC68组合的优势、双模块布局的电磁兼容设计、SPI接口配置及射频走线技巧,并提供了实测数据和常见问题解决方案,帮助开发者高效实现物联网设备的低功耗远距离通信。

weixin_28693447的博客 260

#Linux内存管理# 用一个案例详细介绍ARMv7-A架构 缺页中断处理的原理

跳转到异常向量:根据 异常向量表基地址(通常配置在 VBAR 寄存器中,例如 0xFFFF0000) + 数据中止异常的偏移量 0x10,跳转到数据中止异常的处理程序入口点 0xFFFF0010(实践中,这个入口通常是一条跳转到更复杂处理函数的指令)。malloc 通常不会立即分配物理内存页,它只是在内核为该进程维护的虚拟地址空间中找到一段足够大的空闲虚拟地址区域(比如 0x00008000 - 0x00008FFF),标记为已用,并返回起始地址(例如 0x00008000)给程序。

sinat_37817094的博客 993

C++界面库

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

少得多惑的博客 2万+

智能问数产品背后的Agent技术揭秘:从任务分解到工具调用的完整流程

本文深入解析智能问数产品背后的Agent技术,从任务分解到工具调用的完整流程。通过大模型驱动的语义理解和动态工具调度,Agent系统能高效处理复杂数据分析需求,显著提升响应速度和准确率。文章详细介绍了模块化架构、任务分解机制、动态工具调用及双通道记忆系统等核心技术,展示了大模型时代的新型数据分析范式。

weixin_30399821的博客 438

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

告别WSL:Ollama Windows原生部署与GPU加速实战

本文详细介绍了Ollama在Windows系统上的原生部署与GPU加速实战指南。告别WSL,通过官方原生应用直接调用NVIDIA和AMD显卡,实现更高效的本地大模型运行。文章涵盖系统准备、三步安装、模型拉取运行、GPU性能优化及高级配置,为Windows AI开发者提供一站式解决方案。

prometheus9mon的博客 534

uniapp [全端兼容] - 实现省市区选择器三四级联动组件,uniapp选择地址自定义省市区三级联动插件,弹框式多级联动选择器区域选择(全平台兼容苹果安卓App、支付宝微信小程序、移动端H5网页)

uni-app省市区选择器,省市区街道三级四级联动选择器,uniapp自定义多列选择器省市两级联动,uniapp picker组件实现多级联动,h5移动端网页,微信小程序,支付宝小程序,Android安卓,苹果ios,app,nvue,uniApp选择器省市区县街道乡镇,uniapp实现省市区选择联动,uniapp城市三级联动(自定义组件)_uniapp三级联动,picker插件省市区联动,uniapp小程序省市区选择器,uni-app 省市区街道的四级联动选择,uniapp怎样实现省市区地址三级联动uni

🏆 前端领域优质创作者 1万+

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

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

个人开发记录 2576

【车载以太网】【架构】整体架构与协议标准

车载以太网架构图 应用层:DHCP /SOMEIP/DoIP/XCP/UDPNM 传输层:TCP/IP 网络层:IPv4/IPv6/ARP/ICMP 链路层:IEEE Ethernet MAC+VLAN 物理层:Ethernet PHY: 100BASE-T1/1000BASE-T1/100BASE-Tx

专注汽车软件开发、AutoSAR、车载以太网、SOA、EE架构。 8354

LibUIDK 开源项目教程

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

gitblog_01066的博客 955

AMBA-CHI协议详解(三)

Write Transactions、Atomic transactions、 Stash transactions、 Dataless transactions的等各个事务的事务流。

Crazzy_M的博客 3180

执行任务赚积分

接下来N行,每行两个空格分隔的整数(SLA和V),SLA表示任务的最晚处理时间,V表 示任务对应的积分。每个任务都有最晚处理时间限制和积分值,在最晚处理时间点之前处理完成任务才可获得对应的积分奖励。现有N个任务需要处理,同一时间只能处理一个任务,处理每个任务所需要的时间固定为1。可用于处理任务的时间有限,请问在有限的时间内,可获得的最多积分。第2个时间单位内,处理任务4,获得5个积分。输入描述:第一行为一个数N,表示有N个任务,1

面试高手的博客 4694

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

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

gitblog_01010的博客 927

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

vs 2008 界面开发调研

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

心静如水 2901

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

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

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

SkinSE界面技术 6411

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

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

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值