Thread: edit box affecting displaying of text?

  1. #1
    yes, I'm registered!!! algi's Avatar
    Join Date
    Nov 2004
    Location
    Ipswich
    Posts
    161

    edit box affecting displaying of text?

    Basically i had a problem before where is i called i function by a button and then deleted the button there would be a problem when i try and write text over where the old button used to be. I solved that by using ShowWindow() instead of DestroyWindow(). But now in the function if i create a button or edit box, the problem happens again.

    In the code below delete the edit box creation in the function and the problem goes, but how can i solve this text not appearing properly.

    Code:
    #include <windows.h>
    
    /*  Declare Windows procedure  */
    LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);
    
    /*  Make the class name into a global variable  */
    char szClassName[ ] = "WindowsApp";
    HINSTANCE hInstGlobal;
    
    int WINAPI WinMain (HINSTANCE hThisInstance,
                        HINSTANCE hPrevInstance,
                        LPSTR lpszArgument,
                        int nFunsterStil)
    
    {
        HWND hwnd;               /* 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) GetStockObject (WHITE_BRUSH);
    
        /* 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 */
               "Windows App",       /* Title Text */
               WS_OVERLAPPEDWINDOW, /* default window */
               CW_USEDEFAULT,       /* Windows decides the position */
               CW_USEDEFAULT,       /* where the window ends up on the screen */
               544,                 /* The programs width */
               375,                 /* 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-value is 0 - The value that PostQuitMessage() gave */
        return messages.wParam;
    }
    
    
    HWND hButton, hName;
    
    
    void buttonpressed(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
         
         HDC hdc;
         
         hdc = GetDC (GetParent((HWND) lParam));
         HFONT font;
         PAINTSTRUCT ps;
         font = CreateFont(30, 0, 0, 0,
                               FW_NORMAL, FALSE, FALSE, FALSE,
                               ANSI_CHARSET, OUT_DEFAULT_PRECIS,
    		         CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
    		         DEFAULT_PITCH | FF_ROMAN,
    			"Times New Roman");
    
            SelectObject(hdc, font);
            TextOut(hdc, 10, 10, "When i delete a button the text cannot be seen!", 47);
            DeleteObject(font);
    
    	EndPaint(hwnd, &ps);
    
    hEdit = CreateWindow ("BUTTON", "Now i'm here the text doesn't show properly",
                                         WS_CHILD | WS_VISIBLE |
                                         BS_PUSHBUTTON,
                                         100, 100, 140, 20,
                                         hwnd, (HMENU) 2,
                                         hInstGlobal, NULL);
    	
    	
    	
    }
    
    
    
    /*  This function is called by the Windows function DispatchMessage()  */
    
    LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
        switch (message)                  /* handle the messages */
        {
            case WM_CREATE:
                 hButton = CreateWindow ("BUTTON", "Press Me",
                                         WS_CHILD | WS_VISIBLE |
                                         BS_PUSHBUTTON,
                                         10, 10, 140, 20,
                                         hwnd, (HMENU) 1,
                                         hInstGlobal, NULL);
                 
                 return 0;
            case WM_COMMAND:
                 if (HIWORD(wParam) == BN_CLICKED)
                 {
                      if (LOWORD(wParam) == 1)
                      {
                           ShowWindow(hButton, SW_HIDE);
                          
                           
                           
                           buttonpressed(hwnd, message, wParam, lParam);
                            DestroyWindow(hButton);
                           return 0;
                           }
                           return 0;
                           }
                      return 0;
                 
            case WM_DESTROY:
                PostQuitMessage (0);       /* send a WM_QUIT to the message queue */
                break;
            default:                      /* for messages that we don't deal with */
                return DefWindowProc (hwnd, message, wParam, lParam);
        }
    
        return 0;
    }
    Ps. Sorry if there are any errors, I had to write this in the libruary where there are no compilers and where the internet connection is slow.
    Last edited by algi; 05-03-2005 at 09:41 AM.
    I started out with nothing and I still have most of it left.

  2. #2
    Registered User Joelito's Avatar
    Join Date
    Mar 2005
    Location
    Tijuana, BC, México
    Posts
    310
    Seems that you are trying to use the default font... that's easy and you don't need CreateFont for that, at least for applying another one different from the default one....
    Code:
    WM_CREATE:
    {
    hButton = CreateWindow ("BUTTON", "Press Me",
                                         WS_CHILD | WS_VISIBLE |
                                         BS_PUSHBUTTON,
                                         10, 10, 140, 20,
                                         hwnd, (HMENU) 1,
                                         hInstGlobal, NULL);
    SendMessage(hButton, WM_SETFONT, (WPARAM)GetStockObject(DEFAULT_GUI_FONT), 0);
    Is this what you want?

  3. #3
    erstwhile
    Join Date
    Jan 2002
    Posts
    2,227
    As mentioned in this thread you should not use BeginPaint nor EndPaint outwith a WM_PAINT handler.

    If you'd followed either of the suggestions given in that thread by myself or Novacain you would not be having these problems.

    I suggest you go with Novacain's recommendation and abandon manually drawing the text. Create a static control that contains the text you want and vary the show states of the button and that underlying static control. As Novacain previously mentioned, there's no need to destroy the button control if you follow this approach, you just need to hide it when it's clicked and show the static control containing your text in response to the BN_CLICKED notification message.
    CProgramming FAQ
    Caution: this person may be a carrier of the misinformation virus.

  4. #4
    yes, I'm registered!!! algi's Avatar
    Join Date
    Nov 2004
    Location
    Ipswich
    Posts
    161
    how would i create a static control that contains the text i want. Can you show me an example.
    I started out with nothing and I still have most of it left.

  5. #5
    erstwhile
    Join Date
    Jan 2002
    Posts
    2,227
    I've modified your code to show both approaches. Please read the relevant sections on msdn - links have already been provided.

    1. Static Control approach
    Code:
    #include <windows.h>
    #include <tchar.h>
    
    #define IDC_BUTTON 100
    #if !defined IDC_STATIC
      #define IDC_STATIC -1
    #endif
    
    /*  Declare Windows procedure  */
    LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);
    
    /*  Make the class name into a global variable  */
    char szClassName[ ] = "WindowsApp";
    HINSTANCE hInstGlobal;
    
    int WINAPI WinMain (HINSTANCE hThisInstance,
                        HINSTANCE hPrevInstance,
                        LPSTR lpszArgument,
                        int nFunsterStil)
    
    {
        HWND hwnd;               /* 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) GetStockObject (WHITE_BRUSH);
    
        /* 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 */
               "Windows App",       /* Title Text */
               WS_OVERLAPPEDWINDOW|WS_CLIPCHILDREN, /* default window */
               CW_USEDEFAULT,       /* Windows decides the position */
               CW_USEDEFAULT,       /* where the window ends up on the screen */
               544,                 /* The programs width */
               375,                 /* 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)>0)
        {
            /* Translate virtual-key messages into character messages */
            TranslateMessage(&messages);
            /* Send message to WindowProcedure */
            DispatchMessage(&messages);
        }
    
        /* The program return-value is 0 - The value that PostQuitMessage() gave */
        return messages.wParam;
    }
    
    
    
    /*  This function is called by the Windows function DispatchMessage()  */
    
    LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    static TCHAR txt[]=_T("When I hide a button the text can now be seen!");
    static int txtlen;
    static HWND hButton;
    static HWND hStatic;
    
        switch (message)                  /* handle the messages */
        {
            case WM_CREATE:
                txtlen=lstrlen(txt);
                hButton = CreateWindow ("BUTTON", "Press Me",
                                         WS_CHILD | WS_VISIBLE |
                                         BS_PUSHBUTTON,
                                         10, 10, 140, 20,
                                         hwnd, (HMENU) IDC_BUTTON,
                                         hInstGlobal, NULL);
                hStatic = CreateWindowEx (0,"static", txt,
                                         WS_CHILD  | /*no visible style when created*/
                                         SS_LEFT,
                                         10, 10, 360, 20,
                                         hwnd, (HMENU) IDC_STATIC,
                                         hInstGlobal, NULL);
                 
                 return 0;
            case WM_COMMAND:
                  if (HIWORD(wParam) == BN_CLICKED && LOWORD(wParam)==IDC_BUTTON)
                  {
                      ShowWindow(hButton, SW_HIDE);
                      ShowWindow(hStatic,SW_SHOW);
                      return 0;
                  }
                  return 0;
            case WM_CTLCOLORSTATIC:
              /*handle this msg and return NULL system brush to make static
                control transparent*/
              return (LRESULT)GetStockObject(HOLLOW_BRUSH);
            case WM_DESTROY:
                PostQuitMessage (0);  /* send a WM_QUIT to the message queue */
                break;
            default:  /* for messages that we don't deal with */
                return DefWindowProc (hwnd, message, wParam, lParam);
        }
    
        return 0;
    }
    2. WM_PAINT handler (no static control)
    Code:
    #include <windows.h>
    #include <tchar.h>
    
    #define IDC_BUTTON 100
    
    /*  Declare Windows procedure  */
    LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);
    
    /*  Make the class name into a global variable  */
    char szClassName[ ] = "WindowsApp";
    HINSTANCE hInstGlobal;
    
    int WINAPI WinMain (HINSTANCE hThisInstance,
                        HINSTANCE hPrevInstance,
                        LPSTR lpszArgument,
                        int nFunsterStil)
    
    {
        HWND hwnd;               /* 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) GetStockObject (WHITE_BRUSH);
    
        /* 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 */
               "Windows App",       /* Title Text */
               WS_OVERLAPPEDWINDOW, /* default window */
               CW_USEDEFAULT,       /* Windows decides the position */
               CW_USEDEFAULT,       /* where the window ends up on the screen */
               544,                 /* The programs width */
               375,                 /* 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)>0)
        {
            /* Translate virtual-key messages into character messages */
            TranslateMessage(&messages);
            /* Send message to WindowProcedure */
            DispatchMessage(&messages);
        }
    
        /* The program return-value is 0 - The value that PostQuitMessage() gave */
        return messages.wParam;
    }
    
    
    
    /*  This function is called by the Windows function DispatchMessage()  */
    
    LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    static TCHAR txt[]=_T("When I hide a button the text can now be seen!");
    static int txtlen;
    static HWND hButton;
    
        switch (message)                  /* handle the messages */
        {
            case WM_CREATE:
                txtlen=lstrlen(txt);
                hButton = CreateWindow ("BUTTON", "Press Me",
                                         WS_CHILD | WS_VISIBLE |
                                         BS_PUSHBUTTON,
                                         10, 10, 140, 20,
                                         hwnd, (HMENU) IDC_BUTTON,
                                         hInstGlobal, NULL);
                 
                 return 0;
            case WM_COMMAND:
                  if (HIWORD(wParam) == BN_CLICKED && LOWORD(wParam)==IDC_BUTTON)
                  {
                      ShowWindow(hButton, SW_HIDE);
                      /*InvalidateRect adds to update rectangle for when next WM_PAINT 
                        is processed*/
                      InvalidateRect(hwnd,0,1); 
                      return 0;
                  }
                  return 0;
                 
            case WM_DESTROY:
                PostQuitMessage (0);  /* send a WM_QUIT to the message queue */
                break;
            case WM_PAINT:
              {
              /*do all painting here*/
              PAINTSTRUCT ps;
              BeginPaint(hwnd,&ps);
                if (IsWindowVisible(hButton)==FALSE)
                  {
                  TextOut(ps.hdc, 10, 10, txt, txtlen);
                  }
              EndPaint(hwnd,&ps);
              return 0;
              }
            default:  /* for messages that we don't deal with */
                return DefWindowProc (hwnd, message, wParam, lParam);
        }
    
        return 0;
    }
    CProgramming FAQ
    Caution: this person may be a carrier of the misinformation virus.

Popular pages Recent additions subscribe to a feed

Similar Threads

  1. How to use FTP?
    By maxorator in forum C++ Programming
    Replies: 8
    Last Post: 11-04-2005, 03:17 PM
  2. find if text in edit box has been changed
    By willc0de4food in forum Windows Programming
    Replies: 13
    Last Post: 09-10-2005, 10:47 PM
  3. Capture Enter key press in EDIT Box
    By richiev in forum Windows Programming
    Replies: 4
    Last Post: 07-14-2005, 12:03 AM
  4. Edit Box Questions PT. II
    By Quantrizi in forum Windows Programming
    Replies: 16
    Last Post: 08-12-2003, 10:42 PM
  5. Outputting String arrays in windows
    By Xterria in forum Game Programming
    Replies: 11
    Last Post: 11-13-2001, 07:35 PM