 |
运行效果: 
|
 |
其中这个InsertStr窗口是通过主窗口的File菜单的Show Dialog...命令(或者按下对应的快捷键Ctrl + O)打开的: 
|
 |
这是课本上的程序: void insert(wchar_t *s1, wchar_t *s2) { int f = 0; int len1 = wcslen(s1); int len2 = wcslen(s2); wchar_t *p1 = s1; wchar_t *p2 = s1 + len1 - 1; while (*p1 != '\0' && *p1 != *s2) p1++; if (*p1 != '\0') { for (; p2 > p1; p2--) *(p2 + len2 - 1) = *p2; f = 1; } while (*s2) *p1++ = *s2++; *(s1 + len1 + len2 - f) = '\0'; } 本来是在控制台窗口中运行的,我把它搬到了Windows窗口程序中拿来用。 把所有的char改成wchar_t(宽字符,用于支持中文等双字节字符),strlen改成wcslen,其他的全部照着书上的抄下来。
|
 |
在菜单资源中添加一个新菜单项:  Caption: &Show Dialog...\tCtrl+O ID: ID_FILE_SHOWDIALOG
|
 |
打开rc中的快捷键资源IDC_WIN32PROJECT1,添加一个新快捷键Ctrl + O:  ID可以不修改,就用默认的。
|
 |
在C++源文件中的WndProc函数中,switch (wmId)下添加如下内容: case ID_FILE_SHOWDIALOG: case ID_ACCELERATOR32772: DialogBox(hInst, MAKEINTRESOURCE(IDD_DIALOG1), hWnd, Dlg1); break;
|
 |
创建函数: INT_PTR CALLBACK Dlg1(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_INITDIALOG: Dlg1_Init(hDlg); return (INT_PTR)TRUE; case WM_COMMAND: switch (LOWORD(wParam)) { case IDOK: Dlg1_GetResult(hDlg); break; case IDCANCEL: EndDialog(hDlg, LOWORD(wParam)); return (INT_PTR)TRUE; } break; } return (INT_PTR)FALSE; }
void Dlg1_Init(HWND hDlg) { HWND tf1 = GetDlgItem(hDlg, IDC_EDIT1); HWND tf2 = GetDlgItem(hDlg, IDC_EDIT2); SendMessage(tf1, WM_SETTEXT, NULL, (LPARAM)L"abcdef"); SendMessage(tf2, WM_SETTEXT, NULL, (LPARAM)L"d45"); }
void insert(wchar_t *s1, wchar_t *s2) { int f = 0; int len1 = wcslen(s1); int len2 = wcslen(s2); wchar_t *p1 = s1; wchar_t *p2 = s1 + len1 - 1; while (*p1 != '\0' && *p1 != *s2) p1++; if (*p1 != '\0') { for (; p2 > p1; p2--) *(p2 + len2 - 1) = *p2; f = 1; } while (*s2) *p1++ = *s2++; *(s1 + len1 + len2 - f) = '\0'; }
void Dlg1_GetResult(HWND hDlg) { HWND tf1 = GetDlgItem(hDlg, IDC_EDIT1); HWND tf2 = GetDlgItem(hDlg, IDC_EDIT2); HWND tf3 = GetDlgItem(hDlg, IDC_EDIT3); wchar_t s1[100]; wchar_t s2[100]; GetWindowText(tf1, s1, 500); GetWindowText(tf2, s2, 500); insert(s1, s2); SendMessage(tf3, WM_SETTEXT, NULL, (LPARAM)s1); }
|
 |
在头文件(Win32Project1.h)添加如下函数声明: void Dlg1_Init(HWND hDlg); void insert(wchar_t *s1, wchar_t *s2); void Dlg1_GetResult(HWND hDlg);
下面这一行可以放到cpp文件的// Forward declarations of functions included in this code module:下面的最后一行: INT_PTR CALLBACK Dlg1(HWND, UINT, WPARAM, LPARAM); 当然也可以直接放到头文件中
|
 |
10樓
巨大八爪鱼
2015-12-1 23:33
对话框的布局:  Ctrl + D设置的Tab访问的控件顺序: 
|