剑痴乎

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

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

2014年11月2日 2949点热度 5人点赞 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

管理员——代码为剑,如痴如醉

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

文章评论

  • laoyan

    很有帮助,感谢博主~

    2019年7月25日
    回复
  • razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
    回复 laoyan 取消回复

    这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理。

    版权声明

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

    最近评论
    ztt 发布于 1 个月前(04月05日) 你好,想看里面的视频和图片为什么没有显示呢?需要下flash吗还是什么。
    huowa222 发布于 1 个月前(03月26日) 同问
    邱国禄 发布于 3 个月前(02月17日) Receive Delta以0.25ms为单位,reference time以64ms为单位,kDe...
    啊非 发布于 4 个月前(12月30日) 大神,请教一个问题: constexpr int kBaseScaleFactor = Tran...
    啊非 发布于 4 个月前(12月30日) reference time:3字节,表示参考时间,以64ms为单位,但是 代码里面是 Trans...
    相关文章
    • Google ProtoBuf协议介绍
    • Intel Media SDK 内存优化(转)
    • 网络字节转换到本地字节的函数模板
    • 解决Ubuntu下vlc无法播放文件
    • MFC WebBrowser控件如何实现滚动条滑动

    COPYRIGHT © 2024 jianchihu.net. ALL RIGHTS RESERVED.

    Theme Kratos Made By Seaton Jiang