【问题标题】:Reduced label is displayed in c++ mfc application减少标签显示在 c++ mfc 应用程序中
【发布时间】:2023-03-26 13:30:02
【问题描述】:

我开发了一些 C++ MFC 应用程序。在我的对话框中有一个进度条和一个带有常量文本(西里尔符号)的标签。

在 Windows 7、XP 上此文本显示良好,但在 Windows 8,10 上显示为缩小形式。

为什么?

这是在 Windows 7 上:

这是在 Windows 8 上:

这是与此对话框表单相关的类的源代码。 *.cpp 文件:

// Progress.cpp : implementation file
//

#include "stdafx.h"
#include "LybidLoader.h"
#include "Progress.h"
#include "afxdialogex.h"


// Progress dialog

IMPLEMENT_DYNAMIC(Progress, CDialogEx)

Progress::Progress(CWnd* pParent /*=NULL*/)
: CDialogEx(Progress::IDD, pParent)
{

}

Progress::~Progress()
{
}

void Progress::DoDataExchange(CDataExchange* pDX)
{
    CDialogEx::DoDataExchange(pDX);
    DDX_Control(pDX, IDC_PROGRESS1, m_ProgressBar);
}


BEGIN_MESSAGE_MAP(Progress, CDialogEx)
ON_BN_CLICKED(IDC_BUTTON1, &Progress::OnBnClickedForceExit)
END_MESSAGE_MAP()


// Progress message handlers


BOOL Progress::OnInitDialog()
{
    CDialogEx::OnInitDialog();

    ModifyStyle( WS_SYSMENU, 0);

    m_ProgressBar.SetMarquee(TRUE, 10);

    return TRUE;  // return TRUE unless you set the focus to a control
    // EXCEPTION: OCX Property Pages should return FALSE
}


void Progress::OnBnClickedForceExit()
{   
    if (::MessageBoxW(this->m_hWnd, (LPCWSTR)_T("Ви впевнені? Буде здійснено        аварійний вихід"), (LPCWSTR)_T("Підтвердіть дію"), MB_ICONEXCLAMATION |         MB_YESNO) == IDYES)
    {
        PostQuitMessage(0);
    }           
}


BOOL Progress::PreTranslateMessage(MSG* pMsg)
{
    // TODO: Add your specialized code here and/or call the base class

    if( pMsg->message == WM_KEYDOWN )
    {
        if(pMsg->wParam == VK_RETURN || pMsg->wParam == VK_ESCAPE)
        {
            return TRUE;                // Do not process further
        }
    }

    return CDialogEx::PreTranslateMessage(pMsg);
}

和 *.h 文件:

#pragma once
#include "afxcmn.h"


// Progress dialog

class Progress : public CDialogEx
{
    DECLARE_DYNAMIC(Progress)

public:
    Progress(CWnd* pParent = NULL);   // standard constructor
    virtual ~Progress();

// Dialog Data
    enum { IDD = IDD_PROGRESSBAR };

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

    DECLARE_MESSAGE_MAP()
public:
    virtual BOOL OnInitDialog();
    CProgressCtrl m_ProgressBar;



    afx_msg void OnBnClickedForceExit();
    virtual BOOL PreTranslateMessage(MSG* pMsg);
};

这是资源文件的一部分:

IDD_PROGRESSBAR DIALOGEX 0, 0, 369, 105
STYLE DS_SETFONT | DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE |  WS_CAPTION | WS_SYSMENU
CAPTION "Будь-ласка, зачекайте!"
FONT 8, "Microsoft Sans Serif", 400, 0, 0x1
BEGIN
    CONTROL         "",IDC_PROGRESS1,"msctls_progress32",PBS_MARQUEE | WS_BORDER,7,47,355,14
    LTEXT           "Триває обмін даними з опціональною платою! НЕ ВИМИКАЙТЕ РАДІОСТАНЦІЮ",IDC_STATIC,25,19,267,8
    PUSHBUTTON      "Примусово завершити роботу",IDC_BUTTON1,101,84,118,14
END

【问题讨论】:

  • 您尚未提供有关如何实现此对话框窗口的任何详细信息。因此,如果没有源代码,很难帮助您。
  • @AndrewKomiagin 我添加了新的空对话框并将进度条项和一个标签放在那里。在标签的属性中,我设置了应该显示的静态文本...在我的实现中只有按钮按下的处理程序...如果需要,我可以显示与此对话框相关的类的头文件和 cpp 文件的源代码形式。
  • @storojs72:源代码会很好 - 最好删除无关的细节(但检查简化版本是否仍然存在问题)。也不要忘记 .rc 文件的相关部分。
  • @MartinBonner 源代码添加

标签: c++ mfc


【解决方案1】:

忽略以下图片中的乱码,这只是代码页问题。

您为静态文本控件提供的空间太小:

第一个对话框是你的,修改它使它看起来像第二个。

【讨论】:

  • 经过几次增加/减少标签的题字后,最后一个字终于出现在 Windows 8 上...谢谢,但不幸的是我不明白为什么在 Windows 8 上会出现这个问题 - 比 7 更新...
  • 从您提供的屏幕副本中,我想您在 Windows 7 上使用的 DPI 为 125%,在 Windows 8 上使用 100%。(您可以在控制面板、显示中设置这些)。在不同的 DPI 设置中文本占用的空间可能会有所不同。您始终应该为带有一定边距的文本提供足够的空间。
  • 我认为您应该将第一行更改为“忽略以下图像中的垃圾字符。它是...”(起初我以为您是在告诉 OP 他在 他的图像)。
【解决方案2】:

可能是字体 DPI,也可能是字体本身。它可能是“Microsoft Sans Serif”映射到不同的字体。我已经进行了足够的本地化工作,知道某些字体并非在所有系统上都可用。我认为可能是“Microsoft Sans Serif”,但我在远东地区看到过系统中没有“Arial”的系统。

如果我是你,我会在你的对话框资源中将“Microsoft Sans Serif”更改为“MS Shell Dlg”。 “MS Shell Dlg”是一种虚拟字体,大致映射到默认的 GUI 字体。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-06
    • 1970-01-01
    • 1970-01-01
    • 2010-09-08
    • 2023-03-05
    • 1970-01-01
    相关资源
    最近更新 更多