问几个关于button控件的问题(非MFC)1.我在自己创建的对话框上定义了一个edit和一个button,其中button有BS_
问几个关于button控件的问题(非MFC)
1.我在自己创建的对话框上定义了一个edit和一个button,其中button有BS_DEFPUSHBUTTON属性,意图是想当输入回车就默认按了这个键,不过貌似不起作用。请问是什么原因?(楼下上完整代码)
2.说到不用资源创建对话框,引出一个问题,DLGTEMPLATE结构体后面应该还紧跟有一些数据,用来描述对话框上的控件。之前直接定义结构体,创建不出来。
我猜想,在DialogBoxIndirectParam内部肯定有类型下面代码的操作
int i, a = 0;
for (i = 0; i < 100; ++i)
printf("%x\n", (&a)[i]);
请问这种操作为什么不会出现“xx指令引用的xx内存不能为read”错误?
[解决办法]第一个问题,你确定你(或者系统)只在一个地方设置了默认按钮样式?
单位:如果不是像素,那单位就是根据该对话框的字体大小设定的,一般宽度单位是字体宽度的1/4,高度单位是字体宽度的1/8
[解决办法]来学习的, 这个问题,考虑过,
wm_initdialog return true后,就会“不根据rc文件进行分配默认的焦点”。
bs_defpushbutton会给分配一个默认的属性。
当enter后,就会给默认焦点的按钮发送wm_command.
[解决办法]按回车键不会检查按钮风格,只会根据对话框设置的默认按钮ID来发WM_COMMAND消息
对话框默认按钮ID默认是IDOK,你可以将关闭的ID改为IDOK,或者发DM_SETDEFID给对话框设置默认按钮ID
SendMessage(hDialog, DM_SETDEFID, 0x2001, 0);
cx、cy的单位问题,参考这里:
http://support.microsoft.com/kb/145994
[解决办法]备注
在对话框的标准模板中,DLGTEMPLATE 结构始终立即紧跟着三个指定对话框菜单、类名和标题的变长数组。当指定 DS_SETFONT 样式,这些这些数组也紧跟着一个指定磅数的16位值以及另外一个指定字体名称的变长数组。每个数组包括一个或多个16位元素。菜单、类名、标题以及字体数组必须按字边界对齐。
紧跟 DLGTEMPLATE 结构体是一个标识对话框菜单资源的菜单数组。如果此数组的第一个元素是 0x0000,对话框没有菜单并且数组没有其他元素。如果第一个元素是 0xFFFF,此数组拥有一个额外的元素来指定在可执行文件中的菜单资源的序数。如果第一个元素为其他值,系统将其视为指定可执行文件中菜单名称的零结尾 Unicode 字符串。
接着菜单数组是一个标识控件的窗口类的类名数组。如果第一个元素是 0x0000,系统为对话框使用预定义的对话框类,并且数组没有其他元素。如果第一个元素是 0xFFFF,此数组拥有一个额外的元素来指定系统预定义窗口类的的序数。如果第一个元素为其他值,系统将其视为指定已注册窗口类名的零结尾 Unicode 字符串。
接着类名数组指定包含了窗口标题的零结尾 Unicode 字符串的标题数组。如果第一个元素是 0x0000,对话框没有标题,并且数组没有其他元素。
仅当 style 成员指定了 DS_SETFONT 时,16位值磅值和字体名数组在标题数组之后。磅数值指定用于对话画框及其控件文字的字体磅数。字体名数组是一个指定了字体名称零结尾 Unicode 字符串。当这些值指定后,系统创建一个拥有指定大小和字体名(如果可能)的字体,并在其创建对话框和控件时发送 WM_SETFONT 给对话框过程以及控件窗口过程。
在标准对话框 DLGTEMPLATE 头之后跟着一个或多个定义了该对话框中控件的样式和坐标尺寸的 DLGITEMTEMPLATE 结构体。cdit 成员指定了对话框模板中 DLGITEMTEMPLATE 结构体的数量。这些 DLGITEMTEMPLATE 必须按 DWORD 边界对齐。
如果在菜单、类名、标题或字体名中指定了字符串,你必须使用 Unicode 字符串。要创建同时工作于 Windows 95/98/Me 和 Windows NT/2000/XP 的代码,使用 MultiByteToWideChar 函数来产生这些 Unicode 字符串。
x、y、cx 和 cy 成员指定了对话框单位值。你可以通过使用 MapDialogRect 函数转换这些值为屏幕单位(像素)。
[解决办法]感觉不对啊,
做过实验,建立一个对话框,然后把2个默认按钮去掉
添加2个新按钮试试
检查rc文件,如果有defbutton,那么去掉这个属性。
此时,运行程序,在wm_command里设置断点,回车后,看是否进入这个消息。
我感觉是会的,
因为对话框会再次默认分配一个 默认焦点。
这个默认焦点可能是非按钮控件
[解决办法]建议你处理 Enter 按键消息,给那个按钮发送点击事件。你要想改变焦点了之后还能通过回车键来响应另外一个按钮比较麻烦。
[解决办法]点击了别的按钮, 被点的那个按钮就成了默认按钮了
我想了办法,可以让按回车总会执行同一按钮的命令
下面这个例子无论按焦点在那个按钮,按回车总是执行ID为IDOK的按钮的命令
case WM_COMMAND:
if (GetKeyState(VK_RETURN) < 0 && LOWORD(wParam) != IDOK)
{
SendMessage(hwndDlg, WM_COMMAND, IDOK, 0);
return TRUE;
}
switch (wParam)
{
case MAKEWPARAM(IDOK, BN_CLICKED):
MessageBoxA(hwndDlg, "OK", "WM_COMMAND", MB_OK);
//EndDialog(hwndDlg, TRUE);
return TRUE;
//TODO: Add more id, when needed.
}
break;