VS2015 MFC 控件修改背景、字体;定时器;加载bmp图片;修改图片;创建线程;进程调用exe;鼠标悬停按钮显示文字;进程只启动一次;互斥锁;随机数

edit控件修改字体大小、文字居中、背景色、去掉边框等

字体大小:

CFont m_Font;
m_Font.CreateFont(30, 25, 0, 0, 100, FALSE, FALSE, 0, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, FF_SWISS, LPCSTR("Arial"));
GetDlgItem(IDC_EDIT1)->SetFont(&m_Font, NULL);

或者:

CFont m_Font; //需放到OnInitDialog()函数外
m_Font.CreatePointFont(100, _T("Times New Roman")); //大小,字体
GetDlgItem(IDC_EDIT1)->SetFont(&m_Font);

文字居中:

CRect rect;
GetDlgItem(IDC_EDIT1)->GetClientRect(&rect);
rect.OffsetRect(4, 30);
::SendMessage(((CEdit*)GetDlgItem(IDC_EDIT1))->m_hWnd, EM_SETRECT, 0, (LPARAM)&rect);
SetDlgItemText(IDC_EDIT1, _T("hello\r\n world "));

修改背景色:

重载OnCtlColor函数,并对其改写。 ON_WM_CTLCOLOR() 有点内存泄露,不知道怎么解决,请知道的麻烦留言,谢谢

类中定义:CBrush m_brush;
构造函数中初始化:m_brush.CreateSolidBrush(RGB(126, 255, 255));
HBRUSH CpDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
    HBRUSH hbr;// = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor);
    // TODO:  在此更改 DC 的任何特性
    switch (nCtlColor)
    {
    case  CTLCOLOR_EDIT:
        pDC->SetBkMode(TRANSPARENT);// 修改字体背景为透明
        //pDC->SetBkColor(RGB(126, 255, 255));
        hbr = m_edit_cbrush;// CreateSolidBrush(RGB(126, 255, 255));
        break;
    default:
        hbr = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor);
        break;
    }
    // TODO:  如果默认的不是所需画笔,则返回另一个画笔
    //if (nCtlColor == CTLCOLOR_EDIT) {
    //    pDC->SetBkMode(TRANSPARENT);// 修改字体背景色为透明
    //    hbr = m_brush; //修改控件背景色
    //}
    return hbr;
}

去掉边框:

将属性中的Border置为false即可。

button设置背景色

将button修改为owner draw 类型, 重载OnDrawItem函数,并对其改写, 在适当的位置添加下面的语句afx_msg void OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct);

ON_WM_DRAWITEM()

void CpDlg::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct)
{
    // TODO: 在此添加消息处理程序代码和/或调用默认值
    CDC dc;
    dc.Attach(lpDrawItemStruct->hDC);
    ASSERT(lpDrawItemStruct->CtlType == ODT_BUTTON);
    CString strText;
    ((CButton *)GetDlgItem(nIDCtl))->GetWindowText(strText);
    SetBkMode(lpDrawItemStruct->hDC, TRANSPARENT);
    //if (lpDrawItemStruct->itemState&ODS_SELECTED)
    {
        CBrush brush(RGB(126, 255, 255));
        dc.FillRect(&(lpDrawItemStruct->rcItem), &brush);
        DrawText(lpDrawItemStruct->hDC, strText, strText.GetLength(),
            &lpDrawItemStruct->rcItem, DT_SINGLELINE | DT_VCENTER | DT_CENTER);
        //SetBkMode(lpDrawItemStruct->hDC, TRANSPARENT);
    }
    dc.Detach();
    dc.DeleteDC();
    CDialogEx::OnDrawItem(nIDCtl, lpDrawItemStruct);
}
定时器使用

调用ON_WM_TIMER()

//定时器
SetTimer(1, 1000, NULL);
//使用
void CpDlg::OnTimer(UINT_PTR nIDEvent)
{
    switch (nIDEvent)
    {
    case 1:
    break;
    default:
    break;
    }
    CDialogEx::OnTimer(nIDEvent);
}
加载bmp图片

拖拽一个picture control 控件,改ID IDC_STATIC为IDC_STATIC1,type改为Bitmap。

CBitmap m_bitmap;
m_bitmap.LoadBitmap(IDB_BITMAP1);
CStatic *p = (CStatic*)GetDlgItem(IDC_STATIC1);
p->SetBitmap(m_bitmap);
修改图标

dlg.cpp文件 构造函数中AfxGetApp()->LoadIcon()中加载的图标改为导入的icon生成的文件名,一般为IDI_ICON1

创建线程

CWinThread* MyThread = AfxBeginThread(线程函数名, NULL);

创建进程 加载外部exe执行文件
STARTUPINFO si;
PROCESS_INFORMATION pi;
si = { 0 };
pi = { 0 };
BOOL fSuccess = CreateProcess(NULL, "./hello.exe", NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
if (fSuccess)
{
    WaitForSingleObject(pi.hProcess, INFINITE);
    CloseHandle(pi.hProcess);
    CloseHandle(pi.hThread);
}

注意:非管理员用户不能阻塞管理员用户exe。

修改背景颜色

在已有函数中增加

void CpDlg::OnPaint()
{
    if (IsIconic())
    {
        CPaintDC dc(this); // 用于绘制的设备上下文

        SendMessage(WM_ICONERASEBKGND, reinterpret_cast(dc.GetSafeHdc()), 0);

        // 使图标在工作区矩形中居中
        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;

        // 绘制图标
        dc.DrawIcon(x, y, m_hIcon);
    }
    else
    {
        //修改背景色
        CRect rc;
        GetClientRect(&rc);
        CPaintDC dc(this);
        dc.FillSolidRect(&rc, RGB(203, 255, 255));

        CDialogEx::OnPaint();
    }
}
按钮button添加ico格式图片

需将button按钮的Owner Draw设为False, Icon设置为True

    HICON hIcon = AfxGetApp()->LoadIcon(IDI_ICON2);
    ((CButton*)GetDlgItem(IDC_BUTTON2))->SetIcon(hIcon);
鼠标悬停按钮显示文字

在.cpp文件的头文件中声明CToolTipCtrl的类对象m_Ttc:

CToolTipCtrl m_Ttc;

在Dlg.cpp的初始化函数OnInitDialog()中设置m_Ttc:

m_Ttc.Create(this); //必需 
EnableToolTips(true); //设置是否启用提示 
m_Ttc.SetDelayTime(0); //设置延迟,如果为0则不等待 
m_Ttc.SetTipTextColor( RGB(0,0,255) ); //设置提示文本的颜色 
m_Ttc.SetTipBkColor( RGB(255,255,255)); //设置提示框的背景颜色 
m_Ttc.SetMaxTipWidth(600);//设置提示文本框的最大宽度
m_Ttc.Activate(TRUE); //设置是否启用提示 
m_Ttc.AddTool(GetDlgItem(IDC_BUTTON1), _T("功能预留"));//绑定控件ID  显示提示内容     
m_Ttc.AddTool(GetDlgItem(IDC_BUTTON2), _T("新建工程"));

项目右键选择类向导,类名选择Dlg,切换到:虚函数,找到PreTranslateMessage,点击添加函数。

VS2015 MFC 控件修改背景、字体;定时器;加载bmp图片;修改图片;创建线程;进程调用exe;鼠标悬停按钮显示文字;进程只启动一次;互斥锁;随机数_第1张图片

在函数中加入:

if (pMsg->message == WM_MOUSEMOVE)
    m_Ttc.RelayEvent(pMsg);
mfc生成的exe文件,只启动一次
在函数InitInstance()中添加下面程序   
    HANDLE m_hMutex = CreateMutex(NULL, TRUE, "power_spectrum");
    if (GetLastError() == ERROR_ALREADY_EXISTS)
    {
        AfxMessageBox(TEXT("只能启动一个程序"));
        return FALSE;
    }
互斥锁
CMutex mutex;//cpp文件里添加不要放在函数内

CSingleLock singleLock(&mutex);//函数内
singleLock.Lock();
//内容
singleLock.Unlock();
随机数
srand((unsigned)time(NULL));
double d = rand() / 100.00;

你可能感兴趣的:(Windows,windows,mfc)