2016-07-11 3 views
1

Я хотел создать «развратитель» Word, который фактически просто заменяет некоторые буквы некоторым алфавитом ascii. Однако, при нажатии на кнопку «Создать», окно автоматически закрываетсяC Win32: Окно автоматически закрывается

static HANDLE ghInstance; 

HWND hwndEDIT; 
int index[10]; 

static INT_PTR CALLBACK MainDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) 
{ 
    switch (uMsg) 
    { 
     case WM_INITDIALOG: 
     { 
      hwndEDIT = GetWindow(hwndDlg, IDC_EDIT); 

      return TRUE; 
     } 

     case WM_SIZE: 
      /* 
      * TODO: Add code to process resizing, when needed. 
      */ 
      return TRUE; 

     case WM_COMMAND: 
      switch (GET_WM_COMMAND_ID(wParam, lParam)) 
      { 
       case IDC_GENERATE: 
       { 
        char input[1000]; 
        char output[1000][10]; 

        int i, strLength, m, map; 
        int rNmb; 
        int chance; 

        GetWindowText(hwndEDIT, input, 1000); 

        srand(time(NULL)); 

        strLength = strlen(input); 

        for(m=0;m<10;m++) 
        { 
         map = 0; 
         strcpy(output[m], input); 
         for(i=0;i<strLength;i++) 
         { 
          switch(output[m][i]) 
          { 
           case '\0': 
            continue; 

           case '\n': 
            continue; 

           case ' ': 
            continue; 
          } 

          chance = rand() % 100; 

          if(chance < 25) 
          { 
           rNmb = (rand() % 128) + 128; 

           output[m][i] = rNmb; 
          } 
         } 
         index[m] = SendDlgItemMessage(hwndDlg , IDC_LISTBOX, LB_ADDSTRING, 0, (LPARAM)output[m]); 

         map++; 
         SendDlgItemMessage(hwndDlg, IDC_LISTBOX, LB_SETITEMDATA, (WPARAM)index[m], (LPARAM)map); 
        } 
       } 
       case IDC_CLOSE: 
        EndDialog(hwndDlg, TRUE); 
        return TRUE; 
      } 
      break; 

     case WM_CLOSE: 
      EndDialog(hwndDlg, 0); 
      return TRUE; 

     /* 
     * TODO: Add more messages, when needed. 
     */ 
    } 

    return FALSE; 
} 

Я не вижу никакой связи между кнопкой генерации и команды закрытия

+3

Дело 'IDC_GENERATE' попадает в корпус' IDC_CLOSE'. Блоки переключателей проваливаются, если вы явно не сломаете или не вернетесь. –

+2

нет разрыва; после случая IDC_GENERATE: в результате вы выполняете регистр IDC_CLOSE: EndDialog (hwndDlg, TRUE); – RbMm

+0

Эй, вы недавно [подняли запрос на улучшение этой части документации] (http://stackoverflow.com/documentation/improvement-requests/view/2256/7403). Поскольку невозможно отправлять комментарии или общаться с вами через интерфейс Docs, я злоупотребляю комментариями, чтобы сделать это здесь. Можете ли вы дать мне подсказку о том, что вы считаете неправильным с примером кода? В частности, каким образом это неясно или неполно? (У него явно нет проблем с форматированием.) Что еще вы хотели бы увидеть? Я рассмотрел представление, и это выглядит разумным для меня. Вы тестировали код и выяснили, что он не работает? –

ответ

4

Вы пропускаете заявление перерыв.

Дело case IDC_GENERATE падает прямо в:

case IDC_CLOSE: 
    EndDialog(hwndDlg, TRUE); 
    return TRUE; 

Вы можете использовать функции, чтобы сделать код читаемым, и эта ошибка, вероятно, будет пойман.

+1

Мне нравится последняя строка. При некотором рефакторинге дел на отдельные функции факт 'break' отсутствует, действительно будет более заметным. Очень длинные функции всегда трудно читать. –

Смежные вопросы