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

    千次下载 热门讨论 2020-07-30 23:32:04
    Qt漂亮通用界面。 大部分的界面都可以用这个学习,非常漂亮哦!
  • 用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



    展开全文
  • Qt界面开发(一)(各种控件以及图表)

    万次阅读 多人点赞 2020-07-25 10:38:37
    注:资源主要来源:http://www.qtcn.org/bbs/u/110085... 如若侵权,请联系删除。 本文只是将作品集合到起来,方便大家一起学习。 ... Qt界面开发(各种控件以及图表) 1.Qt简洁窗体 源代码链接:点击打开链接 2....

    注:资源主要来源http://www.qtcn.org/bbs/u/110085 (刘大神)

    如若侵权,请联系删除。

    本文只是将作品集合到起来,方便大家一起学习。
    资源集合已经放到 链接:https://pan.baidu.com/s/1sVvQE8uDujVxeKVVSoxyYw 密码:wslk

    Qt界面开发(各种控件以及图表)

    1.Qt简洁窗体

    源代码链接:点击打开链接

    2.QT漂亮界面

     

    源代码链接:点击打开链接

    3.音乐播放器界面

    源代码链接:点击打开链接

    4.六宫格界面

    源代码链接:点击打开链接

    5.漂亮通用界面

    源代码链接:点击打开链接

    6.净化设备管理

    源代码链接:点击打开链接

    7.树形界面通用图

    源代码链接:点击打开链接

    8.窗口主框架

    源代码链接:点击打开链接

    9.tcp文件传输

    源代码链接:点击打开链接

    10.综合组件的界面

    源代码链接:点击打开链接

    11.Qt动态圆形进度条

    源代码链接:点击打开链接

    12.动态绘制曲线

     

    源代码链接:点击打开链接

    13.二维码解析

    源代码链接:点击打开链接

    14.自定义UI演示

    源代码链接:点击打开链接

    15.Widget例子

    源代码链接:点击打开链接

    16.俄罗斯方块

    源代码链接:点击打开链接

    17.Qt360 界面

    源代码链接:点击打开链接

    18.正则表达式

    源代码链接:点击打开链接

    19.绘制(平滑与折线)曲线

    源代码链接:点击打开链接

    20.Tab选项界面

    源代码链接:点击打开链接

    21.十二宫格界面

    源代码链接:点击打开链接

    22.网络调试助手

    源代码链接:点击打开链接

    23.List树形列表界面

    源代码链接:点击打开链接

    24.Ping界面实现

    源代码链接:点击打开链接

    25.脉冲维修工具界面

    源代码链接:点击打开链接

    26.Qt个性时钟

    源代码链接:点击打开链接

    27.Qt漂亮日历

    源代码链接:点击打开链接

    28.Qt个性按钮

    源代码链接:点击打开链接

    29.Led数字显示

    源代码链接:点击打开链接

    30.多种组件界面

    源代码链接:点击打开链接

    31.英语词典

    源代码链接:点击打开链接

    32.绝对牛逼的计算器

    源代码链接:点击打开链接

    33.Led显示以及list列表

    源代码链接:点击打开链接

    34.Qt(动态数据模拟)曲线

    源代码链接:点击打开链接

    35.Tab飘逸界面

    源代码链接:点击打开链接

    36.滑动显示图片

    源代码链接:点击打开链接

    37.各种Chart例子

    源代码链接:点击打开链接

    38.背景图界面

    源代码链接:点击打开链接

    39.多种样式的进度条

    源代码链接:点击打开链接

    40.360UI完美界面

    源代码链接:点击打开链接

    41.360安防系统

     

    源代码链接:点击打开链接

    42.机器人聊天

    源代码链接:点击打开链接

    43.各种chart图表

    源代码链接:点击打开链接

    44.Qt图片预览(图形列表)

    源代码链接:点击打开链接

    45.动态显示文本的label

    源代码链接:点击打开链接

    46.Qt2048游戏

    源代码链接:点击打开链接

    47.Animation按钮

    源代码链接:点击打开链接

    48.模拟电量进度条

    源代码链接:点击打开链接

    49.网易云音乐界面

    源代码链接:点击打开链接

    50.多种样式日历

    源代码链接:点击打开链接

    51.myseria串口

    源代码链接:点击打开链接

    52.绘制魔法鱼儿

    源代码链接:点击打开链接

     

     

     

     

     

    展开全文
  • 教你用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#漂亮的界面设计

    千次下载 热门讨论 2020-07-29 14:21:28
    c#漂亮的界面设计c#漂亮的界面设计
  • 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***********************************************/

    展开全文
  • 索引本章最佳实践正式开始编辑准备界面UI实体编写准备界面UI逻辑类UITankItem类UIReady类进入下一流程 本章最佳实践 UI界面管理器。 正式开始 在前几章我们已经完成了准备界面所需要的大部分内容,比如坦克、武器...
  • Python界面 可视化开发(python3+PyQt5+Qt Designer)

    千次阅读 多人点赞 2019-11-18 09:33:14
    以前制作一个Python窗体界面,我都是用GUI窗口视窗设计的模块Tkinter一点一点敲出来的,今天朋友问我有没有Python窗体的设计工具,“用鼠标拖拖”就能完成窗体设计,我查了查相关资料,果然有一款好用的工具——Qt ...
  • 网页制作:一个简易美观的登录界面

    万次阅读 多人点赞 2018-09-28 17:27:17
    这次来总结一下公司的Task 1 实现一个登录界面。 登录界面其实在大三的时候就有做过,但是当时做的界面超级low,主要区别在于有无css,由于公司的设计要求,对于该界面的很多细节处理实在不容易。所以,还是想要写...
  • Java Swing 图形界面开发简介

    万次阅读 多人点赞 2019-01-14 15:52:58
    Java Swing GUI 图形界面窗口开发基础教程,本教程将系统性地详细介绍 Swing 开发中常用的一些组件、布局管理器等相关知识技术,并且每章节都将通过代码实例展示实际应用。Swing 是 Java 为图形界面应用开发提供的...
  • NSIS教程(3): 现代用户界面(Modern UI)

    万次阅读 2019-12-09 17:45:19
    NSIS的现代用户界面(Modern UI)只是相对于传统(丑陋)的界面而言的“现代”而已。它定义在MUI2.nsh(注:nsh文件类似C++中的头文件,可以被其他模块包含引用)中,如果要使用MUI2界面,则需要包含该文件: !...
  • 在linux下图形界面和命令行界面的切换我估计好多喜欢用linux系统的人都不太会遇到这个问题,因为linux图形界面会占用一些系统资源并且也没那么“好用”。1. 图形界面和命令行界面的切换如果linux系统安装了“全套”...
  • C++ 图形界面、Qt 简单的使用、Hello world

    万次阅读 多人点赞 2018-08-29 21:24:12
    之前大一使用C++写一些简单的信息管理系统,界面总是黑屏白字,体验十分差,为了给应用程序增加一个 UI 图形界面,使用了Qt5就可以轻松做到,而且操作十分键,很多都是编译器帮你做好了基础的了。 下面演示如构建一...
  • JAVA登录界面的实现(一)

    万次阅读 多人点赞 2018-12-25 09:26:24
    学习JAVA的过程中,登录界面是多数人第一个实现的小程序。今天我们就来做一下登录界面。当然在动手写代码之前我们要先做一些准备工作,我们要先了解JAVA提供的图形界面类有哪些,以及有哪些常用的组件类和辅助类。 ...
  • Python - 编写可视化界面(Python+PyCharm+PyQt)

    万次阅读 多人点赞 2019-01-15 10:45:43
    Python编写可视化界面  最近开始学习Python,但只限于看理论,编几行代码,觉得没有意思,就想能不能用Python编写可视化的界面。遂查找了相关资料,发现了PyQt,由于前一段时间刚看过Qt,而且对Qt的印象很好,于是...
  • linux命令行界面如何安装图形化界面

    万次阅读 2018-02-06 11:56:16
    当我们在安装Linux系统时,我们一开始可能安装的是非图形界面的系统,就是有可能选择的是最小化安装方式。这种安装凡是有很多的坑。那么有时候,我们可能需要进行图形化设置,但是我们又不可能重启设置,这就需要...
  • Qt 多界面来回切换的问题以及Qt界面关闭与销毁

    万次阅读 多人点赞 2018-04-27 19:40:11
    Qt 中我们经常会用到好几个界面,那么这几个界面之间来回切换就是一个经常出现的问题。之前我也总是被这个问题困扰,现在写一个样例程序当作一种解决方案,希望能给大家启发。 首先我定义了两个界面,一个主界面,...
  • Centos7命令行安装图形用户界面

    万次阅读 多人点赞 2018-03-03 22:17:34
    安装完成Centos7后,重启后发现是命令行界面,于是就想改成图形用户界面。安装了图形用户界面的话:1. 查看系统里是否已经安装了图形用户界面。使用ctrl+alt+fx,x为1234,都试试,看看是否能切换为图形用户界面。我...
  • 前面的几篇文章介绍了NSIS的传统界面的安装包和现代界面的安装包的制作方法,也提到了NSIS支持自定义页面(即使用page custom)的特性,自定义页面需要用户自己创建对话框、控件、添加控件响应等等,虽然NSIS提供了...
1 2 3 4 5 ... 20
收藏数 2,603,787
精华内容 1,041,514
关键字:

界面