谁有用窗体模仿MessageBox的代码,或者修改MessageBox的字体的方法

hans_marke 2010-06-22 01:31:41
我在CE上用,因为VGA模式下使用系统字体的消息框。字太小。
所以需要使用大字体来显示,网上搜了一下,貌似没有找到合适的直接改MessageBox的字体的办法。
如果各位有请告诉我,谢谢。

所以我目前只能做几个窗口模仿MessageBox的动作,但这个我感觉开发量不小。
想找一下有没有参考的例子谢谢
...全文
206 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
hans_marke 2010-06-22
  • 打赏
  • 举报
回复
恩!谢谢5楼我明白你的做法了
我正在看
向立天 2010-06-22
  • 打赏
  • 举报
回复
类似的东西我倒是做过
不过我觉得我实现的比较牵强
给你借鉴一下吧
头文件
class GPMessageBoxDlg : public GPBaseDialog
{
DECLARE_DYNAMIC(GPMessageBoxDlg)

int m_nWidthExtend, //宽度扩展量
m_nHeightExtend, //高度扩展量
m_nMaxLen; //信息行的最大长度
UINT m_uDlgMode; //对话框样式
CFont m_fontMsg; //信息的字体
CStringArray m_strarrayMsg; //信息字符串的数组

public:
GPMessageBoxDlg(CWnd* pParent = NULL); // 标准构造函数
virtual ~GPMessageBoxDlg();

/**
* SetMessageFont(const CString& strFont, int nPointSize, int nWeight)
* 此函数的作用是现实信息的文字的字体
* @param: strFont 该参数指定了字体的名称
* @param: nPointSize 该参数指定了字号的大小
* @param: nWeight 该参数指定了字体的样式
* @return: void 返回值为空
**/
void SetMessageFont(const CString& strFont, int nPointSize, int nWeight);

/**
* RunMessageBox(CString strMessage, UINT uDlgMode)
* 该函数用于运行消息框
* @param: strMessage 该参数传入欲显示的消息
* @param: uDlgMode 该参数传入界面风格
* @return: INT_PTR 返回对话框的处理ID
**/
INT_PTR RunMessageBox(CString strMessage, UINT uDlgMode=MESSAGEBOX_OK_ONLY);

/**
* RunMessageBox(UINT uMsgID, UINT uDlgMode)
* 该函数用于运行消息框
* @param: uMsgID 该参数传入欲显示的消息ID
* @param: uDlgMode 该参数传入欲定制的界面的ID
* @return: INT_PTR 返回对话框的处理ID
**/
INT_PTR RunMessageBox(UINT uMsgID, UINT uDlgMode=MESSAGEBOX_OK_ONLY);

// 对话框数据
enum { IDD = IDD_MESSAGEBOX };

GPButtonNormal m_norbtnOK, //确定按钮的控制变量
m_norbtnCancel; //取消按钮的控制变量

protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持

DECLARE_MESSAGE_MAP()
public:
virtual BOOL OnInitDialog();
afx_msg void OnPaint();
};

cpp文件
#include "stdafx.h"
#include "GPGameBridge.h"
#include "GPMessageBoxDlg.h"
#include ".\gpmessageboxdlg.h"
#include ".\gpinterface.h"


// GPMessageBoxDlg 对话框

IMPLEMENT_DYNAMIC(GPMessageBoxDlg, GPBaseDialog)
GPMessageBoxDlg::GPMessageBoxDlg(CWnd* pParent /*=NULL*/)
: GPBaseDialog(GPMessageBoxDlg::IDD, pParent)
{
m_nWidthExtend = 0;
m_nHeightExtend = 0;
m_nMaxLen = 20;
m_uDlgMode = MESSAGEBOX_OK_ONLY;
}

GPMessageBoxDlg::~GPMessageBoxDlg()
{
}

void GPMessageBoxDlg::SetMessageFont(const CString& strFont, int nPointSize, int nWeight)
{
LOGFONT lf;
memset(&lf, 0, sizeof(LOGFONT));

//设置字体样式
_tcscpy(lf.lfFaceName, strFont);
lf.lfHeight = nPointSize;
lf.lfWeight = nWeight;
lf.lfCharSet = GB2312_CHARSET;

//清楚已有样式
if (m_fontMsg.GetSafeHandle())
m_fontMsg.DeleteObject();

//设置字体
m_fontMsg.CreateFontIndirect(&lf);
}

INT_PTR GPMessageBoxDlg::RunMessageBox(CString strMessage, UINT uDlgMode)
{
CString strTemp;
int nCount;
//清空数组
m_strarrayMsg.RemoveAll();

//分解消息
while(strMessage.Find('\n')!=-1)
{
nCount = strMessage.Find('\n');
strTemp = strMessage.Left(nCount);
strMessage = strMessage.Mid(nCount+1);
m_strarrayMsg.Add(strTemp);
if(strTemp.GetLength()>m_nMaxLen)
m_nMaxLen = strTemp.GetLength();
}
m_strarrayMsg.Add(strMessage);
if(strMessage.GetLength()>m_nMaxLen)
m_nMaxLen = strMessage.GetLength();

m_nWidthExtend = 6*(m_nMaxLen-20);
m_nHeightExtend = 12*((int)m_strarrayMsg.GetCount()-1);
m_uDlgMode = uDlgMode;

//禁用托盘
GPInterface::m_bIsEnableTray = false;
//调用消息框
MessageBeep(MB_ICONWARNING);
INT_PTR nResponse = DoModal();
//启用托盘
GPInterface::m_bIsEnableTray = true;

return nResponse;
}

INT_PTR GPMessageBoxDlg::RunMessageBox(UINT uMsgID, UINT uDlgMode)
{
CString strMessage;

//加载字符串
strMessage.LoadString(uMsgID);

//运行对话框
return RunMessageBox(strMessage, uDlgMode);
}

void GPMessageBoxDlg::DoDataExchange(CDataExchange* pDX)
{
GPBaseDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDOK, m_norbtnOK);
DDX_Control(pDX, IDCANCEL, m_norbtnCancel);
}


BEGIN_MESSAGE_MAP(GPMessageBoxDlg, GPBaseDialog)
ON_WM_PAINT()
END_MESSAGE_MAP()


// GPMessageBoxDlg 消息处理程序

BOOL GPMessageBoxDlg::OnInitDialog()
{
GPBaseDialog::OnInitDialog();

//设置窗口标题
CString strCaption;
strCaption.LoadString(GPMAINFRAME_CAPTION_STR);
SetWindowText(strCaption);

//设置窗口
CRect rectWnd;
GetWindowRect(rectWnd);
rectWnd.right += m_nWidthExtend;
rectWnd.bottom += m_nHeightExtend;
MoveWindow(rectWnd);

//设置按钮
m_norbtnOK.SetButtonBitmap("IDB_BITMAP_NORMALBUTTON", 4);
m_norbtnOK.SetWindowText(GPSERIALDLG_BUTTON_OK_STR);
m_norbtnCancel.SetButtonBitmap("IDB_BITMAP_NORMALBUTTON", 4);
m_norbtnCancel.SetWindowText(GPCONFIGDLG_BUTTON_CANCEL_STR);

//布置界面
switch(m_uDlgMode)
{
case MESSAGEBOX_OK_ONLY:
{
m_norbtnCancel.ShowWindow(SW_HIDE);
m_norbtnOK.MoveButton(rectWnd.Width()/2-35, rectWnd.Height()-60);
}break;
case MESSAGEBOX_OKCANCEL:
{
m_norbtnOK.MoveButton(rectWnd.Width()/2-66-10, rectWnd.Height()-60);
m_norbtnCancel.MoveButton(rectWnd.Width()/2+10, rectWnd.Height()-60);
}break;
}

//设置字体
SetMessageFont("宋体", 12, FW_NORMAL);

return TRUE;
}

void GPMessageBoxDlg::OnPaint()
{
CPaintDC dc(this);

int nOffset = 15;
CRect rectClient;
CDC* pMemDC=new CDC;
CBitmap bitmapTemp, *pOldBitmap;

CRect rect;
int nMargin = 2;

//获取客户区
GetClientRect(&rectClient);
GetClientRect(rect);

rect.left += nMargin;
rect.right -= nMargin;
rect.bottom -= nMargin;


//创建位图内存
bitmapTemp.CreateCompatibleBitmap(&dc, rectClient.Width(), rectClient.Height());
pMemDC->CreateCompatibleDC(&dc);
pOldBitmap=pMemDC->SelectObject(&bitmapTemp);

//填充底色
pMemDC->FillSolidRect(0, 0, rectClient.Width(), rectClient.Height(), RGB(255, 156, 96));
pMemDC->FillSolidRect(rect, RGB(255, 231, 207));
DrawIconEx(pMemDC->GetSafeHdc(), rect.left+10, rect.top+10, AfxGetApp()->LoadIcon(IDI_ICON_WARNING), 32, 32, 0, NULL, DI_NORMAL);

//输出消息
CFont* pOldFont = pMemDC->SelectObject(&m_fontMsg);
for(int i=0; i<m_strarrayMsg.GetCount(); i++)
{
pMemDC->TextOut(rect.left+50, rect.top+20+nOffset*i, m_strarrayMsg.GetAt(i));
}
pMemDC->SelectObject(pOldFont);

dc.BitBlt(0, 0, rectClient.Width(), rectClient.Height(), pMemDC, 0, 0, SRCCOPY);
pMemDC->SelectObject(pOldBitmap);

ReleaseDC(pMemDC);
delete pMemDC;
}
hans_marke 2010-06-22
  • 打赏
  • 举报
回复
自己做需要考虑到高度宽度根据文字长度变化,按钮个数和icon的图标也要根据参数变化。
我就是想问这块有什么参考代码没有
wjpren2006 2010-06-22
  • 打赏
  • 举报
回复
自己创建一个类,然后在需要创建打开这个窗口的类中添加头文件,然后执行如下代码:
CMessageDlg dlg;
dlg.DoModal();
就可以了。不过要注意和你的dlg的按钮类型关联的时候注意IDOK IDCANCEL
oyljerry 2010-06-22
  • 打赏
  • 举报
回复
其实就是自己做一个对话框,然后DoModal,然后对话框上放几个CStatic,CButton等来模仿MessageBox的界面,做起来应该还是比较简单的
Eleven 2010-06-22
  • 打赏
  • 举报
回复
你自己做个模态对话框,上面放个CStatic控件,不就可以了,需要设置字体的话可以使用SetFont()函数

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧