当前位置:C++技术网 > 资讯 > 对话框与对话框模板以及从内存对话框模板创建对话框原理

对话框与对话框模板以及从内存对话框模板创建对话框原理

更新时间:2015-06-25 19:27:36浏览次数:1+次

对话框

    模板为每个对话框中的控件指定位置、宽、高、风格、ID和窗口类。系统通过传递这些数据调用CreateWindow(Ex) 创建控件。控件是按照在模板中的顺序创建的。每个控件都是子窗口,都必须有WS_CHILD风格
    在把创建数据传递给CreateWindow(Ex) 之前,系统将会把位置和宽高进行坐标转换,从模板单元转换到像素。

    系统将模板中指定的所有窗口风格传递给CreateWindow(Ex) 来创建对话框。对话框模板的尺寸是设备无关的。对话框模板的尺寸以对话框模板单元进行指定。使用MapDialogRect 将模板单元转换成屏幕单元(像素),对话框使用系统字体,可以用GetDialogBaseUnits去执行计算。



对话框模板

    对话框模板是二进制数据,描述了对话框和控件。可以从可执行文件中加载模板或者使用传递给内存的模板来创建对话框。不管是哪种情况,创建对话框时必须提供一个模板
    不想使用模板资源创建对话框,你必须在内存中创建一个模板,并传递给间接创建函数。
    内存中的对话框模板由描述对话框的头组成,紧接着一个或多个描述每个控件的数据块。模板可以使用标准的格式或者扩展的格式。
    在标准的模板中,头是一个“DLGTEMPLATE”结构,紧接着一个变长数组;每个控件的数据由“DLGITEMTEMPLATE”结构组成,后面紧跟着附加的变长数组。
    在扩展模板中,头是一个“DLGTEMPLATEEX“,控件定义使用"DLGITEMTEMPLATEEX"格式。
    可以分配一个内存全局对象来创建内存模板,使用标准或扩展的头和控件定义来填充。内存模板在形式上是一样的,满足模板资源的要求。很多使用内存模板的应用首先用LoadResource 把模板资源加载到内存,然后修改已加载的模板来创建新的内存模板。
    要区别标准模板和扩展模板,检查模板的第一个16位。扩展模板中,第一个WORD为0xFFFF,其他值表示标准模板
    如果在内存创建模板,必须保证每一个DLGITEMTEMPLATE 或者DLGITEMTEMPLATEEX 控件定义都是双字边界对齐,包括任何创建数据。所有的其他的变长数组必须按单字边界对齐。