什么可能导致我的C ++ win32应用程序在后台运行?

时间:2012-06-09 20:12:58

标签: c++ winapi background wm-paint

我已经在这个应用程序上工作至少3-4个月了,就在最近它还没有工作。

它从今天开始,因为昨天它运行良好和顺利。 现在它运行,但窗口不可见(我检查了任务管理器中的进程列表并且它正在运行)。我已经确定了 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-

3 个答案:

答案 0 :(得分:2)

您应该进行调查以确定问题。然后 - 请求解决方案。

如果您正在创建标准的“重叠”窗口(即标题栏,系统菜单和最小/最大/关闭按钮) - 以上所有内容都应该由系统绘制,只有客户区域(即在WM_PAINT处理中绘制窗口的内部。因此,如果您在屏幕上看不到任何内容 - 问题可能在其他地方。

MSVC中有一个很好的工具,名为Spy ++。使用它找到你的进程/线程,检查* 是否真的创建了窗口,检查你的窗口样式和位置。

您还可以在WM_PAINT处理中添加断点。如果你的窗户确实存在且可见,你就会到达那里。

有关您的代码的一些注意事项:

  1. 没有错误检查(例如测试BeginPaint的retval)。您如何知道您的窗口确实已创建(或至少其类已注册)?至少一些调试时宏(例如ASSERT)会有所帮助。
  2. 如果有原因你为什么使用static RECT? (在某些非常特殊的情况下,这可能会节省一些堆栈内存)。
  3. CreateSolidBrush会返回一个画笔句柄,您必须免费DeleteObject。实际上你有资源泄漏。

答案 1 :(得分:1)

在您的案例结束时,您似乎错过了break

答案 2 :(得分:0)

当您填写WNDCLASS结构,注册并创建主窗口时,您可能会调用ShowWindow(handle, SW_SHOW/SW_HIDE);。确保此致电没有说SW_HIDE

鉴于您的代码的这一部分未显示在您当前的帖子中,我可能错了,但这是一个明智的地方。

编辑:在线55ish,ShowWindow();将nFunsterStil更改为“SW_SHOW”,看看是否能解决您的问题。

@Joseph