• 第六篇--MFC美化界面


    1.MFC如何设置背景颜色

     首先,为对话框添加WM_CTLCOLOR消息,方法为:右击Dialog窗口 --> Class Wizard --> Messages --> WM_CTLCOLOR --> Add Handler --> Edit Code

    然后,在Dlg.h文件中添加成员变量CBrush m_brush; 

    接着,在之前Edit Code的位置,写上

    HBRUSH CMFCInterfaceDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
    {
        return m_brush;
    }

    最后,在Dlg.cpp文件的OnInitDialog()函数后面加上m_brush.CreateSolidBrush(RGB(255, 255, 102));//设置背景颜色为黄色。编译运行函数即可。

    2.MFC如何设置背景图片

    首先在网上下载一张Bitmap的图片,放在res文件夹下

    接着在OnInitDialog()后面加上如下代码

       CString strBmpPath = _T(".\res\backgroundone.jpg");
    
        CImage img;
    
        img.Load(strBmpPath);
    
        MoveWindow(0, 0, img.GetWidth(), img.GetHeight());
    
        CBitmap bmpTmp;
    
        bmpTmp.Attach(img.Detach());
    
        m_brush.CreatePatternBrush(&bmpTmp);

     3.MFC修改可执行文件和标题栏图标

    创建一个新工程,可以什么都不加。打开.rc,  创建或打开Icon资源(以下都以Icon为例)。    
    单击工程窗口的资源视图标签,选中资源ID为IDR_MAINFRAME图标资源,然后按Delete键把它删除掉,当然也可以不删,具体后面会讲到。    
    从资源菜单中选择Resource,然后选择Icon,添加资源,选中Icon类型,点击导入,此时会叫你选择本地的图片,记住必须选择.ioc格式的图片,否则导入失败。    
    把新图标的资源ID改为IDI_ICON(也可以不改)。 具体做法如下: 

    有一点很重要,你改知道就是 打开Header Files下的Resource.h,找到Icon下的图标,系统默认是从128开始的,

    #define IDR_MAINFRAME               128

    #define IDR_ICONTETYPE             129(单/多文档程序的文档图标)

    #define IDI_ICON1                            130

    #define IDI_ICON2                            131

    a.修改exe文件图标

    VS2010生成的exe文件图标是用Icon下几个图标中value值最小的,顺序为IDR_MAINFRAME、IDR_ICONTETYPE、新加 的,所以想更改生成的exe文件图标,只要保证图标的value值是Icon下几个图标中最小的就可以了

      1. 导入自己的.ioc图片,并在Resource.h中,将自己加的icon资源Value改为最小,如下,因此不一定要删除IDR_MAINFRAME

      #define IDR_MAINFRAME                   129

      #define IDI_ICON1                               128(自己添加的icon) 

      2. 然后编译运行,找到你的debug目录,你将看到图标已经更改的.exe执行文件,这种方法可以将任何你喜欢的图片做成.exe文件图标

    b.修改标题栏图标

      1. 如上操作,导入自己喜爱的ico图片,编辑新加icon的ID,比如我新加的Icon资源ID为 IDI_ICON1

      22. 基于对话框的程序,在构造函数中有一句

        m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);

        此时把IDR_MAINFRAME改为我的IDI_ICON1的图标名。

    4. Button的绘制

     首先,拖动几个Button到窗口,然后修改Button的Owner Draw属性为true

     接着,右击Dialog窗口 --> Class Wizard --> Messages --> WM_DRAWITEM --> Add Handler --> Edit Code

    void CMFCInterfaceDlg::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct)
    {
        // TODO: Add your message handler code here and/or call default
    
        //获得button标题 
        //CString btnCaption = _T("Dialog");
        CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
    
        CString btnCaption = L"";
        //设置标题
        switch (lpDrawItemStruct->CtlID)
        {
        case ID1:
            btnCaption = "1";
            break;
        case ID2:
            btnCaption = "2";
            break;
        case ID3:
            btnCaption = "3";
            break;
        default:
            ;
        }
    
        CRect drawRect;
        //获得绘图DC
        //得到原Button的矩形大小
        drawRect.CopyRect(&(lpDrawItemStruct->rcItem));
        //绘制控件框架 
        pDC->DrawFrameControl(&drawRect, DFC_BUTTON, lpDrawItemStruct->CtlType);
    
    
        //创建画刷
        CBrush pBrush;
        pBrush.CreateSolidBrush(RGB(100, 130, 10));
        //画矩形 
        pDC->FillRect(drawRect, &pBrush);
    
    
        //定义一个CRect用于绘制文本 
        CRect textRect;
        //拷贝矩形区域 
        textRect.CopyRect(&drawRect);
        //获得字符串尺寸
        CSize sz = pDC->GetTextExtent(btnCaption);
        //调整文本位置 居中 
        textRect.top += (textRect.Height() - sz.cy) / 2;
        //设置文本背景透明 
        pDC->SetBkMode(TRANSPARENT);
        //设置文本颜色
        pDC->SetTextColor(RGB(0, 0, 255));
        //绘制文本内容
        pDC->DrawText(btnCaption, &textRect, DT_RIGHT | DT_CENTER | DT_BOTTOM);
    
        CDialogEx::OnDrawItem(nIDCtl, lpDrawItemStruct);
    }
    View Code

    当然,对于不想要改变的Button,将Owner Draw属性设为false就行。

    5.static text字体及颜色的绘制

    颜色绘制:

    在OnCTLColor中

    HBRUSH CMFCInterfaceDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
    {
        //HBRUSH hbr = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor);
    
        HBRUSH hbr = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor);
    
        if (pWnd == this)
        {
            return m_brush;
        }
    
    
        if (pWnd->GetDlgCtrlID() == (IDC_STATIC_TITLE))//IDC_STATIC_TITLE:标题ID
        {
            pDC->SetBkMode(TRANSPARENT);
            pDC->SetTextColor(RGB(255, 251, 240));
            return HBRUSH(GetStockObject(HOLLOW_BRUSH));
        }
    
        if (pWnd->GetDlgCtrlID() == (IDC_STATIC))//IDC_STATIC:文本ID
        {
            pDC->SetBkMode(TRANSPARENT);
            pDC->SetTextColor(RGB(0, 225, 225));
            return HBRUSH(GetStockObject(HOLLOW_BRUSH));
        }
    
        return hbr;
    
        //return m_brush;
    }
    View Code

    额外提示:pDC->SetBkMode(TRANSPARENT);是设置文本背景透明。

    字体绘制:

    首先,在Dlg.h文件中声明Font变量CFont newFont;

    然后,在OnInitDialog()函数后面加上以下代码

            CFont* font;
        font = static_title.GetFont();//获取CFont对象
        LOGFONT lf;
        font->GetLogFont(&lf);//获取LOGFONT结构体
        lf.lfHeight = -15;    //修改字体大小
        lf.lfItalic = TRUE;        //倾斜
        lf.lfWeight = 400;   //修改字体的粗细
        newFont.CreateFontIndirectW(&lf);//创建一个新的字体
        static_title.SetFont(&newFont);    

    6.MFC取消标题栏,以及自制标题栏

    首先,去掉原本的标题栏,将属性Border设置为NONE。

    然后,观察上面那张图片,上面那个矩形区域就可以当做标题栏。首先要做的就是为它添加一个退出按钮,就是那个叉叉。

    1. 拖动一个button到矩形区域,自行调整大小以及位置,设置它的Caption为大写的X,哈哈哈,其实可以为Button贴图,不过本人为了方便,写个X冒充。将其ID设置为IDC_BUTTON_CLOSE。

    2. 为这个Button添加函数,实现单击时关闭程序。双击Button进入代码编辑页面,输入以下代码

    void CMFCInterfaceDlg::OnBnClickedButtonClose()
    {
        CDialog::OnOK();
    }

    此时,它的退出功能已经完成。但是运行时,可能发现Button的位置偏左,这时候,就可以用代码微调Button的位置,在OnInitDialog()函数后面加上以下代码

    CRect rect;
        GetDlgItem(IDC_BUTTON_CLOSE)->GetWindowRect(&rect);//获得空间的绝对坐标
        ScreenToClient(&rect);//获得相对于主窗体的坐标
        rect.OffsetRect(CSize(15, 0));//这里要是要移动的相对位置
        GetDlgItem(IDC_BUTTON_CLOSE)->MoveWindow(rect);//移动到目标位置

    数字可以自己调节。

    另外关于Button贴图的,附上此链接:https://blog.csdn.net/u011711997/article/details/52551106

    7. 如何实现标题栏的拖动功能

    需要添加三个函数

    void CTestDllDlg::OnLButtonUp(UINT nFlags, CPoint point)
    {
        // TODO: Add your message handler code here and/or call default
        ReleaseCapture();
    
        CDialogEx::OnLButtonUp(nFlags, point);
    }
    
    
    void CTestDllDlg::OnLButtonDown(UINT nFlags, CPoint point)
    {
        // TODO: Add your message handler code here and/or call default
        SetCapture();
    
        CDialogEx::OnLButtonDown(nFlags, point);
    }
    
    
    void CTestDllDlg::OnMouseMove(UINT nFlags, CPoint point)
    {
        // TODO: Add your message handler code here and/or call default
    
        static CPoint PrePoint = CPoint(0, 0);
        if (MK_LBUTTON == nFlags)
        {
            if (point != PrePoint)
            {
                CPoint ptTemp = point - PrePoint;
                CRect rcWindow;
                GetWindowRect(&rcWindow);
                rcWindow.OffsetRect(ptTemp.x, ptTemp.y);
                MoveWindow(&rcWindow);
                return;
            }
        }
        PrePoint = point;
    
        CDialogEx::OnMouseMove(nFlags, point);
    }
    View Code

    亲测可用,捕捉鼠标按下与释放。

    cpp

    // TestDllDlg.cpp : implementation file
    //
    
    #include "stdafx.h"
    #include "TestDll.h"
    #include "TestDllDlg.h"
    #include "afxdialogex.h"
    
    #ifdef _DEBUG
    #define new DEBUG_NEW
    #endif
    
    // CAboutDlg dialog used for App About
    
    class CAboutDlg : public CDialogEx
    {
    public:
        CAboutDlg();
    
    // Dialog Data
    #ifdef AFX_DESIGN_TIME
        enum { IDD = IDD_ABOUTBOX };
    #endif
    
        protected:
        virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
    
    // Implementation
    protected:
        DECLARE_MESSAGE_MAP()
    };
    
    CAboutDlg::CAboutDlg() : CDialogEx(IDD_ABOUTBOX)
    {
    }
    
    void CAboutDlg::DoDataExchange(CDataExchange* pDX)
    {
        CDialogEx::DoDataExchange(pDX);
    }
    
    BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
    END_MESSAGE_MAP()
    
    
    // CTestDllDlg dialog
    
    
    
    CTestDllDlg::CTestDllDlg(CWnd* pParent /*=nullptr*/)
        : CDialogEx(IDD_TESTDLL_DIALOG, pParent)
    {
        m_hIcon = AfxGetApp()->LoadIcon(IDI_ICON1);
    }
    
    void CTestDllDlg::DoDataExchange(CDataExchange* pDX)
    {
        CDialogEx::DoDataExchange(pDX);
        DDX_Control(pDX, IDC_COMBO1, m_combo);
        DDX_Control(pDX, IDC_COMBO2, m_combo_sec);
        DDX_Control(pDX, IDC_BUTTON_CLOSE, m_btnClose);
        DDX_Control(pDX, IDC_STATIC_TITLE, static_title);
    }
    
    BEGIN_MESSAGE_MAP(CTestDllDlg, CDialogEx)
        ON_WM_SYSCOMMAND()
        ON_WM_PAINT()
        ON_WM_QUERYDRAGICON()
        ON_EN_CHANGE(IDC_MFCEDITBROWSE1, &CTestDllDlg::OnEnChangeMfceditbrowse1)
        ON_CBN_SELCHANGE(IDC_COMBO1, &CTestDllDlg::OnCbnSelchangeCombo1)
        ON_CBN_SETFOCUS(IDC_COMBO1, &CTestDllDlg::OnCbnSetfocusCombo1)
        ON_BN_CLICKED(OK, &CTestDllDlg::OnBnClickedOk)
        ON_STN_CLICKED(result, &CTestDllDlg::OnStnClickedresult)
        ON_BN_CLICKED(clear, &CTestDllDlg::OnBnClickedclear)
        ON_CBN_SETFOCUS(IDC_COMBO2, &CTestDllDlg::OnCbnSetfocusCombo2)
        ON_BN_CLICKED(IDC_BUTTON_CLOSE, &CTestDllDlg::OnBnClickedButtonClose)
        ON_WM_CTLCOLOR()
        ON_WM_DRAWITEM()
        ON_WM_LBUTTONUP()
        ON_WM_LBUTTONDOWN()
        ON_WM_MOUSEMOVE()
        ON_WM_SIZE()
    END_MESSAGE_MAP()
    
    
    // CTestDllDlg message handlers
    
    BOOL CTestDllDlg::OnInitDialog()
    {
        CDialogEx::OnInitDialog();
    
        // Add "About..." menu item to system menu.
    
        // IDM_ABOUTBOX must be in the system command range.
        ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
        ASSERT(IDM_ABOUTBOX < 0xF000);
    
        CMenu* pSysMenu = GetSystemMenu(FALSE);
        if (pSysMenu != nullptr)
        {
            BOOL bNameValid;
            CString strAboutMenu;
            bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
            ASSERT(bNameValid);
            if (!strAboutMenu.IsEmpty())
            {
                pSysMenu->AppendMenu(MF_SEPARATOR);
                pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
            }
        }
    
        // Set the icon for this dialog.  The framework does this automatically
        //  when the application's main window is not a dialog
        SetIcon(m_hIcon, TRUE);            // Set big icon
        SetIcon(m_hIcon, FALSE);        // Set small icon
    
        // TODO: Add extra initialization here
    
        CString strBmpPath = _T(".\res\backgroundone.jpg");
    
        CImage img;
    
        img.Load(strBmpPath);
    
        MoveWindow(0, 0, img.GetWidth(), img.GetHeight());
    
        CBitmap bmpTmp;
    
        bmpTmp.Attach(img.Detach());
    
        m_brush.CreatePatternBrush(&bmpTmp);
    
    
        CRect rect_close;
        GetDlgItem(IDC_BUTTON_CLOSE)->GetWindowRect(&rect_close);//获得空间的绝对坐标
        ScreenToClient(&rect_close);//获得相对于主窗体的坐标
        //rect.OffsetRect(CSize(5, 0));//这里要是要移动的相对位置
        rect_close.OffsetRect(CSize(17, 0));//这里要是要移动的相对位置
        GetDlgItem(IDC_BUTTON_CLOSE)->MoveWindow(rect_close);//移动到目标位置
    
        CFont* font;
        font = static_title.GetFont();//获取CFont对象
        LOGFONT lf;
        font->GetLogFont(&lf);//获取LOGFONT结构体
        lf.lfHeight = -15;    //修改字体大小
        lf.lfItalic = TRUE;        //倾斜
        lf.lfWeight = 400;   //修改字体的粗细
        newFont.CreateFontIndirectW(&lf);//创建一个新的字体
        static_title.SetFont(&newFont);
    
        m_combo.AddString(L"Add");
        m_combo.AddString(L"Delete");
        m_combo.AddString(L"Update");
        m_combo.AddString(L"Query");
        m_combo.SetCurSel(0);
    
        return TRUE;  // return TRUE  unless you set the focus to a control
    }
    
    void CTestDllDlg::OnSysCommand(UINT nID, LPARAM lParam)
    {
        if ((nID & 0xFFF0) == IDM_ABOUTBOX)
        {
            CAboutDlg dlgAbout;
            dlgAbout.DoModal();
        }
        else
        {
            CDialogEx::OnSysCommand(nID, lParam);
        }
    }
    
    // If you add a minimize button to your dialog, you will need the code below
    //  to draw the icon.  For MFC applications using the document/view model,
    //  this is automatically done for you by the framework.
    
    void CTestDllDlg::OnPaint()
    {
        if (IsIconic())
        {
            CPaintDC dc(this); // device context for painting
    
            SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
    
            // Center icon in client rectangle
            int cxIcon = GetSystemMetrics(SM_CXICON);
            int cyIcon = GetSystemMetrics(SM_CYICON);
            CRect rect;
            GetClientRect(&rect);
            int x = (rect.Width() - cxIcon + 1) / 2;
            int y = (rect.Height() - cyIcon + 1) / 2;
    
            // Draw the icon
            dc.DrawIcon(x, y, m_hIcon);
        }
        else
        {
            CDialogEx::OnPaint();
            //CDialogEx::OnPaint();
        }
    }
    
    // The system calls this function to obtain the cursor to display while the user drags
    //  the minimized window.
    HCURSOR CTestDllDlg::OnQueryDragIcon()
    {
        return static_cast<HCURSOR>(m_hIcon);
    }
    
    
    
    void CTestDllDlg::OnEnChangeEdit1()
    {
        // TODO:  If this is a RICHEDIT control, the control will not
        // send this notification unless you override the CDialogEx::OnInitDialog()
        // function and call CRichEditCtrl().SetEventMask()
        // with the ENM_CHANGE flag ORed into the mask.
    
        // TODO:  Add your control notification handler code here
    }
    
    char* cstringTochar(CString str_tmp) {
    
        char *ptr;
        CString str;
        str = str_tmp;
    #ifdef _UNICODE
        LONG len;
        len = WideCharToMultiByte(CP_ACP, 0, str, -1, NULL, 0, NULL, NULL);
        ptr = new char[len + 1];
        memset(ptr, 0, len + 1);
        WideCharToMultiByte(CP_ACP, 0, str, -1, ptr, len + 1, NULL, NULL);
    #else
        ptr = new char[str.GetAllocLength() + 1];
        sprintf(ptr, _T("%s"), str);
    #endif
        return ptr;
    }
    
    
    void CTestDllDlg::OnEnChangeMfceditbrowse1()
    {
    
        // TODO:  If this is a RICHEDIT control, the control will not
        // send this notification unless you override the CDialogEx::OnInitDialog()
        // function and call CRichEditCtrl().SetEventMask()
        // with the ENM_CHANGE flag ORed into the mask.
    
        // TODO:  Add your control notification handler code here
    
        //CString strFile = _T("");
        //CFileDialog dlgFile(TRUE, NULL, NULL, OFN_HIDEREADONLY, _T("Describe Files (*.ini)|*.ini|All Files (*.*)|*.*||"), NULL);
        //if (dlgFile.DoModal()) {
        //    strFile = dlgFile.GetPathName();
        //}
        //SetDlgItemText(path, strFile);
        //SetDlgItemText(key, L"aaa");
        m_combo_sec.ResetContent();//清空所有ComboBox的项目
        CString path_cstr;
        GetDlgItemText(IDC_MFCEDITBROWSE1, path_cstr);
        char* path_str;
        path_str = cstringTochar(path_cstr);
    
        HINSTANCE hInst;
        hInst = LoadLibrary(_T("IniDll.dll"));
        typedef int(*Getsec_num)(char* path_str);
        Getsec_num getsec_num = (Getsec_num)GetProcAddress(hInst, "GetSections_num");
        int num = getsec_num(path_str);
    
        char* sec_set;
        typedef char*(*Getsec)(char* path_str, int num);
        Getsec getsec = (Getsec)GetProcAddress(hInst, "GetSections");
        for (int i = 1; i < num + 1; i++) {
            sec_set = getsec(path_str, i);
            CString value_cstr_tmp(sec_set);
            m_combo_sec.AddString(value_cstr_tmp);
            //m_combo.SetCurSel(0);
        }
        m_combo_sec.SetCurSel(-1);
        FreeLibrary(hInst);
        //SetDlgItemText(key, path_cstr);
    }
    
    
    void CTestDllDlg::OnCbnSelchangeCombo1()
    {
        // TODO: Add your control notification handler code here
        //CString strPre, strNew;
        ////GetDlgItem(IDC_COMBO1)->GetWindowTextW(m_paramname);//改变前的文本
        ////SetDlgItemText(path, m_paramname);
        //int nSel = m_combo.GetCurSel();
        //m_combo.GetLBText(nSel, strNew);
        ////SetDlgItemText(path, strNew);
        ////m_combo.GetWindowText(strPre);
        //if (!strNew.CompareNoCase(L"Query")) {
        //    SetDlgItemText(value, strNew);
        //    //query_page.DoModal();
        //    //query_page.ChangeProc(GetDlgItem(IDC_COMBO1)->GetSafeHwnd());
        //}
        GetDlgItem(value)->EnableWindow(TRUE);
        CString strNew_change;
        int nSel_change = m_combo.GetCurSel();
        m_combo.GetLBText(nSel_change, strNew_change);
        if (!strNew_change.CompareNoCase(L"Query")) {
            GetDlgItem(value)->EnableWindow(FALSE);
        }
    }
    
    
    void CTestDllDlg::OnCbnSetfocusCombo1()
    {
         //TODO: Add your control notification handler code here
        //m_combo.ResetContent();//清空所有ComboBox的项目
        //m_combo.AddString(L"Add");
        //m_combo.AddString(L"Delete");
        //m_combo.AddString(L"Update");
        //m_combo.AddString(L"Query");
    
        //int nSel = m_combo.GetCurSel();
        //m_combo.SetCurSel(nSel);
    }
    
    
    void CTestDllDlg::OnBnClickedOk()
    {
        // TODO: Add your control notification handler code here
        CString strNew;
        int nSel = m_combo.GetCurSel();
        m_combo.GetLBText(nSel, strNew);
    
        CString path_cstr, sec_cstr, key_cstr, value_cstr;
        char* path_str;
        char* sec_str;
        char* key_str;
        //GetDlgItemText(path, path_cstr);//获取指定ID的编辑框内容
        GetDlgItemText(IDC_MFCEDITBROWSE1, path_cstr);
        if (!strNew.CompareNoCase(L"Query")) {
            int nSel_sec = m_combo_sec.GetCurSel();
            m_combo_sec.GetLBText(nSel_sec, sec_cstr);
        }
        else {
            m_combo_sec.GetWindowText(sec_cstr);
        }
        //GetDlgItemText(section, sec_cstr);//获取指定ID的编辑框内容
        GetDlgItemText(key, key_cstr);//获取指定ID的编辑框内容
        path_str = cstringTochar(path_cstr);
        sec_str = cstringTochar(sec_cstr);
        key_str = cstringTochar(key_cstr);
    
        if (!strNew.CompareNoCase(L"Query")) {
            GetDlgItem(value)->EnableWindow(TRUE);
            //SetDlgItemText(value, strNew);
            HINSTANCE hInst;
            hInst = LoadLibrary(L"IniDll.dll");
            typedef char*(*Read)(char* sec_str, char* key_str, char* path_str);
            Read read_string = (Read)GetProcAddress(hInst, "Ini_Read");
            //Read read_string = (Read)GetProcAddress(hInst, (LPCSTR)MAKEINTRESOURCE(2));
            char* a = read_string(sec_str, key_str, path_str);
            //char* a = Ini_Read(sec_str, key_str, path_str);
            CString value_cstr_tmp(a);
    
            SetDlgItemText(value, value_cstr_tmp);
    
            //SetDlgItemText(result, L"查询成功");//获取指定ID的编辑框内容
            FreeLibrary(hInst);
            AfxMessageBox(_T("查询成功!"));
            GetDlgItem(value)->EnableWindow(FALSE);
        }
        else if (!strNew.CompareNoCase(L"Add")) {
            GetDlgItemText(value, value_cstr);
            char* value_str = new char[1024];
            value_str = cstringTochar(value_cstr);
    
            HINSTANCE hInst;
            hInst = LoadLibrary(_T("IniDll.dll"));
            typedef void(*Write)(char* sec_str, char* key_str, char* value_str, char* path_str);
            Write write = (Write)GetProcAddress(hInst, "Ini_Write");
            write(sec_str, key_str, value_str, path_str);
            //SetDlgItemText(result, L"添加成功");//获取指定ID的编辑框内容
            FreeLibrary(hInst);
            AfxMessageBox(_T("添加成功!"));
        }
        else if (!strNew.CompareNoCase(L"Update")) {
            GetDlgItemText(value, value_cstr);
            char* value_str = new char[1024];
            value_str = cstringTochar(value_cstr);
    
            HINSTANCE hInst;
            hInst = LoadLibrary(_T("IniDll.dll"));
            typedef void(*Write)(char* sec_str, char* key_str, char* value_str, char* path_str);
            Write write = (Write)GetProcAddress(hInst, "Ini_Write");
            write(sec_str, key_str, value_str, path_str);
            //SetDlgItemText(result, L"修改成功");//获取指定ID的编辑框内容
            FreeLibrary(hInst);
            AfxMessageBox(_T("修改成功!"));
        }
        else if (!strNew.CompareNoCase(L"Delete")) {
            //GetDlgItemText(value, value_cstr);
            //char* value_str = new char[1024];
            //value_str = cstringTochar(value_cstr);
    
    
            if (!key_cstr.CompareNoCase(L"")) {
                HINSTANCE hInst;
                hInst = LoadLibrary(_T("IniDll.dll"));
                typedef void(*Del_Sec)(char* sec_str, char* path_str);
                Del_Sec del_sec = (Del_Sec)GetProcAddress(hInst, "Ini_Del_Sec");
                del_sec(sec_str, path_str);
                FreeLibrary(hInst);
                AfxMessageBox(_T("删除成功!"));
            }
            else {
                HINSTANCE hInst;
                hInst = LoadLibrary(_T("IniDll.dll"));
                typedef void(*Del_Key)(char* sec_str, char* key_str, char* path_str);
                Del_Key del_key = (Del_Key)GetProcAddress(hInst, "Ini_Del_Key");
                del_key(sec_str, key_str, path_str);
                FreeLibrary(hInst);
                AfxMessageBox(_T("删除成功!"));
            }
        }
    
    }
    
    
    void CTestDllDlg::OnStnClickedresult()
    {
        // TODO: Add your control notification handler code here
    }
    
    
    void CTestDllDlg::OnBnClickedclear()
    {
        // TODO: Add your control notification handler code here
        SetDlgItemText(IDC_MFCEDITBROWSE1, L"");
        m_combo_sec.ResetContent();//清空所有ComboBox的项目
        SetDlgItemText(key, L"");
        SetDlgItemText(value, L"");
        SetDlgItemText(result, L"");
    }
    
    
    void CTestDllDlg::OnBnClickedbutton()
    {
        // TODO: Add your control notification handler code here
    }
    
    
    void CTestDllDlg::OnCbnSetfocusCombo2()
    {
        // TODO: Add your control notification handler code here
    }
    
    
    void CTestDllDlg::OnBnClickedButtonClose()
    {
        // TODO: Add your control notification handler code here
        CDialog::OnOK();
    }
    
    
    HBRUSH CTestDllDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
    {
        HBRUSH hbr = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor);
    
        // TODO:  Change any attributes of the DC here
    
        // TODO:  Return a different brush if the default is not desired
    
        if (pWnd == this)
        {
            return m_brush;
        }
    
    
        if (pWnd->GetDlgCtrlID() == (IDC_STATIC_TITLE))
        {
            //MessageBox(_T("static text"));
            pDC->SetBkMode(TRANSPARENT);
            pDC->SetTextColor(RGB(255, 251, 240));
            return HBRUSH(GetStockObject(HOLLOW_BRUSH));
        }
    
        if (pWnd->GetDlgCtrlID() == (IDC_STATIC))
        {
            //MessageBox(_T("static text"));
            pDC->SetBkMode(TRANSPARENT);
            //pDC->SetTextColor(RGB(0, 225, 225));
            return HBRUSH(GetStockObject(HOLLOW_BRUSH));
        }
    
        return hbr;
    }
    
    
    void CTestDllDlg::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct)
    {
        // TODO: Add your message handler code here and/or call default
    
        ////获得button标题 
        //CString btnCaption = _T("Dialog");
        //CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
    
        CString btnCaption = L"";
        //设置标题
        switch (lpDrawItemStruct->CtlID)
        {
        case OK:
            btnCaption = "OK";
            break;
        case clear:
            btnCaption = "Clear";
            break;
        default:
            ;
        }
        CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
    
        CRect drawRect;
        //获得绘图DC
        //得到原Button的矩形大小
        drawRect.CopyRect(&(lpDrawItemStruct->rcItem));
        //绘制控件框架 
        pDC->DrawFrameControl(&drawRect, DFC_BUTTON, lpDrawItemStruct->CtlType);
    
    
        //创建画刷
        CBrush pBrush;
        //pBrush.CreateSolidBrush(RGB(100, 130, 10));
        pBrush.CreateSolidBrush(RGB(0, 128, 255));
        //画矩形 
        pDC->FillRect(drawRect, &pBrush);
    
    
        //定义一个CRect用于绘制文本 
        CRect textRect;
        //拷贝矩形区域 
        textRect.CopyRect(&drawRect);
        //获得字符串尺寸
        CSize sz = pDC->GetTextExtent(btnCaption);
        //调整文本位置 居中 
        textRect.top += (textRect.Height() - sz.cy) / 2;
        //设置文本背景透明 
        pDC->SetBkMode(TRANSPARENT);
        //设置文本颜色
        pDC->SetTextColor(RGB(0, 0, 255));
        //绘制文本内容
        pDC->DrawText(btnCaption, &textRect, DT_RIGHT | DT_CENTER | DT_BOTTOM);
    
        CDialog::OnDrawItem(nIDCtl, lpDrawItemStruct);
    
        //CDialogEx::OnDrawItem(nIDCtl, lpDrawItemStruct);
    }
    
    
    void CTestDllDlg::OnLButtonUp(UINT nFlags, CPoint point)
    {
        // TODO: Add your message handler code here and/or call default
        ReleaseCapture();
    
        CDialogEx::OnLButtonUp(nFlags, point);
    }
    
    
    void CTestDllDlg::OnLButtonDown(UINT nFlags, CPoint point)
    {
        // TODO: Add your message handler code here and/or call default
        SetCapture();
    
        CDialogEx::OnLButtonDown(nFlags, point);
    }
    
    
    void CTestDllDlg::OnMouseMove(UINT nFlags, CPoint point)
    {
        // TODO: Add your message handler code here and/or call default
    
        static CPoint PrePoint = CPoint(0, 0);
        if (MK_LBUTTON == nFlags)
        {
            if (point != PrePoint)
            {
                CPoint ptTemp = point - PrePoint;
                CRect rcWindow;
                GetWindowRect(&rcWindow);
                rcWindow.OffsetRect(ptTemp.x, ptTemp.y);
                MoveWindow(&rcWindow);
                return;
            }
        }
        PrePoint = point;
    
        CDialogEx::OnMouseMove(nFlags, point);
    }
    
    
    void CTestDllDlg::OnSize(UINT nType, int cx, int cy)
    {
        CDialogEx::OnSize(nType, cx, cy);
    
        //CDialogEx::OnSize(nType, cx, cy);
    
        // TODO: Add your message handler code here
    }
    View Code
  • 相关阅读:
    【转载】区间DP
    基础DP的一些知识总结(未完成)
    POJ2718 递归套递归
    Hadoop Illuminated——Chapter4 BigData
    Hadoop Illuminated——Chapter3 Why do I Need Hadoop?
    一条SQL语句是怎么执行的
    Github 《算法竞赛进阶指南》资源
    Hadoop——搭建Hadoop的全分布模式
    Hadoop——免密码登陆的原理和配置
    洛谷——排序P1781宇宙总统
  • 原文地址:https://www.cnblogs.com/smart-zihan/p/10877182.html
Copyright © 2020-2023  润新知