LRESULT CALLBACK WndProc
(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
Controller * pCtrl = WinGetLong<Controller *> (hwnd);
switch (message)
{
case WM_CREATE:
// 不得不在此捕捉异外错误!
try
{
pCtrl = new Controller (hwnd,
reinterpret_cast<CREATESTRUCT *> (lParam));
WinSetLong<Controller *> (hwnd, pCtrl);
}
catch (WinException e)
{
::MessageBox (hwnd, e.GetMessage(), "Initialization",
MB_ICONEXCLAMATION | MB_OK);
return -1;
}
catch (...)
{
::MessageBox (hwnd, "Unknown Error", "Initialization",
MB_ICONEXCLAMATION | MB_OK);
return -1;
}
return 0;
case WM_SIZE:
pCtrl->Size (LOWORD(lParam), HIWORD(lParam));
return 0;
case WM_PAINT:
pCtrl->Paint ();
return 0;
case WM_COMMAND:
pCtrl->Command (LOWORD (wParam));
return 0;
case WM_DESTROY:
WinSetLong<Controller *> (hwnd, 0);
delete pCtrl;
return 0;
}
return ::DefWindowProc (hwnd, message, wParam, lParam);
}
--------------------------------------------------------------------------------
在这个简单的例子中执行了少许的控制器方法。构造函数为稍后的使用不得不记住窗口的句柄,析构函数不得不发送离开消息,Size方法传递它的参数到View,等等,我们将讨论关于描绘窗口。目前,注意到控制器准备与View去一起描绘。
--------------------------------------------------------------------------------
Controller::Controller (HWND hwnd, CREATESTRUCT * pCreate)
:_hwnd (hwnd),
_model ("Generic")
{
}
Controller::~Controller ()
{
::PostQuitMessage(0);
}
void Controller::Size (int cx, int cy)
{
_view.SetSize (cx, cy);
}
void Controller::Paint ()
{
// prepare the canvas and let View do the rest
PaintCanvas canvas (_hwnd);
_view.Paint (canvas, _model);
// Notice: The destructor of PaintCanvas called automatically!
}
--------------------------------------------------------------------------------
当用户选择了菜单条目之一时,产生WM_COMMAND消息窗口过程被调用。适当的控制方法当足于命命令id分配命令。当你利用你的资源编辑器建立了你的菜单时,你为每个菜单条目选取了这些标识id。它们被贮存在适当的头文件里(可能在resource.h里) ,不得不被包含到控制器的源文件中。
我们的菜单仅仅包含三个条目,它们的标识id为IDM_EXIT,IDM_HELP和IDM_ABOUT。响应IDM_ABOUT时对话框被显示,它也是利用资源编辑器建立的,给定的标识id为IDD_ABOUT。它的对话框过程是AboutDlgProc。
最后,为了显示一个对话框我们需指定应用程序实例的句柄。标准的途径是利用应用程序的hwnd访问内部窗口数据结构取回它。
--------------------------------------------------------------------------------
上一页 [1] [2] [3] [4] [5] [6] 下一页