草庐IT

c++ - DialogBoxIndirect 创建的对话框比要求的大

coder 2024-02-11 原文

对于我的应用程序,我需要在不使用资源的情况下创建一个对话框。 我正在尝试使用 DialogBoxInderect 函数来做到这一点。 该代码丑陋得令人难以置信,但我以某种方式成功地做到了。

问题是由于某种原因,对话框比我要求的字体大得多。

如果我从资源加载对话框,下面是对话框的样子:

这里是调用 DialogBoxInderect 函数时显示的相同大小的对话框。

这是它在代码中的定义:

HGLOBAL             hGlobal;
LPDLGTEMPLATE       wlsDialogTemplate;
LPDLGITEMTEMPLATE   wlsDialogItemTemplate;
LPWORD              nextItem;
LPWSTR              itemString;
int32_t             itemStringLength;

// Check for memory allocation errors
hGlobal = GlobalAlloc(GMEM_ZEROINIT, 1024);
if (!hGlobal) 
    return -1;

wlsDialogTemplate = (LPDLGTEMPLATE)GlobalLock(hGlobal);

// Define a dialog box.
wlsDialogTemplate->style    = WS_CAPTION;
wlsDialogTemplate->x        = 0;
wlsDialogTemplate->y        = 0;
wlsDialogTemplate->cx       = 320;
wlsDialogTemplate->cy       = 115;

GlobalUnlock(hGlobal);
retCode = DialogBoxIndirect(0, (LPDLGTEMPLATE)hGlobal, 0, ActivateWlsMsgDialog);

这是它在 RC 文件中的定义方式:

IDD_WLS_SMALL_MESSAGE_DLG DIALOGEX 0, 0, 320, 115
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION
CAPTION "Dialog"
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
    DEFPUSHBUTTON   "OK",ID_CUSTOM_OK,175,95,120,15
    PUSHBUTTON      "Cancel",ID_CUSTOM_CANCEL,45,95,120,15
    CTEXT           "Static",IDC_HEADER_TEXT,120,10,170,70
    CONTROL         "",IDC_LOGO,"Static",SS_BITMAP,16,10,83,70
END

如您所见,第二个对话框比定义的要大得多。我尝试使用各种样式标志但没有成功(这就是为什么在较大的对话框上有红叉)。

有什么帮助吗? 谢谢!

最佳答案

较大的尺寸很容易解释。 Windows 会根据其字体自动调整对话框的大小,较大的对话框使用不同的字体。事实上,它使用的是默认系统字体(有关 Windows 对话框字体令人困惑的问题的更多信息,请参见我的回答 here)。

所以真正需要关注的问题是为什么它使用不同的字体,并修复它可以解决大小问题。

在对话框资源文件中,您指定DS_SETFONT flag作为对话框样式之一。根据文档,这个标志

[i]ndicates that the header of the dialog box template (either standard or extended) contains additional data specifying the font to use for text in the client area and controls of the dialog box. If possible, the system selects a font according to the specified font data. The system passes a handle to the font to the dialog box and to each control by sending them the WM_SETFONT message.

这就解释了为什么那个显示的是预期的字体。

下一个合乎逻辑的问题是动态创建的对话框模板有何不同,用 DialogBoxIndirect 函数显示。罪魁祸首再次是 DS_SETFONT 标志,但在这种情况下,该标志不存在。这意味着该对话框不包含任何有关使用哪种字体来显示其控件的信息,并且系统默认使用默认系统字体(这是您在第二个屏幕截图中看到的丑陋的 Windows 2.0 时代字体)。

一旦我们理解了这一点,解决方案就很明显了:您需要告诉对话框您希望它使用哪种字体。我想到了两种可能的方法:

  1. 您可以设置 DS_SETFONT 标志并在对话框模板的标题中提供字体信息,如上述链接文档中所述。
  2. 或者您可以简单地创建和设置对话框的字体以响应 WM_INITDIALOG 消息。

后者可能是您真正想要做的,因为它允许您使用实际 系统字体(令人困惑的是,它与我一直称呼的不同)默认" 系统字体),它是 Windows Vista 和更高版本中的 Segoe UI。请注意,即使在您的第一个屏幕截图中,它也使用 MS Sans Serif,因此在 Aero 界面中像拇指一样突出。再次参见 this answer了解比您想知道的更多关于字体的信息,以及完成这项工作的示例代码。您需要确保为对话框本身它的所有子控件设置字体。

关于c++ - DialogBoxIndirect 创建的对话框比要求的大,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9207414/

有关c++ - DialogBoxIndirect 创建的对话框比要求的大的更多相关文章

  1. ruby - 如何在 Ruby 中顺序创建 PI - 2

    出于纯粹的兴趣,我很好奇如何按顺序创建PI,而不是在过程结果之后生成数字,而是让数字在过程本身生成时显示。如果是这种情况,那么数字可以自行产生,我可以对以前看到的数字实现垃圾收集,从而创建一个无限系列。结果只是在Pi系列之后每秒生成一个数字。这是我通过互联网筛选的结果:这是流行的计算机友好算法,类机器算法:defarccot(x,unity)xpow=unity/xn=1sign=1sum=0loopdoterm=xpow/nbreakifterm==0sum+=sign*(xpow/n)xpow/=x*xn+=2sign=-signendsumenddefcalc_pi(digits

  2. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  3. ruby - 使用 Vim Rails,您可以创建一个新的迁移文件并一次性打开它吗? - 2

    使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta

  4. ruby-on-rails - 无法使用 Rails 3.2 创建插件? - 2

    我对最新版本的Rails有疑问。我创建了一个新应用程序(railsnewMyProject),但我没有脚本/生成,只有脚本/rails,当我输入ruby./script/railsgeneratepluginmy_plugin"Couldnotfindgeneratorplugin.".你知道如何生成插件模板吗?没有这个命令可以创建插件吗?PS:我正在使用Rails3.2.1和ruby​​1.8.7[universal-darwin11.0] 最佳答案 随着Rails3.2.0的发布,插件生成器已经被移除。查看变更日志here.现在

  5. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

    我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

  6. ruby - 如何使用 RSpec::Core::RakeTask 创建 RSpec Rake 任务? - 2

    如何使用RSpec::Core::RakeTask初始化RSpecRake任务?require'rspec/core/rake_task'RSpec::Core::RakeTask.newdo|t|#whatdoIputinhere?endInitialize函数记录在http://rubydoc.info/github/rspec/rspec-core/RSpec/Core/RakeTask#initialize-instance_method没有很好的记录;它只是说:-(RakeTask)initialize(*args,&task_block)AnewinstanceofRake

  7. ruby - 为什么 SecureRandom.uuid 创建一个唯一的字符串? - 2

    关闭。这个问题需要detailsorclarity.它目前不接受答案。想改进这个问题吗?通过editingthispost添加细节并澄清问题.关闭8年前。Improvethisquestion为什么SecureRandom.uuid创建一个唯一的字符串?SecureRandom.uuid#=>"35cb4e30-54e1-49f9-b5ce-4134799eb2c0"SecureRandom.uuid方法创建的字符串从不重复?

  8. ruby - 有人可以帮助解释类创建的 post_initialize 回调吗 (Sandi Metz) - 2

    我正在阅读SandiMetz的POODR,并且遇到了一个我不太了解的编码原则。这是代码:classBicycleattr_reader:size,:chain,:tire_sizedefinitialize(args={})@size=args[:size]||1@chain=args[:chain]||2@tire_size=args[:tire_size]||3post_initialize(args)endendclassMountainBike此代码将为其各自的属性输出1,2,3,4,5。我不明白的是查找方法。当一辆山地自行车被实例化时,因为它没有自己的initialize方法

  9. ruby - 使用多个数组创建计数 - 2

    我正在尝试按0-9和a-z的顺序创建数字和字母列表。我有一组值value_array=['0','1','2','3','4','5','6','7','8','9','a','b','光盘','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','','u','v','w','x','y','z']和一个组合列表的数组,按顺序,这些数字可以产生x个字符,比方说三个list_array=[]和一个当前字母和数字组合的数组(在将它插入列表数组之前我会把它变成一个字符串,]current_combo['0','0','0']

  10. ruby - 使用 `+=` 和 `send` 方法 - 2

    如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:

随机推荐