<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-144  評論-80  文章-1  trackbacks-0

    C語言嵌入式系統(tǒng)編程修煉之五:鍵盤操作

    作者:宋寶華   更新日期:2005-07-22

    處理功能鍵

      功能鍵的問題在于,用戶界面并非固定的,用戶功能鍵的選擇將使屏幕畫面處于不同的顯示狀態(tài)下。例如,主畫面如圖1:


    圖1 主畫面

      當(dāng)用戶在設(shè)置XX上按下Enter鍵之后,畫面就切換到了設(shè)置XX的界面,如圖2:


    圖2 切換到設(shè)置XX畫面

      程序如何判斷用戶處于哪一畫面,并在該畫面的程序狀態(tài)下調(diào)用對應(yīng)的功能鍵處理函數(shù),而且保證良好的結(jié)構(gòu),是一個值得思考的問題。

       讓我們來看看WIN32編程中用到的"窗口"概念,當(dāng)消息(message)被發(fā)送給不同窗口的時候,該窗口的消息處理函數(shù)(是一個callback函 數(shù))最終被調(diào)用,而在該窗口的消息處理函數(shù)中,又根據(jù)消息的類型調(diào)用了該窗口中的對應(yīng)處理函數(shù)。通過這種方式,WIN32有效的組織了不同的窗口,并處理 不同窗口情況下的消息。

      我們從中學(xué)習(xí)到的就是:

      (1)將不同的畫面類比為WIN32中不同的窗口,將窗口中的各種元素(菜單、按鈕等)包含在窗口之中;

      (2)給各個畫面提供一個功能鍵"消息"處理函數(shù),該函數(shù)接收按鍵信息為參數(shù);

      (3)在各畫面的功能鍵"消息"處理函數(shù)中,判斷按鍵類型和當(dāng)前焦點(diǎn)元素,并調(diào)用對應(yīng)元素的按鍵處理函數(shù)。

    /* 將窗口元素、消息處理函數(shù)封裝在窗口中 */
    struct windows
    {
     BYTE currentFocus;
     ELEMENT element[ELEMENT_NUM];
     void (*messageFun) (BYTE keyValue);
     …
    };
    /* 消息處理函數(shù) */
    void messageFunction(BYTE keyValue)
    {
     BYTE i = 0;
     /* 獲得焦點(diǎn)元素 */
     while ( (element [i].ID!= currentFocus)&& (i < ELEMENT_NUM) )
     {
      i++;
     }
     /* "消息映射" */
     if(i < ELEMENT_NUM)
     {
      switch(keyValue)
      {
       case OK:
        element[i].OnOk();
        break;
       …
      }
     }
    }

      在窗口的消息處理函數(shù)中調(diào)用相應(yīng)元素按鍵函數(shù)的過程類似于"消息映射",這是我們從WIN32編程中學(xué)習(xí)到的。編程到了一個境界,很多東西都是相通的了。其它地方的思想可以拿過來為我所用,是為編程中的"拿來主義"。

      在這個例子中,如果我們還想玩得更大一點(diǎn),我們可以借鑒MFC中處理MESSAGE_MAP的方法,我們也可以學(xué)習(xí)MFC定義幾個精妙的宏來實(shí)現(xiàn)"消息映射"。
    處理數(shù)字鍵

      用戶輸入數(shù)字時是一位一位輸入的,每一位的輸入都對應(yīng)著屏幕上的一個顯示位置(x坐標(biāo),y坐標(biāo))。此外,程序還需要記錄該位置輸入的值,所以有效組織用戶數(shù)字輸入的最佳方式是定義一個結(jié)構(gòu)體,將坐標(biāo)和數(shù)值捆綁在一起:

    /* 用戶數(shù)字輸入結(jié)構(gòu)體 */
    typedef struct tagInputNum
    {
     BYTE byNum; /* 接收用戶輸入賦值 */
     BYTE xPos; /* 數(shù)字輸入在屏幕上的顯示位置x坐標(biāo) */
     BYTE yPos; /* 數(shù)字輸入在屏幕上的顯示位置y坐標(biāo) */
    }InputNum, *LPInputNum;

      那么接收用戶輸入就可以定義一個結(jié)構(gòu)體數(shù)組,用數(shù)組中的各位組成一個完整的數(shù)字:

    InputNum inputElement[NUM_LENGTH]; /* 接收用戶數(shù)字輸入的數(shù)組 */
    /* 數(shù)字按鍵處理函數(shù) */
    extern void onNumKey(BYTE num)
    {
    if(num==0|| num==1) /* 只接收二進(jìn)制輸入 */
    {
     /* 在屏幕上顯示用戶輸入 */
     DrawText(inputElement[currentElementInputPlace].xPos, inputElement[currentElementInputPlace].yPos, "%1d", num);
     /* 將輸入賦值給數(shù)組元素 */
     inputElement[currentElementInputPlace].byNum = num;
     /* 焦點(diǎn)及光標(biāo)右移 */
     moveToRight();
    }
    }

      將數(shù)字每一位輸入的坐標(biāo)和輸入值捆綁后,在數(shù)字鍵處理函數(shù)中就可以較有結(jié)構(gòu)的組織程序,使程序顯得很緊湊。

      整理用戶輸入

      繼續(xù)第2節(jié)的例子,在第2節(jié)的onNumKey函數(shù)中,只是獲取了數(shù)字的每一位,因而我們需要將其轉(zhuǎn)化為有效數(shù)據(jù),譬如要轉(zhuǎn)化為有效的XXX數(shù)據(jù),其方法是:

    /* 從2進(jìn)制數(shù)據(jù)位轉(zhuǎn)化為有效數(shù)據(jù):XXX */
    void convertToXXX()
    {
     BYTE i;
     XXX = 0;
     for (i = 0; i < NUM_LENGTH; i++)
     {
      XXX += inputElement[i].byNum*power(2, NUM_LENGTH - i - 1);
     }
    }

      反之,我們也可能需要在屏幕上顯示那些有效的數(shù)據(jù)位,因為我們也需要能夠反向轉(zhuǎn)化:

    /* 從有效數(shù)據(jù)轉(zhuǎn)化為2進(jìn)制數(shù)據(jù)位:XXX */
    void convertFromXXX()
    {
     BYTE i;
     XXX = 0;
     for (i = 0; i < NUM_LENGTH; i++)
     {
      inputElement[i].byNum = XXX / power(2, NUM_LENGTH - i - 1) % 2;
     }
    }

      當(dāng)然在上面的例子中,因為數(shù)據(jù)是2進(jìn)制的,用power函數(shù)不是很好的選擇,直接用"<< >>"移位操作效率更高,我們僅是為了說明問題的方便。試想,如果用戶輸入是十進(jìn)制的,power函數(shù)或許是唯一的選擇了。

      總結(jié)

      本篇給出了鍵盤操作所涉及的各個方面:功能鍵處理、數(shù)字鍵處理及用戶輸入整理,基本上提供了一個全套的按鍵處理方案。對于功能鍵處理方法,將LCD屏幕與Windows窗口進(jìn)行類比,提出了較新穎地解決屏幕、鍵盤繁雜交互問題的方案。

       計算機(jī)學(xué)的許多知識都具有相通性,因而,不斷追趕時髦技術(shù)而忽略基本功的做法是徒勞無意的。我們最多需要"精通"三種語言(精通,一個在如今的求職簡歷 里泛濫成災(zāi)的詞語),最佳拍檔是匯編、C、C++(或JAVA),很顯然,如果你"精通"了這三種語言,其它語言你應(yīng)該是可以很快"熟悉"的,否則你就沒 有"精通"它們.
    posted on 2005-09-21 17:34 小力力力 閱讀(904) 評論(0)  編輯  收藏 所屬分類: C/C++
    主站蜘蛛池模板: 亚洲gv猛男gv无码男同短文| 国产成人免费永久播放视频平台| 97国产在线公开免费观看| 毛片在线全部免费观看| 亚洲免费观看在线视频| 国产在线98福利播放视频免费| 亚洲免费日韩无码系列| 亚洲精品国产成人99久久| 青娱乐免费在线视频| 日美韩电影免费看| 亚洲色爱图小说专区| 亚洲国产精品综合久久网各| 精品亚洲成A人在线观看青青| 国产精品福利片免费看| 亚洲视频在线观看免费视频| 午夜一区二区免费视频| 亚洲香蕉成人AV网站在线观看| 91大神亚洲影视在线| 爱情岛论坛亚洲品质自拍视频网站| 两性色午夜免费视频| 波多野结衣免费在线| 亚洲精品视频免费观看| 久久久久亚洲精品日久生情| 亚洲熟妇AV一区二区三区宅男| 一级毛片免费播放男男| 无码精品A∨在线观看免费| 亚洲AV无码之日韩精品| 久久久久亚洲av无码专区导航| 亚洲成AV人片高潮喷水| 秋霞人成在线观看免费视频 | 精品久久亚洲一级α| 嫩草影院在线播放www免费观看| 成人黄动漫画免费网站视频| 中文字幕亚洲无线码a| 亚洲成年网站在线观看| 日本免费高清视频| 四虎亚洲国产成人久久精品| 亚洲人成电影网站| 日韩电影免费在线观看网站| 精品免费国产一区二区三区| 亚洲尹人九九大色香蕉网站|