Hi all

I'm experimenting with win API gui stuff, and I've run into a problem with dialog boxes. Currently, when the "Show DialogBox" option in the menu is pressed, the dialog box pops up.

I then need for this dialog box to be draggable/moveable, and to "hide" when its close button is pressed. (and then pop up again when requested etc.)

The problem is that when the dialog box pops up, I lose control over the initial window, as well as the new dialogbox window. The only thing that remains "active" is the button within the dialog box.

Any help would be much appreciated. :)

#include "windows.h"
#define IDC_DIALOG1 9090
#define IDC_HELLOBUTTON 9091

IDC_DIALOG1 DIALOGEX 0, 0, 100, 100
STYLE WS_POPUP | WS_CAPTION
EXSTYLE WS_EX_TOOLWINDOW
CAPTION "Options Dialog"
FONT 7, "MS Sans Serif"
BEGIN
     PUSHBUTTON "&Hello World",IDC_HELLOBUTTON, 10,10,80,30
END
#include <windows.h>
#include <iostream>
#define IDC_DIALOG1 9090
#define IDC_HELLOBUTTON 9091
#define ID_OPTIONS_SHOW 9092

using namespace std;

/* Declare Windows procedure */


HWND testDialog = NULL;

LRESULT CALLBACK WindowProcedure(HWND, UINT, WPARAM, LPARAM);
BOOL CALLBACK ToolDlgProc(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;               /* 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 light-gray as the background of the window */
    wincl.hbrBackground = (HBRUSH) GetStockObject(LTGRAY_BRUSH);

    /* Register the window class, if fail 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;
}

/* 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_DESTROY:
            PostQuitMessage(0);        /* send a WM_QUIT to the message queue */
            break;

            case WM_COMMAND:                  
            {
              switch(LOWORD(wParam))  //contains the ID of the control that sent message
              {
                    case ID_OPTIONS_SHOW:
                         cout << "clicked options-show";
                         ShowWindow(testDialog, SW_SHOW);
              }
            }


           case WM_CREATE:
           {
            HMENU hMenu, hSubMenu;
            hMenu = CreateMenu();
            hSubMenu = CreatePopupMenu();
            AppendMenu(hSubMenu, MF_STRING, ID_OPTIONS_SHOW, "&Show DialogBox");
            AppendMenu(hMenu, MF_STRING | MF_POPUP, (UINT)hSubMenu, "&Options");
            SetMenu(hwnd, hMenu);
            testDialog = CreateDialog(GetModuleHandle(NULL),MAKEINTRESOURCE(IDC_DIALOG1),hwnd, ToolDlgProc);
             if(testDialog != NULL)
                ShowWindow(testDialog, SW_HIDE);

             else
                cout << endl << "testDialog is null!" << endl;

             }
           default:                   /* for messages that we don't deal with */
           return DefWindowProc(hwnd, message, wParam, lParam);
    }
    return 0;
}


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

           case WM_DESTROY:
             ShowWindow(testDialog, SW_HIDE);       /* send a WM_QUIT to the message queue */
             break;
           case WM_COMMAND:
             switch(LOWORD(wParam))
                {
                 case IDC_HELLOBUTTON:
                      cout << endl << "You clicked the button!" << endl;
                }
                break;

           default:                   /* for messages that we don't deal with */
           return DefWindowProc(hwnd, message, wParam, lParam);
    }
    return 0;
}

... nevermind, got it working. :cheesy:

Well what was the problem?

well ... mainly that I was calling DefWindowProc() from within the dialogbox's callback function, which messed things up. :-|

I read somewhere, the real programmers are the C language programmers. I belive that given the structure of C but you also are a real programmer if you are actually using win API. Why not try MFC? Its alot easier.

Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.