界面_界面设计 - CSDN
精华内容
参与话题
  • 相比之前的那个【简单版】登录界面,该模板新增: 1、js 回车事件,并且能够兼容多个浏览器; 2、界面布局的层次结构优化; 3、按钮监听响应事件的实现方式优化; 4、包含全屏方法的实现; 5、连个div块的叠加; --...
  • 漂亮通用界面

    千次下载 热门讨论 2020-07-30 23:32:04
    Qt漂亮通用界面。 大部分的界面都可以用这个学习,非常漂亮哦!
  • android 漂亮的UI界面 完整的界面设计

    万次下载 热门讨论 2020-07-30 23:33:23
    声明:这也是我学习时在网上下载的,鉴于分享精神,并且觉得很不错才上传...android 漂亮的UI界面 完整的界面设计 这是一个完整的UI设计,但是没写动作,这是一个公司程序员的公司任务设计,请别商用,要用请修改。。。
  • C++界面

    千次阅读 2019-08-03 11:23:23
     ...Xtreme ToolkitPro v15.0.1,Skin++,等界面库,以及一些网友自己写的界面库,开始对于C++软件界面美化有了一点点的心得。不敢藏私,希望和一些新手朋友们分享交流。     一...

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


        一.  开源C++界面库

      

    1.RingSdk

        Ringsdk是CSDN上一个前辈自己写的界面库,这个界面库很轻而易举实现QQ2009的界面效果。链接见 

      http://blog.csdn.net/ringphone/article/details/2911244   貌似Ringsdk和MFC无法进行交互,但是 RingSdk其中有很多的图形处理的代码都非常有参考价值。


    2.redui的官方网站http://www.redui.org 已经打不开了。官方QQ群是 40729296 

    CSDN地址是 
    http://blog.csdn.net/jameshooo/article/details/6677272

    这是官方的说明

    REDUI,又名REDirectUI,全称是Rendering Engine for DirectUI,是一款基于XML描述的 DirectUI 渲染引擎,能将“控件”的交互和渲染过程分解成多种独立的要素,包括布局、视觉效果、样式、UI自动化、滤镜、脚本、事件、3D场景、3D模型、通用动画等。通过这些要素的排列组合,可以呈现出各种不同效果的控件,甚至能在XML中直接自定义控件类型。支持2D/3D无缝融合。
    • REDUI支持GDI/GDI+/DirectDraw/D3D等渲染方式,并有支持OPENGL/ES的愿望


    3.Duilib 这个就比较大名鼎鼎了,不用多说了吧。包括华为网盘在内的很多业内企业都在用这个界面库。我用Duilib做了一个小型的界面。贴出来献丑一个。



    4.WGI-1.0.7-Demo-Project-for-windows 。。额。。时间太长,忘记了这个代码是什么,姑且先忽略它。


    5.cj60lib 这个玩过Gh0st3.6木马的人都熟悉,是一款对MFC进行拓展的界面库

    6.金山界面库 这个就不赘述了,可以直接上金山的论坛找源代码和资料

    7.skinTK_V0.20 一款类似于Skin++的开源界面库

    8.FreeCL_Skin2.3 一款不错的控件库 扩展了常用的MFC控件 。  这个是FreeCL_Skin提供的一个效果实例。



    9.GuiLib1.5 一个老外写的界面库 没有用过,没有调查,就没有发言权。大家自行百度。


    10.基于3D的界面库 MangoGUI_V0.1.5

    MangoGUI是猫仔在DXUT基础上修改得来的一个开源GUI系统。

    目前来说基本上继承了DXUT里面绝大多数的功能和改进了使用方式,让DX学习爱好者更容易去使用GUI系统。

    如果你也是一位对GUI有兴趣的同学,非常欢迎你一同来参与到MangoGUI的设计当中来!

    作者博客

    http://m9551.blog.sohu.com/


    11.基于Skia的directui库metalbone

    代码托管地址

    http://code.google.com/p/metalbone/

    官方说明

    MetalBone是一个C++ DirectUI库。接口、命名等借鉴Qt,而并非使用Windows风格。

    MetalBone的特点是,使用CSS来定制样式(如果没有CSS的话,则什么也不显示,lol)。目前可以使用Direct2D或Google Skia来绘制界面。MetalBone使用的是 WWM协议(基于LGPL)


    12.SonicUI2011

    效果比较不错的一款皮肤库

    作者CSDN地址是 

    http://my.csdn.net/akof1314


    13 基于OpenGl的界面库 beGUI-0.1.3-src

    代码托管地址

     http://code.google.com/p/begui/


                   二 未开源或商业界面库



    1.Flash4UI 

     看命名就知道是将Flash嵌入到UI中。

    官方网站是  http://www.flash4ui.com/

    效果图片



    2.bolt 迅雷7界面引擎

    迅雷界面引擎,这个用过迅雷下载和迅雷看看的就有体会了,界面的确是做的非常的赞。而且流畅,CPU占用和内存各种都很棒。采用了脚本交互的方式,脚本语言采用了Lua.可惜的是迅雷只开放了接口SDK给个人使用。

    官方网址 http://bolt.xunlei.com/


    3.clayui

    百度百科说明   clayui是一个采用纯C++编写的界面框架,可以很方便的移植到各种系统上。现在支持的系统包括android,windows,wince,linux。clayui的特点是能实现各种2D,3D动画,一些WPF,FLEX才能实现的界面效果,通过clayui可以很方便的实现。 clayui的底层渲染支持纯软件渲染,d3d,opengl es硬件加速渲染,您可以根据自身的需求选择合适的渲染方式,使您界面的用户体验达到最佳效果

    效果


    4.DSkinLite

    官方网址  http://www.uieasy.cn/dskinlite/

    官方Demo



    5.libuiDK

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

    官方网站

    http://www.iuishop.com/index.asp

    实例



    6. SiteUi   SkinSE  都有官方网站。就不继续搬砖的工作了。


    7.(未开源)上海勇进UIPower

    这个比较牛逼。一款界面库就是大几百万的。老总阙海忠还亲自录了20集的界面库相关的视频

    官方网站 http://www.uipower.com/

    这是老阙的视频。



    8.炫彩界面库

    炫彩界面库貌似是私人开发的一个界面库,可以用C++.c#易语言等来开发。炫彩库的作者貌似是湖北襄阳人哟。

    官方网站 http://www.xcgui.com/


    9.魔方界面库

    官方网站 http://www.muilib.com/

    MuiLib(Magic UI Library)Windows高级界面开发库是在国内首家免费开源的DuiLib界面开发库基础上经过针对性的扩展而发展起来的,他继承了DuiLib高度自由灵活的特点,并吸收了其他界面库的一些优点,针对Windows层窗口按像素透明技术而重点优化后形成的一个优秀界面开发库,是一个使用纯C++调用Windows API的开发库,无任何其他第三方依赖框架,您可以使用其提供的各种高级控件来创建更加炫酷的用户界面


    10 XtremeToolkit

    Codejock 公司出品的一款界面库。应用也是比较广泛的。在2013版的大灰狼远程操控中就采用了这款界面库。


    11.Sharpui

    代码托管地址  https://github.com/china520/sharpui

    Sharpui是居于现在流行的DUI思想的一套界面库,可以方便实现半透明和各种界面效果,采用纯c++实现,分为引擎和控件两个部分,这两个部分采用动态库的形式提供,引擎部分处理了事件、资源、渲染、控制逻辑,同时提供了各种应用层面控件的实现基类,包括:Visual、Element、FrameworkElement、Control、ContentControl、Window、Panel、Popup,这些类封装了基础控件的实现细则,所有用户实现的控件都必须继承自这些类,对于需要呈现的控件必须继承至FrameworkElement。
    控件部分提供的所有控件均采用DUI方式实现、分层绘制,实现各种常用的布局控件,可灵活实现界面的自动布局;Sharpui本身所有数据结构采用原生实现,内存自动管理,不依赖于std的任何容器,使得库的使用更加独立、编译更加简单,使用VS任意一个版本编译都可以用在其它版本里,不需要担心由于std版本原因而产生编译问题。



    以上都是我在工作和个人业余时间收集积累的开源或商业界面库,这些界面库各有各的特色和侧重点,也有不同的换肤思想,如果要用在项目中还是要进行适当的增删整改。

    由于个人能力水平见识有限,也有些大神的作品没有被收录其中。表示遗憾。




    /**************************************************Witch_Soya***********************************************************/

    /**************************************************2013年9月3日15:55:18***********************************************/

    展开全文
  • 教你用Python写界面

    万次阅读 多人点赞 2018-11-18 18:58:06
    作为Pyhon开发者,你迟早都会碰到图形用户界面(GUI)应用开发任务,这时候我们就需要一些界面库来帮助我们快速搭建界面,python的界面库很多,我认识的并不多,这里只列出几种我认识的 1.tkinter Tkinter(也叫Tk...

    好代码本身就是最好的文档。当你需要添加一个注释时,你应该考虑如何修改代码才能不需要注释

    作为Pyhon开发者,你迟早都会碰到图形用户界面(GUI)应用开发任务,这时候我们就需要一些界面库来帮助我们快速搭建界面,python的界面库很多,我认识的并不多,这里只列出几种我认识的

    1.tkinter

    Tkinter(也叫Tk接口)是Tk图形用户界面工具包标准的Python接口。Tk是一个轻量级的跨平台图形用户界面(GUI)开发工具。Tk和Tkinter可以运行在大多数的Unix平台、Windows、和Macintosh系统。

    Tkinter 由一定数量的模块组成。Tkinter位于一个名为_tkinter(较早的版本名为tkinter)的二进制模块中 。Tkinter包含了对Tk的低 级接口模块,低级接口并不会被应用级程序员直接使用,通常是一个共享库(或DLL),但是在一些情况下它也被Python解释器静态链接。

    2.pyqt

    PyQt是Qt库的Python版本。PyQt3支持Qt1到Qt3。 PyQt4支持Qt4。它的首次发布也是在1998年,但是当时它叫 PyKDE,因为开始的时候SIP和PyQt没有分开。PyQt是用SIP写的。PyQt 提供 GPL版和商业版。

    3.wxpython

    wxPython 是 Python 语言的一套优秀的 GUI 图形库,允许 Python 程序员很方便的创建完整的、功能键全的 GUI 用户界面。 wxPython 是作为优秀的跨平台 GUI 库 wxWidgets 的 Python 封装和 Python 模块的方式提供给用户的。

    就如同Python和wxWidgets一样,wxPython也是一款开源软件,并且具有非常优秀的跨平台能力,能够运行在32位windows、绝大多数的Unix或类Unix系统、Macintosh OS X上。

    4.Kivy

    这是一个非常有趣的项目,基于OpenGL ES 2,支持Android和iOS平台的原生多点触摸,作为事件驱动的框架,Kivy非常适合游戏开发,非常适合处理从widgets到动画的任务。如果你想开发跨平台的图形应用,或者仅仅是需要一个强大的跨平台图形用户开发框架,Kivy都是不错的选择。
    5.pygame

    Pygame是跨平台Python模块,专为电子游戏设计,包含图像、声音。建立在SDL基础上,允许实时电子游戏研发而无需被低级语言(如机器语言汇编语言)束缚。

    这个库使用来写游戏的,但是你也可以用来写界面,嘿嘿

    那选择什么库是个人的喜好,但是我推荐尽可能去选择一种通过且学习资料比较多的吧,我这里选择的是tkinter,项目要求比较急,没怎么挑就选了。。。。

    我学习也不是很深,如果你想要进行更深的学习请前往tkinter官方文档

    先来看看Tkinter里面的基础控件

    接下来的代码讲解中你需要导入这些

    from tkinter import *
    from tkinter.tix import Tk, Control, ComboBox  #升级的组合控件包
    from tkinter.messagebox import showinfo, showwarning, showerror #各种类型的提示框

    在进行界面绘制之前你需要初始化Tk()

    root = Tk() # 初始化Tk()

    root便是你布局的根节点了,以后的布局都在它之上

    root.title("hello tkinter")    # 设置窗口标题
    root.geometry("800x1000")    # 设置窗口大小 注意:是x 不是*
    root.resizable(width=True, height=True) # 设置窗口是否可以变化长/宽,False不可变,True可变,默认为True
    root.tk.eval('package require Tix')  #引入升级包,这样才能使用升级的组合控件

    设置一些窗口属性

    1.Label

    再来看看Label,它的属性很多

    activebackground, activeforeground, anchor,
    background, bitmap, borderwidth, cursor,
    disabledforeground, font, foreground,
    highlightbackground, highlightcolor,
    highlightthickness, image, justify,
    padx, pady, relief, takefocus, text,
    textvariable, underline, wraplength
    height, state, width

    太多了,作用基本和名字一样,这里就不一一说了,你可以自己去试试,我说一下常用的属性

    lable = Label(root, text="label", bg="pink",bd=10, font=("Arial",12), width=8, height=3)
    lable.pack(side=LEFT)

     

     

    第一个 要依附的节点
    text 上面显示的字
    bg 背景颜色  也可以传rgb16进制的形式
    bd 边框宽度
    font 字体 第一个是字体样式 第二个是字体大小
    width  height 宽 高
    bitmap 图像
    highlightcolor 高亮时字体颜色
    highlightbackground 高亮时背景颜色
    textvariable 绑定的变量 之后如果变量值发生变动 字也会随之改变
    wraplength 换行控制 如果是50就表示宽度到50就换行显示

    最后你需要调用pack()来把控件布置上去,你可以指定布局方式,可定义的属性也非常多

    # Booleans
    NO=FALSE=OFF=0
    YES=TRUE=ON=1
    
    # -anchor and -sticky
    N='n'
    S='s'
    W='w'
    E='e'
    NW='nw'
    SW='sw'
    NE='ne'
    SE='se'
    NS='ns'
    EW='ew'
    NSEW='nsew'
    CENTER='center'
    
    # -fill
    NONE='none'
    X='x'
    Y='y'
    BOTH='both'
    
    # -side
    LEFT='left'
    TOP='top'
    RIGHT='right'
    BOTTOM='bottom'
    
    # -relief
    RAISED='raised'
    SUNKEN='sunken'
    FLAT='flat'
    RIDGE='ridge'
    GROOVE='groove'
    SOLID = 'solid'
    
    # -orient
    HORIZONTAL='horizontal'
    VERTICAL='vertical'
    
    # -tabs
    NUMERIC='numeric'
    
    # -wrap
    CHAR='char'
    WORD='word'
    
    # -align
    BASELINE='baseline'
    
    # -bordermode
    INSIDE='inside'
    OUTSIDE='outside'
    
    # Special tags, marks and insert positions
    SEL='sel'
    SEL_FIRST='sel.first'
    SEL_LAST='sel.last'
    END='end'
    INSERT='insert'
    CURRENT='current'
    ANCHOR='anchor'
    ALL='all' # e.g. Canvas.delete(ALL)
    
    # Text widget and button states
    NORMAL='normal'
    DISABLED='disabled'
    ACTIVE='active'
    # Canvas state
    HIDDEN='hidden'
    
    # Menu item types
    CASCADE='cascade'
    CHECKBUTTON='checkbutton'
    COMMAND='command'
    RADIOBUTTON='radiobutton'
    SEPARATOR='separator'
    
    # Selection modes for list boxes
    SINGLE='single'
    BROWSE='browse'
    MULTIPLE='multiple'
    EXTENDED='extended'
    
    # Activestyle for list boxes
    # NONE='none' is also valid
    DOTBOX='dotbox'
    UNDERLINE='underline'
    
    # Various canvas styles
    PIESLICE='pieslice'
    CHORD='chord'
    ARC='arc'
    FIRST='first'
    LAST='last'
    BUTT='butt'
    PROJECTING='projecting'
    ROUND='round'
    BEVEL='bevel'
    MITER='miter'
    
    # Arguments to xview/yview
    MOVETO='moveto'
    SCROLL='scroll'
    UNITS='units'
    PAGES='pages'

    写完这些你运行程序发现还是无法出现界面,那是因为你还少了一句

    root.mainloop()

    加上这句话使程序进入消息循环,界面便会显示出来

    学完了label之后学其他控件也就简单了很多,因为很多属性都是相同的

    2.Button

    button=Button(root,text='QUIT',command=root.quit,activeforeground="black",activebackground='blue',bg='red',fg='white')
    button.pack(fill=Y,expand=1)

    之前说过的属性如果没有特殊情况就不再说了

    command 点击调用的方法
    activeforeground 点击时按钮上字的颜色
    activebackground 点击时按钮的背景颜色

    3.Scale

    def resize(ev=None):
        lable.config(font='Helvetica -%d bold'%scale.get())
    scale=Scale(root,from_=10,to=40,orient=HORIZONTAL,command=resize)
    scale.set(12)
    scale.pack()

    和button不同的是command不再是点击事件了而是拖动事件 ,调用set()方法可以设置当前位置

    from_ 滑动条起始值
    to 滑动条终点值
    origent 样式 两种样式 一横一竖

    4.NumbericUpDown

    ct=Control(root,label='Number:',integer=True,max=12,min=2,value=2,step=2)
    ct.label.config(font='Helvetica 14 bold')
    ct.pack()
    integer 是否为整数
    max 最大值
    min 最小值
    value 初始值
    step 步长

    这是一个数字选择框 其中的字体配置需要使用config()方法来进行配置

    5.ComboBox

    cb=ComboBox(root,label='Type:',editable=True)
    for animal in ('dog','cat','hamster','python'):
        cb.insert(END,animal)
    cb.pack()

    这是一个下拉选择框,label前面要显示的字,editable控制是否可更改

    调用insert()给下拉选择框添加选项

    6.Menu

    def click():
        print("点击了一次")
    menubar=Menu(root)
    root.config(menu=menubar)
    filemenu=Menu(menubar,tearoff=0)
    menubar.add_cascade(label='文件',menu=filemenu)
    filemenu.add_command(label='新建...',command=click())
    filemenu.add_command(label='打开...',command=click())
    filemenu.add_command(label='保存',command=click())
    filemenu.add_command(label='关闭填写',command=root.quit)

    惨淡蓝需要所依附的节点配置menu才能起作用

    调用add_cascade给menu添加一项选项

    带哦用add_command则是给外层的选项添加一个子选项

    7.Frame

    frame1 =Frame(root)
    frame1.pack(fill=X)
    lable1=Label(frame1,text='您的花名:  ')
    lable1.grid(row=1,column=0)

    frame相当于一个局部的窗体,可以用来装载其它控件

    使用grid能让你更容易把握控件的位置,你可以指定它出现在几行几列,是否跨行跨列,跨几行等等

    8.Radiobutton

    frame2=Frame(root)
    frame2.pack(fill=X)
    lable2=Label(frame2,text='您的性别:  ')
    lable2.grid(row=1,column=0)
    sex=StringVar()
    sex_male=Radiobutton(frame2,text='男',fg='blue',variable=sex,value='男')
    sex_male.grid(row=1,column=2)
    sex_female=Radiobutton(frame2,text='女',fg='red',variable=sex,value='女')
    sex_female.grid(row=1,column=4)

    这是一个单选框,里面的属性之前也说过

    9.ListBox

    frame4 =Frame(root)
    frame4.pack(fill=X)
    lable4=Label(frame4,text='4、请删除您不会的变成语言:  ')
    lable4.grid(row=1,column=0)
    listbox=Listbox(frame4)
    listbox.grid(row=1,column=1)
    for item in ["C","C++","JAVA","PYTHON","R","SQL","JS"]:
        listbox.insert(END,item)
    DELETE=Button(frame4,text="删除",command=lambda listbox=listbox:listbox.delete(ANCHOR))
    DELETE.grid(row=1,column=2)
    language=Button(frame4,text="确定")
    language.grid(row=2,column=1)

    这是一个列表,注意这里按钮点击事件的写法是用lambda表达式写的

    10.Canvas

    canvas = Canvas(window, width = 200, height = 100, bg = "White")
    canvas.pack()

    这是一个画板,你可以在上面画各种形状,上例子:

    from tkinter import *
    
    class CanvasDemo:
        def __init__(self):
            window = Tk()
            window.title("CanvasDemo")
    
            self.canvas = Canvas(window, width = 200, height = 100, bg = "White")
            self.canvas.pack()
    
            frame = Frame(window)
            frame.pack()
    
            btRectangle = Button(frame, text = "长方形", command = self.displayRect)
            btOval = Button(frame, text="椭 圆", command=self.displayOval)
            btArc = Button(frame, text = "圆 弧", command = self.displayArc)
            btPolygon = Button(frame, text="多边形", command=self.displayPolygon)
            btLine = Button(frame, text=" 线 ", command=self.displayLine)
            btString = Button(frame, text="文 字", command=self.displayString)
            btClear = Button(frame, text="清 空", command=self.clearCanvas)
    
            btRectangle.grid(row = 1, column = 1)
            btOval.grid(row=1, column=2)
            btArc.grid(row=1, column=3)
            btPolygon.grid(row=1, column=4)
            btLine.grid(row=1, column=5)
            btString.grid(row=1, column=6)
            btClear.grid(row=1, column=7)
    
            window.mainloop()
    
        def displayRect(self):
            self.canvas.create_rectangle(10, 10, 190, 90, tags = "rect")
        def displayOval(self):
            self.canvas.create_oval(10, 10, 190, 90, tags = "oval", fill = "red")
        def displayArc(self):
            self.canvas.create_arc(10, 10, 190, 90, start = -90, extent = 90, width = 5, fill = "red", tags = "arc")
        def displayPolygon(self):
            self.canvas.create_polygon(10, 10, 190, 90, 30, 50, tags = "polygon")
        def displayLine(self):
            self.canvas.create_line(10, 10, 190, 90, fill = 'red', tags = "line")
            self.canvas.create_line(10, 90, 190, 10, width = 9, arrow = "last", activefill = "blue", tags = "line")
        def displayString(self):
            self.canvas.create_text(60, 40, text = "Hi,i am a string", font = "Tine 10 bold underline", tags = "string")
        def clearCanvas(self):
            self.canvas.delete("rect", "oval", "arc", "polygon", "line", "string")
    
    CanvasDemo()

     11.CheckButton

    frame8=Frame(root)
    frame8.pack()
    agree=StringVar()
    agree=Checkbutton(frame8,text='我同意',variable=agree,onvalue='确定',offvalue="不确定",)
    agree.grid()

    这是一个多选框,oncalue代表被勾选时的值,offvalue代表不被勾选时的值

    12.LabelFrame

    frame10=Frame(root)
    frame10.pack()
    group=LabelFrame(frame10,text='特别鸣谢',padx=5,pady=5)
    group.grid()
    w=Label(group,text='容器框')
    w.pack()

    这是个容器框,padx,pady分别控制在x,y方向上的外边距

    差不多这些控件已经够用了,我这还有几个小例子供你练习

    展开全文
  • 地方

    主要面向想做出图形界面的C语言初学者

    C语言初学者开始都是在黑白控制台上开发一些小程序,实现一些小功能,因为基础的C语言可视化效果比较差,所展示的都是黑白的字符和数字,比较单调乏味。一些大学的计算机类专业学生,大一学习C语言,学习基础语法和算法,通过平台刷题提高自己编程能力,一般不专门学习图形化编程,期中或者期末可能会有开发一个小游戏或者小系统(如学生成绩管理系统、银行管理系统、日程管理系统等)的任务。这时如果在实现基本功能的情况下做出优美的图形界面,会比较出彩并且会有满满的成就感。

    一、环境准备

    操作系统:windows 10
    编译环境:VS 2017
    图形库:EasyX_20190415(beta)

    下载链接
    VS 2017: 微软官网
    EasyX图形库:EaxyX官网

    下面介绍一下EasyX:
    EasyX 是针对 C++ 的图形库,可以帮助 C语言或C++语言初学者快速上手图形和游戏编程,比如用编译环境和EasyX图形库可以轻松画一个房子,或者一辆移动的小车,可以编写俄罗斯方块、贪吃蛇、黑白棋等小游戏,或者导入一张图片,可以练习图形学的各种算法,等等。
    如何安装:
    需要先下载安装好编译环境VS2017,然后再下载安装EasyX图形库,安装时选择安装在Visual C++2017目录下即可。
    安装截图

    二、程序运行截图

    欢迎界面
    在这里插入图片描述
    系统初始界面
    在这里插入图片描述
    学生端
    在这里插入图片描述
    教师端
    在这里插入图片描述

    三、部分源码展示

    下面是代码的头文件、宏定义、函数声明部分。完整源码请在下方获取

     /************************************************************************
    程序名:日程管理系统
    版本号:2.0
    开发者:符泽林
    程序功能:1)设计学生端口和教师端口,学生端学生自我管理,教师端教师监督管理
    		  2)注册、登录账号,修改密码
    		  3)添加、修改、删除、显示日程
    		  4)文件自动保存
    		  5) 精美界面,界面友好,交互性强
    		  6)系统会进行自动保存
    		  7)登录后退出需要重新登录
    ************************************************************************/
    
    /*对库函数的定义*/
    #include <graphics.h>      // 引用图形库头文件
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #include<math.h>
    #include <conio.h>
    #include<tchar.h>
    
    /*宏定义*/
    #define NUMBER 100//定义可容纳(学生/教师)的用户数量 
    #define MANAGELENGTH 30//定义事件长度(包含时间) 
    #define STRLENGTH 30//定义用户名长度
    #define NUMLENGTH 12//定义密码长度 
    
    /*定义图片*/
    IMAGE welcome;//欢迎界面
    IMAGE welcome_button;//ENTER按钮
    IMAGE startup;//初始界面
    IMAGE stu1;//学生端初始
    IMAGE stu1_return;
    IMAGE stu1_exit;
    IMAGE stu_register;//学生端:创建账户
    IMAGE stu_logon;//学生端:学生登录
    IMAGE stu_resetpassword;//学生端:修改密码
    IMAGE stu_schedulemanagement1;//学生端:日程管理界面1
    IMAGE stu_schedulemanagement2;//学生端:日程管理界面2
    IMAGE stu_schedulemanagement2_return;
    IMAGE stu_schedulemanagement2_exit;
    IMAGE teacher1;//教师端初始
    IMAGE teacher1_return;
    IMAGE teacher1_exit;
    IMAGE teacher_register;//教师端:创建账户
    IMAGE teacher_logon;//教师端:教师登录
    IMAGE teacher_resetpassword;//教师端:修改密码
    IMAGE teacher_schedulemanagement1;//教师端:日程管理界面1
    IMAGE teacher_schedulemanagement2;//教师端:日程管理界面2
    IMAGE teacher_schedulemanagement2_return;
    IMAGE teacher_schedulemanagement2_exit;
    IMAGE createschedule;//学生端:创建日程
    IMAGE resetschedule;//学生端:修改日程
    IMAGE finishedcondition;//学生端:完成状态
    IMAGE setstuschedule;//教师端:设定学生日程
    IMAGE resetstuschedule;//教师端:修改学生日程
    IMAGE checkfinishedcondition;//教师端:查看完成状态
    IMAGE end;//结束界面
    
    /*全局变量*/
    int nStudentNum = 0;//注册的学生编号(从0开始)(同时也代表着注册人数) 
    int nTeacherNum = 0;//注册的教师编号 (第一个注册的用户编号为0) 
    int nStuFlag = 0;//定义判断学生是否登录的标志变量
    int nTeacherFlag = 0;//定义判断教师是否登录的标志变量 
    int studentnum;//定义登录的学生编号
    int teachernum;//定义登录的教师编号
    
    /*定义学生结构体数组*/
    struct student
    {
    	wchar_t szName[STRLENGTH];//定义学生用户名
    	wchar_t password1[NUMLENGTH];//定义学生账户密码
    	wchar_t password2[NUMLENGTH];//定义学生二次输入密码
    	int nSerialNum;//定义学生序号(从1开始) 
    	int nManagement = 0;//定义学生的日程事件数  
    	wchar_t Management1[10][MANAGELENGTH];//定义存储该学生设定的初始时间字符数组      设定一个学生最多设定10个事件 
    	wchar_t Management2[10][MANAGELENGTH];//定义存储该学生设定的截止时间字符数组
    	wchar_t Management3[10][MANAGELENGTH];//定义存储该学生设定的日程内容字符数组
    	wchar_t FinishStatus[10][MANAGELENGTH];//定义每个学生设定的日程的完成状态 
    }stu[NUMBER];
    
    /*定义教师的结构体数组*/
    struct  teacher
    {
    	wchar_t szName[STRLENGTH];//定义教师用户名
    	wchar_t password1[NUMLENGTH];//定义教师账户密码
    	wchar_t password2[NUMLENGTH];//定义教师二次输入密码 
    	int nSerialNum;//定义老师序号(从1开始) 
    }teacher[NUMBER];
    
    /*函数声明***********************************************/
    
    /*欢迎界面函数*/
    void Welcome(FILE *fp);
    
    /*文件保存函数*/
    void SaveFile(FILE *fp);
    
    /*一级主菜单函数*/
    void Select_MainMenu(FILE *fp);
    
    /*二级菜单函数*/
    
    //二级菜单学生端目录显示
    void OutputStu_SecondMenu(FILE *fp);
    //二级菜单教师端目录显示
    void OutputTeacher_SecondMenu(FILE *fp);
    //二级菜单:学生创建账户 
    void Stu_Register(FILE *fp);
    // 二级菜单:学生登录
    void Stu_Logon();
    //二级菜单:学生修改密码
    void Stu_ResetPassword(FILE *fp);
    //二级菜单:学生日程管理
    void Stu_ScheduleManagement(FILE *fp);
    //二级菜单:教师创建账户
    void Teacher_Register(FILE *fp);
    //二级菜单:教师登录
    void Teacher_Logon();
    //二级菜单:教师修改密码
    void Teacher_ResetPassword(FILE *fp);
    //二级菜单:教师对学生日程管理
    void Teacher_ScheduleManagement(FILE *fp);
    
    /*二级菜单结束*/
    
    /*三级菜单*/
    
    //三级菜单:新建日程 
    void CreateSchedule(FILE *fp);
    //三级菜单:修改日程
    void ResetSchedule(FILE *fp);
    //三级菜单:完成状态
    void FinishedCondition(FILE *fp);
    //三级菜单:设定学生日程
    void SetStuSchedule(FILE *fp);
    //三级菜单:修改学生日程
    void ResetStuSchedule(FILE *fp);
    //三级菜单:查看学生完成状态
    void CheckFinishedCondition();
    
    /*三级菜单结束*/
    
    /*函数声明结束********************************************/
    

    四、完整文件

    日程管理系统
    提取码:3x07
    说明:图片都是用ps自己制作的,切不可更改图片命名,否则会导致程序无法运行,因为图片命名和代码要保持一致。

    五、要点

    1、创建项目:新建-项目-空项目-右键“源文件”-添加-新建项-C++文件
    2、编码字符集:unicode字符集
    在这里插入图片描述
    3.将图片资源直接导入到所命名的文件夹中,注意不要将图片打包文件夹后再放入,要直接将图片导入对应文件夹。
    4.程序中要多次用到图形库的函数,建议刚接触的初学者查看EasyX安装时附带的官方帮助文档,也可以参考我分享的源代码。但是考虑到帮助文档内容较少,对函数的用法介绍较少,下面分享一个关于EasyX图形库详细函数用法介绍的文档。
    EasyX函数详细介绍文档
    提取码:6wdk
    5.解决方案配置有两种选择:debug和release,程序编译后会生成对应的文件,如debug文件夹,将图片资源导入该文件夹就可以直接运行文件夹内的可执行文件,否则无法运行,release同理。

    六、最后的话

    本文不谈高深的技术,只介绍了最基础的基于EasyX图形库的C语言图形化编程,比较简单适合初学者,但是学好了同样可以开发出非常棒的程序。当时刚接触C语言和图形界面时不知从何下手,后来发现EasyX这个简单好用的库,没有找到很多详细的文章和博客。自己看EaxyX帮助文档和一些源码学到了一些东西,学了ps做了几十张图片,最后写出了这个日程管理系统,于是决定将我学到的东西和写的程序分享给大家,没有多好,希望给大家一个参考,衷心的希望本文可以对大家有所帮助,欢迎大家留言呀。

    展开全文
  • 用MFC做漂亮界面之登录界面

    万次阅读 2018-05-07 10:28:45
    转自:https://blog.csdn.net/u011711997/article/details/79375710前段时间由于工作原因,一直没有更新博客...这个登录界面的效果图如下:分析当我们看到这个界面的时候,先不要忙着去做,先要分析一下哪些是代码做...

    转自:https://blog.csdn.net/u011711997/article/details/79375710

    前段时间由于工作原因,一直没有更新博客,今天,继续讲解如何用MFC做漂亮界面,前几次我们讲了如何美化窗口背景,如何美化标题,如何美化按钮,今天我们用以前学过的知识来一起做一个登录界面,这个登录界面的效果图如下:

    分析

    当我们看到这个界面的时,先不要忙着去做,先要分析一下哪些是代码做的,哪些不是代码做的,这样就可以减少工作量。大家试试看,分析一下哪些是留在背景上的,不需要我们去做?没错,一共有5个部分是留在背景上的,分别如下:

    第一个是老虎,这个不用多说。

    第二个是账号,因为这个是美术字,加了特效,代码没法实现。

    第三个是密码,同上。

    第四个是账号输入框,因为这个框的边框加了特效,所以要留下。

    第五个是密码输入框,同上。

    美化窗口背景

    创建一个对话框项目,命名为LoginTigger,去掉取消按钮和确定按钮,并且修改对话框的Border为None,然后在函数OnInitDialog中修改窗口尺寸为背景图片尺寸。具体如下:

    1. BOOL CLoginTiggerDlg::OnInitDialog()  
    2. {  
    3.     CDialogEx::OnInitDialog();  
    4.   
    5.     // 将“关于...”菜单项添加到系统菜单中。  
    6.   
    7.     // IDM_ABOUTBOX 必须在系统命令范围内。  
    8.     ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);  
    9.     ASSERT(IDM_ABOUTBOX < 0xF000);  
    10.   
    11.     CMenu* pSysMenu = GetSystemMenu(FALSE);  
    12.     if (pSysMenu != NULL)  
    13.     {  
    14.         BOOL bNameValid;  
    15.         CString strAboutMenu;  
    16.         bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);  
    17.         ASSERT(bNameValid);  
    18.         if (!strAboutMenu.IsEmpty())  
    19.         {  
    20.             pSysMenu->AppendMenu(MF_SEPARATOR);  
    21.             pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);  
    22.         }  
    23.     }  
    24.   
    25.     // 设置此对话框的图标。  当应用程序主窗口不是对话框时,框架将自动  
    26.     //  执行此操作  
    27.     SetIcon(m_hIcon, TRUE);         // 设置大图标  
    28.     SetIcon(m_hIcon, FALSE);        // 设置小图标  
    29.   
    30.     // TODO:  在此添加额外的初始化代码  
    31.   
    32.     //这个是我们自己加的  
    33.     MoveWindow(0, 0, 300, 400);  
    34.   
    35.     return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE  
    36. }  

    然后,编译代码,效果如下:

    下面我们显示背景图片到窗口中,就完成了美化背景,首先在我们的对话框的头文件中增加一个CBrush变量,变量名是m_bkBrush,它代表我们的背景图片,在OnInitDialog中加载背景图片Tigger.png,具体如下:

    1. BOOL CLoginTiggerDlg::OnInitDialog()  
    2. {  
    3.     CDialogEx::OnInitDialog();  
    4.   
    5.     // 将“关于...”菜单项添加到系统菜单中。  
    6.   
    7.     // IDM_ABOUTBOX 必须在系统命令范围内。  
    8.     ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);  
    9.     ASSERT(IDM_ABOUTBOX < 0xF000);  
    10.   
    11.     CMenu* pSysMenu = GetSystemMenu(FALSE);  
    12.     if (pSysMenu != NULL)  
    13.     {  
    14.         BOOL bNameValid;  
    15.         CString strAboutMenu;  
    16.         bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);  
    17.         ASSERT(bNameValid);  
    18.         if (!strAboutMenu.IsEmpty())  
    19.         {  
    20.             pSysMenu->AppendMenu(MF_SEPARATOR);  
    21.             pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);  
    22.         }  
    23.     }  
    24.   
    25.     // 设置此对话框的图标。  当应用程序主窗口不是对话框时,框架将自动  
    26.     //  执行此操作  
    27.     SetIcon(m_hIcon, TRUE);         // 设置大图标  
    28.     SetIcon(m_hIcon, FALSE);        // 设置小图标  
    29.   
    30.     // TODO:  在此添加额外的初始化代码  
    31.   
    32.     //这个是我们自己加的  
    33.     MoveWindow(0, 0, 300, 400);  
    34.   
    35.     //加载背景图片  
    36.   
    37.     CString strBmpPath = _T(".\\res\\Tigger.png");  
    38.   
    39.     CImage img;  
    40.   
    41.     img.Load(strBmpPath);  
    42.   
    43.     CBitmap bmpTmp;  
    44.   
    45.     bmpTmp.Attach(img.Detach());  
    46.   
    47.     m_bkBrush.CreatePatternBrush(&bmpTmp);  
    48.   
    49.     return TRUE;  
    50. }  

    然后添加WM_CTLCOLOR响应函数,不懂得可以翻阅一下前面的文章,具体如下:

    1. HBRUSH CLoginTiggerDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)  
    2. {  
    3.     HBRUSH hbr = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor);  
    4.   
    5.     // TODO:  在此更改 DC 的任何特性  
    6.   
    7.     // TODO:  如果默认的不是所需画笔,则返回另一个画笔  
    8.   
    9.     if (pWnd == this)  
    10.     {  
    11.         return m_bkBrush;  
    12.     }  
    13.   
    14.     return hbr;  
    15. }  

    编译,运行效果如下:


    至此,美化背景完成,是不是很简单。

    添加标题

    我们首先创建一个CCaption类,继承自CStatic,然后添加成员函数HBRUSH CtlColor(CDC* pDC, UINT nCtlColor),不懂得可以翻阅前面的文章,具体如下:

    1. HBRUSH CCaption::CtlColor(CDC* pDC, UINT /*nCtlColor*/)  
    2. {  
    3.     CFont font;  
    4.     LOGFONT lf;  
    5.     if (!pDC)  
    6.         return NULL;  
    7.     //创建一个空画刷,返回这个画刷可以让静态控件的背景透明    
    8.     HBRUSH hr = (HBRUSH)GetStockObject(NULL_BRUSH);  
    9.     //让文字的背景透明        
    10.     pDC->SetBkMode(TRANSPARENT);  
    11.     //设置文字的颜色为白色    
    12.     pDC->SetTextColor(RGB(255, 255, 255));  
    13.     ::ZeroMemory(&lf, sizeof(lf));  
    14.     //设置逻辑字体的高度  
    15.     lf.lfHeight = 24;  
    16.     //设置逻辑字体为粗体字    
    17.     lf.lfWeight = FW_BOLD;  
    18.     //设置字体为宋体    
    19.     ::lstrcpy(lf.lfFaceName, _T("宋体"));  
    20.     //用逻辑字体创建一个CFont对象    
    21.     font.CreateFontIndirect(&lf);  
    22.     //应用字体    
    23.     pDC->SelectObject(&font);  
    24.     return hr;  
    25. }  

    然后再添加一个成员函数,控制这个标题的显示位置和范围,具体如下:

    1. void CCaption::Init(int nX, int nY, int nW, int nH)  
    2. {  
    3.     MoveWindow(nX, nY, nW, nH);  
    4. }  

    然后,在对话框上添加一个静态控件,ID为IDC_STATIC_CAPTION,并且为它定义一个控件变量,命名为m_staticCap,再然后,修改它的类型为CCaption,并在OnInitDialog中设置标题的位置和范围,具体代码如下:

    1. BOOL CLoginTiggerDlg::OnInitDialog()  
    2. {  
    3.     CDialogEx::OnInitDialog();  
    4.   
    5.     // 将“关于...”菜单项添加到系统菜单中。  
    6.   
    7.     // IDM_ABOUTBOX 必须在系统命令范围内。  
    8.     ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);  
    9.     ASSERT(IDM_ABOUTBOX < 0xF000);  
    10.   
    11.     CMenu* pSysMenu = GetSystemMenu(FALSE);  
    12.     if (pSysMenu != NULL)  
    13.     {  
    14.         BOOL bNameValid;  
    15.         CString strAboutMenu;  
    16.         bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);  
    17.         ASSERT(bNameValid);  
    18.         if (!strAboutMenu.IsEmpty())  
    19.         {  
    20.             pSysMenu->AppendMenu(MF_SEPARATOR);  
    21.             pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);  
    22.         }  
    23.     }  
    24.   
    25.     // 设置此对话框的图标。  当应用程序主窗口不是对话框时,框架将自动  
    26.     //  执行此操作  
    27.     SetIcon(m_hIcon, TRUE);         // 设置大图标  
    28.     SetIcon(m_hIcon, FALSE);        // 设置小图标  
    29.   
    30.     // TODO:  在此添加额外的初始化代码  
    31.   
    32.     //这个是我们自己加的  
    33.     MoveWindow(0, 0, 300, 400);  
    34.   
    35.     //加载背景图片  
    36.   
    37.     CString strBmpPath = _T(".\\res\\Tigger.png");  
    38.   
    39.     CImage img;  
    40.   
    41.     img.Load(strBmpPath);  
    42.   
    43.     CBitmap bmpTmp;  
    44.   
    45.     bmpTmp.Attach(img.Detach());  
    46.   
    47.     m_bkBrush.CreatePatternBrush(&bmpTmp);  
    48.   
    49.     //调整标题位置  
    50.   
    51.     m_staticCap.Init(4, 8,105, 30);  
    52.   
    53.     return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE  
    54. }  

    编译程序,显示效果如下:

    根据前面的学习,相信肯定有同学会说,还没有加窗口移动,对,别着急,现在就加,具体代码如下:

    1. LRESULT CLoginTiggerDlg::OnNcHitTest(CPoint point)  
    2. {  
    3.     // TODO:  在此添加消息处理程序代码和/或调用默认值  
    4.     LRESULT ret = CDialogEx::OnNcHitTest(point);  
    5.     return (ret == HTCLIENT) ? HTCAPTION : ret;  
    6. }  
    不懂得,可以看一下前面的文章,这里就不做过多介绍了。

    添加关闭按钮

    关闭按钮一共有三张图片分别对应正常,按下,悬浮(鼠标移动在上面的时候),具体如下:


    首先我们需要为对话框添加一个关闭按钮的控件,命名为IDC_BUTTON_CLOSE,然后设置为Owner Draw,并添加一个控件变量,命名为m_btnClose,然后定义一个美化的按钮类,继承自CButton,命名为CMyButton,具体代码如下:

    MyButton.h内容如下:

    1. #pragma once  
    2.   
    3. // CMyButton  
    4.   
    5. class CMyButton : public CButton  
    6. {  
    7.     DECLARE_DYNAMIC(CMyButton)  
    8.   
    9. public:  
    10.     CMyButton();  
    11.     virtual ~CMyButton();  
    12.   
    13. protected:  
    14.     //正常状态图像路径  
    15.     CString m_strNormalImgPath;  
    16.     //按下状态图像路径  
    17.     CString m_strPressImgPath;  
    18.     //悬浮状态图像路径  
    19.     CString m_strFloatImgPath;  
    20.   
    21.     //正常状态图像  
    22.     CImage m_imgNormal;  
    23.     //按下状态图像  
    24.     CImage m_imgPress;  
    25.     //悬浮状态图像  
    26.     CImage m_imgFloat;  
    27.   
    28.     //窗口背景图片  
    29.     CImage m_BkImg;  
    30.   
    31. public:  
    32.   
    33.     //设置按钮图片路径  
    34.     void SetImagePath(CString strNoramlImgPath, CString strPressImgPath, CString strFloatImgPath);  
    35.     //初始化按钮,主要是调整按钮的位置,处理透明色    
    36.     bool InitMyButton(int nX/*左上角X坐标*/int nY/*左上角Y坐标*/int nW/*图像宽*/int nH/*图像高*/bool bIsPng/*是否是PNG图片*/);  
    37.     //自绘制函数    
    38.     void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);  
    39.   
    40.     //初始化窗口背景  
    41.     void SetBkImg(CString strBkImg);  
    42.   
    43. protected:  
    44.     //光标是否在窗口内  
    45.     BOOL m_bIsInWnd;  
    46.     DECLARE_MESSAGE_MAP()  
    47. public:  
    48.     afx_msg void OnMouseMove(UINT nFlags, CPoint point);  
    49.     afx_msg void OnMouseHover(UINT nFlags, CPoint point);  
    50.     afx_msg void OnMouseLeave();  
    51.   
    52.       
    53. };  

    MyButton.cpp内容如下:

    1. // MyButton.cpp : 实现文件  
    2. //  
    3.   
    4. #include "stdafx.h"  
    5. #include "LoginTigger.h"  
    6. #include "MyButton.h"  
    7.   
    8.   
    9. // CMyButton  
    10.   
    11. IMPLEMENT_DYNAMIC(CMyButton, CButton)  
    12.   
    13. CMyButton::CMyButton()  
    14. {  
    15.     m_bIsInWnd = FALSE;  
    16. }  
    17.   
    18. CMyButton::~CMyButton()  
    19. {  
    20. }  
    21.   
    22.   
    23. BEGIN_MESSAGE_MAP(CMyButton, CButton)  
    24.     ON_WM_MOUSEMOVE()  
    25.     ON_WM_MOUSEHOVER()  
    26.     ON_WM_MOUSELEAVE()  
    27. END_MESSAGE_MAP()  
    28.   
    29.   
    30.   
    31. // CMyButton 消息处理程序  
    32.   
    33. //设置按钮图片路径  
    34. void CMyButton::SetImagePath(CString strNoramlImgPath, CString strPressImgPath, CString strFloatImgPath)  
    35. {  
    36.     m_strNormalImgPath = strNoramlImgPath;  
    37.     m_strPressImgPath = strPressImgPath;  
    38.     m_strFloatImgPath = strFloatImgPath;  
    39. }  
    40.   
    41. void CMyButton::SetBkImg(CString strBkImg)  
    42. {  
    43.     if (strBkImg.IsEmpty())  
    44.         return;  
    45.     m_BkImg.Load(strBkImg);  
    46. }  
    47.   
    48. //初始化按钮,主要是调整按钮的位置,处理透明色    
    49. bool CMyButton::InitMyButton(int nX/*左上角X坐标*/int nY/*左上角Y坐标*/int nW/*图像宽*/int nH/*图像高*/bool bIsPng/*是否是PNG图片*/)  
    50. {  
    51.     HRESULT hr = 0;  
    52.   
    53.     if (m_strNormalImgPath.IsEmpty())  
    54.         return false;  
    55.     if (m_strPressImgPath.IsEmpty())  
    56.         return false;  
    57.     if (m_strFloatImgPath.IsEmpty())  
    58.         return false;  
    59.   
    60.     hr = m_imgNormal.Load(m_strNormalImgPath);  
    61.   
    62.     int a = GetLastError();  
    63.   
    64.     if (FAILED(hr))  
    65.         return false;  
    66.   
    67.     hr = m_imgPress.Load(m_strPressImgPath);  
    68.   
    69.     if (FAILED(hr))  
    70.         return false;  
    71.   
    72.     hr = m_imgFloat.Load(m_strFloatImgPath);  
    73.   
    74.     if (FAILED(hr))  
    75.         return false;  
    76.   
    77.     if (bIsPng)  
    78.     {  
    79.         if (m_imgNormal.GetBPP() == 32)  
    80.         {  
    81.             int i = 0;  
    82.             int j = 0;  
    83.             for (i = 0; i < m_imgNormal.GetWidth(); i++)  
    84.             {  
    85.                 for (j = 0; j < m_imgNormal.GetHeight(); j++)  
    86.                 {  
    87.                     byte * pbyte = (byte *)m_imgNormal.GetPixelAddress(i, j);  
    88.                     pbyte[0] = pbyte[0] * pbyte[3] / 255;  
    89.                     pbyte[1] = pbyte[1] * pbyte[3] / 255;  
    90.                     pbyte[2] = pbyte[2] * pbyte[3] / 255;  
    91.                 }  
    92.             }  
    93.         }  
    94.   
    95.         if (m_imgPress.GetBPP() == 32)  
    96.         {  
    97.             int i = 0;  
    98.             int j = 0;  
    99.             for (i = 0; i < m_imgPress.GetWidth(); i++)  
    100.             {  
    101.                 for (j = 0; j < m_imgPress.GetHeight(); j++)  
    102.                 {  
    103.                     byte * pbyte = (byte *)m_imgPress.GetPixelAddress(i, j);  
    104.                     pbyte[0] = pbyte[0] * pbyte[3] / 255;  
    105.                     pbyte[1] = pbyte[1] * pbyte[3] / 255;  
    106.                     pbyte[2] = pbyte[2] * pbyte[3] / 255;  
    107.                 }  
    108.             }  
    109.         }  
    110.   
    111.         if (m_imgFloat.GetBPP() == 32)  
    112.         {  
    113.             int i = 0;  
    114.             int j = 0;  
    115.             for (i = 0; i < m_imgFloat.GetWidth(); i++)  
    116.             {  
    117.                 for (j = 0; j < m_imgFloat.GetHeight(); j++)  
    118.                 {  
    119.                     byte * pbyte = (byte *)m_imgFloat.GetPixelAddress(i, j);  
    120.                     pbyte[0] = pbyte[0] * pbyte[3] / 255;  
    121.                     pbyte[1] = pbyte[1] * pbyte[3] / 255;  
    122.                     pbyte[2] = pbyte[2] * pbyte[3] / 255;  
    123.                 }  
    124.             }  
    125.         }  
    126.     }  
    127.   
    128.     MoveWindow(nX, nY, nW, nH);  
    129.   
    130.     return true;  
    131.   
    132. }  
    133. //自绘制函数    
    134. void CMyButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)  
    135. {  
    136.     if (!lpDrawItemStruct)  
    137.         return;  
    138.     HDC hMemDC;  
    139.     HBITMAP bmpMem;  
    140.     HGDIOBJ hOldObj;  
    141.     bmpMem = CreateCompatibleBitmap(lpDrawItemStruct->hDC, lpDrawItemStruct->rcItem.right - lpDrawItemStruct->rcItem.left, lpDrawItemStruct->rcItem.bottom - lpDrawItemStruct->rcItem.top);  
    142.     if (!bmpMem)  
    143.         return;  
    144.     hMemDC = CreateCompatibleDC(lpDrawItemStruct->hDC);  
    145.     if (!hMemDC)  
    146.     {  
    147.         if (bmpMem)  
    148.         {  
    149.             ::DeleteObject(bmpMem);  
    150.             bmpMem = NULL;  
    151.         }  
    152.         return;  
    153.     }  
    154.   
    155.     hOldObj = ::SelectObject(hMemDC, bmpMem);  
    156.   
    157.     int nW = lpDrawItemStruct->rcItem.right - lpDrawItemStruct->rcItem.left;  
    158.   
    159.     int nH = lpDrawItemStruct->rcItem.bottom - lpDrawItemStruct->rcItem.top;  
    160.   
    161.     RECT rectTmp = { 0 };  
    162.   
    163.     rectTmp = lpDrawItemStruct->rcItem;  
    164.   
    165.     MapWindowPoints(GetParent(), &rectTmp);  
    166.   
    167.     if (m_BkImg.IsNull() == false)  
    168.         m_BkImg.Draw(hMemDC, 0, 0, rectTmp.right - rectTmp.left, rectTmp.bottom - rectTmp.top, rectTmp.left, rectTmp.top, rectTmp.right - rectTmp.left, rectTmp.bottom - rectTmp.top);  
    169.       
    170.     if (lpDrawItemStruct->itemState & ODS_SELECTED)  
    171.     {  
    172.         //按钮被选择    
    173.         m_imgPress.AlphaBlend(hMemDC, 0, 0, nW, nH, 0, 0, nW, nH);  
    174.     }  
    175.     else  
    176.     {  
    177.         //默认状态    
    178.         m_imgNormal.AlphaBlend(hMemDC, 0, 0, nW, nH, 0, 0, nW, nH);  
    179.   
    180.     }  
    181.   
    182.     ::BitBlt(lpDrawItemStruct->hDC, 0, 0, nW, nH, hMemDC,0,0,SRCCOPY);  
    183.   
    184.     SelectObject(hMemDC, hOldObj);  
    185.   
    186.     if (bmpMem)  
    187.     {  
    188.         ::DeleteObject(bmpMem);  
    189.         bmpMem = NULL;  
    190.     }  
    191.   
    192.     if (hMemDC)  
    193.     {  
    194.         ::DeleteDC(hMemDC);  
    195.         hMemDC = NULL;  
    196.     }  
    197.     return;  
    198. }  
    199.   
    200. void CMyButton::OnMouseMove(UINT nFlags, CPoint point)  
    201. {  
    202.     // TODO:  在此添加消息处理程序代码和/或调用默认值  
    203.   
    204.     CButton::OnMouseMove(nFlags, point);  
    205.     if (!m_bIsInWnd)  
    206.     {  
    207.         TRACKMOUSEEVENT       tme;  
    208.         tme.cbSize = sizeof(TRACKMOUSEEVENT);  
    209.         tme.dwFlags = TME_HOVER | TME_LEAVE;  
    210.         tme.dwHoverTime = 10;  
    211.         tme.hwndTrack = m_hWnd;  
    212.         _TrackMouseEvent(&tme);  
    213.         m_bIsInWnd = TRUE;  
    214.     }  
    215. }  
    216.   
    217.   
    218. void CMyButton::OnMouseHover(UINT nFlags, CPoint point)  
    219. {  
    220.     // TODO:  在此添加消息处理程序代码和/或调用默认值  
    221.   
    222.     HDC hMemDC;  
    223.     HBITMAP bmpMem;  
    224.     HGDIOBJ hOldObj;  
    225.     HDC hDC = ::GetDC(GetSafeHwnd());  
    226.     CRect rcItem;  
    227.     GetClientRect(&rcItem);  
    228.   
    229.     if (hDC)  
    230.     {  
    231.         bmpMem = CreateCompatibleBitmap(hDC, rcItem.Width(), rcItem.Height());  
    232.         if (!bmpMem)  
    233.         {  
    234.             ::ReleaseDC(GetSafeHwnd(), hDC);  
    235.             return;  
    236.         }  
    237.         hMemDC = CreateCompatibleDC(hDC);  
    238.         if (!hMemDC)  
    239.         {  
    240.             if (bmpMem)  
    241.             {  
    242.                 ::DeleteObject(bmpMem);  
    243.                 bmpMem = NULL;  
    244.             }  
    245.             ::ReleaseDC(GetSafeHwnd(), hDC);  
    246.             return;  
    247.         }  
    248.   
    249.         hOldObj = ::SelectObject(hMemDC, bmpMem);  
    250.   
    251.         RECT rectTmp = { 0 };  
    252.   
    253.         rectTmp = rcItem;  
    254.   
    255.         MapWindowPoints(GetParent(), &rectTmp);  
    256.   
    257.         if (m_BkImg.IsNull() == false)  
    258.             m_BkImg.Draw(hMemDC, 0, 0, rectTmp.right - rectTmp.left, rectTmp.bottom - rectTmp.top, rectTmp.left, rectTmp.top, rectTmp.right - rectTmp.left, rectTmp.bottom - rectTmp.top);  
    259.   
    260.         int nW = rcItem.right - rcItem.left;  
    261.   
    262.         int nH = rcItem.bottom - rcItem.top;  
    263.   
    264.         m_imgFloat.AlphaBlend(hMemDC, 0, 0, nW, nH, 0, 0,nW,nH);  
    265.   
    266.         ::BitBlt(hDC, 0, 0, nW, nH, hMemDC, 0, 0, SRCCOPY);  
    267.   
    268.         SelectObject(hMemDC, hOldObj);  
    269.   
    270.         if (bmpMem)  
    271.         {  
    272.             ::DeleteObject(bmpMem);  
    273.             bmpMem = NULL;  
    274.         }  
    275.   
    276.         if (hMemDC)  
    277.         {  
    278.             ::DeleteDC(hMemDC);  
    279.             hMemDC = NULL;  
    280.         }  
    281.   
    282.         ::ReleaseDC(GetSafeHwnd(), hDC);  
    283.     }  
    284.   
    285.     CButton::OnMouseHover(nFlags, point);  
    286. }  
    287.   
    288.   
    289. void CMyButton::OnMouseLeave()  
    290. {  
    291.     // TODO:  在此添加消息处理程序代码和/或调用默认值  
    292.   
    293.     CButton::OnMouseLeave();  
    294.     InvalidateRect(NULL);  
    295.     m_bIsInWnd = FALSE;  
    296. }  

    不懂的同学可以看一下前面的文章,编译程序,运行效果如下:


    上面的图片显示了关闭按钮的三种状态效果,即正常,悬浮,按下。

    添加账号和密码输入框

    首先添加一个编辑框,命名为IDC_EDIT_NAME,设置边框属性为False,为它添加一个控件变量,命名为m_editName,然后为它设置一个字体需求,宋体,24点,具体代码如下:

    1. BOOL CLoginTiggerDlg::OnInitDialog()  
    2. {  
    3.     CDialogEx::OnInitDialog();  
    4.   
    5.     // 将“关于...”菜单项添加到系统菜单中。  
    6.   
    7.     // IDM_ABOUTBOX 必须在系统命令范围内。  
    8.     ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);  
    9.     ASSERT(IDM_ABOUTBOX < 0xF000);  
    10.   
    11.     CMenu* pSysMenu = GetSystemMenu(FALSE);  
    12.     if (pSysMenu != NULL)  
    13.     {  
    14.         BOOL bNameValid;  
    15.         CString strAboutMenu;  
    16.         bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);  
    17.         ASSERT(bNameValid);  
    18.         if (!strAboutMenu.IsEmpty())  
    19.         {  
    20.             pSysMenu->AppendMenu(MF_SEPARATOR);  
    21.             pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);  
    22.         }  
    23.     }  
    24.   
    25.     // 设置此对话框的图标。  当应用程序主窗口不是对话框时,框架将自动  
    26.     //  执行此操作  
    27.     SetIcon(m_hIcon, TRUE);         // 设置大图标  
    28.     SetIcon(m_hIcon, FALSE);        // 设置小图标  
    29.   
    30.     // TODO:  在此添加额外的初始化代码  
    31.   
    32.     //这个是我们自己加的  
    33.     MoveWindow(0, 0, 300, 400);  
    34.   
    35.     //加载背景图片  
    36.   
    37.     CString strBmpPath = _T(".\\res\\Tigger.png");  
    38.   
    39.     CImage img;  
    40.   
    41.     img.Load(strBmpPath);  
    42.   
    43.     CBitmap bmpTmp;  
    44.   
    45.     bmpTmp.Attach(img.Detach());  
    46.   
    47.     m_bkBrush.CreatePatternBrush(&bmpTmp);  
    48.   
    49.     //调整标题位置  
    50.   
    51.     m_staticCap.Init(4, 8,105, 30);  
    52.   
    53.     //关闭按钮设置  
    54.   
    55.     m_btnClose.SetImagePath(_T("./res/TigerCloseNormal.png"), _T("./res/TigerClosePress.png"), _T("./res/TigerCloseFloat.png"));  
    56.       
    57.     m_btnClose.InitMyButton(271, 8, 20, 20, true);  
    58.   
    59.     //调整光标的位置适中  
    60.   
    61.     m_editName.MoveWindow(82, 261 + 4, 200, 31 - 4);  
    62.   
    63.     CFont*  pFont = m_editName.GetFont();  
    64.   
    65.     LOGFONT  lf;  
    66.   
    67.     if (pFont)  
    68.     {  
    69.         pFont->GetLogFont(&lf);  
    70.   
    71.         lf.lfHeight = 24;//改变字体高度      
    72.   
    73.         _tcscpy(lf.lfFaceName, _T("宋体"));//改变字体名称      
    74.   
    75.         m_fontEdit.CreateFontIndirect(&lf);  
    76.   
    77.         m_editName.SetFont(&m_fontEdit);  
    78.     }  
    79.   
    80.     return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE  
    81. }  

    然后修改控件字体的颜色,具体代码如下:

    1. HBRUSH CLoginTiggerDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)  
    2. {  
    3.     HBRUSH hbr = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor);  
    4.   
    5.     // TODO:  在此更改 DC 的任何特性  
    6.   
    7.     if (pWnd == this)  
    8.     {  
    9.         return m_bkBrush;  
    10.     }  
    11.   
    12.     // TODO:  如果默认的不是所需画笔,则返回另一个画笔  
    13.   
    14.     //输入账号  
    15.     if (pWnd == &m_editName)  
    16.     {  
    17.         CFont font;  
    18.         LOGFONT lf;  
    19.         if (!pDC)  
    20.             return NULL;  
    21.   
    22.         //创建一个空画刷,返回这个画刷可以让静态控件的背景透明    
    23.         HBRUSH hr = (HBRUSH)GetStockObject(NULL_BRUSH);  
    24.         //让文字的背景透明        
    25.         pDC->SetBkMode(TRANSPARENT);  
    26.         //设置文字的颜色为白色    
    27.         pDC->SetTextColor(RGB(200, 200, 200));  
    28.     }  
    29.   
    30.     return hbr;  
    31. }  

    编译程序,运行效果如下:

    密码输入框的制作与账号输入框相同,唯一不同的地方就是设置Password属性为真,密码输入框的ID为IDC_EDIT_PWD,为其添加一个控件变量m_editPwd,然后调整它的位置,并设置字体,具体代码如下:

    1. BOOL CLoginTiggerDlg::OnInitDialog()  
    2. {  
    3.     CDialogEx::OnInitDialog();  
    4.   
    5.     // 将“关于...”菜单项添加到系统菜单中。  
    6.   
    7.     // IDM_ABOUTBOX 必须在系统命令范围内。  
    8.     ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);  
    9.     ASSERT(IDM_ABOUTBOX < 0xF000);  
    10.   
    11.     CMenu* pSysMenu = GetSystemMenu(FALSE);  
    12.     if (pSysMenu != NULL)  
    13.     {  
    14.         BOOL bNameValid;  
    15.         CString strAboutMenu;  
    16.         bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);  
    17.         ASSERT(bNameValid);  
    18.         if (!strAboutMenu.IsEmpty())  
    19.         {  
    20.             pSysMenu->AppendMenu(MF_SEPARATOR);  
    21.             pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);  
    22.         }  
    23.     }  
    24.   
    25.     // 设置此对话框的图标。  当应用程序主窗口不是对话框时,框架将自动  
    26.     //  执行此操作  
    27.     SetIcon(m_hIcon, TRUE);         // 设置大图标  
    28.     SetIcon(m_hIcon, FALSE);        // 设置小图标  
    29.   
    30.     // TODO:  在此添加额外的初始化代码  
    31.   
    32.     //这个是我们自己加的  
    33.     MoveWindow(0, 0, 300, 400);  
    34.   
    35.     //加载背景图片  
    36.   
    37.     CString strBmpPath = _T(".\\res\\Tigger.png");  
    38.   
    39.     CImage img;  
    40.   
    41.     img.Load(strBmpPath);  
    42.   
    43.     CBitmap bmpTmp;  
    44.   
    45.     bmpTmp.Attach(img.Detach());  
    46.   
    47.     m_bkBrush.CreatePatternBrush(&bmpTmp);  
    48.   
    49.     //调整标题位置  
    50.   
    51.     m_staticCap.Init(4, 8,105, 30);  
    52.   
    53.     //关闭按钮设置  
    54.   
    55.     m_btnClose.SetImagePath(_T("./res/TigerCloseNormal.png"), _T("./res/TigerClosePress.png"), _T("./res/TigerCloseFloat.png"));  
    56.       
    57.     m_btnClose.InitMyButton(271, 8, 20, 20, true);  
    58.   
    59.     //账号输入框  
    60.   
    61.     //调整光标的位置适中  
    62.   
    63.     m_editName.MoveWindow(82, 261 + 4, 200, 31 - 4);  
    64.   
    65.     CFont*  pFont = m_editName.GetFont();  
    66.   
    67.     LOGFONT  lf;  
    68.   
    69.     if (pFont)  
    70.     {  
    71.         pFont->GetLogFont(&lf);  
    72.   
    73.         lf.lfHeight = 24;//改变字体高度      
    74.   
    75.         _tcscpy(lf.lfFaceName, _T("宋体"));//改变字体名称      
    76.   
    77.         m_fontEdit.CreateFontIndirect(&lf);  
    78.   
    79.         m_editName.SetFont(&m_fontEdit);  
    80.     }  
    81.   
    82.     //密码输入框  
    83.   
    84.     m_editPwd.MoveWindow(82, 308, 200, 25);  
    85.   
    86.     m_editPwd.SetFont(&m_fontEdit);  
    87.   
    88.     return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE  
    89. }  

    为其设置字体颜色,具体代码与账号输入框一样,具体代码如下:

    1. HBRUSH CLoginTiggerDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)  
    2. {  
    3.     HBRUSH hbr = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor);  
    4.   
    5.     // TODO:  在此更改 DC 的任何特性  
    6.   
    7.     if (pWnd == this)  
    8.     {  
    9.         return m_bkBrush;  
    10.     }  
    11.   
    12.     // TODO:  如果默认的不是所需画笔,则返回另一个画笔  
    13.   
    14.     //输入账号  
    15.     if (pWnd == &m_editName)  
    16.     {  
    17.         CFont font;  
    18.         LOGFONT lf;  
    19.         if (!pDC)  
    20.             return NULL;  
    21.   
    22.         //创建一个空画刷,返回这个画刷可以让静态控件的背景透明    
    23.         HBRUSH hr = (HBRUSH)GetStockObject(NULL_BRUSH);  
    24.         //让文字的背景透明        
    25.         pDC->SetBkMode(TRANSPARENT);  
    26.         //设置文字的颜色为白色    
    27.         pDC->SetTextColor(RGB(200, 200, 200));  
    28.     }  
    29.   
    30.     //输入密码  
    31.     if (pWnd == &m_editPwd)  
    32.     {  
    33.         CFont font;  
    34.         LOGFONT lf;  
    35.         if (!pDC)  
    36.             return NULL;  
    37.   
    38.         //创建一个空画刷,返回这个画刷可以让静态控件的背景透明    
    39.         HBRUSH hr = (HBRUSH)GetStockObject(NULL_BRUSH);  
    40.         //让文字的背景透明        
    41.         pDC->SetBkMode(TRANSPARENT);  
    42.         //设置文字的颜色为白色    
    43.         pDC->SetTextColor(RGB(200, 200, 200));  
    44.     }  
    45.   
    46.     return hbr;  
    47. }  

    编译程序,运行效果如下:


    添加登录和注册按钮

    登录按钮和注册按钮与关闭按钮的代码一样,所以我们只需要使用CMyButton类就可以,唯一需要调整的就是它们的图片不一样,所以这里我们只说说不同的地方,首先添加两个按钮控件,ID分别为IDC_BUTTON_LOGIN和IDC_BUTTON_REG,分别为它们添加两个控件变量m_btnLogin和m_btnReg,然后修改它们的控件类型为CMyButton,最后在OnInitDialog中初始化它们的位置和图片,具体代码如下:

    1. BOOL CLoginTiggerDlg::OnInitDialog()  
    2. {  
    3.     CDialogEx::OnInitDialog();  
    4.   
    5.     // 将“关于...”菜单项添加到系统菜单中。  
    6.   
    7.     // IDM_ABOUTBOX 必须在系统命令范围内。  
    8.     ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);  
    9.     ASSERT(IDM_ABOUTBOX < 0xF000);  
    10.   
    11.     CMenu* pSysMenu = GetSystemMenu(FALSE);  
    12.     if (pSysMenu != NULL)  
    13.     {  
    14.         BOOL bNameValid;  
    15.         CString strAboutMenu;  
    16.         bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);  
    17.         ASSERT(bNameValid);  
    18.         if (!strAboutMenu.IsEmpty())  
    19.         {  
    20.             pSysMenu->AppendMenu(MF_SEPARATOR);  
    21.             pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);  
    22.         }  
    23.     }  
    24.   
    25.     // 设置此对话框的图标。  当应用程序主窗口不是对话框时,框架将自动  
    26.     //  执行此操作  
    27.     SetIcon(m_hIcon, TRUE);         // 设置大图标  
    28.     SetIcon(m_hIcon, FALSE);        // 设置小图标  
    29.   
    30.     // TODO:  在此添加额外的初始化代码  
    31.   
    32.     //这个是我们自己加的  
    33.     MoveWindow(0, 0, 300, 400);  
    34.   
    35.     //加载背景图片  
    36.   
    37.     CString strBmpPath = _T(".\\res\\Tigger.png");  
    38.   
    39.     CImage img;  
    40.   
    41.     img.Load(strBmpPath);  
    42.   
    43.     CBitmap bmpTmp;  
    44.   
    45.     bmpTmp.Attach(img.Detach());  
    46.   
    47.     m_bkBrush.CreatePatternBrush(&bmpTmp);  
    48.   
    49.     //调整标题位置  
    50.   
    51.     m_staticCap.Init(4, 8,105, 30);  
    52.   
    53.     //关闭按钮设置  
    54.   
    55.     m_btnClose.SetImagePath(_T("./res/TigerCloseNormal.png"), _T("./res/TigerClosePress.png"), _T("./res/TigerCloseFloat.png"));  
    56.       
    57.     m_btnClose.InitMyButton(271, 8, 20, 20, true);  
    58.   
    59.     //登录和注册按钮设置  
    60.   
    61.     m_btnLogin.SetImagePath(_T("./res/tigerLoginNormal.png"), _T("./res/tigerLoginPress.png"), _T("./res/TigerLoginFloat.png"));  
    62.   
    63.     m_btnLogin.InitMyButton(23, 355, 115, 35, true);  
    64.   
    65.     m_btnReg.SetImagePath(_T("./res/tigerRegisterNormal.png"), _T("./res/tigerRegisterPress.png"), _T("./res/TigerRegisterFloat.png"));  
    66.   
    67.     m_btnReg.InitMyButton(167, 355, 115, 35,true);  
    68.   
    69.     m_btnLogin.SetBkImg(strBmpPath);  
    70.   
    71.     m_btnReg.SetBkImg(strBmpPath);  
    72.   
    73.     //账号输入框  
    74.   
    75.     //调整光标的位置适中  
    76.   
    77.     m_editName.MoveWindow(82, 261 + 4, 200, 31 - 4);  
    78.   
    79.     CFont*  pFont = m_editName.GetFont();  
    80.   
    81.     LOGFONT  lf;  
    82.   
    83.     if (pFont)  
    84.     {  
    85.         pFont->GetLogFont(&lf);  
    86.   
    87.         lf.lfHeight = 24;//改变字体高度      
    88.   
    89.         _tcscpy(lf.lfFaceName, _T("宋体"));//改变字体名称      
    90.   
    91.         m_fontEdit.CreateFontIndirect(&lf);  
    92.   
    93.         m_editName.SetFont(&m_fontEdit);  
    94.     }  
    95.   
    96.     //密码输入框  
    97.   
    98.     m_editPwd.MoveWindow(82, 308, 200, 25);  
    99.   
    100.     m_editPwd.SetFont(&m_fontEdit);   
    101.   
    102.     return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE  
    103. }  

    编译程序,运行效果如下:

    至此我们的登录界面就做完了,有不懂得地方可以翻阅一下前面的文章,需要下载源码的同学,可以从下面的地址下载:

    http://download.csdn.net/download/u011711997/10261765



    展开全文
  • Python界面 可视化开发(python3+PyQt5+Qt Designer)

    千次阅读 多人点赞 2019-11-18 09:33:14
    以前制作一个Python窗体界面,我都是用GUI窗口视窗设计的模块Tkinter一点一点敲出来的,今天朋友问我有没有Python窗体的设计工具,“用鼠标拖拖”就能完成窗体设计,我查了查相关资料,果然有一款好用的工具——Qt ...
  • 在Python-OpenCV中显示图像时调用的是一个单独的窗口,有时我们需要将这些图像显示在PyQt的图形化界面上,这样就可以将整个图像显示与PyQt图形化界面进行整合。但OpenCV格式的图像和PyQt格式的图像并不同,这就需要...
  • 索引本章最佳实践正式开始编辑准备界面UI实体编写准备界面UI逻辑类UITankItem类UIReady类进入下一流程 本章最佳实践 UI界面管理器。 正式开始 在前几章我们已经完成了准备界面所需要的大部分内容,比如坦克、武器...
  • 在linux下图形界面和命令行界面的切换我估计好多喜欢用linux系统的人都不太会遇到这个问题,因为linux图形界面会占用一些系统资源并且也没那么“好用”。1. 图形界面和命令行界面的切换如果linux系统安装了“全套”...
  • centos 7 启动与切换图形界面

    万次阅读 多人点赞 2018-11-03 20:37:39
    安装图形界面 默认情况下是不会安装图形界面的,所以需要自己手动安装,步骤如下: 开启系统,以root身份进入 安装X(X Window System),命令如下: yum groupinstall "X Window System" 其中大约有...
  • Qt-多界面编程(界面切换)

    万次阅读 多人点赞 2018-10-26 11:11:41
    在Qt编程中经常遇到多个界面之间的切换, 比如从登录界面跳转到主界面, 主界面跳转到设置界面,在返回到主界面 下面更加这个流程实现一个例子: 1.在QtCreator集成开发环境上创建MultiInterface工程如下(创建...
  • 现有2个项目,taskA、...taskA负责调用taskB中指定的界面。 taskB中有3个界面,a、b、c,每个界面显示它所在的task id。 SingleTask: 其中b界面被声明为SingleTask。 先运行taskB,显示a界面,由a界面调用
  • CentOS7图形界面与命令行界面切换

    万次阅读 2018-03-01 10:54:56
    在图形界面使用 ctrl+alt+F2切换到dos界面 dos界面 ctrl+alt+F2切换回图形界面在命令上 输入 init 3 命令 切换到dos界面 输入 init 5命令 切换到图形界面 如果想系统默认以某种方式启动, 使用systemd创建符号...
  • 虚拟机Linux图形界面和命令界面切换

    万次阅读 2018-08-07 15:38:42
    --linux切换图形界面alt+ctrl + F1-F5 更改ubuntu鼠标移出快捷键alt + ctrl   ctrl + alt + F3 编辑模式 ctrl + alt + F1 图形界面模式
  • Linux之RedHat 7 图形界面版安装

    万次阅读 2018-09-12 11:33:02
    若分配1G以下内存则只能安装最小化版(无图形界面) 选择带界面的系统安装 安装位置默认分区就行 需设置root密码 等待安装 这里需要输入搜索才能继续,点界面是没用的 ...
  • Systemd是一种新的linux系统服务管理器。 它替换了init系统,能够管理系统的启动...切换至字符界面: sudo systemctl set-default multi-user.target 切换至图形界面: sudo systemctl set-default graphical.tar
  • CentOS 图形界面 命令行界面切换 多种方法

    万次阅读 多人点赞 2014-07-12 15:07:27
    方法1:运行命令到图形界面  #startx , 需要先配置图形界面信息  方法2:修改/etc/inittab文件中的   id:3:initdefault , 将3改为5 ,重新启动系统;  方法3:进入图形界面: init 5 从图形界面进入文本...
  • Linux如何从图形界面切换到命令界面

    万次阅读 2013-09-18 11:17:50
    在图形界面中找一个可以输入命令的地方.(我的RedHat9中默认是按alt+F2,你也可以自己找找命令行窗口之类的东西) 输入init 3 回车. 注意init后面有一个空格 等一会就进入了图形界面 用init 5可以回到图形界面 -*-*-*-*...
1 2 3 4 5 ... 20
收藏数 2,637,693
精华内容 1,055,077
关键字:

界面