<var id="fnfpo"><source id="fnfpo"></source></var>
<rp id="fnfpo"></rp>

<em id="fnfpo"><object id="fnfpo"><input id="fnfpo"></input></object></em>
<em id="fnfpo"><acronym id="fnfpo"></acronym></em>
  • <th id="fnfpo"><track id="fnfpo"></track></th>
  • <progress id="fnfpo"><track id="fnfpo"></track></progress>
  • <tbody id="fnfpo"><pre id="fnfpo"></pre></tbody>

  • x
    x

    金山衛士界面源碼解讀及界面庫分離(2)

    發布時間:2011-3-29 21:57    發布者:1770309616
    關鍵詞: 界面庫分離 , 界面源碼解讀 , 金山衛士
    金山衛士界面源碼解讀及界面庫分離.pdf (239.76 KB)


    前面已經發布了分離后的Kui代碼,我們繼續,下面來解釋該代碼庫的使用.
    首先要說下Kui框架的一些基礎概念:
    一、
    金山界面庫不使用Windows的窗口布局,只是使用Windows的窗口作為一個載體,整個窗口都只是作為一個繪制面,
    而Kui對窗口實行重新布局,取消了原窗口非客戶區和客戶區的概念.而自己對窗口劃分為上中下三個部分.
    上部分為Header,一般作為窗口標題欄,可以放置縮小,最大化,關閉按鈕,
    中部分為Body,是窗口主要功能操作區域,
    下部分為Footer,一般作為狀態顯示.
    這部分說明主要是為了以后寫XML時使用.
    二、
    Kui將使用到的諸如圖片,布局定義xml等文件使用zip打包,并按資源名"kuires.dat",資源類別為"SKIN",保存到運行程序的資源里
    三、
    Kui庫使用xml格式定義控件及資源的布局,這也是通常DirectUI的做法(xml布局,腳本控制[Kui里面沒使用],windowless)。
    有了以上的概念就可以使用Kui來進行界面開發了。
    同學們可以參考第一個樣例程序----該程序在客戶區顯示經典的hello world.并且對窗口外框進行了美化。
    一、建立工程
    首先使用向導建立一個Win32程序,對!是Win32程序,選擇了Kui,你將不能使用MFC編程了,因為沒有了MFC的窗口概念。
    你將應用微軟的另一個庫進行程序開發----WTL。
    好處就是開發出來的程序不會那么臃腫了,缺點嘛,就是沒有MFC那么方便了。
    不過習慣了也沒什么的。都是同一家公司的技術,所以肯定各有好處。
    二、編寫入口程序
    首先當然是包含庫文件,在stdafx.h中定義
    // 界面庫
    #include "../../include/KUILib.h"
    然后寫入口函數
    WTL的程序都有一個程序實例,與MFC的CWinApp對應,但Kui對它進行了繼承以完成了一些初始化操作,你可以直接使用該類來定義實例。如Sample1所示:
    HINSTANCE g_hInstance; // 定義實例句柄,必須的。
    CKuiApp _Module;//用Kui的默認類,其中CMainWnd是模版參數,是使用的主窗口類,后面會解釋,定義一個實例,你也可以繼承新的類。
    CAppModule* _ModulePtr = &_Module;// 定義實例指針,必須的。
    完整代碼:
    view plaincopy to clipboardprint?
    01.#include "stdafx.h"   
    02.#include ".\mainwnd.h"   
    03.  
    04.  
    05.//   
    06.HINSTANCE g_hInstance;   
    07.//   
    08.CKuiApp _Module;   
    09.CAppModule* _ModulePtr = &_Module;   
    10.//   
    11.//   
    12.  
    13.int WINAPI _tWinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,   
    14.    LPTSTR lpCmdLine, int nCmdShow)   
    15.{   
    16.    g_hInstance = hInstance;   
    17.  
    18.  
    19.    _Module.Init( hInstance );   
    20.    _Module.Main();   
    21.    _Module.UnInit();   
    22.  
    23.      
    24.    return 0;   
    25.}  
    #include "stdafx.h"
    #include ".\mainwnd.h"

    //
    HINSTANCE g_hInstance;
    //
    CKuiApp _Module;
    CAppModule* _ModulePtr = &_Module;
    //
    //
    int WINAPI _tWinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
    LPTSTR lpCmdLine, int nCmdShow)
    {
    g_hInstance = hInstance;

    _Module.Init( hInstance );
    _Module.Main();
    _Module.UnInit();

    return 0;
    }
    三、窗口函數定義
    下面接著要編寫主窗口類了
    其中頭文件MainWnd.h如下:
    view plaincopy to clipboardprint?
    01.#pragma once   
    02.#include "stdafx.h"   
    03.class CMainWnd : public CKuiDialogImpl   
    04.    , public CWHRoundRectFrameHelper   
    05.{   
    06.public:   
    07.    CMainWnd(void);   
    08.    virtual ~CMainWnd(void);   
    09.    void OnDestroy();   
    10.  
    11.    void OnBkBtnClose();   
    12.    void OnBkBtnMax();   
    13.    void OnBkBtnMin();   
    14.      
    15.  
    16.    KUI_NOTIFY_MAP(IDC_RICHVIEW_WIN)   
    17.        KUI_NOTIFY_ID_COMMAND(60001, OnBkBtnClose)   
    18.        KUI_NOTIFY_ID_COMMAND(60002, OnBkBtnMax)   
    19.        KUI_NOTIFY_ID_COMMAND(60003, OnBkBtnMin)   
    20.        //KUI_NOTIFY_TAB_SELCHANGE(IDC_TAB_MAIN, OnBkTabMainSelChange)   
    21.    KUI_NOTIFY_MAP_END()   
    22.  
    23.    BEGIN_MSG_MAP_EX(CMainWnd)   
    24.        MSG_KUI_NOTIFY(IDC_RICHVIEW_WIN)   
    25.        CHAIN_MSG_MAP(CKuiDialogImpl)   
    26.        CHAIN_MSG_MAP(CWHRoundRectFrameHelper)   
    27.  
    28.        //MSG_WM_INITDIALOG(OnInitDialog)   
    29.        //MSG_WM_SYSCOMMAND(OnSysCommand)   
    30.        MSG_WM_DESTROY(OnDestroy)   
    31.           
    32.        REFLECT_NOTIFICATIONS_EX()   
    33.    END_MSG_MAP()   
    34.};  
    #pragma once
    #include "stdafx.h"
    class CMainWnd : public CKuiDialogImpl
    , public CWHRoundRectFrameHelper
    {
    public:
    CMainWnd(void);
    virtual ~CMainWnd(void);
    void OnDestroy();
    void OnBkBtnClose();
        void OnBkBtnMax();
        void OnBkBtnMin();

    KUI_NOTIFY_MAP(IDC_RICHVIEW_WIN)
            KUI_NOTIFY_ID_COMMAND(60001, OnBkBtnClose)
            KUI_NOTIFY_ID_COMMAND(60002, OnBkBtnMax)
            KUI_NOTIFY_ID_COMMAND(60003, OnBkBtnMin)
            //KUI_NOTIFY_TAB_SELCHANGE(IDC_TAB_MAIN, OnBkTabMainSelChange)
        KUI_NOTIFY_MAP_END()
    BEGIN_MSG_MAP_EX(CMainWnd)
      MSG_KUI_NOTIFY(IDC_RICHVIEW_WIN)
      CHAIN_MSG_MAP(CKuiDialogImpl)
      CHAIN_MSG_MAP(CWHRoundRectFrameHelper)
      //MSG_WM_INITDIALOG(OnInitDialog)
      //MSG_WM_SYSCOMMAND(OnSysCommand)
      MSG_WM_DESTROY(OnDestroy)
      
      REFLECT_NOTIFICATIONS_EX()
    END_MSG_MAP()
    };

    實現文件MainWnd.cpp如下:
    view plaincopy to clipboardprint?
    01.#include "stdafx.h"   
    02.#include ".\mainwnd.h"   
    03.  
    04.  
    05.CMainWnd::CMainWnd(void) : CKuiDialogImpl( "IDR_DLG_MAIN" )   
    06.{   
    07.}   
    08.  
    09.CMainWnd::~CMainWnd(void)   
    10.{   
    11.}   
    12.  
    13.void CMainWnd::OnDestroy()   
    14.{   
    15.    PostQuitMessage(0);   
    16.}   
    17.  
    18.  
    19.void CMainWnd::OnBkBtnMax()   
    20.{   
    21.    if (WS_MAXIMIZE == (GetStyle() & WS_MAXIMIZE))   
    22.    {   
    23.        SendMessage(WM_SYSCOMMAND, SC_RESTORE | HTCAPTION, 0);   
    24.    }   
    25.    else  
    26.    {   
    27.        SendMessage(WM_SYSCOMMAND, SC_MAXIMIZE | HTCAPTION, 0);   
    28.    }   
    29.}   
    30.  
    31.void CMainWnd::OnBkBtnMin()   
    32.{   
    33.    SendMessage(WM_SYSCOMMAND, SC_MINIMIZE | HTCAPTION, 0);   
    34.}   
    35.  
    36.void CMainWnd::OnBkBtnClose()   
    37.{   
    38.    DestroyWindow();   
    39.}  
    #include "stdafx.h"
    #include ".\mainwnd.h"

    CMainWnd::CMainWnd(void) : CKuiDialogImpl( "IDR_DLG_MAIN" )
    {
    }
    CMainWnd::~CMainWnd(void)
    {
    }
    void CMainWnd::OnDestroy()
    {
        PostQuitMessage(0);
    }

    void CMainWnd::OnBkBtnMax()
    {
    if (WS_MAXIMIZE == (GetStyle() & WS_MAXIMIZE))
    {
      SendMessage(WM_SYSCOMMAND, SC_RESTORE | HTCAPTION, 0);
    }
    else
    {
      SendMessage(WM_SYSCOMMAND, SC_MAXIMIZE | HTCAPTION, 0);
    }
    }
    void CMainWnd::OnBkBtnMin()
    {
    SendMessage(WM_SYSCOMMAND, SC_MINIMIZE | HTCAPTION, 0);
    }
    void CMainWnd::OnBkBtnClose()
    {
    DestroyWindow();
    }
    下面對代碼關鍵部分進行說明:
    主窗口繼承自兩個類
    CKuiDialogImpl 是對話框窗口實現模版,主窗口繼承自該類,沒有接觸模版的同學可能對該寫法有些奇怪,看看模版介紹就可以了。
    CWHRoundRectFrameHelper 是一個異型窗口輔助,實現了圓角窗口。
    view plaincopy to clipboardprint?
    01.KUI_NOTIFY_MAP(IDC_RICHVIEW_WIN)   
    02.        KUI_NOTIFY_ID_COMMAND(60001, OnBkBtnClose)   
    03.        KUI_NOTIFY_ID_COMMAND(60002, OnBkBtnMax)   
    04.        KUI_NOTIFY_ID_COMMAND(60003, OnBkBtnMin)   
    05.    KUI_NOTIFY_MAP_END()  
    KUI_NOTIFY_MAP(IDC_RICHVIEW_WIN)
            KUI_NOTIFY_ID_COMMAND(60001, OnBkBtnClose)
            KUI_NOTIFY_ID_COMMAND(60002, OnBkBtnMax)
            KUI_NOTIFY_ID_COMMAND(60003, OnBkBtnMin)
        KUI_NOTIFY_MAP_END()

    上面這些宏映射了控件通知到相應的函數
    view plaincopy to clipboardprint?
    01.BEGIN_MSG_MAP_EX(CMainWnd)   
    02.  MSG_KUI_NOTIFY(IDC_RICHVIEW_WIN)   
    03.  CHAIN_MSG_MAP(CKuiDialogImpl)   
    04.  CHAIN_MSG_MAP(CWHRoundRectFrameHelper)   
    05.  
    06.  //MSG_WM_INITDIALOG(OnInitDialog)   
    07.  //MSG_WM_SYSCOMMAND(OnSysCommand)   
    08.  MSG_WM_DESTROY(OnDestroy)   
    09.     
    10.  REFLECT_NOTIFICATIONS_EX()   
    11. END_MSG_MAP()  
    BEGIN_MSG_MAP_EX(CMainWnd)
      MSG_KUI_NOTIFY(IDC_RICHVIEW_WIN)
      CHAIN_MSG_MAP(CKuiDialogImpl)
      CHAIN_MSG_MAP(CWHRoundRectFrameHelper)
      //MSG_WM_INITDIALOG(OnInitDialog)
      //MSG_WM_SYSCOMMAND(OnSysCommand)
      MSG_WM_DESTROY(OnDestroy)
      
      REFLECT_NOTIFICATIONS_EX()
    END_MSG_MAP()

    上面這些宏映射了窗口消息到對應函數。
    這些代碼作用跟MFC的消息映射作用是一樣的,但實作手法有些差異。其實WTL的更原始。
    實現部分的代碼就比較簡單了。
    四、最后就是資源的添加了。
    可以參考Sample1.rc文件,直接在相應位置添加一行
    kuires.dat    SKIN     "res\\sample1.kui"
    至此Kui庫整個使用過程就是如此簡單。
    你需要做的就是定義主窗口的消息處理及函數而已。
    本文地址:http://www.portaltwn.com/thread-60403-1-1.html     【打印本頁】

    本站部分文章為轉載或網友發布,目的在于傳遞和分享信息,并不代表本網贊同其觀點和對其真實性負責;文章版權歸原作者及原出處所有,如涉及作品內容、版權和其它問題,我們將根據著作權人的要求,第一時間更正或刪除。
    您需要登錄后才可以發表評論 登錄 | 立即注冊

    廠商推薦

    • Microchip視頻專區
    • EtherCAT®和Microchip LAN925x從站控制器介紹培訓教程
    • MPLAB®模擬設計器——在線電源解決方案,加速設計
    • 讓您的模擬設計靈感,化為觸手可及的現實
    • 深度體驗Microchip自動輔助駕駛應用方案——2025巡展開啟報名!
    • 貿澤電子(Mouser)專區
    關于我們  -  服務條款  -  使用指南  -  站點地圖  -  友情鏈接  -  聯系我們
    電子工程網 © 版權所有   京ICP備16069177號 | 京公網安備11010502021702
    快速回復 返回頂部 返回列表
    精品一区二区三区自拍图片区_国产成人亚洲精品_亚洲Va欧美va国产综合888_久久亚洲国产精品五月天婷