剑痴乎

  • 首页
  • 文章分类
    • 音视频
    • WebRTC
    • 编程之美
    • Linux
    • Windows
    • 生活点滴
    • 校园生活
  • 参考
    • API参考
    • 实用工具
    • 测试音视频
    • 文档
  • 留言板
  • 关于
剑痴乎
代码为剑,如痴如醉
  1. 首页
  2. 编程之美
  3. 正文

MFC-改变编辑框(CEdit)样式

2014年11月2日 408点热度 0人点赞 1条评论

MFC默认的编辑框控件是白底的,有时候我们需要按自己的要求显示,比如我写过一个程序,用编辑框控件CEdit作为控制台输出,黑色背景,绿色文字。下面讲下如何修改编辑框控件样式。

1)首先我们通过MFC的向导创建一个基于对话框的程序Test,往界面拖一个Edit Control,ID设置为:IDC_SHOWMSG,由于我将该编辑框作为控制台输出,所以设置属性:Read Only:True,Multiline:True
2)选中该编辑框控件,在Class Wizard中添加WM_CTLCOLOR消息
Onctlcolormessage
3)在对话框类声明中添加如下三个成员变量:

C++
1
2
3
CBrush m_brMine;
COLORREF m_BlackColor;
COLORREF m_TextColor;

4)在OnInitDialog()中添加如下初始化代码:

C++
1
2
3
m_BlackColor = RGB(10,10,10);                // 黑色背景  
m_TextColor=RGB(0,255,0);                 // 文本颜色设置为绿色  
m_brMine.CreateSolidBrush(m_BlackColor);         // 黑色背景色  

5)修改OnCtlColor()函数:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
HBRUSH CToolBoxDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
    HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);  
    if ((pWnd->GetDlgCtrlID() == IDC_SHOWMSG) && (nCtlColor == CTLCOLOR_STATIC) )
    {
        pDC->SetBkColor(m_BlackColor);    
        pDC->SetTextColor(m_TextColor);
        hbr = (HBRUSH) m_brMine;    
        return m_brMine;  
    }
    else
    {
        hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
        return hbr;
    }
}

6)最后的效果如下图所示:
blackbackwhitetext

完整代码:
TestDlg.h

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
// TestDlg.h : header file
//
 
#pragma once
 
 
// CTestDlg dialog
class CTestDlg : public CDialogEx
{
// Construction
public:
    CTestDlg(CWnd* pParent = NULL);    // standard constructor
 
// Dialog Data
    enum { IDD = IDD_TEST_DIALOG };
 
    protected:
    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
 
 
// Implementation
protected:
    HICON m_hIcon;
 
    // Generated message map functions
    virtual BOOL OnInitDialog();
    afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
    afx_msg void OnPaint();
    afx_msg HCURSOR OnQueryDragIcon();
    DECLARE_MESSAGE_MAP()
    CBrush m_brMine;
    COLORREF m_BlackColor;
    COLORREF m_TextColor;
public:
    afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);
};

TestDlg.cpp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
// TestDlg.cpp : implementation file
//
 
#include "stdafx.h"
#include "Test.h"
#include "TestDlg.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
    enum { IDD = IDD_ABOUTBOX };
 
    protected:
    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
 
// Implementation
protected:
    DECLARE_MESSAGE_MAP()
};
 
CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD)
{
}
 
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
    CDialogEx::DoDataExchange(pDX);
}
 
BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
END_MESSAGE_MAP()
 
 
// CTestDlg dialog
 
 
 
CTestDlg::CTestDlg(CWnd* pParent /*=NULL*/)
    : CDialogEx(CTestDlg::IDD, pParent)
{
    m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
 
void CTestDlg::DoDataExchange(CDataExchange* pDX)
{
    CDialogEx::DoDataExchange(pDX);
}
 
BEGIN_MESSAGE_MAP(CTestDlg, CDialogEx)
    ON_WM_SYSCOMMAND()
    ON_WM_PAINT()
    ON_WM_QUERYDRAGICON()
    ON_WM_CTLCOLOR()
END_MESSAGE_MAP()
 
 
// CTestDlg message handlers
 
BOOL CTestDlg::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 != NULL)
    {
        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
    m_BlackColor = RGB(10,10,10);                     // 黑色背景  
    m_TextColor=RGB(0,255,0);                          // 文本颜色设置为绿色  
    m_brMine.CreateSolidBrush(m_BlackColor);         // 黑色背景色  
 
    SetDlgItemText(IDC_SHOWMSG,L"黑色背景,绿色文字");
 
    return TRUE;  // return TRUE  unless you set the focus to a control
}
 
void CTestDlg::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 CTestDlg::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();
    }
}
 
// The system calls this function to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR CTestDlg::OnQueryDragIcon()
{
    return static_cast<HCURSOR>(m_hIcon);
}
 
 
 
HBRUSH CTestDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
    HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);  
    //  由于编辑框属性设置为Read only,所以为CTLCOLOR_STATIC,相当于Static Text
    if ((pWnd->GetDlgCtrlID() == IDC_SHOWMSG) && (nCtlColor == CTLCOLOR_STATIC) )
    {
        pDC->SetBkColor(m_BlackColor);    
        pDC->SetTextColor(m_TextColor);
        hbr = (HBRUSH) m_brMine;    
        return m_brMine;  
    }
    else
    {
        hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
        return hbr;
    }
}

本作品采用 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议 进行许可
标签: 暂无
最后更新:2018年12月23日

Jeff Young

代码为剑,如痴如醉

打赏 点赞
< 上一篇
下一篇 >

文章评论

  • laoyan

    很有帮助,感谢博主~

    2019年7月25日
    回复
  • 取消回复

    我的其它小窝

    公众号:码上Play(基本不更新,回答问题用)

    近期评论
    • Jeff on WebRTC研究:BBR拥塞控制被移除了研究过了,等后面有时间简单说明下
    • xhcx on WebRTC研究:BBR拥塞控制被移除了楼主,BBR移除的原因最近有研究吗,分享一下
    • Jeff on Windows平台WebRTC编译(持续更新)M79是2019年发布的版本,不适用这篇文章。编译…
    • haige on Windows平台WebRTC编译(持续更新)我编译的m79版本,用VS2019打开会报错, F…
    • 菜菜 on libcef编译使用--使用VS2015是真的鸟
    版权声明

    为支持原创,创作更好的文章,未经许可,禁止任何形式的转载与抄袭,如需转载请邮件私信!本人保留所有法定权利。违者必究!

    COPYRIGHT © 2021 剑痴乎. ALL RIGHTS RESERVED.

    THEME KRATOS MADE BY VTROIS