Link to home
Start Free TrialLog in
Avatar of WinDude
WinDude

asked on

Non Square Window Shapes

I have a program somebody gave me that creates an non-square window.  Has anybody else seen this?  What I need to know is if there is some way to do this for a Dialog box instead of a SDI.  Here is the code for SDI:

#include <windows.h>

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

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
            PSTR szCmdLine, int iCmdShow)
{
      static char szAppName[] = "App Name";
      static char szAppTitle[] = "App Name";
      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 = LoadIcon(NULL, IDI_APPLICATION);
      wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
      wndclass.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);
      wndclass.lpszMenuName = NULL;
      wndclass.lpszClassName = szAppName;
      wndclass.hIconSm = LoadIcon(NULL, IDI_APPLICATION);

      RegisterClassEx(&wndclass);
      hwnd = CreateWindow (szAppName, szAppTitle,WS_OVERLAPPEDWINDOW,
            CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
            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;
      RECT rect;
      HRGN Rgn;
      POINT points[5];
      int AutoMagic = -1;

      switch (iMsg)
      {
            case WM_CREATE :
                  SetWindowRgn(hwnd,NULL,FALSE);
                  GetWindowRect(hwnd,&rect);
                  points[0].x = points[0].y = points[1].x = 0;
                  points[1].y = GetSystemMetrics(SM_CYMENU) + GetSystemMetrics(SM_CYCAPTION);
                  points[3].x = points[4].x = rect.right - rect.left;
                  points[4].y = 0;
                  points[3].y = points[1].y;
                  points[2].x = (rect.right - rect.left)/2;
                  points[2].y = rect.bottom - rect.top;
                  Rgn = CreatePolygonRgn(points,5,WINDING);
                  SetWindowRgn(hwnd,Rgn,TRUE);
                  return 0;
            case WM_PAINT :
                  hdc = BeginPaint(hwnd, &ps);
                  GetClientRect(hwnd,&rect);
                  DrawText(hdc, "Inside the Window!", AutoMagic, &rect,
                        DT_SINGLELINE | DT_CENTER | DT_VCENTER);
                  EndPaint(hwnd, &ps);
                  return 0;
            case WM_DESTROY :
                  PostQuitMessage(0);
                  return 0;
      }
      return DefWindowProc(hwnd, iMsg, wParam, lParam);
}


This is pretty clever programming, but is it possible for Dialog boxes and can I implement it in C++ using MSVC++5.0?
Avatar of Tommy Hui
Tommy Hui

The "trick" is to use SetWindowRgn() on the dialog. After calling SetWindowRgn() with the region of how you want the dialog to look.

Avatar of WinDude

ASKER

ok, I added more points.  Could I get this translated to C++ MFC for a dialog box?

In the Window Procedure of your dialog, add:

case WM_INITDIALOG:
SetWindowRgn(hwnd,NULL,FALSE);
   GetWindowRect(hwnd,&rect);
   points[0].x = points[0].y = points[1].x = 0;
   points[1].y = GetSystemMetrics(SM_CYMENU) +
   GetSystemMetrics(SM_CYCAPTION);
   points[3].x = points[4].x = rect.right - rect.left;
   points[4].y = 0;
   points[3].y = points[1].y;
   points[2].x = (rect.right - rect.left)/2;
   points[2].y = rect.bottom - rect.top;
   Rgn = CreatePolygonRgn(points,5,WINDING);
   SetWindowRgn(hwnd,Rgn,TRUE);
   return 0;
Avatar of WinDude

ASKER

can anybody translate the ENTIRE (as small as it is) to C++ MFC? yes I'm clueless...
ASKER CERTIFIED SOLUTION
Avatar of MikeP090797
MikeP090797

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