Solved

Non Square Window Shapes

Posted on 1998-04-03
5
956 Views
Last Modified: 2013-12-03
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?
0
Comment
Question by:WinDude
  • 2
  • 2
5 Comments
 
LVL 15

Expert Comment

by:Tommy Hui
ID: 1412526
The "trick" is to use SetWindowRgn() on the dialog. After calling SetWindowRgn() with the region of how you want the dialog to look.

0
 
LVL 1

Author Comment

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

0
 
LVL 8

Expert Comment

by:MikeP090797
ID: 1412528
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;
0
 
LVL 1

Author Comment

by:WinDude
ID: 1412529
can anybody translate the ENTIRE (as small as it is) to C++ MFC? yes I'm clueless...
0
 
LVL 8

Accepted Solution

by:
MikeP090797 earned 400 total points
ID: 1412530
If you want this to be done in MFC, do this:
1. Create a dialog based app using AppWizard - It will generate you a dialog based app.
2. Click on View->ClassWizard. Select the class named CMyDlg.
In the messageList select WM_INITDIALOG and doubleclick it.
paste the code:

SetWindowRgn(NULL,FALSE);
   GetWindowRect(&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(Rgn,TRUE);
   return 0;
0

Featured Post

Free Tool: ZipGrep

ZipGrep is a utility that can list and search zip (.war, .ear, .jar, etc) archives for text patterns, without the need to extract the archive's contents.

One of a set of tools we're offering as a way to say thank you for being a part of the community.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

This article describes how to programmatically preset the "Pages per Sheet" option that's available with most printer drivers.   This setting lets you do "n-Up" printing, where two, four, or more pages are printed on each sheet of paper. If your …
For most people, the WrapPanel seems like a magic when they switch from WinForms to WPF. Most of us will think that the code that is used to write a control like that would be difficult. However, most of the work is done by the WPF engine, and the W…
This is Part 3 in a 3-part series on Experts Exchange to discuss error handling in VBA code written for Excel. Part 1 of this series discussed basic error handling code using VBA. http://www.experts-exchange.com/videos/1478/Excel-Error-Handlin…

762 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question