0

我已经在这个应用程序上工作了至少 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-
4

3 回答 3

2

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

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

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

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

关于您的代码的一些注释:

  1. 没有错误检查(例如测试 retval BeginPaint)。你怎么知道你的窗口确实被创建了(或者至少它的类被注册了)?至少一些调试时宏(例如ASSERT)会有所帮助。
  2. 如果有原因你为什么要使用static RECT?(在某些非常特殊的情况下,这可能会节省一些堆栈内存)。
  3. CreateSolidBrush给你一个刷柄,你必须释放它DeleteObject。实际上,您有资源泄漏。
于 2012-06-09T20:40:28.453 回答
1

看起来您break在案件结束时遗漏了 a 。

于 2012-06-09T20:14:25.303 回答
0

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

鉴于您当前的帖子中没有显示您的这部分代码,我可能是错的,但这是一个明智的选择。

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

@约瑟夫

于 2012-06-09T20:39:38.833 回答