拥有二个窗口的程序

拥有二个窗口的程序

一个程序二个窗口

  1  #include  " stdafx.h "
  2  #include  < map >
  3  #include  " MultiWindow.h "
  4  #define  MAX_LOADSTRING 100
  5  using   namespace  std;
  6  //  全局变量:
  7  HINSTANCE hInst;                                 //  当前实例
  8  TCHAR szTitle[MAX_LOADSTRING];                     //  标题栏文本
  9  TCHAR szWindowClass[MAX_LOADSTRING];             //  主窗口类名
 10 
 11  //  此代码模块中包含的函数的前向声明:
 12  ATOM                MyRegisterClass(HINSTANCE hInstance);
 13  BOOL                InitInstance(HINSTANCE,  int );
 14  LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
 15  LRESULT CALLBACK    About(HWND, UINT, WPARAM, LPARAM);
 16  using   namespace  std;
 17 
 18  class  CMyWnd;
 19  typedef map < HWND,CMyWnd *>  MAPHWND2WND;
 20  MAPHWND2WND  mapHWND2Wnd;
 21 
 22  CMyWnd *  tmpMyWnd  =  NULL;
 23 
 24  class  CMyWnd
 25  {
 26  public :
 27       static  LRESULT CALLBACK WndProc(HWND hWnd,UINT nMessage,WPARAM wParam,LPARAM lParam);
 28 
 29      LRESULT WindowProc(UINT nMessage,WPARAM wParam,LPARAM lParam);
 30 
 31 
 32      CMyWnd()
 33      {
 34          m_hWnd  =  NULL;
 35      }
 36       bool  Create()
 37      {
 38          tmpMyWnd   =   this ;
 39 
 40          m_hWnd   =  CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
 41               0 0 100 , 100 , NULL, NULL, hInst, NULL);
 42 
 43           if  ( ! m_hWnd)
 44               return   false ;
 45 
 46 
 47           return   true ;
 48      }
 49 
 50      BOOL ShowWindow( int  nCmdShow)
 51      {
 52           return  ::ShowWindow(m_hWnd,nCmdShow);
 53      }
 54 
 55      BOOL UpdataWindow()
 56      {
 57           return  ::UpdateWindow(m_hWnd);
 58      }
 59 
 60       virtual   void  OnPaint()
 61      {
 62          PAINTSTRUCT ps;
 63          HDC hdc  =  BeginPaint(m_hWnd,  & ps);
 64          ::TextOut(hdc, 0 , 0 , " 123456 " , 6 );
 65          EndPaint(m_hWnd,  & ps);
 66 
 67      }
 68 
 69      HWND m_hWnd;
 70  };
 71 
 72  class  CMyWnd2 :  public  CMyWnd
 73  {
 74  public :
 75       virtual   void  OnPaint()
 76      {
 77          PAINTSTRUCT ps;
 78          HDC hdc  =  BeginPaint(m_hWnd,  & ps);
 79          ::TextOut(hdc, 0 , 0 , " 6789 " , 4 );
 80          EndPaint(m_hWnd,  & ps);
 81      }
 82 
 83       string  m_str;
 84  };
 85 
 86  class  CMyWnd3 :  public  CMyWnd
 87  {
 88  public :
 89       virtual   void  OnPaint()
 90      {
 91          PAINTSTRUCT ps;
 92          HDC hdc  =  BeginPaint(m_hWnd,  & ps);
 93          ::TextOut(hdc, 0 , 0 , " 000000 " , 6 );
 94          EndPaint(m_hWnd,  & ps);
 95      }
 96 
 97       string  m_str;
 98  };
 99 
100  CMyWnd *  findCMyWnd(HWND hWnd)
101  {
102      MAPHWND2WND::iterator it  =  mapHWND2Wnd.find(hWnd);
103       if  (it  !=  mapHWND2Wnd.end())
104      {
105           return  it -> second;
106      }
107       else
108      {
109          mapHWND2Wnd.insert(make_pair(hWnd,tmpMyWnd));
110 
111          tmpMyWnd -> m_hWnd  =  hWnd;
112           return  tmpMyWnd;
113           // DebugBreak();
114      }
115       return  NULL;
116  }
117 
118  LRESULT CALLBACK CMyWnd::WndProc(HWND hWnd,UINT nMessage,WPARAM wParam,LPARAM lParam)
119  {
120      CMyWnd *  pWnd  =  findCMyWnd(hWnd);
121       if  (pWnd  !=  NULL)
122      {
123           return  pWnd -> WindowProc( nMessage, wParam, lParam);
124      }
125       else
126      {
127          DebugBreak();
128      }
129       return   0 ;
130  }
131 
132  LRESULT CMyWnd::WindowProc(UINT nMessage,WPARAM wParam,LPARAM lParam)
133  {
134       if  (nMessage  ==  WM_PAINT)
135      {
136          OnPaint();
137           return   0 ;
138      }
139       return  ::DefWindowProc(m_hWnd, nMessage, wParam, lParam);;
140  }
141 
142 
143  int  APIENTRY _tWinMain(HINSTANCE hInstance,
144                       HINSTANCE hPrevInstance,
145                       LPTSTR    lpCmdLine,
146                        int        nCmdShow)
147  {
148        //  TODO: 在此放置代码。
149      MSG msg;
150      HACCEL hAccelTable;
151 
152       //  初始化全局字符串
153      LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
154      LoadString(hInstance, IDC_MULTIWINDOW, szWindowClass, MAX_LOADSTRING);
155      MyRegisterClass(hInstance);
156 
157       //  执行应用程序初始化:
158       if  ( ! InitInstance (hInstance, nCmdShow)) 
159      {
160           return  FALSE;
161      }
162 
163      hAccelTable  =  LoadAccelerators(hInstance, (LPCTSTR)IDC_MULTIWINDOW);
164 
165       //  主消息循环:
166       while  (GetMessage( & msg, NULL,  0 0 )) 
167      {
168           if  ( ! TranslateAccelerator(msg.hwnd, hAccelTable,  & msg)) 
169          {
170              TranslateMessage( & msg);
171              DispatchMessage( & msg);
172          }
173      }
174 
175       return  ( int ) msg.wParam;
176  }
177 
178 
179 
180  //
181  //   函数: MyRegisterClass()
182  //
183  //   目的: 注册窗口类。
184  //
185  //   注释: 
186  //
187  //     仅当希望在已添加到 Windows 95 的
188  //     “RegisterClassEx”函数之前此代码与 Win32 系统兼容时,
189  //     才需要此函数及其用法。调用此函数
190  //     十分重要,这样应用程序就可以获得关联的
191  //    “格式正确的”小图标。
192  //
193  ATOM MyRegisterClass(HINSTANCE hInstance)
194  {
195      WNDCLASSEX wcex;
196 
197      wcex.cbSize  =   sizeof (WNDCLASSEX); 
198 
199      wcex.style             =  CS_HREDRAW  |  CS_VREDRAW;
200      wcex.lpfnWndProc     =  CMyWnd::WndProc;
201      wcex.cbClsExtra         =   0 ;
202      wcex.cbWndExtra         =   0 ;
203      wcex.hInstance         =  hInstance;
204      wcex.hIcon             =  LoadIcon(hInstance, (LPCTSTR)IDI_MULTIWINDOW);
205      wcex.hCursor         =  LoadCursor(NULL, IDC_ARROW);
206      wcex.hbrBackground     =  (HBRUSH)(COLOR_WINDOW + 1 );
207      wcex.lpszMenuName     =  (LPCTSTR)IDC_MULTIWINDOW;
208      wcex.lpszClassName     =  szWindowClass;
209      wcex.hIconSm         =  LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL);
210 
211       return  RegisterClassEx( & wcex);
212  }
213 
214  //
215  //    函数: InitInstance(HANDLE, int)
216  //
217  //    目的: 保存实例句柄并创建主窗口
218  //
219  //    注释: 
220  //
221  //         在此函数中,我们在全局变量中保存实例句柄并
222  //         创建和显示主程序窗口。
223  //
224  BOOL InitInstance(HINSTANCE hInstance,  int  nCmdShow)
225  {
226    
227 
228     hInst  =  hInstance;  //  将实例句柄存储在全局变量中
229 
230    
231     CMyWnd *  pWnd  =   new  CMyWnd3();
232      if ( ! pWnd -> Create())
233          return   false ;
234     pWnd -> ShowWindow(nCmdShow);
235     pWnd -> UpdataWindow();
236 
237     pWnd  =   new  CMyWnd2();
238 
239      if  ( ! pWnd -> Create())
240          return  FALSE;
241     pWnd -> ShowWindow(nCmdShow);
242     pWnd -> UpdataWindow();
243 
244      return  TRUE;
245  }

你可能感兴趣的:(拥有二个窗口的程序)