<<Windows程序设计>>第5版第11章第2节的HexCalc(中文502页)讲到,在包含多个子窗口时用CreateDialog来代替CreateWindow是很方便的做法.
在对话框模板中写到
HexCalc DIALOG -1, -1, 102, 122
STYLE WS_OVERLAPPED ¦ WS_CAPTION ¦ WS_SYSMENU ¦ WS_MINIMIZEBOX
CLASS "HexCalc"
CAPTION "Hex Calculator"
作者认为CreateDialog会根据模板展开成为
hwnd = CreateWindow (TEXT ("HexCalc"), TEXT ("Hex Calculator"),
          WS_OVERLAPPED ¦ WS_CAPTION ¦ WS_SYSMENU ¦ WS_MINIMIZEBOX,
          CW_USEDEFAULT, CW_USEDEFAULT,
          102 * 4 / cxChar, 122 * 8 / cyChar,
          NULL, NULL, hInstance, NULL) ;
期望每次打开程序窗口都会出现在不同的位置.但实际上没成功.实际上每次打开都是在屏幕左上角.
在WinUser.h里可以看到CW_USEDEFAULT = ((int)0x80000000),换成10进制就是-2147483648,根本不是-1.
而且,在DLGTEMPLATE或DLGTEMPLATEEX中,x,y,cx,cy都是short型的.short(-1) = 0xFFFF.不管CreateDialog对此值做符号扩展还是0扩展,都不可能扩展为CW_USEDEFAULT.
我的猜想CreateDialog对此值做了0扩展,结果得到的值是65535,结果此值非法,CreateWindowEx就自作主张的把窗口放在了左上角.
还有,跟踪user内部我很迷惑,调用栈里一堆地址没有哪个正好是输入节中能找到的api函数地址,不知道怎么跟.
静态分析又没那个水平.只能蒙住眼睛瞎猜了.

解决方案 »

  1.   

    对直接用SDK开发界面研究不多:)个人理解作者原意并不是说CW_USEDEFAULT和-1是等价的或等值的,
    而只是程序运行时会做这样的转换(不一定是等值转换)。印象中dlu似乎不能为负数,如果你是在资源编辑窗口保存的话,不可能出这个值。
    不过总之-1是转换为0了。至于那个乘4、乘8是对话框模板单位(dlu)和像素(px)转换的问题,
    与对话框字体有关,不必深究。
      

  2.   

    怎么在默认的坐标上创建对话框的问题很早就有人讨论过,没有结果.
    但把位置设为(-1,-1)是肯定不能解决的.
    http://www.codeguru.com/forum/showthread.php?t=444026