1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164
|
#ifndef UNICODE // 13,824 bytes with MinGW 4.4.1
#define UNICODE
#endif
#ifndef _UNICODE
#define _UNICODE
#endif
//Main.cpp //Program displays a main Form/Window/Dialog With Three Buttons on it
#include <windows.h> //to simulate a program started from a main Form with three modules/
#include <tchar.h> //options/modalities within which it operates. When you click the top
#include <stdio.h> //button a new Form/Window/Dialog is created with CreateWindow() of
#include "Main.h" //the "Form1" Window Class, and in the WM_CREATE handler of this new
#include "Form1.h" //window it disables the main form with the three buttons and therefore
#include "Form2.h" //is an example of a modal dialog. When you dismiss this modal dialog
#include "Form3.h" //and click on Button/Option #2 on the Main Form, a CreateWindow() call
//creates a window of "Form2" Window Class, and in the WM_CREATE handler
long fnWndProc_OnCreate(WndEventArgs& Wea) //for this window it hides or makes invisible the main
{ //window. After dismssing this window you'll find that
DWORD dwStyle=WS_CHILD|WS_VISIBLE; //you can click on the Option #3 button as many times as
TCHAR szClassName[16]; //you like because the window-form-dialog it creates neither
WNDCLASSEX wc; //disables nor makes invisible the main window. Further
HWND hCtl; //note that these Option #3 windows can be interacted with
//irregardless of what ever is going on with the other windows.
Wea.hIns=((LPCREATESTRUCT)Wea.lParam)->hInstance;
hCtl=CreateWindow(_T("button"),_T("Option #1"),dwStyle,65,15,120,25,Wea.hWnd,(HMENU)IDC_BUTTON_FORM1,Wea.hIns,0);
hCtl=CreateWindow(_T("button"),_T("Option #2"),dwStyle,65,55,120,25,Wea.hWnd,(HMENU)IDC_BUTTON_FORM2,Wea.hIns,0);
hCtl=CreateWindow(_T("button"),_T("Option #3"),dwStyle,65,95,120,25,Wea.hWnd,(HMENU)IDC_BUTTON_FORM3,Wea.hIns,0);
//Register Window Classes For Form1, Form2 and Form3
wc.cbSize=sizeof(WNDCLASSEX), wc.style=CS_HREDRAW | CS_VREDRAW;
wc.cbClsExtra=0, wc.cbWndExtra=0;
wc.hInstance=Wea.hIns, wc.hIcon=LoadIcon(NULL, IDI_APPLICATION);
wc.hIconSm=0, wc.hCursor=LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH), wc.lpszMenuName=NULL;
_tcscpy(szClassName,_T("Form1")), wc.lpszClassName=szClassName;
wc.lpfnWndProc=fnForm1_WndProc;
RegisterClassEx(&wc);
_tcscpy(szClassName,_T("Form2"));
wc.lpfnWndProc=fnForm2_WndProc;
wc.lpszClassName=szClassName; //Note that a WM_CREATE call is akin to a constructor call in typical
RegisterClassEx(&wc); //C++ class architecture. When you receive this call/message Windows
//has finished doing what it needs to support the Window object, and
_tcscpy(szClassName,_T("Form3")); //is 'passing the ball' to you. In my apps with multiple windows I
wc.lpszClassName=szClassName; //typically use the WM_CREATE handler to register any window classes
wc.lpfnWndProc=fnForm3_WndProc; //I need in the app, so that I can make CreateWindow() calls when I
RegisterClassEx(&wc); //need to instantiate a window of some type.
return 0;
}
long btnForm1_Click(WndEventArgs& Wea)
{
HWND hWnd;
hWnd=CreateWindow(_T("Form1"),_T("Form1"),WS_OVERLAPPEDWINDOW,50,25,310,185,Wea.hWnd,(HMENU)0,GetModuleHandle(0),Wea.hWnd);
ShowWindow(hWnd,SW_SHOWNORMAL);
UpdateWindow(hWnd);
return 0;
}
long btnForm2_Click(WndEventArgs& Wea)
{
HWND hWnd;
hWnd=CreateWindow(_T("Form2"),_T("Form2"),WS_OVERLAPPEDWINDOW,200,250,310,185,Wea.hWnd,(HMENU)0,GetModuleHandle(0),Wea.hWnd);
ShowWindow(hWnd,SW_SHOWNORMAL);
UpdateWindow(hWnd);
return 0;
}
long btnForm3_Click(WndEventArgs& Wea)
{
HWND hWnd;
hWnd=CreateWindow(_T("Form3"),_T("Form3"),WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,300,260,0,(HMENU)0,GetModuleHandle(0),Wea.hWnd);
ShowWindow(hWnd,SW_SHOWNORMAL);
UpdateWindow(hWnd);
return 0;
}
long fnWndProc_OnCommand(WndEventArgs& Wea)
{
switch(LOWORD(Wea.wParam))
{
case IDC_BUTTON_FORM1:
return btnForm1_Click(Wea);
case IDC_BUTTON_FORM2:
return btnForm2_Click(Wea);
case IDC_BUTTON_FORM3:
return btnForm3_Click(Wea);
}
return 0;
}
long fnWndProc_OnClose(WndEventArgs& Wea) //Search And Destroy Mission For Any Form3
{ //Windows Hanging Around.
HWND hForm;
do
{
hForm=FindWindow(_T("Form3"),_T("Form3"));
if(hForm)
SendMessage(hForm,WM_CLOSE,0,0);
else
break;
}while(TRUE);
DestroyWindow(Wea.hWnd);
PostQuitMessage(0);
return 0;
}
LRESULT CALLBACK fnWndProc(HWND hwnd, unsigned int msg, WPARAM wParam,LPARAM lParam)
{
WndEventArgs Wea;
for(unsigned int i=0; i<dim(EventHandler); i++)
{
if(EventHandler[i].iMsg==msg)
{
Wea.hWnd=hwnd, Wea.lParam=lParam, Wea.wParam=wParam;
return (*EventHandler[i].fnPtr)(Wea);
}
}
return (DefWindowProc(hwnd, msg, wParam, lParam));
}
int WINAPI WinMain(HINSTANCE hIns, HINSTANCE hPrevIns, LPSTR lpszArgument, int iShow)
{
TCHAR szClassName[]=_T("Multiple Forms");
WNDCLASSEX wc;
MSG messages;
HWND hWnd;
wc.lpszClassName=szClassName; wc.lpfnWndProc=fnWndProc;
wc.cbSize=sizeof (WNDCLASSEX); wc.style=CS_DBLCLKS;
wc.hIcon=LoadIcon(NULL,IDI_APPLICATION); wc.hInstance=hIns;
wc.hIconSm=LoadIcon(NULL, IDI_APPLICATION); wc.hCursor=LoadCursor(NULL,IDC_ARROW);
wc.hbrBackground=(HBRUSH)COLOR_BTNSHADOW; wc.cbWndExtra=0;
wc.lpszMenuName=NULL; wc.cbClsExtra=0;
RegisterClassEx(&wc);
hWnd=CreateWindowEx(0,szClassName,szClassName,WS_OVERLAPPEDWINDOW,250,500,260,170,HWND_DESKTOP,0,hIns,0);
ShowWindow(hWnd,iShow);
while(GetMessage(&messages,NULL,0,0))
{
TranslateMessage(&messages);
DispatchMessage(&messages);
}
return messages.wParam;
}
|