打开程序后,在一个静态控件上显示一张位图。然后mfc实现:在一个编辑框控件中输入一个字符串,点击按钮后,在位图中央显示输入的字符串。
时间: 2023-06-20 12:04:46 浏览: 177
MFC 位图 按钮 多种方法
3星 · 编辑精心推荐
首先,在资源编辑器中添加一个静态控件和一个编辑框控件,以及一个按钮控件。将静态控件的类型设置为“图片”,并将其ID设置为IDC_STATIC_PIC;将编辑框控件的ID设置为IDC_EDIT_INPUT;将按钮控件的ID设置为IDC_BUTTON_SHOW。
然后,在对话框类的头文件中添加以下成员变量:
```cpp
CStatic m_staticPic; // 静态控件
CEdit m_editInput; // 编辑框控件
CButton m_btnShow; // 按钮控件
CBitmap m_bitmap; // 位图
```
在OnInitDialog()函数中,添加以下代码:
```cpp
// 加载位图
m_bitmap.LoadBitmap(IDB_BITMAP);
// 在静态控件中显示位图
m_staticPic.SetBitmap(m_bitmap);
```
接下来,在按钮的单击事件函数OnBnClickedButtonShow()中添加以下代码:
```cpp
// 获取输入的字符串
CString strInput;
m_editInput.GetWindowText(strInput);
// 获取位图宽高
BITMAP bmpInfo;
m_bitmap.GetObject(sizeof(BITMAP), &bmpInfo);
// 创建设备上下文
CDC* pDC = m_staticPic.GetDC();
// 计算字符串宽度
int nTextWidth = pDC->GetTextExtent(strInput).cx;
// 计算字符串位置
int nX = (bmpInfo.bmWidth - nTextWidth) / 2;
int nY = bmpInfo.bmHeight / 2;
// 在位图中央显示字符串
pDC->SetBkMode(TRANSPARENT);
pDC->TextOut(nX, nY, strInput);
// 释放设备上下文
m_staticPic.ReleaseDC(pDC);
```
最后,记得在对话框类的头文件中添加按钮的消息映射:
```cpp
afx_msg void OnBnClickedButtonShow();
```
并在对话框类的实现文件中添加消息映射:
```cpp
ON_BN_CLICKED(IDC_BUTTON_SHOW, &CMyDlg::OnBnClickedButtonShow)
```
完整实现代码如下:
```cpp
// MyDlg.h
#pragma once
#include "afxwin.h"
class CMyDlg : public CDialogEx
{
public:
CMyDlg(CWnd* pParent = nullptr); // 标准构造函数
// 对话框数据
#ifdef AFX_DESIGN_TIME
enum { IDD = IDD_MY_DIALOG };
#endif
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
DECLARE_MESSAGE_MAP()
private:
CStatic m_staticPic;
CEdit m_editInput;
CButton m_btnShow;
CBitmap m_bitmap;
public:
virtual BOOL OnInitDialog();
afx_msg void OnBnClickedButtonShow();
};
// MyDlg.cpp
#include "stdafx.h"
#include "My.h"
#include "MyDlg.h"
#include "afxdialogex.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
CMyDlg::CMyDlg(CWnd* pParent /*=nullptr*/)
: CDialogEx(IDD_MY_DIALOG, pParent)
{
}
void CMyDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
DDX_Control(pDX, IDC_STATIC_PIC, m_staticPic);
DDX_Control(pDX, IDC_EDIT_INPUT, m_editInput);
DDX_Control(pDX, IDC_BUTTON_SHOW, m_btnShow);
}
BEGIN_MESSAGE_MAP(CMyDlg, CDialogEx)
ON_BN_CLICKED(IDC_BUTTON_SHOW, &CMyDlg::OnBnClickedButtonShow)
END_MESSAGE_MAP()
BOOL CMyDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
// 加载位图
m_bitmap.LoadBitmap(IDB_BITMAP);
// 在静态控件中显示位图
m_staticPic.SetBitmap(m_bitmap);
return TRUE;
}
void CMyDlg::OnBnClickedButtonShow()
{
// 获取输入的字符串
CString strInput;
m_editInput.GetWindowText(strInput);
// 获取位图宽高
BITMAP bmpInfo;
m_bitmap.GetObject(sizeof(BITMAP), &bmpInfo);
// 创建设备上下文
CDC* pDC = m_staticPic.GetDC();
// 计算字符串宽度
int nTextWidth = pDC->GetTextExtent(strInput).cx;
// 计算字符串位置
int nX = (bmpInfo.bmWidth - nTextWidth) / 2;
int nY = bmpInfo.bmHeight / 2;
// 在位图中央显示字符串
pDC->SetBkMode(TRANSPARENT);
pDC->TextOut(nX, nY, strInput);
// 释放设备上下文
m_staticPic.ReleaseDC(pDC);
}
```
阅读全文