Link to home
Start Free TrialLog in
Avatar of okuru
okuru

asked on

No Sysmenu

Is it possible to create a WIN32 app with a window having a title bar and a [X] close button BUT NO system menu.
Or do I have to have a dialog box as my main.

Thanks,
Avatar of Mirkwood
Mirkwood

Remove style WS_SYSMENU from CreateWindow
Just don't specify the WS_SYSMENU window style.  You probably want to specify WS_CAPTION WS_OVERLAPPED WS_THICKFRAME and maybe WS_MINIMIZE and WS_MAXIMIZE.

Let me know if you have questions.  (If that doesn't work, There is another way, but i think that will)
Damn, I pressed comment iso answer
Avatar of okuru

ASKER

Does not work - I want a window with a title bar, a [X] close button but NO icon/sysmenu...

ASKER CERTIFIED SOLUTION
Avatar of nietod
nietod

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
I create such a window in my programs.  The styles I use are

 WS_POPUPWINDOW | WS_DLGFRAME | WS_THICKFRAME | WS_OVERLAPPED | WS_CLIPSIBLINGS

You can remove the clip sibblings style.  My window has a caption although I didn not specify the WS_CAPTION style.  It does have a close box but does not have minimize and maximize buttons.  (these can be added with the WS_MINIMUZE and WS_MAXIMIZEstyles)  It has no system menu.  
Avatar of okuru

ASKER

With this I get a window with title bar no close button, if I add sysmenu I get an icon/menu ???


#include <windows.h>

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

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
                   PSTR szCmdLine, int iCmdShow) {

static char szAppName[] = "Test";
HWND hwnd;
MSG msg;
WNDCLASSEX wndclass;

wndclass.cbSize            = sizeof(wndclass);
wndclass.style            = CS_HREDRAW | CS_VREDRAW;
wndclass.lpfnWndProc      = WndProc;
wndclass.cbClsExtra      = 0;
wndclass.cbWndExtra      = 0;
wndclass.hInstance      = hInstance;
wndclass.hIcon            = NULL;
wndclass.hCursor      = LoadCursor(NULL, IDC_ARROW);
wndclass.hbrBackground      = (HBRUSH) GetStockObject (LTGRAY_BRUSH);
wndclass.lpszMenuName      = NULL;
wndclass.lpszClassName      = szAppName;
wndclass.hIconSm      = NULL;

RegisterClassEx(&wndclass);

hwnd = CreateWindow(szAppName,
" Test",
WS_POPUPWINDOW |
WS_DLGFRAME |
WS_THICKFRAME |
WS_OVERLAPPED |
WS_CLIPSIBLINGS,
CW_USEDEFAULT,
CW_USEDEFAULT,
150,
50,
NULL,
NULL,
hInstance,
NULL);

ShowWindow(hwnd, iCmdShow);
UpdateWindow(hwnd);

while (GetMessage(&msg, NULL, 0, 0)) {
      TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam) {
      HDC                  hdc;
      PAINTSTRUCT      ps;
      switch (iMsg) {
            case WM_CREATE:
                  return 0;

        case WM_PAINT :
                  hdc = BeginPaint(hwnd, &ps);
                  EndPaint (hwnd, &ps);
            return 0;

            case WM_DESTROY:
                  PostQuitMessage (0);
            return 0 ;
      }
      return DefWindowProc(hwnd, iMsg, wParam, lParam);
}

I have a close button on mine.  However, I use CreateWindowEx() and specify two extended styles.  WS_EX_DLGMODALFRAME and WS_EX_WINDOWEDGE.

You might try that or you might try adding the WS_CAPTION style.  (Which probably should have been there, but actually isn't in my code.)
Avatar of okuru

ASKER

Thanks
CreateWindowEx() does it, CreateWindow() does not.