青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆-341  評(píng)論-2670  文章-0  trackbacks-0
    這是GacUI關(guān)于文本框高亮的最后一個(gè)Demo了。這個(gè)Demo是關(guān)于XML著色的。XML著色比起C++著色更難,主要是因?yàn)樵陬愃?lt;book name="C++ Primer">這樣的代碼里面,book和name的顏色不一樣,<和book的顏色也不一樣(參考Visual Studio)。這種時(shí)候單純依靠正則表達(dá)式來區(qū)分顏色是不夠的,我們還需要引入一個(gè)新的狀態(tài)機(jī)。這個(gè)狀態(tài)機(jī)只有三個(gè)狀態(tài),用來區(qū)分tag name,attribute name和text三種顏色。狀態(tài)機(jī)是手寫的,并且GacUI提供了一個(gè)回調(diào)來寫這個(gè)只有寥寥幾行狀態(tài)機(jī)。先看圖:



    跟C++一樣,XML著色首先是由正則表達(dá)式組成的。XML的正則表達(dá)式比較簡(jiǎn)單,只有符號(hào)、name、字符串、CData、注釋和其它一些簡(jiǎn)單的東西:

 1 class XmlColorizer : public GuiTextBoxRegexColorizer
 2 {
 3 public:
 4     XmlColorizer()
 5     {
 6         text::ColorEntry entry=win7::Win7GetTextBoxTextColor();
 7         SetDefaultColor(entry);
 8 
 9         entry.normal.text=Color(01280);
10         AddToken(L"/<!--([^/-]|-[^/-]|--[^>])*--/>", entry);
11 
12         entry.normal.text=Color(1280255);
13         AddToken(L"/<!/[CDATA/[([^/]]|/][^/]]|/]/][^>])*/]/]/>", entry);
14 
15         entry.normal.text=Color(000);
16         AddToken(L"\"[^\"]*\"", entry);
17 
18         entry.normal.text=Color(00255);
19         AddToken(L"[<>=]", entry);
20 
21         entry.normal.text=Color(25500);
22         AddToken(L"[a-zA-Z0-9_/-:]+", entry);
23 
24         entry.normal.text=Color(1632121);
25         AddExtraToken(entry);
26 
27         Setup();
28     }
29 
30     void ColorizeTokenContextSensitive(const wchar_t* text, vint start, vint length, vint& token, int& contextState)override
31     {
32         
33     }
34 
35     int GetContextStartState()override
36     {
37         
38     }
39 };

    其次要對(duì)三種地方的[a-zA-Z0-9_/-:]進(jìn)行著色。Tag的名字用褐色,attribute的名字用紅色,而普通文本用黑色。因此我們可以做一個(gè)狀態(tài)機(jī),初始狀態(tài)為0。如果讀進(jìn)了<,狀態(tài)變成1。1遇到了一個(gè)Tag名字之后變?yōu)?。從2開始所有的名字就只能是attribute的名字了。我們只考慮正確的情況,錯(cuò)誤的代碼著色出了問題不僅沒有壞處,還可以提醒程序員有什么地方寫錯(cuò)了。之后遇到了>變回0,在0的狀態(tài)下所有的東西都是普通文本,所以名字就都是黑色的。因此上面ColorizeTokenContextSensitive函數(shù)中就需要填入這個(gè)邏輯。GetContextStartState返回0,作為第一行的起始狀態(tài)。代碼如下:

    void ColorizeTokenContextSensitive(const wchar_t* text, vint start, vint length, vint& token, int& contextState)override
    {
        
// 0 < 1 name 2 att > 0
        switch(token)
        {
        
case 3:
            
if(length==1)
            {
                
switch(text[start])
                {
                
case '<':
                    contextState
=1;
                    
break;
                
case '>':
                    contextState
=0;
                    
break;
                }
            }
            
break;
        
case 4:
            
switch(contextState)
            {
            
case 0:
                token
=-1;
                
break;
            
case 1:
                token
=5;
                contextState
=2;
                
break;
            }
            
break;
        }
    }

    
int GetContextStartState()override
    {
        
return 0;
    }

    這個(gè)函數(shù)里面有幾個(gè)魔法數(shù)字,其實(shí)都是關(guān)于Token的編號(hào)的。構(gòu)造函數(shù)里面我們使用AddToken將一個(gè)顏色關(guān)聯(lián)到正則表達(dá)式上,使用AddExtraToken創(chuàng)建一個(gè)沒有正則表達(dá)式關(guān)聯(lián)的顏色。所以在這個(gè)狀態(tài)機(jī)里面,所有的顏色都用Token的序號(hào)來表示。無論是使用AddToken還是AddExtraToken,第一個(gè)顏色編號(hào)為0,第二個(gè)顏色編號(hào)為1。因此case 3指的是[<>=],而case 4指的是[a-zA-Z0-9_/-:]+。而case 4里面的token=5則表示在狀態(tài)為1的時(shí)候,名字都用AddExtraToken指定的那個(gè)褐色進(jìn)行染色。缺省的名字(也就是id為4的token)是紅色,所以不需要對(duì)contextState為2的時(shí)候進(jìn)行處理。

    這樣我們就完成了XML的著色。GacUI接下來的幾個(gè)Demo將會(huì)是關(guān)于ListBox、ListView和TreeView的,敬請(qǐng)期待。
posted on 2012-05-20 00:41 陳梓瀚(vczh) 閱讀(2266) 評(píng)論(2)  編輯 收藏 引用 所屬分類: GacUI

評(píng)論:
# re: GacUI Demo:文本框高亮(三,完)上下文相關(guān)著色 2012-05-20 01:40 | 陳梓瀚(vczh)
發(fā)現(xiàn)xml里面把C++他爹的名字寫錯(cuò)了……  回復(fù)  更多評(píng)論
  
# re: GacUI Demo:文本框高亮(三,完)上下文相關(guān)著色 2012-05-20 04:06 | iloveprogramme
嚴(yán)重佩服啊!期待lz完成的那天。  回復(fù)  更多評(píng)論
  
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            国产视频一区在线| 免费在线看一区| 欧美成人自拍视频| 久久高清福利视频| 欧美三区美女| 亚洲美女诱惑| 亚洲精品少妇网址| 久久免费国产精品| 久久天堂av综合合色| 国产精品盗摄久久久| 一本色道久久综合一区| 久久夜色精品| 在线视频一区二区| 亚洲伊人网站| 亚洲欧美精品在线观看| 亚洲欧美日韩高清| 亚洲欧美国产三级| 欧美天天影院| 亚洲一区黄色| 欧美专区亚洲专区| 国产伦精品一区二区三区照片91 | 你懂的一区二区| 国产一级一区二区| 亚洲国产精品久久久久婷婷884| 欧美精品一线| 亚洲精品日韩欧美| 99这里只有久久精品视频| 亚洲自拍啪啪| 欧美综合77777色婷婷| 国产欧美日韩三级| 久久成人18免费网站| 一区二区精品在线| 欧美日韩喷水| 亚洲欧美日韩综合aⅴ视频| 亚洲专区在线| 国产在线成人| 亚洲午夜精品福利| 亚洲欧美日韩电影| 国产亚洲欧美日韩一区二区| 久久久精品网| 亚洲欧洲一区二区三区| 亚洲影院免费| 黑人巨大精品欧美一区二区 | 欧美国产亚洲视频| 国外成人在线| 欧美国产精品| 亚洲私人影院在线观看| 久久精品国产免费观看| 欧美国产一区二区| 麻豆精品一区二区av白丝在线| 欧美日韩国产在线一区| 亚洲一区二区三区免费观看 | 亚洲精品在线看| 亚洲欧美在线网| 伊人婷婷欧美激情| 欧美久久影院| 欧美一级大片在线免费观看| 欧美粗暴jizz性欧美20| 狠狠做深爱婷婷久久综合一区| 亚洲免费在线观看| 欧美大片免费久久精品三p| 亚洲视频www| 国内综合精品午夜久久资源| 欧美精品1区2区| 久久xxxx| 日韩视频在线播放| 免费成人高清| 性欧美大战久久久久久久免费观看| 欧美午夜精品久久久久免费视| 最新亚洲视频| 久久精品夜色噜噜亚洲a∨| 99国产精品99久久久久久粉嫩| 免费在线亚洲| 欧美一二三区精品| 一区二区久久久久| 亚洲成人自拍视频| 国产精品久久久久久久久久久久| 亚洲九九精品| 欧美成人高清| 久久乐国产精品| 亚洲欧美激情一区二区| 国产精品综合不卡av| 欧美xxxx在线观看| 欧美高潮视频| 午夜精品久久久久久99热软件| 欧美影院在线播放| 在线亚洲精品福利网址导航| 在线精品高清中文字幕| 国产精品一区二区久久| 欧美亚州一区二区三区 | 欧美激情1区2区3区| 欧美自拍偷拍午夜视频| 午夜精品久久久久久久久久久久久| 国产精品亚洲一区| 欧美精品999| 免费观看一区| 欧美成人a视频| 亚洲美女免费精品视频在线观看| 亚洲欧美成人综合| 在线视频精品一区| 99国产成+人+综合+亚洲欧美| 国产精品久在线观看| 久久久久国产精品厨房| 久久国产精品99国产| 午夜精品一区二区三区四区| 亚洲香蕉在线观看| 一区二区三区四区在线| 99精品99| 亚洲欧美电影院| 亚洲免费视频中文字幕| 亚洲男人的天堂在线| 亚洲免费在线视频| 亚洲成人在线视频播放 | 伊人婷婷久久| 激情文学一区| 91久久国产综合久久| 亚洲精品你懂的| 在线中文字幕日韩| 亚洲综合大片69999| 午夜在线a亚洲v天堂网2018| 亚洲国产日韩综合一区| 亚洲日本电影在线| aa日韩免费精品视频一| 亚洲视频在线一区| 亚洲成在人线av| 亚洲精品国产精品国自产观看浪潮 | 久久精品视频导航| 久久成人综合视频| 美女脱光内衣内裤视频久久影院| 亚洲欧美久久久久一区二区三区| 最新国产拍偷乱拍精品| 一区二区三区www| 欧美一区二区三区男人的天堂| 亚洲精品一级| 亚洲国产精品电影在线观看| 91久久亚洲| 欧美激情精品久久久久| 亚洲人成艺术| 亚洲欧美综合网| 男同欧美伦乱| 国产精品久久看| 亚洲成人在线免费| 亚洲午夜女主播在线直播| 久久精品1区| 久久国产一区| 亚洲国产老妈| 欧美亚洲尤物久久| 欧美日韩大片一区二区三区| 国产在线欧美| 国产视频自拍一区| 亚洲免费大片| 夜夜嗨网站十八久久| 欧美在线亚洲一区| 亚洲理论在线观看| 久久久久综合网| 国产精品日本欧美一区二区三区| 国产精品伦理| 日韩午夜三级在线| 久久久蜜桃精品| 亚洲一区3d动漫同人无遮挡| 老司机精品视频一区二区三区| 久久亚洲综合色一区二区三区| 久久久久这里只有精品| 国产精品igao视频网网址不卡日韩| 欧美日韩视频在线| 亚洲国产精品久久久| 欧美在线网址| 中文一区在线| 欧美日韩亚洲一区二| 亚洲欧洲综合另类| 嫩草国产精品入口| 欧美中文字幕视频在线观看| 欧美性猛片xxxx免费看久爱| 亚洲欧洲三级电影| 免费在线国产精品| 欧美在线国产| 国产欧美日本一区二区三区| 亚洲视频一二| 亚洲精品欧洲| 欧美激情网友自拍| 亚洲破处大片| 欧美国产在线观看| 久久躁日日躁aaaaxxxx| 欧美日本高清视频| 亚洲精品中文字幕女同| 欧美高清hd18日本| 免费观看久久久4p| 亚洲激情二区| 亚洲黑丝在线| 午夜视频一区二区| 国产一区二区日韩| 亚洲精品国产精品国自产观看浪潮| 亚洲午夜免费视频| 狂野欧美激情性xxxx欧美| 欧美一区二区精品| 激情综合色丁香一区二区| 卡通动漫国产精品| 男女激情视频一区| 日韩午夜高潮| 亚洲天堂久久|