1、模仿主对话框中创建对话框所需的各种函数:
HANDLE_MSG(hwnd, WM_INITDIALOG, Login_OnInitDialog);
HANDLE_MSG(hwnd, WM_COMMAND, Login_OnCommand);
HANDLE_MSG(hwnd, WM_CLOSE, Login_OnClose);
2、使用DialogBoxParam 函数创建新的对话框, 最后一个参数可以供传递参数用。
DialogBoxParam 是默认阻塞运行的,模态对话框,执行完才会继续下一条
INT_PTR DialogBoxParam(
HINSTANCE hInstance, // handle to module
);
1) LONG a;
DialogBoxParam(...,a);
2) TCHAR a[20];
DialogBoxParam(...,(LPARAM)a);
3) struct Login
{ TCHAR *user; TCHAR *pass;};
Login data;
DialogBoxParam(...,(LPARAM)&data);
LPARAM就是LONG型,4个字节,指针类型本身所占内存,4个字节,所以可以互相转换,传递。
3、在新创建的对话框函数中:Login_OnInitDialog的最后一个参数lParam 就是传递过来的参数。
对应的使用方法。
1) TCHAR s[256];
sprintf(s , "%i" , lParam);//直接使用lParam即可。
MessageBox(hwnd , s ,s , MB_OK);
2) TCHAR *s = (TCHAR *)lParam;//转化成char *型的指针即可
MessageBox(hwnd , s ,s , MB_OK);
3) Login *s = (Login *)lParam;//转化成Login * 指针使用
TCHAR s[256];
sprintf( s ,“%s” , s->user);
MessageBox(hwnd , s, s ,MB_OK);
4、 SetWindowLong函数可以将参数 与某个窗口句柄关联,
从而通过GetWindowLong函数获取该参数。 SetWindowLong(hwnd , GWL_USERDATA , (LONG)b);
Login *b = (Login *)GetWindowLong(hwnd , GWL_USERDATA);
5、 TCHAR user[256];
TCHAR pass[256];
TCHAR *user1;
TCHAR *pass1;
user1 = user;
pass1 = pass;
【问题】为何数组头地址赋值给 TCHAR型指针,输出会是乱码?什么样的内存分配结构?
TCHAR *user;
TCHAR *pass;
user = (TCHAR *)malloc(20 );
pass = (TCHAR *)malloc(20 );
GetDlgItemText(hwnd , IDC_EDITUSER , user , 20);
GetDlgItemText(hwnd , IDC_EDITPASS , pass , 20);
如此动态分配内存,能够容纳的字符数只有三个?
答: 与GetDlgItemText 中最后一个参数有关,使用sizeof(user)只是TCHAR指针的大小 ,4个字节,
只能容纳三个字 符 abc\0
而当user是一个数组头地址的时候,sizeof(user)代表数组最大的内存长度
6、EndDialog 的第二个参数 将作为DialogBoxParam 的返回值,可以根据这个值判断点击哪个按钮。