2012-06-09 5 views
0

Я работаю над этим приложением не менее 3-4 месяцев, и совсем недавно он не работал.Что может привести к тому, что мое приложение C++ win32 будет работать в фоновом режиме?

Это началось сегодня, потому что вчера он работал нормально и плавно. Теперь он запускается, но окно не становится видимым (я проверил список процессов в диспетчере задач и он запущен). Я убедился, что ShowWindow (hwnd, nFunsterStil); не был случайно удален, но он все еще там.

Я считаю, что проблема связана с WM_PAINT, потому что это то, над чем я работал, когда программа перестала работать.

Это то, что я имел, когда он составлен и первый начал быть невидимым:

PAINTSTRUCT ps; 
    HDC hdc; 
    case WM_PAINT: { 
        hdc = BeginPaint(hwnd, &ps); 
        static RECT Background, Background2; 
        SetRect(&Background, 0, 0, 476, 555); 
        SetRect(&Background2, 300, 300, 200, 400); 
        FillRect(hdc, &Background, (HBRUSH) (INT_PTR)CreateSolidBrush(RGB(50,55,50))); 
        FillRect(hdc, &Background2, (HBRUSH) (INT_PTR)CreateSolidBrush(RGB(100,200,100))); 
        EndPaint(hwnd, &ps); 
        } 

Теперь я пытался избавиться от некоторых линий в там, что делает весь блок в комментарии, и даже полностью удалить но это ничего не помогло. Я знаю, что, наверное, что-то испортил с памятью моего компьютера. Поэтому мой вопрос: что не так, и как я могу это исправить? Заранее благодарю за любую помощь.

Вот полный переключатель Сообщение:

LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) 
    { 
switch (message)     /* handle the messages */ 
{ 

     case WM_CTLCOLORSTATIC: { 
           HDC hdcStatic = (HDC) wParam; 
           SetTextColor(hdcStatic, RGB(50,255,50)); 
           SetBkColor(hdcStatic, RGB(0,0,0)); 
           return (INT_PTR)CreateSolidBrush(RGB(0, 0, 0)); 
           } 
     case WM_CTLCOLOREDIT: { 
          HDC hdcStatic = (HDC) wParam; 
          SetTextColor(hdcStatic, RGB(50,255,50)); 
          SetBkColor(hdcStatic, RGB(0,0,0)); 
          return (INT_PTR)CreateSolidBrush(RGB(0, 0, 0)); 
          } 
    case WM_CREATE: 
     { 
        // ------------------MENU------------------- 
        HMENU hMenubar = CreateMenu(); 
        HMENU hFile = CreatePopupMenu(); 
        HMENU hCPP = CreatePopupMenu(); 
        HMENU hHELP = CreatePopupMenu(); 
        HMENU hCUSTOMIZE = CreatePopupMenu(); 

        HMENU hTHEME = CreatePopupMenu(); 

        HMENU hNEW = CreatePopupMenu(); 

        AppendMenu(hFile, MF_STRING, ID_HOME, "Ho&me"); 
        AppendMenu(hFile, MF_SEPARATOR, 0, 0); 

        AppendMenu(hFile, MF_POPUP, (UINT) hNEW, "N&ew..."); 
        AppendMenu(hNEW, MF_STRING, ID_NEW, "Not&e"); 

        AppendMenu(hFile, MF_STRING, ID_SAVE, "Sa&ve"); 
        AppendMenu(hFile, MF_STRING, ID_SHOWCPP, "Ed&it"); 
        AppendMenu(hFile, MF_SEPARATOR, 0, 0); 
        AppendMenu(hFile, MF_STRING, ID_CLOSE, "Cl&ose"); 

        AppendMenu(hCPP, MF_STRING, ID_SHOWNOTES, "Li&st all notes"); 
        AppendMenu(hCPP, MF_STRING, MENU_COREFILES, "Open 'Notes' fol&der"); 
        AppendMenu(hCPP, MF_SEPARATOR, 0, 0); 
        AppendMenu(hCPP, MF_STRING, ID_SAVEFILE, "Sa&ve"); 
        AppendMenu(hCPP, MF_STRING, ID_SHOWCPP, "Ed&it"); 

        AppendMenu(hHELP, MF_STRING, 0, "Help Fil&es..."); 
        AppendMenu(hHELP, MF_STRING, MENU_ABOUT, "Ab&out"); 
        AppendMenu(hHELP, MF_SEPARATOR, 0, 0); 
        AppendMenu(hHELP, MF_STRING, 0, "Pro&duct Website"); 

        AppendMenu(hCUSTOMIZE, MF_POPUP, (UINT) hTHEME, "Current& Theme"); 
        AppendMenu(hTHEME, MF_STRING | MF_CHECKED, 0, "Pr&ompt"); 
        AppendMenu(hTHEME, MF_STRING, 0, "No&te Pad"); 

        AppendMenu(hMenubar, MF_STRING | MF_POPUP, (UINT) hFile, "Fi&le"); 
        AppendMenu(hMenubar, MF_SEPARATOR, 0, 0); 
        AppendMenu(hMenubar, MF_SEPARATOR, 0, 0); 
        AppendMenu(hMenubar, MF_SEPARATOR, 0, 0); 
        AppendMenu(hMenubar, MF_STRING | MF_POPUP, (UINT) hCPP, "No&tes"); 
        AppendMenu(hMenubar, MF_SEPARATOR, 0, 0); 
        AppendMenu(hMenubar, MF_SEPARATOR, 0, 0); 
        AppendMenu(hMenubar, MF_SEPARATOR, 0, 0); 
        AppendMenu(hMenubar, MF_STRING | MF_POPUP, (UINT) hHELP, "He&lp"); 
        AppendMenu(hMenubar, MF_SEPARATOR, 0, 0); 
        AppendMenu(hMenubar, MF_SEPARATOR, 0, 0); 
        AppendMenu(hMenubar, MF_SEPARATOR, 0, 0); 
        AppendMenu(hMenubar, MF_STRING | MF_POPUP, (UINT) hCUSTOMIZE, "Custom&ise"); 


        SetMenu(hwnd, hMenubar); 

        // WINDOW FEATURES!!! 

        TEST[1] = CreateWindow(TEXT("BUTTON"), TEXT("List all notes!"), 
        WS_VISIBLE | WS_CHILD | WS_BORDER, 
        200,375,150,25, 
        hwnd,(HMENU) ID_SHOWNOTES, NULL, NULL); 

        MAIN = CreateWindow(TEXT("edit"), TEXT(""),      
        WS_VISIBLE | WS_CHILD | WS_BORDER | ES_LEFT | ES_MULTILINE | ES_READONLY | SBS_RIGHTALIGN | WS_VSCROLL, 
        10,20,516,350, 
        hwnd,(HMENU) 5001, NULL, NULL); 

        EDIT = CreateWindow(TEXT("edit"), TEXT(""),      
        WS_VISIBLE | WS_CHILD | WS_BORDER | ES_LEFT | ES_MULTILINE | SBS_RIGHTALIGN | WS_VSCROLL, 
        10,20,516,350, 
        hwnd,(HMENU) 5001, NULL, NULL); 
        ShowWindow(EDIT, SW_HIDE); 

        NAME=CreateWindow(TEXT("edit"), TEXT("-> Title <-"), 
        WS_VISIBLE | WS_CHILD | WS_BORDER | ES_AUTOHSCROLL, 
        10, 0, 516, 20, 
        hwnd, (HMENU) ID_FILENAME, NULL, NULL); 
        ShowWindow(NAME, SW_HIDE); 


        TEST[2] = CreateWindow(TEXT("BUTTON"), TEXT("-> Home <-"), 
        WS_VISIBLE | WS_CHILD | WS_BORDER, 
        200,375,150,25, 
        hwnd,(HMENU) ID_SHOWHOME, NULL, NULL); 
        ShowWindow(TEST[2], SW_HIDE); 
        SetWindowText(MAIN, DEFTEXT); 
     break; 
     } 
    case WM_COMMAND: { 
     // MENU ITEMS!!! 
        //Close 
       if(LOWORD(wParam) == ID_CLOSE) { 
        PostQuitMessage (0); 
        } 
       if(LOWORD(wParam) == MENU_COREFILES) { 
           ShellExecute(NULL, "explore", "Notes", NULL, NULL, SW_SHOW); 
           } 
       if(LOWORD(wParam) == MENU_ABOUT) { 
           MessageBox(hwnd, "© 2012 Joseph Meadows. \r\nThis program is essentially a reference guide for whatever you want. It can be used to store school notes, or things completely opposite.", "About:", 
           MB_ICONINFORMATION | MB_SYSTEMMODAL | MB_OK); 
           } 
       if(LOWORD(wParam) == ID_SHOWCPP) { 
           if(home==3) { 
              MessageBox(hwnd, "Error: 9026. Cannot edit Home Page.", "Invalid Action!", 
              MB_ICONERROR | MB_SYSTEMMODAL | MB_DEFBUTTON1 | MB_OK); 
              } 
           else if(home==1) { 
               MessageBox(hwnd, "Error: 6502 Cannot edit System pages.", "Invalid Action!", 
               MB_ICONERROR | MB_SYSTEMMODAL | MB_DEFBUTTON1 | MB_OK); 
               } 
           else { 
            ShowWindow(EDIT, SW_SHOW); 
            ShowWindow(NAME, SW_SHOW); 
            ShowWindow(MAIN, SW_HIDE); 
            SetWindowText(StatButts[0],"List all notes!"); 
            mode=2; 
            } 
            } 
       if(LOWORD(wParam) == ID_SAVE) { 
           char* tittle=SaveFile(hwnd, NAME, EDIT); 
           SetWindowText(MAIN, tittle); 
           ShowWindow(EDIT, SW_HIDE); 
           ShowWindow(NAME, SW_HIDE); 
           ShowWindow(MAIN, SW_SHOW); 
           mode=1; 
           } 
       if(LOWORD(wParam) == ID_HOME) { 
           if(mode==2){ 
              int Savebox=MessageBox(hwnd, "Would you like to save this page?", "Save Page", 
              MB_ICONQUESTION | MB_SYSTEMMODAL | MB_DEFBUTTON1 | MB_YESNOCANCEL); 
              switch(Savebox){ 
                  case IDYES: { 
                   ShowWindow(EDIT, SW_HIDE); 
                   ShowWindow(NAME, SW_HIDE); 
                   ShowWindow(MAIN, SW_SHOW); 
                   SetWindowText(StatButts[0],"List all notes!"); 
                   int len = GetWindowTextLength(EDIT)+1; 
                   static char title[1000]; 
                   GetWindowText(EDIT, title, len); 
                   SetWindowText(MAIN, title); 
                   mode=1; 
                   home=1; 
                   break; 
                   } 
                  case IDNO: { 
                   ShowWindow(EDIT, SW_HIDE); 
                   ShowWindow(NAME, SW_HIDE); 
                   ShowWindow(MAIN, SW_SHOW); 
                   SetWindowText(StatButts[0],"List all notes!"); 
                   SetWindowText(MAIN, DEFTEXT); 
                   mode=1; 
                   home=1; 
                   } 
                  case IDCANCEL: {} 
              } 
           }  
           if(mode==1){   
              ShowWindow(EDIT, SW_HIDE); 
              ShowWindow(NAME, SW_HIDE); 
              ShowWindow(MAIN, SW_SHOW); 
              SetWindowText(MAIN, DEFTEXT); 
              SetWindowText(StatButts[0],"List all notes!"); 
           } 
       } 
       if(LOWORD(wParam)==ID_NEW) { 
           if(mode==1) { 
              ShowWindow(EDIT, SW_SHOW); 
              ShowWindow(NAME, SW_SHOW); 
              ShowWindow(MAIN, SW_HIDE); 
              SetWindowText(TEST[1],"List all notes!"); 
              SetWindowText(EDIT, ""); 
              mode=2; 
           } 
       } 
       if(LOWORD(wParam)==ID_SHOWHOME) {  
                if(mode==1) { 
                   ShowWindow(MAIN, SW_SHOW); 
                   ShowWindow(NAME, SW_HIDE); 
                   ShowWindow(EDIT, SW_HIDE); 
                   ShowWindow(TEST[1], SW_SHOW); 
                   ShowWindow(TEST[2], SW_HIDE); 
                   home=1; 
                   SetWindowText(MAIN, DEFTEXT); 
                   SetWindowText(TEST[1], "List all notes!"); 
                   } 
                if(mode!=1) {     
                   int Savebox=MessageBox(hwnd, "Would you like to save this page?", "Save Page?", 
                   MB_ICONQUESTION | MB_SYSTEMMODAL | MB_DEFBUTTON1 | MB_YESNOCANCEL); 
                   switch(Savebox){ 
                       case IDYES: { 
                         ShowWindow(EDIT, SW_HIDE); 
                         ShowWindow(NAME, SW_HIDE); 
                         ShowWindow(MAIN, SW_SHOW); 
                         ShowWindow(TEST[1], SW_SHOW); 
                         ShowWindow(TEST[2], SW_HIDE); 
                         SetWindowText(TEST[1],"List all notes!"); 
                         int len = GetWindowTextLength(EDIT)+1; 
                         static char title[1000]; 
                         GetWindowText(EDIT, title, len); 
                         SetWindowText(MAIN, title); 
                         mode=1; 
                         home=1; 
                         break; 
                         } 
                       case IDNO: { 
                         ShowWindow(EDIT, SW_HIDE); 
                         ShowWindow(NAME, SW_HIDE); 
                         ShowWindow(MAIN, SW_SHOW); 
                         ShowWindow(TEST[1], SW_SHOW); 
                         ShowWindow(TEST[2], SW_HIDE); 
                         SetWindowText(TEST[1],"List all notes!"); 
                         mode=1; 
                         home=1; 
                         } 

                   } 
                } 
               } 
       if(LOWORD(wParam)==ID_SHOWNOTES) { 
               if(mode==1) { 
                      std::string umm=""; 
                      ShowWindow(NAME,SW_SHOW); 
                      ShowWindow(MAIN,SW_SHOW); 
                      ShowWindow(EDIT,SW_HIDE); 
                      ShowWindow(TEST[1], SW_HIDE); 
                      ShowWindow(TEST[2], SW_SHOW); 
                      SetWindowText(NAME, "-> Title <-"); 
                      WIN32_FIND_DATA File_Buffer; 
                      HANDLE hFind = FindFirstFile(TEXT("Notes/*.NNF"), &File_Buffer); 
                      PTSTR Files[8999]; 
                      int num=0; 
                      SetWindowText(MAIN, ""); 
                      if(hFind != INVALID_HANDLE_VALUE) { 
                         do { 
                         PTSTR FileName = File_Buffer.cFileName; 

                         Files[num] = FileName; 
                         num=num+1; 

                         string kkk(FileName); 
                         stringstream nam(kkk); 
                         string name; 
                         getline(nam, name, '.'); 
                         umm = Stringadd(umm, name); 
                         //================================================================================================ 
                         } while (FindNextFile(hFind, &File_Buffer)); 
                      std::stringstream out; 
                      out << num; 
                      std::string numb=out.str(); 
                      umm=umm+" \r\n \r\n "+"Number of Notes: "+numb; 
                      const char * lol=umm.c_str(); 
                      SetWindowText(MAIN, lol); 
                      FindClose(hFind); 
                  } 
                  } 
                  if(mode!=1) {     
                   int Savebox=MessageBox(hwnd, "Would you like to save this page?", "Save Page", 
                   MB_ICONQUESTION | MB_SYSTEMMODAL | MB_DEFBUTTON1 | MB_YESNOCANCEL); 
                   switch(Savebox){ 
                       case IDYES: { 
                         ShowWindow(EDIT, SW_HIDE); 
                         ShowWindow(NAME, SW_HIDE); 
                         ShowWindow(MAIN, SW_SHOW); 
                         ShowWindow(TEST[1], SW_SHOW); 
                         ShowWindow(TEST[2], SW_HIDE); 
                         SetWindowText(TEST[1],"List all notes!"); 
                         int len = GetWindowTextLength(EDIT)+1; 
                         static char title[1000]; 
                         GetWindowText(EDIT, title, len); 
                         SetWindowText(MAIN, title); 
                         mode=1; 
                         home=1; 
                         break; 
                         } 
                       case IDNO: { 
                         ShowWindow(EDIT, SW_HIDE); 
                         ShowWindow(NAME, SW_HIDE); 
                         ShowWindow(MAIN, SW_SHOW); 
                         ShowWindow(TEST[1], SW_SHOW); 
                         ShowWindow(TEST[2], SW_HIDE); 
                         SetWindowText(TEST[1],"List all notes!"); 
                         mode=1; 
                         home=1; 
                         } 

                   } 
                } 
               }       
     // BUTTONS!!! 
         //Show CPP 
     break; 
     } 
     case WM_PAINT: { 
          PAINTSTRUCT ps; 
          HDC hdc; 
         hdc = BeginPaint(hwnd, &ps); 
         static RECT Background; 
         SetRect(&Background, 0, 0, 476, 555); 
         FillRect(hdc, &Background, (HBRUSH) (INT_PTR)CreateSolidBrush(RGB(50,55,50))); 
         EndPaint(hwnd, &ps); 
         break; 
         } 
    case WM_DESTROY: 
     PostQuitMessage (0);  /* send a WM_QUIT to the message queue */ 
    default:      /* for messages that we don't deal with */ 
     break; 
     return DefWindowProc (hwnd, message, wParam, lParam); 
} 

return 0; 
    } 

А вот детали, имеющие отношение к сделать окно:

LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM); 

    /* Make the class name into a global variable */ 
    char szClassName[ ] = "WindowsApp"; 

    int WINAPI WinMain (HINSTANCE hThisInstance, 
       HINSTANCE hPrevInstance, 
       LPSTR lpszArgument, 
       int nFunsterStil) 

    { 
    HWND hwnd, hwnd2;    /* This is the handle for our window */ 
    MSG messages;   /* Here messages to the application are saved */ 
    WNDCLASSEX wincl;  /* Data structure for the windowclass */ 

/* The Window structure */ 
wincl.hInstance = hThisInstance; 
wincl.lpszClassName = szClassName; 
wincl.lpfnWndProc = WindowProcedure;  /* This function is called by windows */ 
wincl.style = CS_DBLCLKS;     /* Catch double-clicks */ 
wincl.cbSize = sizeof (WNDCLASSEX); 

/* Use default icon and mouse-pointer */ 
wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION); 
wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION); 
wincl.hCursor = LoadCursor (NULL, IDC_ARROW); 
wincl.lpszMenuName = NULL;     /* No menu */ 
wincl.cbClsExtra = 0;      /* No extra bytes after the window class */ 
wincl.cbWndExtra = 0;      /* structure or the window instance */ 
/* Use Windows's default color as the background of the window */ 
wincl.hbrBackground = (HBRUSH) (INT_PTR)CreateSolidBrush(RGB(0,0,0)); 

/* Register the window class, and if it fails quit the program */ 
if (!RegisterClassEx (&wincl)) 
    return 0; 



/* The class is registered, let's create the program*/ 
hwnd = CreateWindowEx (
     0,     /* Extended possibilites for variation */ 
     szClassName,   /* Classname */ 
     "VirtualNotes",  /* Title Text */ 
     WS_SYSMENU | WS_MINIMIZEBOX, /* default window */ 
     CW_USEDEFAULT,  /* Windows decides the position */ 
     CW_USEDEFAULT,  /* where the window ends up on the screen */ 
     554,     /* The programs width */ 
     475,     /* and height in pixels */ 
     HWND_DESKTOP,  /* The window is a child-window to desktop */ 
     NULL,    /* No menu */ 
     hThisInstance,  /* Program Instance handler */ 
     NULL     /* No Window Creation data */ 
     ); 
/* Make the window visible on the screen */ 
ShowWindow (hwnd, nFunsterStil); 

/* Run the message loop. It will run until GetMessage() returns 0 */ 
while (GetMessage (&messages, NULL, 0, 0)) 
{ 
    /* Translate virtual-key messages into character messages */ 
    TranslateMessage(&messages); 
    /* Send message to WindowProcedure */ 
    DispatchMessage(&messages); 
} 

/* The program return- 
+0

Возможно ли, что 'DefWindowProc' не называется? С тех пор у меня были какие-то странные вещи. – chris

+0

У меня есть "return DefWindowProc (hwnd, message, wParam, lParam);" в конце коммутатора. –

+0

Не могли бы вы показать, где это окно создано (и что-то сразу после этого относится к нему)? – chris

ответ

2

Вы должны выполнить исследование, чтобы определить проблему. Затем - попросите решение.

В случае, если вы создаете стандартное «перекрывающееся» окно (т. Е. С заголовком, системным меню и кнопками min/max/close) - все вышеперечисленное должно быть нарисовано системой, только клиентская область (т.е. внутренности окна) в пределах WM_PAINT обработки. Так что, если вы ничего не видите на экране - проблема, вероятно, в другом месте.

В MSVC есть хороший инструмент, называемый Spy ++. Используя его, найдите свой процесс/поток, проверьте, действительно ли это действительно создало окно, проверьте стиль и место вашего окна.

Вы также можете добавить контрольную точку в свою обработку WM_PAINT. Вы попадете туда, если ваше окно действительно существует и видимо.

Некоторые замечания относительно вашего кода:

  1. Нет проверки ошибок (например, тестирование RETVAL из BeginPaint). Откуда вы знаете, что ваше окно действительно создано (или, по крайней мере, его класс зарегистрирован)? Было бы полезно, по крайней мере, некоторое время отладки (например, ASSERT).
  2. Если есть причина Почему вы используете static RECT? (в некоторых очень специфических случаях это может сэкономить некоторую стек памяти).
  3. CreateSolidBrush возвращает вам ручку щетки, которую вы должен освободится DeleteObject. Фактически у вас есть утечка ресурсов.
+0

Я установил его. В той части, где я создал окно, было что-то не так. Я не знаю, как это повлияло, потому что с тех пор, как я впервые начал проект, я ничего не изменил. –

+0

@JosephMeadows, мне сейчас интересно, был ли это 'DefWindowProc', или что это было? – chris

+0

Да. Перерыв для WM_DESTROY каким-то образом попал между DefWindowProc и значением по умолчанию: –

1

Похоже, вы пропускаете break в конце вашего дела.

+0

О том, сколько раз мне приходилось отлаживать мое окно, случайно закрывающееся от этого. – chris

+0

Я добавил перерыв, но он все еще не показывает окно. –

+0

@chris, который не звучит весело ... – Serge

0

Когда вы заполните свою структуру WNDCLASS, зарегистрируйтесь и создадите свое главное окно, вы, вероятно, позвоните по телефону ShowWindow(handle, SW_SHOW/SW_HIDE);. Удостоверьтесь, что этот звонок не говорит SW_HIDE

Учитывая, что этот раздел вашего кода не отображается в вашем текущем сообщении, я мог ошибаться, но это было бы разумное место для поиска.

EDIT: On line 55ish, ShowWindow(); измените nFunsterStil на «SW_SHOW» и посмотрите, решит ли это вашу проблему.

@ Джозеф

+0

Я пробовал это раньше, и это не сработало. Я думаю, что это проблема в той части, где она делает окно, потому что я сделал резервную копию и в основном удалил разделы кода, пока он не появился в виде пустого окна, и он все еще скрывался. Я увижу в секунду, хотя. –

+0

Удачи и не забудьте принять ответ (нажмите зеленый галочку под стрелками для голосования)! =) – Timmy