技术篇(3)--QPG界面分解方法介绍
生活随笔
收集整理的這篇文章主要介紹了
技术篇(3)--QPG界面分解方法介绍
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
在實際開發中,我發現很多程序員花很多時間在界面處理上.并且界面之間的關系和控制邏輯可能工作量并不小.所以好些老手到后面就跑去做后臺服務,做通訊去了.
??? 界面布局和交互設計本身有很多的學問,或者有很多藝術,但是本文這里先不討論這個問題.
??? 在QPG團隊實踐中,我們把界面劃分成很多的UI_PART,這和ASP.NET2.0的WebPart可能有相同的地方.我們用這些簡單的PART進行接受輸入或者展示結果.這樣就可以比較方便的測試了.通常這些PART就是一些用戶控件,我們提供了IMainForm接口,使得UI的容器可以動態調入這些部件,哪怕程序已經運行,您也可以編寫一個PART,您只要把它放到bin\plugins目錄即可.
????有時部件可能要和容器通訊,看看下面的代碼您可能就會明白:
IMainForm?成員#region?IMainForm?成員
????????public?string?CurUserID?{
????????????get?{
????????????????//?TODO:??添加?Form1.CurUserID?getter?實現
????????????????return?"admin";
????????????}
????????}
????????public?object?getCookie(string?name)?{
????????????//?TODO:??添加?Form1.getCookie?實現
????????????return?name;
????????}
????????public?void?addCookie(string?name,?object?obj)?{
????????????//?TODO:??添加?Form1.addCookie?實現
????????}
????????public?QPG.UIP.Privilege?getPrivilegeByUser(string?uid,?string?cmdName)?{
????????????//?TODO:??添加?Form1.getPrivilegeByUser?實現
????????????return??QPG.UIP.Privilege.Full;
????????}
????????public?void?showStatus(string?msg)?{
????????????MessageBox.Show(msg);
????????}
????????public?void?showHelp(string?help)?{
????????????//?TODO:??添加?Form1.showHelp?實現
????????}
????????public?void?showNotify(string?title,?string?msg)?{
????????????MessageBox.Show(msg);
????????}
????????#endregion要使用插件服務.您的代碼Form容器大致如下:
public?class?Form1?:?System.Windows.Forms.Form,IMainForm
????{
????????private?System.ComponentModel.IContainer?components;
????????private?System.Windows.Forms.Panel?panel1;
????????public?static?PluginService?Plugins=new?PluginService();
????????private?QPG.UIP.Actions.ActionList?actionList1;
????????private?QPG.UIP.Actions.Action?action1;
????????private?QPG.UIP.Actions.Action?action2;
????//
????protected?IPlugin?selectedPlugin;
????????public?Form1()
????????{
????????????//
????????????//?Windows?窗體設計器支持所必需的
????????????//
????????????InitializeComponent();
????????????Plugins.MainForm=this;
????????
????????????action1.Tag="Demo.UIC.Plugin1";
????????????action2.Tag="Demo.UIC.Plugin2";
????????????action1.Execute+=new?EventHandler(runAction);
????????????action2.Execute+=new?EventHandler(runAction);
????????//????Tester?t=new?Tester();
????????//????t.testParametersConfig();
????????}
????????private?void?runAction(object?sender,?System.EventArgs?e)?{
????????????QPG.UIP.Actions.Action?a=sender?as?QPG.UIP.Actions.Action;
????????
????????????if(getPrivilegeByUser("admin",?a.Tag.ToString())==Privilege.None)?return;
????????
????????????selectedPlugin=Plugins.FindPlugin(a.Tag.ToString()?);
????????????panel1.Controls.Clear();
????????????panel1.Controls.Add(selectedPlugin.MainInterface);
????????????selectedPlugin.MainInterface.Dock=DockStyle.Fill;
????????}
插件的編寫就很簡單了,大致如下:
using?System;
using?QPG.UIP;
namespace?Demo.UIC
{
????/**////?<summary>
????///?Plugin2
????///?</summary>
????public?class?Plugin1?:??BasePlugin??
????{
????????public?Plugin1():base()
????????{
????????????
????????}
????????protected?override?void?init()
????????{
????????????base.init();
????
????????????this.myRequimentNo?=?"uca01";
????????????
????????????this.myDescription="統計圖";
????????????this.myAuthor="alex";
????????????????????
????????????????
????????
????????}
????????
????????????
????????
????????public?override?void?Initialize()
????????{
????????????this.MainInterface=new?PlugUI1();
????????}
????????
????????public?override?void?Dispose()
????????{
????????????//Put?any?cleanup?code?in?here?for?when?the?program?is?stopped
????????}
????}
}
using?System;
using?System.Collections;
using?System.ComponentModel;
using?System.Drawing;
using?System.Data;
using?System.Windows.Forms;
using?QPG.UIP;
namespace?Demo.UIC
{
????/**////?<summary>
????///?Summary?description?for?ctlMain.
????///?</summary>
????public?class?PlugUI1?:?PluginBaseUI
????{
????
????????private?System.Windows.Forms.Label?label1;
????????private?System.Windows.Forms.GroupBox?groupBox1;
????????private?System.Windows.Forms.TextBox?txtFeedback;
????????private?System.Windows.Forms.Button?button1;
????????/**////?<summary>?
????????///?Required?designer?variable.
????????///?</summary>
????????private?System.ComponentModel.Container?components?=?null;
????????public?PlugUI1()
????????{
????????????//?This?call?is?required?by?the?Windows.Forms?Form?Designer.
????????????InitializeComponent();
????????????//?TODO:?Add?any?initialization?after?the?InitializeComponent?call
????????}
????????/**////?<summary>?
????????///?Clean?up?any?resources?being?used.
????????///?</summary>
????????protected?override?void?Dispose(?bool?disposing?)
????????{
????????????if(?disposing?)
????????????{
????????????????if(components?!=?null)
????????????????{
????????????????????components.Dispose();
????????????????}
????????????}
????????????base.Dispose(?disposing?);
????????}
//
????????private?void?button1_Click(object?sender,?System.EventArgs?e)?{
????????????this.PluginHost.showStatus(txtFeedback.Text);
????????}
????????
????????
????}
}
?具體代碼可以參閱:下載開發演示文件
??? 界面布局和交互設計本身有很多的學問,或者有很多藝術,但是本文這里先不討論這個問題.
??? 在QPG團隊實踐中,我們把界面劃分成很多的UI_PART,這和ASP.NET2.0的WebPart可能有相同的地方.我們用這些簡單的PART進行接受輸入或者展示結果.這樣就可以比較方便的測試了.通常這些PART就是一些用戶控件,我們提供了IMainForm接口,使得UI的容器可以動態調入這些部件,哪怕程序已經運行,您也可以編寫一個PART,您只要把它放到bin\plugins目錄即可.
????有時部件可能要和容器通訊,看看下面的代碼您可能就會明白:
IMainForm?成員#region?IMainForm?成員
????????public?string?CurUserID?{
????????????get?{
????????????????//?TODO:??添加?Form1.CurUserID?getter?實現
????????????????return?"admin";
????????????}
????????}
????????public?object?getCookie(string?name)?{
????????????//?TODO:??添加?Form1.getCookie?實現
????????????return?name;
????????}
????????public?void?addCookie(string?name,?object?obj)?{
????????????//?TODO:??添加?Form1.addCookie?實現
????????}
????????public?QPG.UIP.Privilege?getPrivilegeByUser(string?uid,?string?cmdName)?{
????????????//?TODO:??添加?Form1.getPrivilegeByUser?實現
????????????return??QPG.UIP.Privilege.Full;
????????}
????????public?void?showStatus(string?msg)?{
????????????MessageBox.Show(msg);
????????}
????????public?void?showHelp(string?help)?{
????????????//?TODO:??添加?Form1.showHelp?實現
????????}
????????public?void?showNotify(string?title,?string?msg)?{
????????????MessageBox.Show(msg);
????????}
????????#endregion要使用插件服務.您的代碼Form容器大致如下:
public?class?Form1?:?System.Windows.Forms.Form,IMainForm
????{
????????private?System.ComponentModel.IContainer?components;
????????private?System.Windows.Forms.Panel?panel1;
????????public?static?PluginService?Plugins=new?PluginService();
????????private?QPG.UIP.Actions.ActionList?actionList1;
????????private?QPG.UIP.Actions.Action?action1;
????????private?QPG.UIP.Actions.Action?action2;
????//
????protected?IPlugin?selectedPlugin;
????????public?Form1()
????????{
????????????//
????????????//?Windows?窗體設計器支持所必需的
????????????//
????????????InitializeComponent();
????????????Plugins.MainForm=this;
????????
????????????action1.Tag="Demo.UIC.Plugin1";
????????????action2.Tag="Demo.UIC.Plugin2";
????????????action1.Execute+=new?EventHandler(runAction);
????????????action2.Execute+=new?EventHandler(runAction);
????????//????Tester?t=new?Tester();
????????//????t.testParametersConfig();
????????}
????????private?void?runAction(object?sender,?System.EventArgs?e)?{
????????????QPG.UIP.Actions.Action?a=sender?as?QPG.UIP.Actions.Action;
????????
????????????if(getPrivilegeByUser("admin",?a.Tag.ToString())==Privilege.None)?return;
????????
????????????selectedPlugin=Plugins.FindPlugin(a.Tag.ToString()?);
????????????panel1.Controls.Clear();
????????????panel1.Controls.Add(selectedPlugin.MainInterface);
????????????selectedPlugin.MainInterface.Dock=DockStyle.Fill;
????????}
插件的編寫就很簡單了,大致如下:
using?System;
using?QPG.UIP;
namespace?Demo.UIC
{
????/**////?<summary>
????///?Plugin2
????///?</summary>
????public?class?Plugin1?:??BasePlugin??
????{
????????public?Plugin1():base()
????????{
????????????
????????}
????????protected?override?void?init()
????????{
????????????base.init();
????
????????????this.myRequimentNo?=?"uca01";
????????????
????????????this.myDescription="統計圖";
????????????this.myAuthor="alex";
????????????????????
????????????????
????????
????????}
????????
????????????
????????
????????public?override?void?Initialize()
????????{
????????????this.MainInterface=new?PlugUI1();
????????}
????????
????????public?override?void?Dispose()
????????{
????????????//Put?any?cleanup?code?in?here?for?when?the?program?is?stopped
????????}
????}
}
using?System;
using?System.Collections;
using?System.ComponentModel;
using?System.Drawing;
using?System.Data;
using?System.Windows.Forms;
using?QPG.UIP;
namespace?Demo.UIC
{
????/**////?<summary>
????///?Summary?description?for?ctlMain.
????///?</summary>
????public?class?PlugUI1?:?PluginBaseUI
????{
????
????????private?System.Windows.Forms.Label?label1;
????????private?System.Windows.Forms.GroupBox?groupBox1;
????????private?System.Windows.Forms.TextBox?txtFeedback;
????????private?System.Windows.Forms.Button?button1;
????????/**////?<summary>?
????????///?Required?designer?variable.
????????///?</summary>
????????private?System.ComponentModel.Container?components?=?null;
????????public?PlugUI1()
????????{
????????????//?This?call?is?required?by?the?Windows.Forms?Form?Designer.
????????????InitializeComponent();
????????????//?TODO:?Add?any?initialization?after?the?InitializeComponent?call
????????}
????????/**////?<summary>?
????????///?Clean?up?any?resources?being?used.
????????///?</summary>
????????protected?override?void?Dispose(?bool?disposing?)
????????{
????????????if(?disposing?)
????????????{
????????????????if(components?!=?null)
????????????????{
????????????????????components.Dispose();
????????????????}
????????????}
????????????base.Dispose(?disposing?);
????????}
//
????????private?void?button1_Click(object?sender,?System.EventArgs?e)?{
????????????this.PluginHost.showStatus(txtFeedback.Text);
????????}
????????
????????
????}
}
?具體代碼可以參閱:下載開發演示文件
轉載于:https://www.cnblogs.com/QPG2006/archive/2005/10/07/249662.html
總結
以上是生活随笔為你收集整理的技术篇(3)--QPG界面分解方法介绍的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 中信小白青春卡介绍 学生党必办“准信用卡
- 下一篇: 一篇有关教育的文章