|
今天,我又把C语言课本上的Insert Str程序做成了Win32版本的对话框程序 |
一派护法 十九级 |
运行效果:
|
一派护法 十九级 |
其中这个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); 当然也可以直接放到头文件中
|
一派护法 十九级 |
|
一派护法 十九级 |
对话框的布局: Ctrl + D设置的Tab访问的控件顺序:
|
一派护法 十九级 |
文本框的ID都是默认的: IDC_EDIT1 IDC_EDIT2 IDC_EDIT3 最后一个文本框要设为只读(Read Only)
|
一派护法 十九级 |
然后就可以运行程序了。
|
一派护法 十九级 |
由于Win32程序是C++语言直接调用Windows API来创建和显示窗口,所以并未使用到微软的MFC类库,也就不涉及到CString字符串类的操作。因此,直接把字符数组通过Windows 消息发送给文本框控件就行了,读取的时候也只需要调用GetWindowText函数把文本框中输入的内容存入字符数组,和scanf几乎完全一样(除了scanf不能传入空格这一点不同以外)
而MFC的CString则不同,通过调用GetBuffer()方法可以获得字符数组指针的缓冲(操作这个字符串指针中的内容就会立刻影响CString字符串的内容),但是这个缓冲的大小是动态变化的,由CString内部决定,所以如果直接通过赋值\0来加长字符串就会导致数组越界而出错。
|