  | 
      
        
          1楼
          巨大八爪鱼
          2015-12-1 23:23
          
          
           
         
        运行效果:   
       | 
    
    
        | 
      
        
          2楼
          巨大八爪鱼
          2015-12-1 23:25
          
          
           
         
        其中这个InsertStr窗口是通过主窗口的File菜单的Show Dialog...命令(或者按下对应的快捷键Ctrl + O)打开的:   
       | 
    
    
        | 
      
        
          3楼
          巨大八爪鱼
          2015-12-1 23:26
          
          
           
         
        这是课本上的程序: 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,其他的全部照着书上的抄下来。
  
       | 
    
    
        | 
      
        
          4楼
          巨大八爪鱼
          2015-12-1 23:27
          
          
           
         
        在菜单资源中添加一个新菜单项:  Caption: &Show Dialog...\tCtrl+O ID: ID_FILE_SHOWDIALOG  
       | 
    
    
        | 
      
        
          5楼
          巨大八爪鱼
          2015-12-1 23:28
          
          
           
         
        打开rc中的快捷键资源IDC_WIN32PROJECT1,添加一个新快捷键Ctrl + O:  ID可以不修改,就用默认的。  
       | 
    
    
        | 
      
        
          6楼
          巨大八爪鱼
          2015-12-1 23:30
          
          
           
         
        在C++源文件中的WndProc函数中,switch (wmId)下添加如下内容: case ID_FILE_SHOWDIALOG: case ID_ACCELERATOR32772:     DialogBox(hInst, MAKEINTRESOURCE(IDD_DIALOG1), hWnd, Dlg1);     break;
  
       | 
    
    
        | 
      
        
          7楼
          巨大八爪鱼
          2015-12-1 23:30
          
          
           
         
        创建函数: 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); }
  
       | 
    
    
        | 
      
        
          8楼
          巨大八爪鱼
          2015-12-1 23:32
          
          
           
         
        在头文件(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访问的控件顺序:   
       |