MFC—基础知识点

@picture control控件加载图片
{
    HBITMAP hBitMap = (HBITMAP)::LoadImage(NULL, L"D:\\data\\phone417.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
    m_child_pic.SetBitmap(hBitMap);    
}

@创建一张位图
{
    if (!m_bmp.GetSafeHandle())
    {
        m_bmp.LoadBitmap(IDB_BITMAP1);
        nCount = m_bmp.GetBitmapBits(0, NULL);

        char *p = new char[nCount];
        m_bmp.GetBitmapBits(0, p);
        delete []p;
    }

    CDC mdc;
    mdc.CreateCompatibleDC(&dc);
    mdc.SelectObject(&m_bmp);

    BITMAP bm;
    m_bmp.GetBitmap(&bm);

    dc.SetStretchBltMode(STRETCH_HALFTONE);
    //dc.BitBlt(0, 0, bm.bmWidth, bm.bmHeight, &mdc, 0, 0, SRCCOPY);
    dc.StretchBlt(bm.bmWidth, 0, -bm.bmWidth, bm.bmHeight, &mdc, 0, 0, bm.bmWidth, bm.bmHeight, SRCCOPY);
}
@控件随窗口变化
{
    void CYRDlg::ReSize(void)
    {
        float fsp[2];
        POINT Newp; //获取现在对话框的大小  
        CRect recta;
        GetClientRect(&recta);     //取客户区大小    
        Newp.x = recta.right - recta.left;
        Newp.y = recta.bottom - recta.top;
        fsp[0] = (float)Newp.x / m_old.x;
        fsp[1] = (float)Newp.y / m_old.y;
        CRect Rect;
        int woc;
        CPoint OldTLPoint, TLPoint; //左上角  
        CPoint OldBRPoint, BRPoint; //右下角  
        HWND  hwndChild = ::GetWindow(m_hWnd, GW_CHILD);  //列出所有控件    
        while (hwndChild) {
            woc = ::GetDlgCtrlID(hwndChild);//取得ID  
            GetDlgItem(woc)->GetWindowRect(Rect);
            ScreenToClient(Rect);
            OldTLPoint = Rect.TopLeft();
            TLPoint.x = long(OldTLPoint.x*fsp[0]);
            TLPoint.y = long(OldTLPoint.y*fsp[1]);
            OldBRPoint = Rect.BottomRight();
            BRPoint.x = long(OldBRPoint.x *fsp[0]);
            BRPoint.y = long(OldBRPoint.y *fsp[1]);
            Rect.SetRect(TLPoint, BRPoint);
            GetDlgItem(woc)->MoveWindow(Rect, TRUE);
            hwndChild = ::GetWindow(hwndChild, GW_HWNDNEXT);
        }
        m_old = Newp;
    }

    void CYRDlg::ChangeSize(UINT nID, int x, int y)
    {
        CWnd *pWnd = GetDlgItem(nID);
        if (pWnd != NULL)
        {
            CRect rec;
            pWnd->GetWindowRect(&rec);//获取控件变化前的大小
            ScreenToClient(rec);   //将控件大小装换位在对话框中的区域坐标
                                   // x / m_rect.Width(); 伸缩rate
            rec.left = rec.left * x / m_rect.Width();
            rec.top = rec.top * y / m_rect.Height();
            rec.bottom = rec.bottom  * y / m_rect.Height();
            rec.right = rec.right * x / m_rect.Width();
            pWnd->MoveWindow(rec);//伸缩控件
        }
    }

    void CYRDlg::OnSize(UINT nType, int cx, int cy)
    {
        CDialogEx::OnSize(nType, cx, cy);
        
        // TODO: 在此处添加消息处理程序代码
        if (nType != SIZE_MINIMIZED)  //判断窗口是不是最小化了,因为窗口最小化之后 ,窗口的长和宽会变成0,当前一次变化的时就会出现除以0的错误操作
        {
            ReSize();
        }
    }
}

@创建矩形并填充颜色
{
    //分割线
    CDC *pDC = GetDlgItem(IDC_STATIC_LINE)->GetDC();
    CRect rct;
    GetDlgItem(IDC_STATIC_LINE)->GetWindowRect(&rct);
    CBrush brs;
    brs.CreateSolidBrush(RGB(211, 211, 211));
    CRect picrct;
    picrct.top = 0;
    picrct.left = 0;
    picrct.bottom = rct.Height();
    picrct.right = rct.Width();
    pDC->FillRect(&picrct, &brs);
    GetDlgItem(IDC_STATIC_LINE)->ReleaseDC(pDC);
}

@设置Edit编辑框内容
{
    int intergrateTime = 1;
    CString timeInt;
    timeInt.Format(L"%d", intergrateTime);
    SetDlgItemText(IDC_EDIT_SCORE, timeInt);

@获取Edit编辑框内容
{
    CString numStr;
    GetDlgItemText(IDC_EDIT, numStr);
}

@CString 转换为 char *
{
    USES_CONVERSION;
    CString str;
    T2A(str);
}

@CString 装欢为 int
{
    CString numStr;
    GetDlgItemText(IDC_EDIT_DBD, numStr);
    g_dbd = _ttoi(numStr);
}

&CString 转换为 double
{
    _tstof(str);
}

@char * 转换为 CString
{
    USES_CONVERSION;
    char * str;
    A2T(str);
}

@string 转换 CString  unicode
{
    string strr = m_detector->GetErrorInfo(errid);
    CString str(strr.c_str());
}

@检查目录是否存在,不存在则创建
{
    CString phonedir;
    phonedir.Format(L"D:\\data");
    if (FALSE == PathFileExists(phonedir))
    {
        CreateDirectory(phonedir, NULL);
    }
}

@MessageBox
{
    MessageBox(L"请设置积分时间", L"警告");
}

@图片跟随控件大小显示
{
    CImage imagePic;
    if (imagePic.Load("路径") == S_OK)
    {
        CRect rect;
        m_myView->m_child_pic.GetClientRect(&rect);
        CDC *pDC = m_myView->m_child_pic.GetDC();
        SetStretchBltMode(pDC->m_hDC, STRETCH_HALFTONE);
        SetBrushOrgEx(pDC->m_hDC, 0, 0, NULL);
        imagePic.StretchBlt(pDC->m_hDC, rect, SRCCOPY);
        m_myView->m_child_pic.ReleaseDC(pDC);
    }
}

@控件平移
{
    CClientDC dc(this->m_myView);
    CRect rect, rect2, rt;
    m_myView->GetClientRect(rt);

    m_myView->m_child_pic.GetWindowRect(rect);
    m_myView->ScreenToClient(rect);
    rect.OffsetRect(-1, 0);
    m_myView->m_child_pic.MoveWindow(rect);

    if (rect.right <= 0)
    {
        rect.OffsetRect(rect.Width() + rt.Width(), 0);
    }
    m_myView->m_child_pic.MoveWindow(rect);
}

@屏蔽Esc和Enter
{
    //重写函数
    BOOL CYRDlg::PreTranslateMessage(MSG* pMsg)
    {
        /*if (pMsg->message == WM_NCLBUTTONDBLCLK)
        {
            return TRUE;
        }*/
        if (pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_ESCAPE)
        {
            // 屏蔽Esc键
            return TRUE;
        }
        if (pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_RETURN)
        {
            // 屏蔽Entert键;
            return TRUE;
        }
        return CDialogEx::PreTranslateMessage(pMsg);
    }
}

@获取当前时间
{
    CString CYRDlg::onGetTime()
    {
        CTime m_time;
        m_time = CTime::GetCurrentTime();
        CString time = m_time.Format(_T("%X"));
        return time + " | ";
    }
}

@Edit自动换行
{
    void CYRDlg::SetInfoText()
    {
        SetDlgItemText(IDC_EDIT_ERR_INFO, m_infoStr);
        m_edit.LineScroll(m_edit.GetLineCount());
    }
}

@检查复选框是否选中
{
    void CYRDlg::OnBnClickedCheckLr()
    {
        // TODO: 在此添加控件通知处理程序代码
        if (BST_CHECKED == IsDlgButtonChecked(IDC_CHECK_LR))
            b_pic_dir = true;
        else
            b_pic_dir = false;
    }
}

@读取ini文件数据
{
    void CYRDlg::OnBnClickedButtonCheck()
    {
        // TODO: 在此添加控件通知处理程序代码
        USES_CONVERSION;
        CString PROGRAM_PATH = L"D:\\data.ini";
        if (_access(T2A(PROGRAM_PATH), 0) == -1)
        {
            MessageBox(L"D:\\data.ini 文件不存在", L"警告");
            return;
        }

        //if (m_bright_bdark_count == 2)
        {
            CString str;

            int datasize = 64 * m_detector_num;
            for (int i = 0; i < datasize; i++)
            {
                str = "";
                str.Format(L"%d", i);
                g_buf_ming[i] = GetPrivateProfileInt(L"ming", str, 999, PROGRAM_PATH);
            }

            for (int i = 0; i < datasize; i++)
            {
                str = "";
                str.Format(L"%d", i);
                g_buf_an[i] = GetPrivateProfileInt(L"an", str, 999, PROGRAM_PATH);
            }

            b_bcheck = true;

            WriteInfoStr(L"校验完成");
            GetDlgItem(IDC_BUTTON_CHECK)->EnableWindow(SW_HIDE);
        }
    }
}

@写入ini文件数据
{
    CString PROGRAM_PATH = L"D:\\data.ini";

    //防止第二次删除
    if (m_bright_bdark_count == 1)
    {
        DeleteFile(PROGRAM_PATH);
    }

    CString str;
    CString str_buf;
    for (int i = 0; i < datasize; i++)
    {
        str = "";
        str.Format(L"%d", i);

        str_buf = "";
        str_buf.Format(L"%d", g_buf_two[g_buf_second - 1][i]);

        if (b_bright)
            ::WritePrivateProfileString(_T("ming"), str, str_buf, PROGRAM_PATH);
        else
            ::WritePrivateProfileString(_T("an"), str, str_buf, PROGRAM_PATH);
    }
}

@只允许输入数字
{
    BOOL CWeiXinQ::PreTranslateMessage(MSG* pMsg)
    {
        // TODO: 在此添加专用代码和/或调用基类
            //指定对话框只接受数字按键输入,其他符号输入无效
        
        //获取控件窗口指针
        CEdit* pEdit1 = (CEdit*)GetDlgItem(IDC_EDIT1_Q_MONEY);
        CEdit* pEdit2 = (CEdit*)GetDlgItem(IDC_EDIT2_Q_CODE);
        if(    (GetFocus() == pEdit1 ||GetFocus() == pEdit2) && (pMsg->message == WM_CHAR)  )
        {
            //只允许输入数字和小数点“.”
            if((pMsg->wParam <= '9' && pMsg->wParam >= '0') || pMsg->wParam == '.') 
            {
                //金额输入框只允许输入一个小数点
                if(pMsg->wParam == '.')
                {
                    CString str;
                    int nPos = 0;
                    GetDlgItemText(IDC_EDIT1_Q_MONEY, str); // 获取edit中文本
                    nPos = str.Find('.');    // 查找.的位置
                    if(nPos >= 0)
                    {
                        return 1;
                    }
                }
                
                return 0;
                
            }
            else if(pMsg->wParam == 0x08 || pMsg->wParam == 0x10)          //接受Backspace和delete键
            {
                    return 0;
            }
            else
            {
                //响应标签页切换的快捷键
                switch(pMsg->wParam)
                {
                case 'q':
                case 'Q':
                case 'w':
                case 'W':
                case 'e':
                case 'E':
                case 'r':
                case 'R':
                case 't':
                case 'T':
                case 'y':
                case 'Y':
                case 'u':
                case 'U':
                case 'i':
                case 'I':
                case 'o':
                case 'O':
                    CWnd *pParent = GetParent();
                    pParent->SetFocus();
                }
                return 1;
            }
     
        }
     
        return CDialogEx::PreTranslateMessage(pMsg);
    }
}

@数据写入文档 较卡
{
    CStdioFile File;
    File.Open(_T("E:\\Project\\YR\\YR\\res\\filename.txt"), CFile::modeWrite | CFile::modeCreate);
    File.WriteString(textStr);
    File.Close();
}

@自定义单个消息
{
.h文件      #define WN_MYMSG WM_USER+1
.c文件      
    BEGIN_MESSAGE_MAP()
         ON_MESSAGE(WN_MYMSG, OnFunMyMsg)
    END_MESSAGE_MAP()    
调用
    SendMessage(WN_MYMASE,0,0);
    PostMessage(WN_MYMASE,0,0);
}

@多个程序调用一个消息
{
.h文件       static UINT WM_MYMSG_TEST = RegisterWindowMessage(L"myMessage");
.c文件    
    BEGIN_MESSAGE_MAP()
         ON_REGISTERED_MESSAGE(WM_MYMSG_TEST, OnMyMsgHandler)
    END_MESSAGE_MAP()
调用
    ::SendMessage(HWND_BROADCAST, WM_MYMSG_TEST, 0, 0);
}

@创建工具栏
{
    //m_ImageList.Create(64, 64, ILC_COLOR24 | ILC_MASK, 1, 1);

    //CBitmap bmp;
    //for (int n = 0; n<5; n++)
    //{
    //    bmp.LoadBitmap(IDB_BITMAP1 + n);
    //    m_ImageList.Add(&bmp, RGB(255, 255, 255));
    //    bmp.DeleteObject();
    //}
    定义工具栏命令ID数组
    //UINT nArray[5];
    //for (int i = 0; i<5; i++)
    //{
    //    nArray[i] = ID_ADDINFO + i;
    //}
    //m_wndToolBar.CreateEx(this);
    //m_wndToolBar.SetButtons(nArray, 5);
    设置工具栏按钮和按钮图像大小
    //m_wndToolBar.SetSizes(CSize(120, 120), CSize(64, 64));
    设置工具栏文本
    //m_wndToolBar.SetButtonText(0, L"信息添加");
    //m_wndToolBar.SetButtonText(1, L"信息修改");
    //m_wndToolBar.SetButtonText(2, L"信息删除");
    //m_wndToolBar.SetButtonText(3, L"信息查询");
    //m_wndToolBar.SetButtonText(4, L"信息保存");
    设置工具栏按钮显示图标
    //m_wndToolBar.GetToolBarCtrl().SetImageList(&m_ImageList);
    显示工具栏
    //RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST, 0);

}

@动态创建Static text
{
//m_pStatic = NULL;
    //if (m_pStatic && m_pStatic->IsWindowVisible())
    //{
    //    return 0;
    //}
    //else
    //{
    //    CRect rt;
    //    m_pView->GetWindowRect(rt);

    //    m_pStatic = new CStatic;
    //    m_pStatic->Create(_T("时间显示..."), WS_CHILD | WS_VISIBLE | DT_RIGHT, CRect(770, 20, 770+180, 40), this, IDC_STATIC_TIME);
    //    CFont font;
    //    font.CreatePointFont(120, L"宋体");//一个为字体大小,另一个为字体类型
    //    m_pStatic->SetFont(&font);//设置字体
    //}
}

@但文档创建/选择View
{
mainfrm.h
    CSplitterWnd    m_Splitter;
    
    int OnCreate(....)
    {
        m_myPicView = (CMyPicDlg*)m_Splitter.GetPane(0,0);
        m_pView = (CDkView*)m_Splitter.GetPane(0,1);
    }
    
    BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
    {
        // TODO: 在此添加专用代码和/或调用基类

        m_Splitter.CreateStatic(this, 1, 2);
        m_Splitter.CreateView(0, 0, RUNTIME_CLASS(CMyPicDlg), CSize(700, 700), pContext); 
        m_Splitter.CreateView(0, 1, RUNTIME_CLASS(CDkView), CSize(250, 0), pContext); 

        return true;
    }
}

@禁止拉伸对话框
{
    LRESULT CMainFrame::OnNcHitTest(CPoint point)
    {
        // TODO: 在此添加消息处理程序代码和/或调用默认值
        int ret = CFrameWnd::OnNcHitTest(point);
        if (HTTOP == ret || HTBOTTOM == ret || HTLEFT == ret || HTRIGHT == ret || HTBOTTOMLEFT == ret || HTBOTTOMRIGHT == ret || HTTOPLEFT == ret || HTTOPRIGHT == ret || HTCAPTION == ret)
            return HTCLIENT;
        return CFrameWnd::OnNcHitTest(point);
    }
}

@ListCtrl报错 (void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct))
{
    资源文件设置 Owner Draw Fixed 为 false
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值